Choose Your Tools with Care
In 1995 David Garlan et al., wrote "Future breakthroughs in software productivity may well depend on the software community’s ability to combine existing pieces of software to produce new applications". Nowadays, their prediction has become true. In fact modern applications are very rarely built from scratch, but they are assembled using existing tools--components, libraries, and frameworks--for some very good reasons:
- Applications are growing in size, complexity, and sophistication, while the time available to develop them is less and less, so it is much better if developers can concentrate in writing more business-domain code and less infrastructure code
- Widely used components and frameworks are likely to have fewer bugs than the ones developed in house
- There is a lot of high quality software available on the web for free, which means less development costs, and higher likelihood of finding developers with the necessary expertise
- Software production and maintenance is human intensive work, so buying may be cheaper than building
However, choosing the right mix of tools for your application can be a tricky business requiring some thought. In fact when making a choice, there are a few things you should keep in mind:
- Different tools may rely on different assumptions about their surroinding context--e.g., surrounding infrastructure, control model, data model, communication protocols, etc.--leading to an "architectural mismatch" which, in order to be fixed, may require hacks and workarounds that will make the code much more complex than necessary
- Different tools have different lifecycles, and upgrading one of them may become an extremely difficult and time-consuming task since the new functionality, design changes, or even bug fixes may cause incompatibilities with the other tools. The more the tools the worse the problem becomes
- Some tools require quite a bit of configuration, often by means of one or more XML files, which can grow very big very quickly. If this happens, the application may end up looking as if it was all written in XML plus a bunch of lines of code in some programming language, and it may become quite difficult to maintain and extend
- Vendor lock-in. Code that depends heavily on specific vendor products ends up in being constrained by them on several accounts: maintainability, performances, ability to evolve, price, etc.
- If you plan to use free software, you might discover that it's not free, after all. You may need to buy commercial support, which is not necessarily going to be cheap
- Licensing terms matter; even for free software. In some companies in not acceptable to use software licensed under the GNU license terms due to its viral nature--i.e., software developed with it must be distributed along with its source code
My personal strategy to mitigate the problems above is to start small by using only the tools that are absolutely necessary--usually, to get rid of some low level infrastructure problems right away, e.g., by using some middleware instead of using raw sockets for distributed applications--and add more if needed. I also tend to isolate the external tools from my business domain objects by means of interfaces and layering, so that I can change the tool if I have to with just a small amount of pain. A positive side effect of this approach is that I generally end up with a smaller application that uses fewer external tools than originally forecasted.
This work is licensed under a Creative Commons Attribution 3
Back to 97 Things Every Programmer Should Know home page