Software development is vast; it is easy to feel overwhelmed.
Jonathan Blow argues that this feeling is often grounded in reality.
It is the mind recognising a real gap and saying, in effect, you do not know this yet; you need more knowledge or skill.
Be Realistic
The first principle is that you must not fool yourself—and you are the person who is easiest to fool.
— Richard Feynman
That is worth listening to. Sometimes the right response is simply to learn, practise, and close the gap.
But there is also a grey area in this work. Sometimes the problem is not a lack of ability, but a lack of confidence; not incompetence, but uncertainty under pressure.
It may also be the case that the domain itself does not match our strengths.
Each of these situations requires a different response. If it is as Jonathan says, then the task is to acquire the necessary skills and knowledge. If it is a confidence issue, then the task is to develop winning habits. If it is a domain mismatch, then some form of career repositioning is likely to be the answer.
Focus on Your Strengths
Focus is a matter of deciding what things you're not going to do.
— John Carmack
There is always something more to learn: 3D maths, physics, finance, hardware, accounting, and countless other specialisms.
It is important to recognise the very real distinction between accidental and essential complexity. Some domains really are complex. Building a game engine, for example, requires advanced mathematics.
No matter how strong our coding skills may be, if we are working in the wrong domain, it can become a kind of quiet desperation.
The choice is to grow into the domain, or to seek one better suited to our temperament and abilities.
Build Momentum
Of all the things that can boost emotions, motivation, and perceptions during a workday, the single most important is making progress in meaningful work.
— Teresa Amabile, The Progress Principle
It is easy to panic when a problem seems too large, the design uncertain, or the way forward unclear.
What helps is to find some small success, no matter how small, and achieve it.
Then stand on that first step and look for the next one. Difficult problems often unwind in this way: step by step, with each small success making the next move clearer.
In uncertain work, feedback matters enormously. Action produces feedback; feedback allows adjustment; adjustment makes the next action more intelligent. Fast feedback loops spur progress.
There is something almost cybernetic in this. When things are unclear, it is usually better to do something concrete, observe the result, and correct course than to remain paralysed in thought.
Action helps overcome fear, and small successes begin to restore confidence.
Closing the Gap: Action over Analysis
Start where you are. Use what you have. Do what you can.
— Arthur Ashe
When suddenly faced with pressure in an unfamiliar technology stack or domain, the sheer scale of the knowledge gap can tempt one to despair. The mind sees the crevice and doubts it can clear it.
The truth is, in most cases, it is not necessary to understand the whole field in order to move forward.
Focus on the task at hand. Learn only what is strictly necessary to complete it. Review the approach with a senior if needed, then execute. Task by task, the wider domain gradually becomes familiar.
This is especially important for those of a more melancholic or contemplative temperament, who naturally want to understand principles and causes in depth before acting. That instinct has value, but under pressure it can become a trap. Taken too far, it turns every task into a research project and makes every deadline late.
The deeper understanding will come. For now, get the task done. Learn to eat on the run: pull in knowledge as needed, keep moving, and use tools, including AI, to accelerate the feedback loop.
Leverage your natural capacity to learn by analogy. You will find that many concepts are transferable. A Dictionary in C# is analogous to a Map in Java; the core abstractions in the ASP.NET Core request-processing pipeline can also be found in Spring Boot. By mapping new concepts onto what you already know, learning is reduced to a delta.
There is much truth in the 80/20 principle. Often, a relatively small portion of the knowledge is enough to produce meaningful progress. Let knowledge accumulate over time.
Avoid Isolation
For the things we have to learn before we can do them, we learn by doing them.
— Aristotle, Nicomachean Ethics
Some complex tasks can feel overwhelming, provoking a wave of anxiety.
When truly stuck, do not spend precious time worrying in private. As uncertainty grows and time runs down, pressure rises with it. Each day of delay makes the deadline feel heavier.
The important thing is to act before panic takes hold.
Speak to a colleague. If needed, speak to another. Escalate to a team lead if the situation calls for it. Do not remain isolated under pressure, hoping the problem will yield through force of will alone.
There is a reason for this. Under stress, the amygdala can begin to dominate, and when it does, concentration narrows and reasoning suffers. Put simply: do not let the amygdala into the room.
Problems that might have been resolved quickly through conversation can become much harder when fear is allowed to lead. Fear makes for a good servant, but a terrible taskmaster.
Ask early. Bring others in. Decisive action overcomes fear.
In uncertainty, take prudent steps: discuss, act, reflect, repeat. You learn by doing.
Form Good Habits
You do not rise to the level of your goals. You fall to the level of your systems.
— James Clear, Atomic Habits
Give yourself a chance. Order yourself for success.
To the best of your ability, eat well, stay hydrated, get some exercise, and get enough sleep.
Software development demands concentration, judgement, patience, and steadiness, and all of these begin to suffer when the body is neglected. Optimise your ability to function well at work.
Try to allocate an hour a day to studying the field in which you are struggling. The return compounds over time, and the combination of daily work and deliberate study can create a strong upward momentum.
Don't burn the candle at both ends; a measured pace wins the race. Be persistent and consistent.
Good habits are not separate from good work. They are part of what makes good work possible.
Tranquillity is the result of order.
Know Your Nature
Become such as you are, having learned what that is.
— Pindar, Pythian 2
Here is a good talk by David Heinemeier Hansson in which he discusses, among other things, how he got into software development and the kind of developer he is. What I like is that he seems to accept his limitations and focus on what he can do well. He knows he is not an engineer in the mould of Linus Torvalds, and that mathematics is not his strongest suit, yet he still found a path in software and built a successful career in Ruby web development.
I think that is important. It is worth considering our own abilities, temperament, values, and ideals so that we pursue a path in programming that is both suitable and meaningful.
We cannot do everything, and perhaps we are not meant to.
I also agree with the sense that developing software is, in some respects, like writing, or even like poetry. Semantics matter. Naming matters. Structure matters. And it seems to me that all of these disciplines benefit from the same virtues: clarity, concision, and simplicity.