TDD, BDD, Design patterns, SpecDDD this and many more are terms to be discussed whenever you step into any conversation centered on best practices. What if I told you that they all related and are all an implementation of one basic principle?
In On the cruelty of really teaching computing science Dijkstra famously points out
Compared to that number of semantic levels, the average mathematical theory is almost flat. By evoking the need for deep conceptual hierarchies, the automatic computer confronts us with a radically new intellectual challenge that has no precedent in our history.
Still with me? By now you may have already guessed it. All Engineering practises are driven by the need to manage complexity in software
So what do I mean when I say manage complexity? Well that means trying to cram an entire program/application into your head is an exercise in futility but rather we build tools (JUnit, PHPUnit) to check functionality of our code and even better we organize our code in such a way that we can safely focus on only one part at a time (Design Patterns).
So what can we do with this knowledge of the basic principle guiding software engineering? For one we can come up with some rules of thumb in evaluating our design choices, remember we have talked about their wickedness in the past.
Rules of thumb when making design decisions
- Always select the simpler design
- Always assert inputs to ensure that your simple design covers all business cases
- A simple but wrong solution is useless
- Minimize contextual knowledge needed to understand your code at any point
There we have it. How have you dealt with complexity in your own projects? Talk to us on the comment section below.