There comes a time when programming itself is normal, easy. You can encounter problems that are difficult to solve, sure, but programming itself is as second-nature as talking or driving. Thinking in that way of looking at problems as systems of decomposable parts becomes second nature.
Whether at this point or beforehand, a programmer encounters a particular reality over and over again. The real impediment to coding is not lack of knowledge about a programming language or a functional library, nor again is it the difficulty of reasoning about the problem space. The difficult thing about programming, once you’re good at it, is learning how to enter that highly efficient flow-state at will. The really difficult thing is in being able to pop in and out of it as people distract you without even knowing they’re plunking your cognitive handle holds.
I don’t think a lot of people really get good at this (especially that second part). But it really depends on your flow state, too. Some flow states are deeper than others. You may be accustomed to a “2 inch deep” flow state whereas someone else may prefer “10 foot deep” flow states. My experience is that 10 foot deep flow states are more challenging to get into and stay in than 2 inch deep flow states, but they’re also better. When you’re flowing 10 feet deep you can not only flow with your fingers over the keyboard and complex editor key chords and the nano-functionality you’re working on at the moment, but you can also keep a strategic eye on the overall architecture and even on the long-term goals of the system. Ideally, you can gain the practice of settling into your coding time such that you sink down through 2 inch flow states to 10 foot flow states as distractionless-time accumulates as if pulled by gravity.
Picture it – the flow state is pulling you down. A little hypnotic suggestion can always help.
But the first thing you have to do is give yourself space to let that settling down commence. From the outside, that looks like a person sitting at a computer staring at a screen. From the inside, it feels like disengaging-from/quieting the inner dialog and expanding one’s proprioreception (oh yeah, that’s right, I have an abdomen and it has more to say than “I’m hungry”, in fact, it’s talking about how it is straining to help my lower back with my bad posture…).
This is all the same as meditation.
A foundational skill of a programmer, in my book, is the ability to sit in front of a computer and check into oneself to the point where one finds oneself flowing into the flow state, almost as if by habit. Programming becomes a meditation on the programmer-body-action/problem-object/solution-visualization.
In this state, we are the wizards of a world that is redesigning itself for us through us.
Bonus Material: What is flow state? Why does “going deeper” allow you to keep track of more that is going on (and there is a hell of a lot going on when a programmer programs). I think the going deeper is simply the stilling of the personal ego. Less of the mind’s resources are going into propping up an internal context of meaning concerning one’s “personality” and ALL of its desires and complaints. As these resources of conscious attention free up, they naturally start seeing all the other stuff that is going on in the mind. They also give the brain’s “user”, the conscious will, a chance to stand back and SELECT which thoughts to give extra time in the spotlight of conscious attention.
SELECT * FROM BackgroundThoughts WHERE StrategicValue > 100 and AssociativityThreshold < 5
In this way, the conscious mind can be used in the way it is best utilized – as a strategic overlay to initiate and adjust automatic processes in situ, in relation to a higher-level view of the details of the moment. This is where masters like to set up base camp.