Creating Software is one of the most creative activities that humans undertake. The main limitation in software is the Human Imagination, and the limits on that are all self imposed. Through the Software Engineering model we see a linear, sequential model of Software Development, something that drastically reduces our ability to create really great software.
Through the application of creativity, it is possible to create truly great software. The only problem is that doing so requires that developers have the freedom to explore different designs, and the ability to choose the design that most closely matches the spirit of the requirements rather than the letter of the requirements documents.
Software Creativity occurs when we take time to explore the design space of possibilities, rather than immediately fixating on the first solution that comes to mind. A good example of this is my current favourite development tool, Borland Delphi with it's tightly integrated code and graphical editors, allowing a developer to make changes either via the text editor or any of the other tools. Now if they can only come out with a Java or C++ version. (1997 addition) C++Builder and JBuilder are both answers to this request.
One of the main ways we impose limits on our imagination with respect to Software is the "engineering" model of software development. The background thought, possibly dating back to Parnas, is that software development should be a linear sequential process. Unfortunately, Parnas in his paper "A Rational development process, How and why to fake it", was talking about how to understand what has been developed.
So most design documentation that we see is written as if the design was developed linearly in a clean sequential manner. This arguably does help someone understand how the system currently works, but it also has a very unfortunate set of side effects. One effect is that our minds take away, after seeing many clean linear expositions, the assumption that creation process should be linear as well. Another effect is that we assume software is frozen in time, rather than undergoing dynamic evolution.
The dynamic evolution of software is something that all really great software needs to take into account. As Richard Gabriel states in Patterns of Software, "How habitable is our software, can we, as developers, really live in and extend our code?" For a static design, habitability is not an issue, but for a design that is in a constant state of evolution, habitability is a major design consideration.
Another implication is that developers need to be concerned about creativity. Although most people would ascribe to the idea that software development is a creative activity, few people think that they are really creative. The effect of this on software development is drastic. Few developers learn how to really evaluate designs, since one consequence of being able to evaluate a design is the need to create alternatives if the first one is lacking.
One mechanism that I have found very useful for improving my skills at evaluating designs is to always create at least 3 alternative designs. Having at least 3 alternatives means that the evaluation process has to be thought about. If one of the designs is massively superior to the others in all scenarios, then this is usually a symptom of weak alternatives or lack of imagination in creating the test scenarios.
I also find it very useful to ensure that there are always at least 3 alternatives, such that if one design is eliminated from consideration, another alternative is created. The reasoning behind this is I want to ensure that the evaluation process does not get polarised between two alternatives, and three is the minimum number required to prevent this polarization.
A useful primer on this subject is Software Creativity by Robert Glass, Prentice Hall 1995, somewhat academic in tone, it explores the need for creativity in software development. Serious Creativity by Edward de Bono is a very useful sourcebook for ideas on improving creativity.
(C) 1996,1999 Software Craftsmanship Inc., all rights reserved.