Six tiers of reasoning in programming

Originally conceptualised by Dan Garfield. Paraphrased and reformatted here.

Tier I: Pre-reasoning

also known as “magical thinking” or “cargo-cult programming”

No mental model of how things should work or what steps are relevant to its realisation. No ability to detect correct outcomes.

Tier II: Process-oriented reasoning

“If I can complete each step in the how-to guide I have successfully completed the task.”

Mental model is one of conformity to established procedures. No ability to detect correct outcomes besides the general success or failure of the program.

Tier III: Outcome-oriented reasoning

“Does it work? If so, we’re finished here.”

Mental model is functional but not systematic. Can detect correct outcomes within narrow constraints of ‘correct’; cannot improvise or generalize to more complex states of correctness.

Tier IV: Systematic reasoning

“What are we trying to accomplish here? Does our system do that efficiently?”

Can reason about interactions between procedural steps. Can abstract outcomes and reason about system states instead of specific functional states. Limited ability to improvise.

Tier V: Meta-systemic fluid reasoning

“What kinds of systems are best suited for this class of problems?”

Can reason counter-factually (what do we NOT do effectively) about systems. Sees outcomes as emergent of system interaction. Improvisation is the default modus operandum.

Tier VI: No-system reasoning

“Do we even need to do this? What is the real problem at hand?”

Able to reason about the entire problem domain while also reasoning about specific problem instances. Can detect misidentified problems (solving for the wrong thing). Able to transcend the limits of systematic reasoning.