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


B4B – Reinventing the Customer-Supplier Relationship – Book Review

I just finished reading B4b: How Technology and Big Data Are Reinventing the Customer-Supplier Relationship and it helped me understand the company I’ve been working for and others in the industry.

One of the models the book puts forth is one of 4 levels of companies. A company can stay at one level or try and progress to next levels. The authors put emphasis on the need for adding levels with AND, instead of OR.

The four levels are organized by the complexity of the offer and the result the customer is expecting.

  • Level 1: Simple Offer
    • This is like a simple product company, where the manufacturer distributes product to re-sellers that distribute to end users. An example might be a company that sells toasters.
  • Level 2: Complex Offer
    • This is like an IT or enterprise software company that sells a complex system. This offer requires someone to manage the system after purchase. This level of company will sell the product to a customer, like a hospital, and then leave and let the hospital engineers maintain the system.
  • Level 3: Optimize
    • This level of company offers complex products, but adds additional services. An example might be a software vendor that sells a product with an annual maintenance contract. This vendor might remotely monitor the software or perform routine maintenance or other programs to make sure the customer is able to use the product.
  • Level 4: Outcome
    • This level of company offers customers outcomes. An example is a copier machine company that does not sell copiers, but puts copiers in office buildings and sells per page. People are not buying copiers, not buying maintence contracts, but are buying a copy. Another example is Amazon Web Services offering servers by the minute.

The book takes these categorizations of companies and spells out useful advice for each. The Level 4 companies require more automation and not just per-outcome pricing. The authors warn that if a Level 4 company tries to sell using Software-as-a-Service (SaaS) pricing without the necessary level of automation, then it will cost the company a lot more. This is because the company will have guaranteed an outcome, but without automation, the delivery of each unit will vary. We know this in IT because depending on the employee and depending on different factors, the time required to set up a server can vary.

A lot of small and medium size traditional IT and software vendors are doing Level 2 and Level 3 offers, where they offer complex products and selling annual maintenance contracts. The book makes the argument that because customers are getting introduced to Level 4 companies in the consumer space, that they will increasingly expect Level 4 companies, like Salesforce and Amazon in the commercial space.

B4B makes the case that many software vendors products offer way more features than are actually used by any individual customer. This gap between the customer’s usage and available capabilities is something that software vendors should take notice of. What ratio of your developers work is going to adding new features, that might not actually contribute to value-add for the customer? With this feature/usage gap, those developers have cover to use an increasingly larger portion of their work time to implement the underlying platform needs, to bring their company to Level 4 automated offers. This requires deep instrumentation and understanding how customers use the product.

Integrating Systems Accelerates

I am working on integrating a variety of systems, some of which will only be known sometime in the future. Some of the challenges that arise are how to deal with the complexity and variety of systems. Below are some general thoughts on how to approach this type of work. With an increasing number of software systems in all walks of life, integration work will increase exponentially.

A system is the product of interaction between parts that cannot be achieved by any single part. Russel Ackoff has a good analogy. A car moves, but a motor can’t even move itself. Physical products were fixed products, whereas software systems usually integrate using versioned APIs with versioned back-end systems.

Below is one example of going about such integration work in a methodical way, not a comprehensive guide.

Pattern matching and analysis to understand the needs. How do you allow for variety, somewhat future-proof and enable scenarios through combining available and composable functions into a solution? Extensibility is implementing interfaces in a way that allow this. Classifying scenarios and analyzing them to find patterns can help create a map of needs. Someone thinking about extensibility should think in terms of using composable parts to then fulfill the needs.

Enabling architecture to meet needs and allow for variety through synthesis. Some of the useful parts of systems thinking that might help with successfully integrating systems include thinking of how the part fits in to the whole. Using classification techniques and then using pattern matching to run over the classifications can create a map of similar parts. A good part in our system tries to absorb variety while not being useless and ambiguous. Parts that can be combined to produce an increased number of useful interactions is better than a set of parts that produce less numbers of useful interactions. In reality, you will not know every scenario enabled, but you can do thought experiments and discuss it with other people to get an idea of which parts provide this better result.

Think in terms of the system when working with the parts. One thing that makes integration more complex than it needs to be is when people creating parts, expose the part implementation to people wanting to use the extensibility layer to make new interactions. It might be impossible in some scenarios to abstract away or hide the implementation details, but in a lot of cases it is something that can remain hidden. This does not mean parts have unique properties. It means that the unique properties exposed to the integrators should be thought of in terms of the system and whole the part fits in to the system, not how the part works.

An example of this with software is that you might need to transform data from one format to another. As a software developer creating the part, you might use XSL to transform the data, but having the integrator be responsible for providing XSL to an XSL part would be the more complex solution. If the system will require 10 parts to create the system, then this approach will theoretically require the systems integrator to understand 10 unrelated sets of technical details. Because the integrator is creating a system with parts, they will obviously have to know 10 different parts, but cognitive load should be related to the system and not the intricacies of the parts.

The systems engineer creating the parts might judge the complexity by the number of parts created, thinking that fewer parts means less complication. Thus the one XSL transformer that allows any XSL to be submitted might be judged better than the more strict phone translator. When you want an email translator, the part maker will have to make another part and this might be judged as adding complexity or work.

The less complex solution for system integrator in this example, would be if the part creator (software developer) created a set of parts around specific types of translators in the context of the system. If the system is about communication, then maybe there is a US Phone Number to International Translator. It will be more valuable for the systems integrator to talk about translating phone numbers every day they make systems from these parts than to reference XSL and its intricacies. It is appropriate for the systems integrator to think about area code, but not the syntax of an XSL if statement for example.

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.

Building Software Cathedrals

My work as a software developer at different companies has made me appreciate the need to visualize the software systems I build. A lot of times building software can turn more into each silo doing their work and briefly meeting to verbally say what their silo is doing or what the other verticals within the organization need to be doing.

The typical software development process I’ve participated in is mainly having a requirements document, a ticket system for work to be assigned and developers coding against the requirements. A few times I feel like we have done it the right way and were better off for it. The right way, for high-performance teams, is for the team members to focus on building the cathedral as Peter Drucker described.

Focusing on building the cathedral when developing software apps, Software-as-a-Service or other information systems means:

  • Visualize the system collaboratively. Sit down in the same room with a white board and a list of the user stories and requirements and different people stand up and draw what they see while others pressure test it, re-arrange things and add to it.
  • Work together, don’t just meet together. Produce work, writings, drawings, debate, flesh out contradictions and progress through work together. Do not just meet together with one or two people talking most of the time while others passively listen.
  • Write, do not just read or listen. Reading the requirements in a meeting, in a ticket or listening to requirements read verbally is not seeing the cathedral. Those are for analysis, a description of the desired system, it’s not a synthesis of what is going to be built or how.
  • Share writing, do not keep it private. The team needs to share their writings and not keep them private. Otherwise people will eventually splinter into their own rabbit hole and justify it by the notes they took. Even though it may seem too simplistic or obvious at first, without constant sharing and reinforcing then people will lose site of the cathedral and start focusing only on the proverbial stone cutting.
  • Have less meetings, but work more collaboratively. Getting together to work on the cathedral is not a meeting. Do not justify working together less by saying that meetings are a waste of time. Every time 2 or more people get together does not mean it’s a meeting and just because you are not coding 100% of the time does not mean you are not building software.
  • Progress as a team and address targets publicly. The team is needed to build the cathedral. Team members who constantly go off on irrelevant tangents or who take 30 minutes of team time to talk about screen resolution or irrelevant topics should be told publicly what they are doing and to refocus. This way, after a couple of times, they will self-focus and remain a participant with their valuable insights. If they are lost to attrition by team members leaving them off team time so “work can get done” then the team will be weaker over time, not stronger.