Understanding and Managing Friction in Software Development
Effective software delivery depends on strategically managing friction - the forces that impede progress between ideation and implementation. Technology leaders who master this capability systematically eliminate unnecessary barriers while preserving essential protective controls, achieving both speed and quality in their organizations.
Carl von Clausewitz's observations about war remain remarkably relevant when applied to software development:
Everything is very simple in War, but the simplest thing is difficult. These difficulties accumulate and produce a friction which no man can imagine exactly who has not seen War, Suppose now a traveller, who towards evening expects to accomplish the two stages at the end of his day’s journey, four or five leagues, with post-horses, on the high road—it is nothing. He arrives now at the last station but one, finds no horses, or very bad ones; then a hilly country, bad roads; it is a dark night, and he is glad when, after a great deal of trouble, he reaches the next station, and finds there some miserable accommodation. So in War, through the influence of an infinity of petty circumstances, which cannot properly be described on paper, things disappoint us, and we fall short of the mark.
Replace "War" with "software development," and his description captures the essence of our modern technical challenges. Just as a traveller faces unexpected obstacles that transform a simple journey into an arduous trek, software teams encounter countless small impediments that compound to create significant barriers to progress.
The Three Pillars of Software Development Friction
Infrastructure Friction
Infrastructure friction represents the most tangible form of resistance in software development. It manifests in systems, code, and tools - particularly as technical debt, that accidental complexity that makes tasks take longer than they should. It's the gnarly bit that uses reflection and stubbornly refuses to refactor, or that manual implementation of a pattern that's now available in the standard library but implemented subtly differently.
However, infrastructure friction extends beyond code-level challenges. It encompasses the entire path from committed code to customer value, including flaky tests, slow pipelines, poor version control, and environment inconsistencies.
Execution Friction
Execution friction emerges from the workflows and ceremonies that guide software development.
Understanding gaps manifest as unclear requirements, leading to misaligned expectations and rework. These gaps often arise from insufficient communication between business stakeholders and development teams, or from requirements that lack necessary context and clarity.
Ceremonial overhead occurs when processes become ends in themselves rather than means to an end. This happens when the ceremonies of software development such as stand-ups, sprint planning, retrospectives become the deliverable rather than a tool for building and involving people in problem-solving.
Recommended by LinkedIn
Human Friction
Human friction encompasses the collaborative and cognitive challenges in software development. It manifests when organizational structures and interactions hinder the effective flow of information and collaboration. This friction often stems from siloed teams that create barriers to knowledge sharing and lead to duplicated efforts. It is exacerbated by misaligned priorities between groups working on the same product, causing inefficiencies and conflict. Additionally, the use of ticket systems can transform rich, dynamic human interactions into transactional (and delayed) exchanges, further stifling collaboration and mutual understanding.
Measuring Development Friction
Effective friction management requires systematic measurement. The Accelerate metrics provide a foundation for measuring delivery performance with the four key metrics. The SPACE framework included developer productivity measures around satisfaction, performance, activity, communication and flow.
You almost certainly need additional measures in your company to find and identify friction (maybe it’s the pull request review process? maybe it’s waiting for approval? maybe it’s the need to set up a meeting?).
The Protective Role of Friction
Not all friction in software development is detrimental. Like brakes on a car, some forms of friction serve protective functions in the development process. Creating the right friction points can help enhance quality, security, and alignment.
For example, RFC (Request for Comments) and ADR (Architecture Decision Record) processes add deliberate friction to significant changes. While they may slow initial development, they can improve design through early feedback, document decisions for future reference and prevent costly architectural mistakes.
Similarly, when operating software production access controls exemplify beneficial friction in operations. The friction helps reduce risks of accidental changes, creates clear audit trails and ensures compliance with security requirements.
Managing Friction Effectively
The key to successful software development lies not in eliminating all friction, but in maintaining a balanced approach that:
By understanding the different types of friction and their roles in software development, teams can work more effectively to manage them. The goal is not to eliminate all resistance but to ensure that every point of friction serves a purpose in delivering better software.
Success in software development, like success in Clausewitz's warfare, depends not on avoiding friction entirely but on understanding its nature and working effectively within its constraints. The teams that thrive are those that can distinguish between protective and destructive friction, maintaining the former while systematically eliminating the latter.