Software Development – Art or Engineering
There are many of us who consider software development an art form. Like an artist, we dream up the design of a software system and keep changing it until it becomes perfect. A well designed software system indeed has a beautiful and elegant design. Then the (software) artist moves on to coding. A well written code definitely stands out. A friend of mine used to say that the code should read like a novel. Not only a well designed system or well written code is easier to understand, it is easier to maintain and change as well. Many of us have tried to teach others the art of building beautiful designs or writing elegant code. However, at best we can come up with a set of guidelines. It is very similar to trying to teach someone to write a fiction. There may be guidelines, but the ‘magic’ has to come from within the author.
The software development managers, however, would like to treat software development as a form of engineering with standards everywhere whereas one piece may be replaced by another easily. In their dream scenario, one should be able to accurately estimate the time and resources required for a software project. Then they should be able to engage a set of software professionals as per the estimate – ‘x’ number of type ‘A’, ‘y’ number of type ‘B’, etc. They should be able to replace a type ‘A’ professional with another type ‘A’ professionals even in the middle of the project with no or minimal impact. This scenario allows them to engage the required type of professionals anywhere in the globe. Utopia? One would think…
Moving Towards Standards
Last several years has seen a massive change in the way we do software development. Let us talk about some of these changes:
- Inexpensive Infrastructure: We now have the proliferation of inexpensive (or free) infrastructure pieces, e.g., Apache, J2EE, .Net, JBoss, PHP, MySQL, Linux, Eclipse, etc. This has allowed us to concentrate on the application development rather than worry about memory management, inter-process communication, UI engine, etc. Just a few years back when I started a new project, my team would build the framework pieces first – every time. Today I use the already developed software for these standard tasks.
- Prebuilt Libraries: Now a days you can find a library for almost everything you want to do, whether it is to encrypt data, use a protocol, spell check, compute complex formulas, XML document processing, etc. Most of these libraries are free and supported by a thriving community of developers – leading to their widespread use.
- Open Source: Arguably open source has had the biggest impact to software development. Not only much of the infrastructure and libraries we talked about are open source, there are a slew of open source applications that could be used as the base to start with. Since source code is available, these applications can easily be modified to suit one’s needs. Just couple of weeks back I tweaked PHPBB to use with an application Gyanee when I needed a bulletin board.
This phenomena has made the application development process easier and faster. Some of the infrastructure software, libraries and applications have become so popular that it has resulted in a form of standardization. Some genre of applications use the same set of technologies, e.g., significant number of web applications use LAMP (Linux, Apache, MySQL, PHP) stack. The structure of these applications tend to be very similar.
An Opportunity for Commoditization
The above standardization presents a unique opportunity for the software managers. It is hence possible to partition applications such that some of the parts (modules) are fairly standard in nature. These use standard technologies, have standard interfaces, and standard structure. The plug-and-play utopia has a chance to become a reality in this case.
It gets only better if we combine the above phenomena with the inexpensive offshore development model. In theory, it is hence possible to farm out these ‘standard’ parts of a product to offshore teams, let them work on these, and then integrate with the rest of the product. This, IMHO, is commoditizing software development.
There is no doubt that this kind of standardization and commoditization is not possible for all the software projects. However, I submit that a large number of projects can benefit from this approach. I am equally certain that the software development process is ready for another revolution to take advantage of standardization and low cost offshore development.