Software Development as an Economic-Cooperative Game

I was reading “The End of Software Engineering and the Start of Economic-Cooperative Gaming” by Alistair Cockburn. These two paragraphs frame software development in a different way as an economic-cooperative game, rather than the commonplace software engineering frame.

“Software development is a resource-limited, goal-directed, cooperative game, whose moves consist of invention and communication. The people, who are inventing, manipulating and communicating information across multiple heads, must share their information in order to produce the solution.

This means the speed of the project is proportional to the speed at which information moves between people’s heads. Every obstacle to detecting and moving information between heads slows the project. Understanding and attending to this issue is essential to playing the game effectively.”

Software Development is more than coding.

There are definitely coders out there. But the act of coding or writing syntax to create a program does not make you a software developer. A true software developer is playing this game and as a professional, they’re asking what do I need to become to play the game at the next level. The software developer’s abilities include programming, but also include learning to make these time and capability tradeoffs and communicating more effectively for shared understanding.

One of the main thesis in the post is that invention and communication increase proportional to the speed information moves between people. More specifically than just information, how fast shared understanding moves between peoples heads. This explains why:

  • Delivering the system soon and inexpensively competes with creating an advantageous position for the next game. [Alistair]
  • Creating inexpensive markers competes with creating them to work for a wider range of new people. [Alistair]
  • Keeping the team intact competes with introducing new people. [Alistair]
  • Using a smaller number of highly qualified people (with lower communication costs) competes with using more people of more average capability. [Alistair]

Why I enjoy playing the game of software development.

People will usually equate me saying I love software development to me being a “tech guy” and liking to “write code” or being a “programmer”. These are parts of the craft, but I view myself as participating in the business as a whole. Not all businesses think of software developers as integrated with the business as a whole. Some view software development as a manufacturing task, so it would not be integrated and could be delegated to an outsourcing company.

I have drawn a graphic of how I view Alistair’s observation at the bottom of the page. I think with this understanding of software development, it helped pull back the curtain of why I like certain aspects of software development, mainly those experienced through the frame of an economic-cooperative game. When software development is framed only about engineering or just the syntax, or the machine, then I lose interest. When I want to learn a new programming language or pattern, I typically create a project for myself to work through so I can go through the game with the new technology.

Software development is not experienced by an individual as programming, although programming languages are part of the skillset. To me, it is like the game of basketball is not experienced as players running up and down a court for 2 hours, although running is a skillset required. My enthusiasm for the game, is more about playing the economic-cooperative game and not so much about a coding language. Another analogy is how an author is telling a story (software), not spending all day typing.

A software developer’s contribution to the business is beyond manufacturing code.

Looking at software development through the lens of this type of economic cooperative game also introduces a pathway for everyone contributing to a business to understand how software developers participate, beyond code. Meaning how software developers participate in business beyond production, beyond manufacturing code. Many businesses are going through a digital transformation, where they are increasingly becoming software businesses. Software businesses need good software developers to contribute to the business. They will influence how the business is experienced by customers. A digitally transformed business looking for good coders, is like a basketball team looking for good runners. Finding a good runner might not make your basketball team any better.


The diagram shows the span of delivering multiple software goals (releases) across time (Time 1, 2 and 3) and the tradeoffs between being goal oriented during Time 1 while having to balance what to keep in mind for Time 2, but still delivering during Time 1 to meet your goal and you always have limited resources, which makes the tradeoff necessary. So you can put in a better platform in Time 1 to support Time 2, but it will keep you from doing other things in Time 1. Or you can create “throw away code” in Time 1 and realize your Time 1 goal faster, but that decision might make your Time 2 goal smaller or stretch out longer because you have to rework it instead of continuing to build on top of something already useful in the stack. Then you have the coding patterns like the Strategy Pattern to help, but you also have meta patterns, something that’s not in code, but still considered part of the software you are creating, like the domain concepts, that can help or hurt with this game too.

Software Development.png


Not Reinventing the Wheel to Reduce Costs

Sometimes someone within an organization will task the software development team with developing new software features and prescribe a solution that “does not reinvent the wheel”. Many software consultancy companies create software based on the problem-solution paradigm. There is one major customer that has a specific problem, the consultant analyzes the requirements of this customer and formulates a solution.

With the goal of saving costs the consultancy will try to resell this solution to multiple customers, what the consultancy terms “productizing” the application. I believe it is wrong to classify a consultancy’s output as a resalable product like a cog in a machine. The nature of this customer/consultancy relationship is that the next customer will have requirements that are analyzed and the software will need to be changed, which is at odds with profitability because the goal with the second customer initially was to resell an existing solution. To continue to attempt to save on costs the consultancy that is now analyzing the requirements of the second customer will task the software development team with new requirements, prescribing reusable parts of a prior solution and pushing not to reinvent the wheel. What is meant by this is to leverage existing code. However, the second customer’s problem is different than the first customer’s problem, new requirements have been captured the resulting system that needs to solve the second customer’s problem needs to be examined first as a system and not individual swappable parts. After all, what was initially created for the first customer was a solution to a specific problem inside the context of one customer, not a general-purpose reusable framework. Inevitably the second customer has unique demands that end up contradicting the first customer’s and this makes the system grow more complex.

Another way to approach this is if you want to create a product, then analyze different potential customers at the beginning and synthesize a product that addresses those customer pain points. Generate your own frame of looking at the problem (your way of adding value) and spend energy building the framework you will use to build the product, even though the framework has no individual customer yet. A part of a product’s value is how it frames the problem, not just that you can buy a cog. Analyzing customer requirements individually and transmuting these directly into development tasks will not create a product, even though it might result in a solution for a specific customer. A consultancy is not wrong, but terms and business processes that work in product companies might actually be greedy shortcuts in a consultancy that end up misunderstanding and prioritizing future customers solutions.

I’ll give an example to demonstrate how creating a solution for one specific customer is in conflict with creating a resalable product. If you are creating a solution for a specific customer’s problem then you will continuously be trying to keep that one happy satisfied and solving their problems. No two customers are exactly the same. However, if you are building a product then it is acceptable that some potential customers might not be ready to use your product because they are too small or potential customers have outgrown your offering and are ready to move on to other solutions outside of what you offer. In this case, you might lose a customer through no fault of your own and your product is still a success. In a consultancy you have failed if you lose a customer. In a product company you are trying to create customers that are a fit for your product and you are inviting customers to frame their problem so it fits your product solution.

Another example is a consultancy does not want a customer to solve their own problems. Demand for the consultancy increases when the customer has more problems they want solved. This orients the consultancy around expanding to solve more of fewer customer’s problems because the path of least resistance is to sell more solutions to someone who is already paying you. On the other side, a company selling a product can align with insight selling where customers armed with data from websites and research done by themselves have been heavily influenced in knowing what solutions can be used to solve their problems.

Not reinventing the wheel cannot be prescribed because a consultancy wants to reduce costs. Not reinventing the wheel is a constraint on the input and is decided by how the business operates before it gets to the software development team.