Software development is a difficult endeavor. Development teams are expected to produce ever more complex software systems, yet economic forces require them to do it faster, better and cheaper. As software developers we have an unprecedented array of amazing tools at our disposal for developing, building and testing and deploying our software applications. We’ve made enormous strides in our methods with agile practices like iterative incremental development and test driven development. And yet we continue to build software applications the same way that automobiles used to be built - hand crafted one by one.
Let’s compare software development to the production of automobiles. Today a few very special automobiles are still built by hand. But if we had continued to build all automobiles in this way, then they would be enormously expensive and in very short supply. Quality would be erratic, safety and reliability would be problematic, performance would be unpredictable and parts would be hard to come by. Thanks to the industrialization of the automobile industry, we have an amazing variety of safe, reliable automobiles that address a wide array of needs at a reasonable cost.
Since industrialization was so phenomenally successful for automobile production, can the same approach be applied to software? Can we industrialize the software development? In short the answer is yes! But what does industrialization mean in this context? Clearly software is not the same thing as automobiles. But is it really that different?
Every automobile has many features in common. Each automobile has an engine, transmission, brakes, headlights, a steering wheel, etc. Some features are required – like wheels, while other features are optional – like a GPS navigation system. Some features offer choices – like the color of the body, while other features offer no choice – such as the gas pedal.
When automobiles were first mass produced, each automobile was identical. Today when you order a car you have many choices – type of engine, type of interior, type of wheels, as well as options such as a sun roof, compact disc player and anti-theft security system. These choices are made possible through a technique called flexible manufacturing. Although each car coming down the production line is the same make and model, each one is also a unique. Each car is configured with a different set of features based on the needs and preferences of the customer. Through flexible manufacturing, the production line is capable of producing many variations of the same automobile without the need for retooling.
A software factory applies the same concept of flexible manufacturing to software development. A software factory is a development environment configured to produce a specific type of application quickly and efficiently. The factory provides the tooling and guidance to rapidly develop a family of applications.
Each software application belongs to a class of applications; e.g., accounting system, word processor, ecommerce web site, etc. Within that class there are common features and variable features, in the same way that automobiles have required features and optional features.
The software factory combines a core set of common features with variable features that you select and configure. Once you have your custom feature set specified you use the software factory to automatically generate an implementation. You then manually tailor the implementation as needed to produce the finished product. In this way the software factory is a flexible manufacturing environment for software.
A software factory allows you to build software through mass customization, the ability to produce a range of similar applications by simply selecting the feature set for each application from a pre-defined set of features. This approach leads to economy of scope, where you achieve a significant increase in efficiency by leveraging reusable assets to build a variety of similar products.