You can spend a lot of time arguing about this question and I think many of those arguments tend to miss the point: good design is a process, not a result. Why is that?
Well first, good design starts with a goal. You should at least try to understand what you’re trying to do before deciding what to build. Applying the same design principles to a web application that you do to an embedded controller is not going to end. Often the point is to make money, but this is not always the case. Many design efforts fail to remember to do this bit which is kind of shocking when you think about it.
Next, unless you are starting from scratch you need to understand what you already have. This is harder than it sounds particularly in legacy systems where you may or may not have a clear idea of what your current software does.
Once you know where you are and where you’re going, you can now choose and apply the tools of the trade. There are many languages, services, data representations, not to mention development strategies, testing approaches,etc. There is a tendency in our industry to believe that a particular language or approach is “the” approach but what works well for embedded development is not going to work well in a web development environment. Understanding the strengths and weaknesses of the toolsets you use is crucial to applying them intelligently.
Which brings us to the point: None of these things is constant. What you are trying to accomplish rarely stays constant. Even if your customer knows what they want on day one (!) the world changes. .Obviously your product is going to change since you’re working on it. Also the approaches, languages, and techniques available change. Even the trade-offs change. What may have been a good approach in the time of mainframes may be less relevant when applied in the world of cloud computing.
Good design is the process over time of knowing what you have, what you want, and the tools at your disposal and intelligently applying those tools to get from A to B.1 comment