Years ago, I went to a talk given by Professor William Waite, where he discussed problem solving by programmers, in the context of the engineering of Eli. The key points of this talk always stayed with me for some reason. I recently communicated with him to clarify my recollections, and he was very kind and sent me some notes from a similar talk he gave in Karlsruhe.
Every person deals with problems and attempts to solve them in ways that reflect her previous experience with this type of problem. And her level of success at solving a given problem will build on what she does next time. In other words, she learns from her experiences and knowledge as she encounters new problems.
These sentences prompted my communication with Professor Waite, and in his analysis (quoting the notes from his talk), the following 3 levels of problem solving apply:
Selection - this is an instance of problem X
Abstraction - this is an instance of problem type T, with parameter P
Explanation - here's how you solve it
These 3 levels are interesting, and apply not just to programmers I believe. To put these levels into my preferred order and with a different tagline, here goes:
- Explanation - this problem can be solved by using the following specific steps that are unique to my understanding of the problem
- Abstraction - this problem can be thought of as an instance of a generic problem, whose solution can be parameterised, and then solved with particular values for these parameters
- Selection - this problem is identical to this known problem, which has the following solution
Hopefully this clarifies it a bit better.
The explanation level is for beginners - you've never seen the problem before, or if you have, you don't recognise it and solve from first principles of problem solving. Basically, you see it only at the level of understanding that says, here is a problem to be solved. For example, a child first learning to tie shoelaces - seeing how it's done the first time is like magic, and you try to replicate it. Even the few times afterwards, it's still a tricky problem that has to be solved almost like the first time, as you put together the various physical (laces, holes) and structural (loops, tightness) parts of the solution.
The abstraction level is for more experienced practicitioners - you have seen the problem before in a different scenario, and now you are faced with a similar problem in a new setting. At this level of understanding, you are able to apply your previous solutions with different raw components. For example, wrapping a present with a ribbon. The structural parts of the problem are the same - how to tie a bow in some cord, but the physical setting is quite different - paper surrounding a present.
The selection level is available only once you've solved a lot of problems at both the explanation and abstraction level - you just "know" the answer, and "this" is what it is. For example, the problem is understood to be, "I need an easily releasable knot that binds together something wrapped around something else", and the answer is, "a reef (or square) knot) with two draw loops".
What I like about this analysis is that it helps me to understand why different people solve things more or less easily. We never reach the selection level with all problems; and different people arrive at different levels for different problems. The more experienced we are, the more likely we are to reach the selection level for some particular domain. And while we may be an expert in solving some complex information organisation problem, we may still be unable to fix a leaking tap.
End note: In the context of programming, Professor Waite commented that there is research [Jeffries, Turner, Polson and Atwood, "The Processes Involved in Software Design", 1981] showing that the number of patterns accessible to a practictioner at the Abstraction and Selection level is the only thing which distinguishes novices from experts. In searching for references to this paper, I came across Susan Gasson's various works in progress, including one on "Organisational 'Problem-solving' and Theories of Social Cognition", which provides an excellent overview of much recent research about design more generally.
Disclaimer: Any failures in the explanation of Professor Waite's ideas are my own; for more of his work see this Google scholar search for William Waite problem solving.