NO SILVER BULLET

Three Dots Labs

Based on nearly 20 years of working together on various projects, we discuss when it makes sense to move fast rather than aim for perfect code, and how to avoid technical debt that can kill your project. We focus on making mindful engineering decisions instead of blindly following rules like “always do X” or “never do Y”. Different situations need different approaches to code quality.

  1. 12/19/2025

    How to Know If your Software Is Overcomplicated or Oversimplified?

    Episode notes: https://threedots.tech/episode/overcomplicated-vs-oversimplified-code/ Quick takeaways Complexity comes from two extremes - projects fail both when they’re overcomplicated with unnecessary patterns and when they’re oversimplified for a complex domainEssential vs accidental complexity - essential complexity comes from the domain itself and can’t be removed, accidental complexity is created by poor implementation choices“Keep it simple” is lazy advice - achieving simplicity takes effort; closing your eyes to complexity just pushes it elsewhereMatch patterns to the problem - using the same approach everywhere is a red flag; mix simple solutions for simple parts and sophisticated patterns for complex domainsShip fast and iterate - if you can’t deploy daily and fear making changes, something is wrong regardless of whether it’s over or under-engineeredWe discuss where complexity in software projects comes from and how to deal with it. There are two common extremes: projects that are overcomplicated because someone applied patterns they saw at a conference without understanding them deeply, and projects that started simple but became a tangled mess as they grew. Both can be equally difficult to work with. The key insight is understanding the difference between essential complexity (inherent to your domain) and accidental complexity (created by your implementation choices). We share diagnostic signals to identify unhealthy projects and practical advice on matching your tools to the actual problem you’re solving. No Silver Bullet paper by Fred Brooks - discusses essential vs accidental complexityDomain-Driven Design (DDD) - a pattern for tackling complex domainsClean Architecture - another approach for managing complexityYAGNI (You Aren’t Gonna Need It) - principle against premature generalizationDefensive programming - validating inputs early to prevent errors propagatingCanary releases and rollbacks - deployment strategies that can add overheadThree Dots Labs blog - articles on Go patterns and architectureGo with the Domain ebook - free ebook about DDD in Go with 60,000+ downloadsWild Workouts example DDD project - complex Go project demonstrating real-world patternsMicroservices architecture - discussed as sometimes adding unnecessary complexityCRUD applications - simple approach that works for some domains but not othersThe Domain Engineer training - upcoming training mentioned for early next year

    41 min

About

Based on nearly 20 years of working together on various projects, we discuss when it makes sense to move fast rather than aim for perfect code, and how to avoid technical debt that can kill your project. We focus on making mindful engineering decisions instead of blindly following rules like “always do X” or “never do Y”. Different situations need different approaches to code quality.

You Might Also Like