Evan d'Entremont

intentionally provocative musings on tech

đŸ‡«đŸ‡· Switch to French

The history of all hitherto existing projects is the history of estimation struggles.

Agile methodology was supposed to be a game-changer. It promised flexibility, teamwork, and a focus on delivering real value. In an industry weighed down by rigid processes and long timelines, Agile seemed like the perfect fix. But over time, the original vision got twisted. Instead of empowering teams and improving quality, it often became an excuse for rushed and low-quality work, all under the pretense of ‘speed’ and ‘flexibility.’

In theory, Agile should lead to constant improvement and happy customers. In reality, it often results in chaotic management, shifting goals, and unrealistic expectations. The focus on speed leads to a cycle of incomplete work, technical debt, and a product that’s barely holding together.

The reality is that Agile, like other big ideas, often falls short when faced with real-world challenges. The idea of creating better software through constant updates and feedback often turns into a mad dash where quality is sacrificed.

In this post, I’ll explain how Agile has been misused, why it often fails, and how it’s similar to another system that looked great on paper but didn’t work in practice: communism. Although it may sound extreme, comparing Agile to communism helps us understand why Agile frequently fails to deliver on its promises.

Manifesto vs. Reality

Communism sounds good in theory: a society where everyone gets what they need, and everyone works according to their ability. But it only works if you remove people from the equation. Human nature—self-interest, power struggles, and varying levels of motivation—ends up ruining the ideal. The same problem applies to Agile.

On paper, Agile is all about teamwork, flexibility, and adding value. But in practice, it often becomes a mess of chaotic management, rushed work, and constantly changing goals. Just like communism doesn’t account for human nature, Agile often doesn’t account for the real challenges of working in an organization or developing software.

In theory, Agile helps teams estimate effort and align priorities through discussion. In reality, many developers dislike rituals like Planning Poker because it forces them to guess and estimate in ways that don’t reflect the actual work. This leads to poor planning and unrealistic expectations.

That’s how you get ants

Bugs are a major headache in software development. They’re sneaky, chaotic, and can turn into big problems. Agile, with its fixed-length sprints and rigid rules, isn’t set up to handle this level of unpredictability. Trying to estimate bugs is like trying to plan for a disaster you don’t know about until it happens.

This unpredictability is why bugs should be dealt with before new features are added. If bugs aren’t fixed right away, they pile up and make the system fragile and hard to maintain. Agile’s focus on adding new features can turn the codebase into a house of cards—fragile and complex, where even small issues can cause everything to collapse. This builds up technical debt and slows down future development while increasing the risk of serious failures.

Joel Spolsky lists 12 key practices that separate strong teams from those at risk of creating such a fragile system:

  1. Do you use source control?
  2. Can you make a build in one step?
  3. Do you make daily builds?
  4. Do you have a bug database?
  5. Do you fix bugs before writing new code?
  6. Do you have an up-to-date schedule?
  7. Do you have a spec?
  8. Do programmers have quiet working conditions?
  9. Do you use the best tools money can buy?
  10. Do you have testers?
  11. Do new candidates write code during their interview?
  12. Do you do hallway usability testing?

These practices are still widely considered essential for software quality and stability. While some practices, like using source control and making daily builds, are within a team’s control, others are influenced by external factors. Agile, when misapplied, often makes these challenges worse.

For example, maintaining an up-to-date schedule, having a clear spec, managing a bug database, and prioritizing bug fixes can all be affected by Agile. The constant push to deliver new features can lead to chaotic schedules, unclear specs, and a backlog of unresolved bugs. Agile can undermine these essential practices, pushing teams to sacrifice long-term quality for short-term gains.

Other important practices—like providing quiet work conditions, using top-notch tools, and doing usability testing—are often out of the team’s control. These factors are crucial for long-term success but are often overlooked in Agile environments where short-term delivery is prioritized.

When these foundational practices are compromised, the result is a fragile codebase that resembles a house of cards. Each new feature added without fixing underlying issues increases the risk of collapse. Agile, when it focuses on speed over quality, can turn a solid product into a shaky structure vulnerable to even minor disturbances.

The Tyranny of Flexibility

The most dangerous aspect of Agile is how it’s often used as an excuse for poor planning. The “flexibility” that Agile promotes can become a way for stakeholders to change their minds at the last minute without considering the impact on the team or the product. This isn’t flexibility; it’s chaos. Real flexibility would mean adjusting timelines, resources, and expectations when priorities change, not just expecting teams to work faster and cut corners.

The problem is that teams often pick only parts of Agile they think will solve their problems, without fully embracing the methodology. Agile is meant to be a complete system where all parts work together to support adaptive planning and development. When teams only use some Agile practices—like daily stand-ups or sprint reviews—while ignoring important elements like feedback loops and backlog grooming, they miss the point of Agile.

This incomplete approach creates a false sense of agility, where only the surface-level practices are in place, but the underlying principles are ignored. Stakeholders may see these practices and expect quick fixes, not realizing that Agile’s real value comes from its balanced approach to flexibility and discipline. Without fully adopting Agile’s principles, teams are left with a disjointed process that increases chaos instead of creating a productive workflow.

The result is a cycle of constant re-prioritization and shifting deadlines without adjusting resources or scope. Teams are pushed to meet unrealistic expectations, leading to rushed work, technical debt, and a compromised product. Agile’s potential to improve responsiveness and project outcomes is lost when its practices are used in isolation, making flexibility a cover for poor planning.

Seize the means of Production Environments

The irony of both communism and Agile is that their failure comes not from their ideals but from their implementation. Both systems struggle when human nature and complex realities disrupt their theoretical models. In software development, the goal is not to force rigid methods or overestimate but to step back and let developers focus on their strengths: solving problems and creating great software.

Agile can work, but we must stop thinking of it as a one-size-fits-all solution. We need to move beyond ineffective rituals and focus on creating an environment that values quality and thoughtful planning. Everyone needs to push for meaningful change by supporting practices that genuinely help development rather than sticking to superficial Agile rituals. It’s time to clear the way, let developers excel, and adopt a more balanced approach. Only then can we hope to achieve Agile’s true potential and avoid treating it as a misguided revolution.

last updated 2024-09-22

Posts