A PathOfTheProgrammer
A PathOfTheProgrammer
I will characterise the Path of the Programmer by borrowing an idea from Zen about the three phases on the
path to enlightenment: Novice, Journeyman and Master.[REF?]
The Novice
For the novice this phase is thus characterised by an undisciplined self-awareness of their learning process and
habits.
Here the problem is that you can get into Abstract thinking and this can lead you to having an overly complex
view of the solution. Your thinking here is more complex than the problem warrants. It is quite possible that up
to 80% of the code will never be used. Therefore you are unaware of your own thinking limits and this can lead
to an experience of total panic, especially if you are working on larger systems. [About a quarter of the listeners
raised their hand when I asked if anyone had ever experienced this] This conforms to the downward spike that
occurs after the upward spike on the confidence curve.
One anecdote I have is the story of one rather over-confident colleague who was given responsibility for a
project. The evening before the client was due to turn up for a demo he was still coding away. When I came into
work the next morning there was a note on his desk saying ‘I RESIGN’. He had been working through the night
and didn’t manage to get to any solution. Of course the contract was lost.
This highlighted the total lack of awareness about one’s own limits. In this phase I also remember having an
arrogant positivity – its just software, anything is possible – as I had an undisciplined lack of self-awareness.
Some people can stay in this phase for a long time, indeed their whole career. It can be characterized by an
insistence on designing and coding to the limit of the complexity of their thinking, which means by definition
they will have massive problems debugging it, because you need more complex thinking to debug a system than
was used in creating it.
So we have gone here from one undisciplined state of partial self-awareness to another undisciplined state of no
self-awareness. Of course this could be seen to be a bit of a caricature but you know if you hit that panic feeling –
you are in this phase.
The Master
Here we have a good knowledge of tools, but the issue that is different is that you will be using a Context Based
thinking. You are looking at the problem you have got in front of you and fitting the tools to that problem. There
is a strong link here with a practice when flying aircraft. You need to read from the ground to map, not the other
way around. You must do it correctly because there have been a number of accidents where the pilots have read
from the map to ground thus misidentifying their location.
It is the same with this. Focus to the problem, bring the tools as you need them. It is interesting what Dr. Marian
Petre said about how experts can look as though they are novices – which is exactly what I feel like – sometimes I
look at my code and think “That doesn’t really look that complicated”. You bring the ‘big guns’ out when you need
them, hopefully abstracted down under a good interface. You know you need to keep the complexity down
because there will be a lot of maintenance in the future where you or others will have to reason about the code.
So here the software complexity is of the order of the problem complexity, perhaps a bit more because you will
need a bit of slack within the solution. At a personal level the big thing here is that you are aware of your own
limits because in the previous phase you have been panicked.
One of the big things I have learnt through my career is the ability to handle this. For example there will be a bug.
The client may panic. This is to be expected. The salesman may panic. Still possibly to be expected. As a
developer if your manager panics too, you have a problem, because the buck will stop with you. Can you
discipline your own thinking and your own practice so that you can calmly deal with the issue, regardless of how
others are handling the situation? This is the struggle you can get in a commercial coding environment.
Implicit in this description is that you have developed a disciplined personal practice.
Summary
Novice
• Rule-based thinking
• Undisciplined
• Some self-awareness.
Journeyman
• Abstract thinking
• Undisciplined
• No (or very little) self-awareness.
Master
• Contextual thinking
• Disciplined
• Deep self-awareness.