OOMP: Realistic Design

By | October 1, 2025

After seeing how our careful and thoughtful design changes over time, it should be obvious that some designs will not survive implementation or later maintenance. It should also make you wonder how to do a better job on design.

Looking Back on your Design

In the future, some of your great decisions will look naive. This should be obvious because you learn as you implement the design. You will almost certainly learn things that you didn’t know when you started. As such, some earlier decisions will have been naive. That’s not a problem to fix, that’s just something to be aware of.

For that reason, you want to avoid getting too detailed early in the design process. You also want to avoid getting too attached to your early decisions. As the implementation continues, you need to re-examine your assumptions to see if and when your design needs to adapt.

Picking the Right Design

Some people after seeing designs go off the rails in implementation, double down to try harder to get the right design. They try to find a design approach that will always work. Patterns that will guarantee that we won’t need to do re-work.

In my experience, there is no one, true way to develop software. No design will always work in all circumstances. No pattern or set of patterns will always work. A large part of this is that no two software systems are exactly alike. If you need a second system that is exactly the same as one you’ve already built, just copy the code. Problem solved.

Every system will need a bit of design, because it will be the only one of its kind. So, any design we choose needs to be somewhat flexible. We should do just enough design to direct the long-term goal of the project. We’ll re-examine the design and adjust it as new information becomes available.

Trade-offs

No design approach is perfect, and there are a large number of things we will learn as we work through the implementation. As we implement the design, we will find places where the needs of the implementation and the details of the design will diverge. In those cases, we will need to modify our plans. At those points, we will see different approaches we could take to modifying our design.

Every design is based on a series of sub-optimal trade-offs. That applies both to the initial design and the design that exists at the end of the project. Any decision in the initial design or decisions made during the implementation, is a trade-off made based on what we knew at that point. Each of these decisions is a trade-off that is probably sub-optimal because we still don’t know everything when we made the decision.

Someone looking back at the design after the project is done will see a number of trade-offs that they disagree with. This looks like bad design, since the person does not have all of the information the implementers did at the time of the decision. While building a system, each decision will examine different possible solutions or approaches. Based on what we know at that point and what we think we know about the future directions, we will choice a direction that seems to be most reasonable at that point in time.

A good design has attributes you want, with downsides you can live with. As we said above no design is perfect. If the critical attributes are there, and any downsides are not too bad, that is an acceptable design. A good design is a study in careful trade-offs. If the decision has downsides, we need to make certain that the good parts of the decision outweigh those downsides.

Leave a Reply

Your email address will not be published. Required fields are marked *