The way in which you design is probably driven by personality and circumstance. Personality shapes what you like, and circumstance shapes who your teachers and mentors are. With those limitations in mind, I like to explore what is possible in engineering design, what works and what doesn't.
I tend to like to get something approximately right, and then iterate to something almost completely correct as fast as I can using that first one as a learning experience. Today I learned that this approach was once described as the "New Jersey" approach in programming. Its contrary was called the MIT approach, since that institution emphasized these elements at the time this term was coined.
The New Jersey Approach
- Simplicity-the design must be simple, both in implementation and interface. It is more important for the implementation to be simple than the interface. Simplicity is the most important consideration in a design.
- Correctness-the design must be correct in all observable aspects. It is slightly better to be simple than correct.
- Consistency-the design must not be overly inconsistent. Consistency can be sacrificed for simplicity in some cases, but it is better to drop those parts of the design that deal with less common circumstances than to introduce either implementational complexity or inconsistency.
- Completeness-the design must cover as many important situations as is practical. All reasonably expected cases should be covered. Completeness can be sacrificed in favor of any other quality. In fact, completeness must sacrificed whenever implementation simplicity is jeopardized. Consistency can be sacrificed to achieve completeness if simplicity is retained; especially worthless is consistency of interface.
The MIT Approach
- Simplicity-the design must be simple, both in implementation and interface. It is more important for the interface to be simple than the implementation.
- Correctness-the design must be correct in all observable aspects. Incorrectness is simply not allowed.
- Consistency-the design must not be inconsistent. A design is allowed to be slightly less simple and less complete to avoid inconsistency. Consistency is as important as correctness.
- Completeness-the design must cover as many important situations as is practical. All reasonably expected cases must be covered. Simplicity is not allowed to overly reduce completeness.
Lots of engineers like the MIT approach, and the author of the piece argues that despite this attractiveness, the New Jersey approach is superior, hence the catchphrase "worse is better." The way I've usually phrased it is "the perfect is the enemy of the good." I think this is a rule of thumb, and more useful in engineering than metaphysics.
Even though the context is programming, I think this can be applied to other fields of engineering as well. A really good appreciation of both risk and tradeoffs is key to making the New Jersey approach work. Since you can't actually create a perfectly simple, correct, and consistent design, something will always be inadequate. Knowing what really matters, and what can be given up without really harming your business or the customer allows for more rapid development and release, and better responsiveness to the market. However, part of the the appeal of the MIT approach is that when the New Jersey approach really screws up, it can be catastrophic. Regulatory controls tend to push engineering in the direction of the MIT approach, in order to prevent and eliminate foreseeable disasters.
h/t Ken Shirriff