Designing software is difficult, unpredictable, and emotionally charged. Even seasoned developers face uncertainty, pressure, and the ever-present risk of looking back at a codebase and thinking, “I wish we had done this differently.” Most of us aren’t taught what to do with that regret—so we ignore it, rationalize it, or let it quietly accumulate.
This Masterclass takes a different approach. Instead of trying to eliminate regret, we’ll learn how to work with it. We explore software design regret as a natural consequence of learning in complex environments—and help participants develop strategies to respond constructively, confidently, and collaboratively. The focus isn’t on getting things right the first time, but on becoming more aware of our blind spots, building systems that are resilient to change, and sharpening the judgment needed to improve designs under real-world conditions.
Through hands-on coding exercises, personal reflection, and structured group discussions, participants will practise concrete techniques for managing the costs of design mistakes and recovering from them. We’ll work with a curated, intentionally flawed codebase that’s complex enough to challenge, but small enough not to intimidate—along with optional space to apply techniques to your own codebase.
This Masterclass is also grounded in practical realism. We understand that participants will return to environments with inertia, time pressure, and varying levels of team support. Rather than promise transformation through idealized practices, we focus on skills and strategies that work within your constraints—helping individuals and teams pursue meaningful progress without disillusionment or burnout.
Throughout, participants are invited to engage with skepticism and even cynicism—not as obstacles, but as honest signals of past frustration. This is a psychologically safe environment where people can discuss failure, frustration, or fear of judgment without being told to “just do it better.” Whether you’re burned out from past efforts to improve things, or you simply want to make thoughtful design improvements with less risk and conflict, this workshop is designed to meet you where you are.
Understanding Regret in Software Design
The Various Costs of “Not Knowing Yet”
Practising Where It’s Just Difficult Enough
Making Changes Safely Uses Techniques That Go Beyond Writing Unit Tests First
Refactoring for Discovery and Direction
Practising Foundational Design Moves
Collaborating Through Design Tension
Building Design Confidence and Communicating Clearly
Participants will leave with:
You’ll also receive curated post-class resources, including book recommendations, technique references, and ideas for follow-up experiments and conversations you can bring to your team. Facilitation support is available on request for teams who wish to continue this work with additional guidance.
This Masterclass is for anyone who writes code and has ever felt regret about a software design decision—whether because of a missed opportunity, a rushed compromise, or something that just didn’t turn out the way they hoped. Participants will benefit if they want:
All levels of experience are welcome. It will help if you already feel comfortable using at least one unit testing library and adding it to an existing project. If you don’t currently write code as a significant part of your job, you are still welcome to join—during hands-on segments, you’ll have the opportunity to engage in reflection, planning, or guided observation instead.
This Masterclass is designed to support a variety of technical contexts—including remote/distributed work, regulated environments, and legacy-heavy systems. While we won’t endorse any particular methodology or process framework (e.g., Scrum, Agile, DevOps), we’ll explore how to adapt core design practices within the organizational and technical constraints you already face.