Software Development is more like a professional competition than building a house


Construction metaphors are commonly used to describe the software development process to outside observers. It’s easy to see why this is a popular metaphor, it often appears like a structure being built to the outside observer. It’s not like building a house though, and describing it that way erodes confidence in the process for these outside observers, who often have a real stake in the delivery of the results of the process.



What are We Doing Day to Day?

The vast majority of people who call themselves software developers, software engineers, programmers, or any other of the myriad of terms we use to refer to ourselves, work for a company that offers a product or set of products in a competitive marketplace. As one of these people, I’ve observed a pattern in the way we work by ourselves, with our peers, with our customers and with our leaders (commonly referred to as The Business). We often conceptualize this pattern either within ourselves, or to external observers of the development process, through the use of the construction metaphor. Here’s what happens in reality, how it maps to the construction metaphor, and where the metaphor breaks down.

The Process Leading up to the Delivery of Software.

The Competition Starts with Delivering Something

How do We get Better at Practicing?

The majority of time spent creating software isn’t contained in the time it takes to write, commit, and test a particular piece of software. It’s in the time it takes to for the software developer to build an internal mental model of the overall system, and how the piece fits in to that. Once that mental model is built, the software itself can be rewritten in an insignificant amount of time. The creation and maintenance of this mental model within each developer is far more important to the end deliverable than any particular piece of written code.

These mental models aren’t as stable as something like learning to ride a bike or memorizing the alphabet. They take repetition to maintain and deliberate practice to add definition to. The moment you stop thinking about a mental model, it incrementally loses definition and recall-ibility within your mind.

This is much like practicing for a competition against a specific opponent. You are coming in with mastery of fundamentals, but it will take a unique combination of those fundamentals in order to win the competition. You practice that combination exclusively and intensely right up until the last moment before the competition. You also know that any distraction from practicing those fundamentals will lower your ability to perform in the competition.

There are lots of examples of how deliberate practice has lead to the success of and individual or a team in a competitive environment. There is one thing they all have in common. An intense focus on and mastery of fundamental components of a successful strategy followed by an equally intense focus on the progression and interaction of these fundamentals within the framework of their strategy.

The most important thing we do as software developers is focus our practice time on developing the fundamentals necessary to successfully executing our strategy. Communicating this fact clearly to our outside observers and establishing their trust in this process will allow us to work in an environment that encourages the most effective approach to delivering software projects.