Here’s a bold statement: Traditional testing methods might be holding your team back from delivering high-quality software at speed. But what if there’s a better way? Ola Hast and Asgaut Mjølne Söderbom, in their insightful talk at QCon London, challenge conventional wisdom by advocating for a radical shift in how teams approach testing and feedback. Instead of relying heavily on end-to-end tests, they champion a combination of test-driven development (TDD), pair programming, and production testing to achieve faster, more reliable results.
And this is the part most people miss: Hast and Mjølne Söderbom trust their unit and integration tests so thoroughly that they’ve completely eliminated end-to-end tests. How? By embracing principles like separation of concerns, modularity, and high cohesion, which naturally align with TDD and pair programming. The result? A domain-driven design with exceptional code quality. For example, they’ve moved away from broad HTTP application integration tests, opting instead for focused tests with shorter feedback loops—a strategy that’s both efficient and effective.
But here’s where it gets controversial: They’ve largely abandoned test environments, favoring production testing instead. Why? Because, as Mjölne Söderbom explains, production is where the highest-quality feedback comes from. Test environments, with their approximations and often flawed data, simply can’t compete. To mitigate risks, they use feature toggles, deploying small, incremental changes that are easy to fix or roll back if issues arise. This approach has been their secret sauce for years, ensuring stability and speed.
In a previous article, the duo highlighted their team’s unique workflow: no solo tasks, no separate code reviews—just pair and mob programming with TDD. This collaborative approach not only boosts code quality but also fosters knowledge sharing and reduces waste. Interestingly, testing locally or in a test environment is rarely their focus; it’s a byproduct of their streamlined process, not the goal.
Pair programming and continuous integration are another dynamic duo in their toolkit. Pushing to main multiple times a day can be chaotic without pairing, leading to delays and merge conflicts. Pairing, however, enables instant code reviews, smoother refactoring, and fewer bugs—a win-win for team resilience and productivity.
Here’s a thought-provoking question: Is TDD primarily a testing tool or a design tool? Mjölne Söderbom argues the latter. Difficult-to-test code often signals design flaws, and TDD helps uncover these issues early, driving better design decisions. Fast feedback from tests is a bonus, but the real value lies in its ability to shape robust, maintainable code.
The key takeaway? Feedback loops are everything. Whether it’s from tests or production, feedback guides direction and enables quick course corrections. As Hast puts it, they tackle painful processes head-on by increasing deployment cadence and addressing issues where they hurt most. This relentless focus on fast feedback at every level has been their North Star for over a decade.
So, here’s the challenge: Are you ready to rethink your testing strategy? Could embracing production testing and TDD as a design tool transform your team’s efficiency and code quality? Let’s spark a discussion—share your thoughts in the comments!