Individual skill makes a huge difference:
A good programmer is ten times more productive than an average programmer. A great programmer is 20-100 times more productive than the average. Studies since the 1960’s have consistently shown this. A bad programmer is not just unproductive—he will not only not get any work done, but create a lot of work and headaches for others to fix.
“A great lathe operator commands several times the wage of an average lathe operator, but a great writer of software code is worth 10,000 times the price of an average software writer.” –Bill Gates
Although most software is made by teams, it is not a democratic activity. Usually, just one person is responsible for the design, and the rest of the team fills in the details.
Only 10% of building software involves writing code:
Over the lifetime of the project, a programmer spends about 10-20% of his time writing code, and most programmers write about 10-12 lines of code per day that goes into the final product, regardless of their skill level. Good programmers spend much of the other 90% thinking, researching, and experimenting to find the best design. Bad programmers spend much of that 90% debugging code by making random changes and seeing if they work.
Programmers who spend much of their time writing code are too lazy, too ignorant, or too arrogant to find existing solutions to old problems. Great programmers are masters at recognizing and reusing common patterns. Good programmers are not afraid to refactor (rewrite) their code to reach the ideal design. Bad programmers write code which lacks conceptual integrity, non-redundancy, hierarchy, and patterns, and so is very difficult to refactor.
Programming is hard work. It’s an intense mental activity. Good programmers think about their work 24/7. They write their most important code in the shower and in their dreams. Because the most important work is done away from a keyboard, software projects cannot be accelerated by spending more time in the office or adding more people to a project.
Software is hard, and obeys the law of entropy:
Software development obeys the laws of entropy, like any other process. Continuous changes leads to software rot, which erodes the conceptual integrity of the original design. Software rot is unavoidable, but projects without an effective conceptual focus can rot so so fast that they becomes worthless before they are even completed. Failure of conceptual integrity is probably the most common reason for software project failure. Such software become bloated, buggy, slow to run and slow to change, and and pleases no one by trying to please everyone. Software rot slows down progress exponentially, so many projects face exploding timelines and budgets before they are mercifully killed. Successful software does one thing only and does it well before trying anything else.
A 2004 study found that most software projects (51%) will fail in a critical aspect, and 15% will fail totally. This is an improvement since 1994, when 31% failed.