January 21, 2012 | John Rusk | 5 Comments Imagine looking at a dog. You instantly know that it is, indeed, a dog. That’s an incredible feat of pattern recognition, performed almost instantly and without any conscious effort. Is it really incredible? Yes. It just seems easy because you’ve been doing it effortlessly since about age three. To remind yourself how difficult it actually is, imagine designing an algorithm to recognise dogs. Exactly what would be the rules for distinguishing a small small dog from a large cat? How would you define the category “dog” such that it included Chihuahuas and Great Danes, but not foxes and wolves? Nobel prize winner Daniel Kahneman uses the dog example to explain the two ways humans think. One way is effortful thought – what we do when consciously thinking about something. The other doesn’t even feel like thinking it all. It’s just effortless automatic perception – like seeing a dog. Much of our brain’s activity is of the automatic kind. Kahneman gives several examples to show the difference: Automatic Effortful Detect that one object is more distant than another Focus on the voice of a particular person in a crowded and noisy room Detect hostility in a voice Tell someone your phone number Answer 2 + 2 = ? Answer 17 x 24 = ? Drive a car on a empty road (unless you are just learning to drive, in which case this belongs in the “effortful” column) Check the validity of a logical argument Expertise What does this have to do with expertise? The answer is simply this: expertise involves significant “automatic” thought. For example, you happen to be an expert in recognising dogs. You accomplish that task with no conscious effort whatsoever. The same applies to activities that we normally associate with “expertise”. Chess masters are a compelling example. When a chess master looks at a board, several strong moves immediately spring to mind. Just like you effortlessly “see” that an animal is a dog, a chess master effortlessly “sees” which moves make sense. This set of “candidate moves” is generated automatically, without conscious effort. Only after the moves spring to mind does the master actually start consciously thinking about them – to decide which of the candidate moves is best. As Kahneman writes: [Experts’] intuitive judgements come to mind with the same immediacy as [a child’s] “doggie!” An Analogy It may seem hard to believe, that many of our most difficult mental tasks are performed instantly and unconsciously. As Kahneman points out, their very automatic-ness leads us to overlook their importance. When I was reading his book, I found it helpful to recall the university paper I took in artificial intelligence. There we learned about artificial neural networks. Neural networks implement an approach to computation which is inspired by the structure of the human brain. They are very fast and effective “pattern recognisers” but, having recognised an input as matching a particular pattern, they are completely unable to tell you why it matched the pattern. I.e. they can’t explain their “reasoning”. This exactly matches Kahneman’s description of our automatic thought – it gives you an impression/hunch very quickly, but is unable to tell you why. So: I imagined the brain’s underlying hardware as a neural network – quick to recognise patterns, but unable to explain its logic. It is here that our automatic thinking takes place. So it’s easy to see why our automatic thinking is so fast – neural networks are naturally fast pattern recognisers, and ours is implemented directly in “hardware”. I imagined effortful thought as a simulation running on top of the underlying hardware. Rather like a virtual machine. Inside the virtual machine, thinking is sequential and logical. But, because the virtual machine is just an emulation, it runs slowly and has limited working memory. (Question: does this imply our effortful thoughts aren’t “real”? No. Just that they have a complicated origin, but our automatic thoughts are not subject to the same performance limitations.) I wouldn’t dare to suggest that this model is accurate in terms of the underlying biology, but as a software engineer I found it helpful in understanding Kahneman’s work. Developing Expertise Consider two chess players, a novice and a master. The novice relies almost entirely on effortful thought. “How does a knight move?”, “Let me think what would happen if I moved my rook to here…”. But the master makes heavy use of automatic thought. The master’s automatic mind takes care of most of the details that the novice struggles with, leaving the master’s effortful mind free to add value where it is most needed. Consequently the master can produce better decisions in less time. But how does the novice become a master? How does someone using effortful thought slowly transition to creating (good-quality) automatic thoughts? Through practice. With enough time, and enough examples, your underlying neural network trains itself to recognise the patterns. Three sources have influenced my thinking about this kind of practice: James Bach’s Myths of Rigour presentation (which to me, could equally well have been entitled “What is learning?”). [Video here]. Anders Ericsson’s work on deliberate practice Alistair Cockburn’s concept of Shu-Ha-Ri. To join the dot’s between Shu-Ha-Ri and Kahneman’s work, I’d suggest that the Shu-Ha-Ri progression equates to the same progression described above: from a novice who uses only effortful thought, to an expert who uses a highly efficient blend of automatic and effortful thought. A Software Example I recently noticed how various people debug the large software solution that I’ve been working on for some years. When I need to debug it myself, I don’t get “stuck”. I might not know the cause of the problem, but I always have an idea on what to do next – something that will take me one step closer to finding the problem. Just like experienced players instantly “see” good moves in a chess game; I tend to “see” good moves in the debugging process. A series of such moves, possibly with some backtracking, eventually leads to a solution. But I’ve noticed junior developers are much more likely to get stuck – when faced with a problem they sometimes have trouble generating the “next move”. I’ve also noticed that although I generate moves more successfully than juniors, I seem to expend less conscious effort in doing so. Of course, this is no excuse for me to take an ego trip – after about 7000 hours with this code base, and a decade’s experience on other systems before it, I darn well should have automatic expertise by now! Junior programmers, or senior ones with less experience of the system at hand, have no choice but to generate fewer moves automatically and fill the gaps with effortful thought. Over time, their balance will gradually shift from effortful to automatic. Implications The science of expertise has many implications for how we recruit, train and deploy software engineers. In a future post, I intend to explore the implications for pair programming.