Over the past few months, I have noticed that people, and their approach to solving problems, can be broadly split into two groups. The first group adopt a Concept Driven approach, where they first visualise the logical solution to the problem, without constraints. The second group take what they have today as the starting point.
Two Different Approaches
People naturally fall into one of the following approaches when faced with a problem to solve:-
Concept Driven Approach
In response to a problem, this group initially form a high level, conceptual idea of how the solution should work. Then they look at the best way of implementing this model without making too many compromises. Once the logical structure, division of responsibilities, interfaces and patterns are defined, the next step is to see how much reuse can be achieved whilst adhering to this conceptual model.
Linear, Incremental Approach
In response to a problem, this second group look immediately to what they already have available. Once they find something that appears to do something similar, they try to extend or modify it to satisfy the requirements.
To illustrate these differing approaches, I will return to my favorite analogy: building a car. If a designer pens a beautiful concept car, and the car company decides that they need a car like this in their range, there are two approaches they could take. They could build the basics of the new concept, for example the bodyshell, and then use their parts bin to put in a standard, pre-existing drivetrain, engine and suspension. This approach would retain a purity of concept whilst achieving high reuse of proven components. The other approach would be to find the car in their range that looks the most like the concept car, and try and re-engineer it to fit this new concept. The likely outcome of this approach would be a dilution of the concept and a multitude of compromises.
I think that it is extremely important to work from a clear concept, and then deal with the specifics of implementation later. Taking what you have and changing it in a linear and incremental way in response to various different requirements will confuse the architecture of the system, involve complicated rework and result in a confused, complex solution.