One of my favorite quotes about the art of software development is

You cannot eliminate complexity, all you can do is move it around

This is very true when it comes to designing systems. You should always look with skepticism when someone tells you that some development tool or technology eliminates complexity. Usually this means the complexity has been hidden but lurks just below the surface waiting to ensnare unwary programmers. However on certain rare occassions, the complex part of the problem is actually solved by the tool or technology effectively eliminating from the worries of the application developer. This is very rare.

A good example of a technology which eliminated complexity for application developers by moving it into the purvey of runtime frameworks is garbage collection. The complexity of memory management was eliminated as a concern of application developers and moved into the domain of application framework developers. This was a win for the industry since the complexity could be relegated to realm of language runtime gurus.

There are lots of examples of technologies that claim to "eliminate complexity" but actually just move it around in a way that makes the complexity less obvious. This is often because, the person claiming to be eliminating the complexity fails to acknowledge where the complexity lies in the first place. For example, when the .NET Framework was first shipped by Microsoft there were lots of claims that DLL Hell would now be a thing of the past. You can still find blog posts and articles like Simplifying Deployment and Solving DLL Hell with the .NET Framework from that era claiming that "DLL Hell" is solved. The problem with that thinking was that versioning and keeping libraries backwards compatible is a fundamentally hard problem that often has no good solution. At the end of the day, you only have two real choices when it comes to preserving backwards compatibility; never change the existing functionality of a library or always ensure that applications always run against the original library they were compiled against so that if the new one changes behavior, they are unaffected. Both choices are untenable which means there will always be complexity when it comes to how one handles versioning and system libraries.

It’s been about six years since the first versions of the .NET Framework were shipped and such hyperbole has died down. Today you can find posts like What A Difference A Revision Makes - IConfigMapPath Is Inaccessible Due To Its Protection Level and Microsoft .NET Patch May Make PCs Go "Haywire" which indicate that DLL Hell is still alive and well when it comes to programming against the .NET Framework.

This brings me to my point. Recently Shawn Steele of Microsoft wrote a blog post entitled Security patch MS07-040 for .Net 2.0 breaks some culture names for .Net 2.0 on Windows XP/2003/2000 where he writes

The .Net patch of July 10th, ms07-049, changes culture names to use the new names on Windows XP/2003/2000 as well as Vista...Unfortunately this change can break applications that expect the old names.  If that happens, the workaround of creating custom cultures might work for your application.

Potential problems experienced by applications could be:

  • client/server communication because one used the old names and one used the new names.  A workaround is to create custom cultures with the old names and choose a parent fallback for them.
  • Visual Studio projects probably need migrated to use the new names for the resources, otherwise there could be confusion compiling and loading resources.
  • If this is your system locale there could be problems loading resources using the old name, depending on the behavior.  In this case creating custom cultures for the old names and replacements for the new names with the old names as the parent culture may solve the problem.

This problem affects the following cultures supported by RSS Bandit; zh-CHT->Chinese (Traditional), zh-CHS->Chinese (Simplified), sr-SP-Cyrl->Serbian (Cyril), and sr-SP-Latn (Latin).

The blog post is unclear but it sounds like RSS Bandit may for our Chinese and Serbian users who have updated their versions of the .NET Framework. However I’m not 100% sure this is the case. If you are an RSS Bandit user whose environment is set to Chinese or Serbian and have applied the recent .NET Framework security patch, please respond to this comment with information about any problems you are facing or let me know if there are no problems.

Thanks for your continued support.

Now playing: T.I. - Big Things Poppin (Do It)


Friday, July 20, 2007 7:06:54 AM (GMT Daylight Time, UTC+01:00)
DLL hell may not have been completely eliminated, but it has been vastly improved in .NET since the COM/registry days.

Versionning, registering, unregistering, running regclean, tracking down the right damn version of the DLL so you'd be able to unregister it, deleting suspicious-looking registry entries and crossing your fingers that it wouldn't break something else, mapping GUIDs to classids... all used to be an infuriating time sink.

.NET DLLs are small: it's vastly easier now I can just stick the right version in the app folder and forget about it.

So, thanks, Microsoft for that...
Friday, July 20, 2007 10:45:00 AM (GMT Daylight Time, UTC+01:00)
I'm not up to speed on .NET, but COM was supposed to get rid of DLL hell. Why didn't it work then?
Friday, July 20, 2007 11:13:11 AM (GMT Daylight Time, UTC+01:00)
If you've ever needed to write high performance code in Java, you will know that the complexity of garbage collection will come and bite you. I'm sure there's always a level of interaction you get with a system where you will rediscover the hidden complexity.
Friday, July 20, 2007 7:46:52 PM (GMT Daylight Time, UTC+01:00)
Hello Dare. Everything OK here (Win 2003 Stnd, latest patches) with sr-SP-Latn and sr-SP-Cyrl in RSSBandit. Looks like Network Working Group cannot catchup with Balkan balkanization. Latest response says sr-Latn-CS (sr for Serbian, Latn for script and CS for country) where CS stands for Serbia and Montenegro. Serbia and Montenegro are two countries now, and to my knowledge new codes for Serbia and Montenegro as separate countries are not set. I think that sr-SP-Latn and sr-SP-Cyril are more accurate then sr-Latn-CS and sr-Cyril-CS (being last two are false).
Comments are closed.