Modern software development relies more and more on the availability of proper tools libraries and frameworks.

+

Modern applications are very rarely built from scratch, but they are assembled using existing tools &mdash; components, libraries, and frameworks &mdash; for a number of good reasons:

-

Some of the reasons are:

+

* Applications are growing in size, complexity, and sophistication, while the time available to develop them grows shorter. It is makes better use of developers' time and intelligence if they can concentrate on writing more business-domain code and less infrastructure code.

-

* Applications are growing in size, complexity, and sophistication, while the time available to develop them is less and less

+

* Widely used components and frameworks are likely to have fewer bugs than the ones developed in-house.

-

* Tools libraries and frameworks that are widely used 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 lower development costs and greater likelihood of finding developers with the necessary interest and expertise.

-

* 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.

-

* Given the fact that software production is human intensive work, often buying is cheaper than building

+

-

* Reduced time to market (or to “production” if it is for internal users)

+

-

However, there is not such a thing as a free lunch. Tools must be chosen wisely, in fact there are some potential problems to consider

+

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:

-

* Every tool has its own pros and cons, and, depending on the combination you choose they may actually make your development activities more complicated than necessary

+

-

* Sometimes free software is not free, after all. You may need to buy commercial support, which is not necessarily going to be cheap

+

-

* 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. Finally, there is a reduced scope to negotiate the licensing fees

+

-

* Etc.

+

-

By all means use tools, libraries and frameworks, but make sure you choose them wisely.

+

* Different tools may rely on different assumptions about their surrounding context &mdash; e.g., surrounding infrastructure, control model, data model, communication protocols, etc. &mdash; which can lead to an ''architectural mismatch'' between the application and the tools. Such a mismatch leads to hacks and workarounds that will make the code 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 greater the number tools the worse the problem can become.

-

[this is still work in progress]

+

* Some tools require quite a bit of configuration, often by means of one or more XML files, which can grow out of control very quickly. The application may end up looking as if it was all written in XML plus a few odd lines of code in some programming language. The configurational complexity will make the application difficult to maintain and to extend.

+

* Vendor lock-in occurs when code that depends heavily on specific vendor products ends up being constrained by them on several counts: maintainability, performances, ability to evolve, price, etc.

+

* If you plan to use free software, you may discover that it's not so 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. For example, in some companies it is not acceptable to use software licensed under the GNU license terms because of its viral nature &mdash; i.e., software developed with it must be distributed along with its source code.

+

My personal strategy to mitigate these problems is to start small by using only the tools that are absolutely necessary. Usually the initial focus is on removing the need to engage in low-level infrastructure programming (and problems), e.g., by using some middleware instead of using raw sockets for distributed applications. And then 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 forecast.

By [[Giovanni Asproni]]

By [[Giovanni Asproni]]

Current revision

Modern applications are very rarely built from scratch, but they are assembled using existing tools — components, libraries, and frameworks — for a number of good reasons:

Applications are growing in size, complexity, and sophistication, while the time available to develop them grows shorter. It is makes better use of developers' time and intelligence if they can concentrate on 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 lower development costs and greater likelihood of finding developers with the necessary interest and 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 surrounding context — e.g., surrounding infrastructure, control model, data model, communication protocols, etc. — which can lead to an architectural mismatch between the application and the tools. Such a mismatch leads to hacks and workarounds that will make the code 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 greater the number tools the worse the problem can become.

Some tools require quite a bit of configuration, often by means of one or more XML files, which can grow out of control very quickly. The application may end up looking as if it was all written in XML plus a few odd lines of code in some programming language. The configurational complexity will make the application difficult to maintain and to extend.

Vendor lock-in occurs when code that depends heavily on specific vendor products ends up being constrained by them on several counts: maintainability, performances, ability to evolve, price, etc.

If you plan to use free software, you may discover that it's not so 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. For example, in some companies it is not acceptable to use software licensed under the GNU license terms because of its viral nature — i.e., software developed with it must be distributed along with its source code.

My personal strategy to mitigate these problems is to start small by using only the tools that are absolutely necessary. Usually the initial focus is on removing the need to engage in low-level infrastructure programming (and problems), e.g., by using some middleware instead of using raw sockets for distributed applications. And then 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 forecast.