Original The basic idea of writing software is to produce code that has not been produced before. Techniques like object-orientation, component-based design, service-oriented architecture, and refactoring are all there to help you in making each line of code unique. Ultimately, software developers think that, in a perfect world, each piece of code exists only once. And in searching for this utopia, trying to prevent any repetition of work, software developers have far more possibilities than, say, writers, painters, architects, and hairdressers. None of these other creative people have a similar array of techniques for abstraction and indirection. (In fact, they probably don't even know what that is.)
Useful Likewise, producing useful results is another basic idea of writing software. Quite possibly, no other type of creative activity has increased global productivity levels as much as software has done. The business value of software exceeds that of almost any other creative product, by several orders of magnitude. Software developers can hardly be compared to writers, painters, architects, or even hair dressers for that matter. They often don't even think of themselves as "creative", with all the wishy-washy connotations that often come along with that term. Most software developers are not of the poem-writing, ballet-dancing kind. They just want to be practical, and make stuff that is used.
So it appears that the terms original and useful touchthe very core of software development. And even though intelligence, discipline and routine all play important parts in many software projects, there is nothing to apply them to if it weren't for creativity.
Note: You don't have to agree that creative products are often useful, but that doesn't change the fact that software development is a creative activity. One that just happens to be useful.
The Creative Process The best-known model for the creative process was created by Graham Wallas and Richard Smith, in their work Art of Thought. The five-step process, consisting of preparation, incubation, intimation, illumination and verification, is just as applicable to software development as to any other creative activity. For example, let's suppose you are responsible for improving the performance of a web site. The process might go like this:
preparation: Finding out what the location and dimension of the problem is, like the time it takes for (some) queries to execute on the database server;
incubation: Pondering on the performance problem, both consciously and unconsciously, while taking a shower, playing poker and discussing the latest Batman movie with friends (possibly all at the same time);
intimation: Realizing that the solution might have to be found in a better data model, and not, as you thought earlier, in more efficient queries or better hardware;
illumination: Suddenly having the insight that a solution can be realized by splitting table Foobar in tables Foobear and Fooboar, while flattening the tables Lorem and Ipsum into one;
verification: Trying out the new solution, verifying and improving it, until it has the intended results.
This is creativity. People can be seen using a similar process during requirements gathering, analysis & design, construction, maintenance, management, and all the other disciplines of software engineering.
Our Creative Joy The creative part of software projects is what motivates most software engineers. Frederick P. Brooks, in The Mythical Man-Month, listed five reasons for it:
making stuff: We like making things that we can call our own, ever since we were able to pick up crayon markers and use them on the wallpaper in our bedrooms.
pleasing others: We like to be complimented by others, either directly or indirectly, for the things that we created for them.
solving problems: We like solving puzzles, as an intellectual endeavor, particularly when our solutions are unlike any other's.
learning things: We like gaining knowledge of problem domains, as knowledge improves our value to ourselves and to others.
handling tools: We like handling tools. And code (being nothing more than digitally written thoughts) is the most tractable and malleable tool we have ever devised.
All About People According to scientists, complexity –that interesting state between order and chaos– is the root of all creativity, in physics, biology, psychology and beyond. Only that which is complex can be creative. And with creativity being the root of software development, and people being very effective creative systems, it is clear that software development is all about people.
Note: This post is published automatically while I'm reading a book on a beach in Cuba. I will respond to any replies and comments, but it might take a while.