Computers and software has become so pervasive in our daily lives it is hard to imagine doing anything without it. In fact, virtually everything we touch daily is powered by a chip of some sort and we as humans interact with the software running on it. Whether it is our cell phone, iPod, digital camera, television, video, car or the software we use at work and play, software is everywhere. With the price of computers continually dropping and the power continuously increasing, coupled with exponential growth in internet connectivity, there is simply going to be more software in 2006 and for years to come.
However, a fundamental problem still exists in the world of software. The process of creating software is still a labor intensive, error prone process that is fraught with complexity, bugs, schedule/cost overruns and unhappy users. To non-software professionals who are the masses that make up the software user community, software seems to be doing ok - maybe. I can listen to my iPod, while getting email on my computer and seeing text messages come in on my cell phone. However, what the masses dont see is the incredible effort required to design, construct, test and release any type of commercial software that has minimal bugs and meets your requirements.
As a software developer, the process we use to design and construct software is still trial and error at best. It may come as a surprise to non-software professionals that there isnt a predictable and repeatable process for developing quality software on time and on budget. While there are hundreds of books and thousands of articles on how to design and construct software, they are all different, with no tried and true process. Of course there are commonalities, but as the saying goes for every user requirement, there are a thousand designs and for each design there are a thousand ways to implement it. The variability in how we develop software is the curse of our industry.
Over the last 15 years as a software professional, I have worked on many software projects and products, some small, some very large and a lot in-between. I have also worked with hundreds of people on these projects. As I reflect on those projects, I realize that the ones that succeeded were based mostly on the highly skilled and competent people working on these projects.
Perhaps another surprise is that a lot of these people did not have Computer Science degrees, but rather came from all walks of life, however, all of these people had one thing in common they knew intuitively how to design and construct software. While some of this can be attributed to experience, most of it was an innate ability to read words as user requirements and translate those words into a working software program that somehow met what the user (community) wanted and was done on time and budget.
So what does this mean? It means that the design and construction of software, particularly business software, is still an unindustrialized process. What do I mean by unindustrialized process? I mean that we have progressed very little in the way of automation. We still hand-craft software just like cars were handcrafted before the concept of producing parts that were then assembled. That was almost 100 years ago!
It still amazes me that we have this incredible technology called software, yet our process of creating this software is quite archaic. On the industrialization scale, compared to other industrialized disciplines like manufacturing, building construction, electronics, etc., we are decades behind. What will drive industrialization in the software industry? This will be the topic of my next post in this series.