A Computer Forces You to Explain What You Thought Was Obvious
Why programming reveals the invisible steps inside human thought
A human can understand an instruction that was never fully given.
A computer usually cannot.
Tell another person:
Take the numbers, remove the bad ones, calculate the average, and show me the unusual results.
They may begin immediately.
They may infer what bad means.
They may assume that blank cells should be ignored.
They may guess what counts as unusual.
They may understand what kind of average you probably want.
They may even correct a mistake in your instructions without telling you.
Now give the same instruction to a computer.
Suddenly, almost every word becomes a problem.
What counts as a number?
What makes one bad?
What happens to an empty value?
Which average?
How unusual is unusual?
What should happen if no valid values remain?
What does show me mean?
A table?
A list?
A graph?
A message?
The computer has not necessarily made the task more complicated.
It has exposed complexity that human interpretation was hiding.
And that makes programming interesting for a reason that goes far beyond programming.
A machine often reveals the missing steps in an explanation precisely because it cannot pretend those steps were there.
— Tymur Levitin
Human Communication Runs on Missing Information
Ordinary language would be exhausting if everything had to be stated explicitly.
Imagine saying:
Please take the ceramic cup currently located approximately thirty centimetres to your right, grasp it without excessive pressure, lift it vertically while preserving its orientation, move it toward me, and place it on the horizontal surface in front of my left hand.
We normally say:
Pass me the cup.
The rest is reconstructed.
Human communication depends heavily on this ability.
We use context.
Shared knowledge.
Physical surroundings.
Expectations.
Social conventions.
Previous conversation.
Probabilities.
The listener does not merely decode the words.
The listener reconstructs an intended situation.
That is one reason natural language is so powerful.
It is also one reason natural language can hide incomplete reasoning.
“I Know What I Mean” Is Not the Same as “I Have Specified What I Mean”
Consider a simple instruction:
Sort the students by performance.
It sounds clear.
Until we try to formalize it.
Performance according to what?
One test?
Several tests?
Attendance?
Improvement?
Final grade?
Average score?
Weighted average?
What happens when two students have the same score?
Are missing assignments counted as zero or excluded?
Are all subjects equally important?
The original sentence did not answer these questions.
A human listener may silently choose answers.
Then something psychologically interesting happens:
because the listener successfully acts, we may conclude that the original instruction was precise.
It was not.
Interpretation repaired it.
This distinction matters:
successful communication does not prove complete specification.
The Hidden Architecture Between a Problem and an Answer
Suppose we begin with:
Find the strongest student.
A person may feel that the task is obvious.
A computer forces us to open the phrase.
We might discover a chain like this:
“Strongest student”
↓
define performance
↓
select relevant data
↓
decide how missing data behave
↓
choose a comparison rule
↓
calculate scores
↓
resolve ties
↓
produce output
Suddenly one apparently simple instruction contains several decisions.
The machine did not create those decisions.
They were already inside the task.
We simply had not made them visible.
Programming Externalizes Thought
This is one reason code is intellectually unusual.
Thought can remain partially implicit.
Code must make much more of the procedure explicit.
Not everything, of course. Programming languages themselves contain abstractions, libraries and conventions that hide enormous complexity.
When we write:
numbers.sort()we are not specifying every operation performed by the machine.
But at the level of the problem we are solving, programming repeatedly forces us to answer questions such as:
What information exists?
How should it be represented?
What should happen first?
What must repeat?
What condition changes the next action?
What counts as success?
What happens when the expected input does not arrive?
The path often looks like this:
Situation
→ Interpretation
→ Decomposition
→ Explicit Rules
→ Algorithm
→ Code
→ Execution
→ Observed Result
And then something extremely valuable happens.
The result can disagree with our expectation.
The Output Becomes Evidence About the Thought
Suppose a program runs without errors.
But the answer is wrong.
That moment is important.
The machine has followed an executable interpretation of our reasoning.
So we can compare:
What I expected
with
What my instructions actually produced
The difference between them contains information.
Perhaps the code is wrong.
Perhaps the algorithm is wrong.
Perhaps the input was represented incorrectly.
Perhaps an assumption was false.
Perhaps the original problem was misunderstood.
Perhaps the expected answer was wrong.
This gives us a richer debugging chain:
Unexpected Result
↓
Inspect Code
↓
Inspect Algorithm
↓
Inspect Assumptions
↓
Inspect Problem Representation
↓
Revise
Debugging can therefore move backwards through thought.
Debugging Is Not Only About Code
A beginner may think debugging means finding:
a missing bracket,
incorrect indentation,
a typo,
or the wrong variable name.
Those are real errors.
But some of the most interesting errors are perfectly executable.
Imagine a program designed to calculate the average of several scores.
It runs.
It prints:
63.4
No error message appears.
But the expected value was:
79.25
Now the problem is not:
Why won't Python run?
The problem becomes:
What did our procedure actually mean?
Maybe one score was omitted.
Maybe the wrong denominator was used.
Maybe missing values were converted to zero.
Maybe a percentage was interpreted as a raw score.
Maybe the formula itself was conceptually wrong.
The program becomes a trace of reasoning.
An Error Can Reveal a Hidden Assumption
Suppose we write a program that calculates the average:
average = sum(scores) / len(scores)It works beautifully.
Until:
scores = []Now the program fails.
Why?
Because our earlier reasoning contained an unstated assumption:
There will always be at least one score.
The empty list did not merely break the program.
It revealed the assumption.
That distinction is powerful.
An edge case is often not an annoying exception to the “real” problem.
It can be a diagnostic instrument.
It asks:
What did your model assume would always be true?
The Same Thing Happens Outside Programming
Imagine a school concludes:
This student needs more English.
Why?
Because the student struggles with physics taught in English.
The explanation sounds plausible.
But now make the reasoning explicit.
Does the student understand the physics in another language?
Can the student solve the equations?
Can they interpret the graphs?
Do they understand the question but lack terminology?
Do they know the terminology but misunderstand the physical relationship?
Can they explain the concept without using technical vocabulary?
The sentence:
The student needs more English
may have compressed several untested assumptions.
Once those assumptions become visible, the educational problem may change.
Perhaps the missing layer is language.
Perhaps physics.
Perhaps the connection between existing physics knowledge and a new language.
The first description was not necessarily false.
It was under-specified.
Explanation Is a Form of Decompression
This gives us a useful way to think about explanation.
A short statement can compress a large structure.
Find the average.
Learn Python.
Improve your English.
The student is weak in mathematics.
The employee lacks initiative.
Customers think the product is too expensive.
Every sentence may contain a much larger hidden model.
To understand it, we sometimes need to decompress it.
What exactly happened?
Which observations support the statement?
Which categories were chosen?
Which relationships are assumed?
Which alternatives were excluded?
What process would produce the claimed result?
Programming makes this unusually visible because eventually the compressed instruction must become operational.
A Computer Cannot Execute a Vague Intention
Humans often know what result they want without knowing the procedure that will reliably produce it.
We say:
Make the program smarter.
Clean the data.
Find the important information.
Choose the best option.
These are intentions.
They are not yet algorithms.
To make them executable, we must move from:
desired outcome
to
operational definition
to
procedure
to
testable result
For example:
Find unusual values
becomes:
What is a normal value?
How will normality be measured?
What threshold separates ordinary from unusual?
What should happen at the threshold?
What should happen to missing data?
Now the concept can begin to become operational.
This Is Why Decomposition Matters
Large problems often feel difficult because several unresolved decisions are compressed into one sentence.
Consider:
Build a program that helps students track their grades.
That is not one task.
It may contain:
Input
How are grades entered?
↓
Representation
How are subjects, assignments and scores stored?
↓
Calculation
How are averages computed?
↓
Rules
Are assignments weighted differently?
↓
Exceptions
What happens when a grade is missing?
↓
Output
What information should the student see?
↓
Interaction
Can grades be edited?
↓
Validation
What inputs are allowed?
The problem becomes easier not because it has become smaller in reality.
It becomes easier because its internal structure is now visible.
The Blank Screen Is Sometimes a Thinking Problem
This explains a familiar experience.
A learner knows several Python commands.
Then receives a new task.
The editor opens.
The cursor blinks.
Nothing happens.
It is tempting to conclude:
I need more Python.
Sometimes that is true.
But sometimes the learner does not need another command.
They need to answer:
What is the problem actually asking me to transform?
What is the input?
What is the output?
What relationships connect them?
What intermediate steps exist?
Which decisions are conditional?
Which actions repeat?
Once those questions have answers, the first line of code may become obvious.
The difficulty was upstream of syntax.
Code and Natural Language Solve Opposite Problems
Natural language often succeeds through flexibility.
Code succeeds through controlled explicitness.
Natural language can tolerate:
ambiguity,
contextual inference,
metaphor,
approximation,
shared assumptions,
and incomplete specification.
Programming languages deliberately restrict much of this freedom.
That does not make code superior to natural language.
They serve different purposes.
If I tell a friend:
Meet me near the station after lunch,
human flexibility is useful.
If I instruct a payment system:
Transfer roughly the right amount to something like the correct account sometime this afternoon,
flexibility becomes dangerous.
Different communicative tasks require different tolerances for ambiguity.
Precision Is Not Always More Words
There is another important distinction.
Explicit thinking does not mean saying everything.
A good algorithm does not describe every transistor operation.
A good mathematical model does not reproduce every atom in the system.
A good explanation selects the detail relevant to the task.
So the goal is not maximum detail.
It is sufficient explicitness.
We need enough information for the intended operation to be reconstructed reliably.
This is the same problem encountered in science, education and communication:
What must be preserved, and what may safely remain compressed?
Expertise Often Means Knowing What Can Remain Unsaid
A beginner may need to make many steps explicit.
An expert can compress them.
This is not necessarily because the expert is skipping reasoning.
Often the expert has packaged repeated reasoning into larger units.
A chess player sees a position.
A mathematician sees a structure.
A programmer sees a pattern.
A language user recognizes a construction.
The problem comes when compression becomes so automatic that the expert forgets what the beginner cannot yet reconstruct.
Then an explanation sounds like:
Just use a loop.
Just factor it.
Just change the tense.
Obviously, you normalize the data first.
The word just often hides a decompression problem.
What is one mental unit for the expert may still be seven separate operations for the learner.
Teaching Requires Reconstructing the Missing Steps
Good teaching therefore involves more than possessing compressed expertise.
The teacher must be able to reopen it.
What did the learner already understand?
Where did the chain break?
Which operation is still invisible?
Which assumption has not been established?
Which representation would make the relationship easier to see?
This is why two students producing the same wrong answer may require different explanations.
The error is visible.
The mechanism behind it is not.
Programming Makes the Difference Between Knowledge and Availability Visible
A learner may recognize an algorithm when shown one.
That does not guarantee they can construct it independently.
They may understand code after reading it.
That does not guarantee they can generate equivalent code from a new problem.
They may reproduce a classroom example.
That does not guarantee they can transfer the structure to unfamiliar data.
These are different levels of availability.
Recognition
is not identical to
reconstruction
which is not identical to
independent generation
which is not identical to
transfer.
Programming provides unusually clear opportunities to observe these differences because the learner eventually has to produce something executable.
The Machine Is an Unforgiving Listener—but a Useful One
A computer does not understand in the human sense simply because code executes.
Nor should we romanticize machines as perfect judges of reasoning.
A program can run while embodying a terrible model.
A specification can be precise and still solve the wrong problem.
Data can be perfectly processed and conceptually meaningless.
But the machine gives us one valuable constraint:
it cannot rely on human social intuition to repair every missing procedural step.
That makes it a useful mirror.
Not a mirror of intelligence.
A mirror of explicitness.
From Implicit Thought to Testable Thought
A useful thinking cycle therefore looks like this:
I think I understand
↓
Can I explain the process?
↓
Can I decompose it?
↓
Can I specify the relationships?
↓
Can I predict the result?
↓
Can the procedure be executed?
↓
Does the result match the prediction?
↓
If not, what assumption failed?
This cycle belongs to programming.
But not only programming.
It belongs to mathematics.
Science.
Research.
Education.
Decision-making.
Communication.
Any domain in which our internal model eventually meets something outside our head.
The Deeper Lesson of Programming
Programming is often introduced as learning how to communicate with computers.
That is true, but incomplete.
There is another educational possibility.
When we try to make a process executable, we discover how much of our own reasoning depended on invisible transitions.
We discover that:
an intention is not yet a procedure,
a label is not yet an explanation,
a correct result does not prove a correct model,
a running program does not prove correct reasoning,
and a feeling of understanding does not guarantee that the structure can be reconstructed.
The machine becomes valuable precisely where it refuses to understand us generously.
Human beings often cooperate with incomplete explanations.
Computers force some of those incompletions into the open.
And once they are visible, they can be examined.
Programming does not merely teach us how to give instructions to machines. It reveals how much of our own thinking was never explicitly instructed to ourselves.
— Tymur Levitin
From Hidden Steps to Trainable Skills
At Levitin Language School, programming and digital learning can therefore be approached as more than memorizing commands.
A learner may need help with:
programming language
problem decomposition
mathematical reasoning
algorithms
data and formulas
visualization
or the connection between these layers.
That is why Python, Excel and GeoGebra can be connected with mathematics when the learner's actual task requires it.
The educational question is not simply:
Which tool are you learning?
It is also:
Which part of the thinking process is currently unavailable?
Explore the programming direction:
Learn Programming, Python and Excel
https://timurlevitin.blogspot.com/p/learn-programming-python-and-excel.html
A teacher working across mathematics and digital tools:
Sone Bille — Mathematics Educator
https://levitintymur.com/teachers/sone-bille-mathematics-educator/
And the foundational page for this new Language Thinking Lab cluster:
You Can Know Python Syntax and Still Not Know How to Program
https://languagethinkinglab.blogspot.com/p/you-can-know-python-syntax-and-still.html
Continue Reading
We Do Not Think With Reality. We Think With Models of It.
https://tymurlevitin.substack.com/p/we-do-not-think-with-reality-we-think
A Formula Is a Compressed Prediction About Reality
https://languagethinkinglab.blogspot.com/2026/09/a-formula-is-compressed-prediction.html
You Can Know the Formula and Still Not Know What Will Happen
https://timurlevitin.blogspot.com/2026/09/you-can-know-formula-and-still-not-know.html
The Subject on the Schedule Is Not Always the Subject the Student Needs
https://www.linkedin.com/pulse/subject-schedule-always-student-needs-ldjxf
About the Author
Tymur Levitin is the founder and director of Levitin Language School, a teacher, translator and author exploring language, thinking, knowledge, learning and the structures through which people make complex problems understandable.
His work examines what happens between knowing information and being able to interpret, reconstruct, explain and use it.
Levitin Language School
https://levitintymur.com/
Language Learnings — USA
https://languagelearnings.com/
Email: notification@levitintymur.com
Telegram: @START_SCHOOL_TYMUR_LEVITIN
WhatsApp / Viber: +380932913429
Global Learning. Personal Approach.
© Tymur Levitin / Levitin Language School. All rights reserved.


Comments
Post a Comment