Frameworks causing unnecessary complexity in enterprise software systems.
Posted on Sunday, February 22, 2009 at 5:04 PM.A few weeks ago, Travis Jensen posted an article about the low quality of many enterprise software systems. For those of us who have worked in such environments before, we are well aware of what he is saying. The quality of such software is often quite terrible. And he does nail a big portion of the problem: complexity.
In some domains, there is inherent complexity. We may be working with huge amounts of data, we may have to process many requests simultaneously, we may have to deal with ambiguous or unclear business rules, and so forth. But many projects also introduce unnecessary complexity at the technical level. This seems to be what Travis was focusing on, as he discusses the unnecessarily large software stack he has to work with daily.
We often see these unruly software stacks in Java-based systems. The Java development community has always been far more in favor of frameworks than many other development communities, even when working on implementing similar software systems. And even within the different types of frameworks, we often see three or more competing projects. Given that a huge amount of enterprise-grade software is developed using Java, it's no surprise that we're likely to run into systems making use of several such frameworks.
While these frameworks are often useful in smaller applications that need to be developed very quickly by a small team, they typically lose their benefit in the larger, more complex and longer-term projects we see in the enterprise. Aside from the increased complexity and the debugging difficulties they bring, as mentioned by Travis in his article, the effort necessary to integrate these frameworks often exceeds the benefit they initially bring to the table.
At some companies I've worked with, it was almost seen as a crime within the development team to write any significant amount of code for a project. The emphasis was completely on letting the framework do the work, with the developers only writing light integration code. As anyone who has worked with such frameworks knows, this often isn't possible, due to performance reasons, unusual requirements, or even the deployment environment.
I've witnessed some of these teams spent excessive amounts of time fighting to integrate the various third-party frameworks of their software stack. The code they write to integrate these components ends up being more than what they would've wrote if they'd just rolled it all by hand. And like Travis highlighted in his article, debugging can become a real nightmare. Tracking the original source of a single field displayed on the UI can become a tedious journey through Web template frameworks, the code integrating that with an underlying business layer, through to the code making up a data layer or an ORM framework, and sometimes down to hand-written SQL code. Simple bug fixes can indeed become very time-consuming tasks.
Some of those development groups have moved towards reducing their use of frameworks. If this approach is taken with an existing application, we can end up with a real mess. Some portions of the system will use some ORM or data persistence layer, while others directly invoke SQL code or stored procedures. This takes what may have already been a confusing situation, and makes it far more convoluted.
There's probably no easy solution to these problems. We may just need to accept that for larger and more complex software systems, it's better to invest in developing much of the system from scratch. While frameworks may give an initial advantage, for longer-term projects they become a nuisance, and even an additional problem to work around when modifying the system or adding new functionality. And given that many of these frameworks manage to work their way into the overall architecture in a manner that does not easily allow them to be removed later, it may be best just to not get involved with them in the first place.








