Today we ran across an interesting problem in our software. It turned out we had accidentally hard-coded a bit of text in English instead of properly setting it up to be displayed in any language (this is called internationalization in geek-speak).
When we went in to fix this, we discovered the hard coding was done in our data access layer. According to theory, the data access layer has nothing do with internationalization, so we should move the internationalization logic to a different part of the application. In an attempt to conform to proper theory, it meant changing the code in our data access layer. This in turn required several changes to the service layer. The changes to the service layer in turn required even more changes to the user interface layer. As you can see, this disconnect between theory and reality quickly ballooned to the point where a very simple conceptual change would require many changes to the code.
Instead of ripping our software apart to conform to theory, we let reality take over on this one. The reality is our customers want working feature-rich software yesterday. They don't want theoretically perfect software 10 years from now. So, we just added the internationalization logic directly to the data access layer so that we could cut the latest build of CMS 1.3, which expands CMS' browser support to IE7 and Safari. We hope to make a general release of this software soon.