Programming is the act of deciding now what will happen in the future. A programming language offers an operationally precise way to encode decisions through a process called simply coding. Programmers reason about future behavior by interpreting previously coded decisions and integrating these with their own decisions and their interpretations of other sources like Technical Memos and domain experts.
The depth, quality and value of programming decisions will be limited by the programmers ability to concentrate.
Therefore: Develop a program in discrete episodes. Select appropriate deliverables for an episode and commit sufficient mind share to deliver them. Be aware of the rise in concentration as the episode progresses. Consider each source (above) and consciously include or exclude its recommendations.
Use the fear that often accompanies a decision not-yet-made as a motivation. Try to compare your position within an episode to similar points in previously successful episodes.
"I feel like we've been around twice now on the possible ways we can bind the six terms of this bond analytic to the four calculation classes we have in our library."
"Yea, right now I'd be happy if we could place the four primary terms, look at the error cases, and see if that gives us a hint how to proceed after lunch."
Push for the decisions that can be made. Don't abandon an episode; that will leave you feeling defeated and unable to achieve even the same level of concentration at a future time. Make the decisions that seem possible. Code the decisions. Then review the code to be sure that the extent of your decisions and your confidence in them is apparent in the code.
Coding occurs on the down-hill side of a programming episode. Coding is the most direct way to promulgate programming decisions.