I hate to blog about a blog, but everyone in software development should read this post from Don Box’s blog. Thanks to him I now have a name for this. Too many times over the past five years have I been stuck in the middle of the “Academic” vs. “Pragmatic” discussion of some technology.
While branching out and doing something new and risky is occasionally groundbreaking, most of the time it just makes it harder on people who make thier living slinging code. I like to think of it like building a car. Sleek lines, computer controlled ignition, GPS are all neat features, but if it isn’t reliable transportation 99.999% of the time, it will be a lemon.
To me it is pertinent to coders that work in the trenches to understand that magical middleground between over and under engineering. When I started development eighteen years ago, the push was small, fast code to deal with the limitations of the hardware of the time. Maintainable code was a laudable goal, but small and fast always won in the end.
Soon after, it was software that could be designed to be tweaked to handle every situation that you could imagine. Ideas like pluggable architectures and components were the buzzwords of the day. In fact, many of these solutions were over engineered to handle solutions that would never come to pass.
In the last five years, things have changed a bit. I now appreciate agility over flexibility. With the daily use of managed languages (Java, .NET, etc.) we can work with code and change underlying fundaments much quicker than before. Engineering enough of a solution to work well; designing interfaces that are flexible; and writing code that makes refactoring easier are the goals of most of my work these days. Its not to say that performance and scalability are not important; they are. Its just that it no longer makes sense to be penny wise and pound foolish.