Total Software Engineering

The practice of Total Software Engineering and it's similarity to Total Football

Total Software Engineering

The fast paced rate of progress in software technology, the continuous introduction of new languages, frameworks, automation techniques and the common acceptance of agile delivery methods, requires a holistic approach to software engineering.

Taking inspiration from the Total Voetbal system made famous by the Dutch national football team in the 1974 World Cup, we might call this approach Total Software Engineering,

Total Football's tactical success depends largely on the adaptability of each footballer within the team, in particular the ability to quickly switch positions depending on the on-field situation. The theory requires players to be comfortable in multiple positions; hence, it requires very intelligent and technically diverse players.
Jack Reynolds (John Reynold)[2] (23 September 1881 in Manchester, England – 8 November 1962 in Amsterdam, Netherlands) was an English football manager and player. He was the manager of Ajax Amsterdam from 1915–1925, 1928–1940, and 1945–1947. He was one of the pioneers of the Total Football system of playing and is considered among the best managers the team has had. He also managed Swiss side St Gallen.

Business Value and Software Development

At the end of the day, the goal of writing software is surely to provide value to the business. Coding is not an end in itself. Intricate and esoteric code employing all available design patterns or coding constructs, detracts from the primary aim of providing business value. Instead we need to write maintainable as well as sustainable software. If the code is hard to maintain and adapt then it will be equally hard to deliver needed business outcomes and will eventually impact the business itself.

Therefore, it makes sense to choose languages, technologies and working principles that help readability, maintainability and sustainability of the total software engineering.

Cross Functional Team For Agile Software Delivery

To remain competitive, automation in software delivery is essential. Testing, delivery and even operations are all candidates for automation.

This introduces a strong inter-relationship between development and other aspects of software delivery.  The developer is no longer just coding the business requirement. We can see that title changing to something more encompassing in future. As in Total Voetbal, the coder is required to diversify and adapt, to also understand and even write automated test code, CI infrastructure code, operational monitoring code, etc. We see that it is all still a form of coding. Within a cross functional agile team, various members of the team now need to work more closely together, specialist and generalists. The team as a unit delivering valuable stories which aim to provide business advantage when completed. With all the skills embedded in the team hand-offs* to another team are avoided.  Such an autonomous team needs to embrace total software engineering.

As the team ability grows,  members of the team are able to expand their skills to work on other parts of the SDLC and so collectively help progress the story to done. The T shaped aspect of each member gets broader.

* Once you hand the story to another team, you have to reconsider what your definition of done is, and also whether your estimates are relevant to that definition as you are no longer in full control of your destiny, even when SLAs are promised. On the other hand when you can truly deliver the story autonomously, you can also converge to more accurate estimates.

The Polyglot Engineer


We often hear of the need for full-stack engineers, so in this regard a total software engineer has similar broad skills. Perhaps something like the following:

A compiled language (Java, Go), a scripting language (Javascript, Python), front-end (ReactJS, VueJS), servers (Go, NodeJs, SpringBoot), devops (Jenkins, Gitlab, Docker, Terraform, K8S, some Cloud).

Not really a complete list, but even so it's a big ask. To arrive at this skill set within an individual or more reasonably within a team, not everyone needs to be an expert in all aspects to be valuable. In fact, to keep things simple and maintainable, what you need is sufficient expertise to be able deliver to production effectively. Members of the team help coach each other to become technically multi-lingual. Members of such a team can no longer say I only speak Java.

In Conclusion


To pursue total software engineering, what is needed is the ability to learn other skills or languages, without having to know every intricate detail and be focused on providing business value. Members help each other in gaining these new skills.

Aim to create simple*, understandable and readable code at all levels of the delivery pipeline. Question the need to use all those myriads of design patterns, obscure coding features and unconfirmed features.

As in total football, a high performing agile team requires adaptability and diversity, the readiness and willingness to learn and do whatever tasks are needed to help deliver the business outcome. The team also benefits, as each individual grows to a greater level of understanding and ability.

While being a total footballer you can still excel at what you do best. The Cruyff turn is a thing of beauty.

* "Entities are not to be multiplied without necessity"
(Non sunt multiplicanda entia sine necessitate)
Occams Razor
KISS, an acronym for "keep it simple, stupid" or "keep it stupid simple", is a design principle noted by the U.S. Navy in 1960
Kelly Johnson
Simplicity is hard to achieve. See simplicity of Go by Rob Pike https://talks.golang.org/2015/simplicity-is-complicated.slide#1

Acknowledgement

Thanks to Martin Bamford for his encouragement and advice in writing this article.