“The purpose of abstraction is not to be vague, but to create a new semantic level in which one can be absolutely precise.” – Edsger Dijkstra
Two Competing Futures
The coding capabilities embedded in AI and large language models will fundamentally change what we mean by code development. The question is whether we lean toward the “glass half empty” or the “glass half full” view. The glass half empty version: we trim down and eliminate large coding teams, producing the same output with far fewer developers. The glass half full version: AI unleashes a new kind of code development. It can allow us to generate higher-value, higher-volume output where quality improvement is the main outcome. I hope for this more optimistic outcome.
In the glass-half-empty narrative, you get the same output with far fewer developers. You trim your team, cut costs, and still get the same output with fewer people. The AI does the bulk of the work, overseen by a handful of senior developers who manage the AI. The side effect is the hollowing out of the field, a reduction in the number of code developers, and cost-cutting. The output and product remain largely unchanged, and the field’s trajectory is the same as it would have been with just more efficiency. This is dismal. It is technology stagnating and damaging the future. Money is the only beneficiary.
In the other view, the picture is more complex. Success is harder and more uncertain. Expectations, duties, and tasks for code developers need to change significantly. The coding tools provide more value because each person can produce far more. The key is that people need to have greater expectations about what they produce and what they expect. The key is deep thinking. You get more code, more capability, and an accelerated trajectory for what code can produce. In this view, you supercharge the value of code development. It is a path to a better future.
“The purpose of computing is insight, not numbers.” –Richard Hamming
Change Our Thinking
“Civilization advances by extending the number of important operations which we can perform without thinking about them.” – Alfred North Whitehead
Rather than stop thinking, AI requires us to think more. We need to expect deeper and more abstract thought. This is something only people can do. What needs to change is the mentality of those managing code development. They need to break out of the straitjacket they’re in today and recognize what code development tasks have fallen by the wayside in recent years, so they can reach the full value the code should produce. This is the narrative AI needs. The other direction is a horror show for society.
This dynamic plays out across the use of AI in society. Are we using AI to get rid of work and people, or to improve the quality, improve the thinking, and improve the work that’s done? The latter is a form of abundance we should seek. It must be reflected in how society plans AI use, what it expects from it. Ultimately, it should change how we educate people and the questions and skills we teach. We need to retrain and educate most of the current white-collar workforce, too.
What’s clear is that AI overturns traditional ways of thinking, teaching, and working. We need to adapt and change to reflect what these new capabilities produce and how to improve the quality and value of what we all do. These issues are prevalent across the modern workforce. It requires a different mentality for success. Code development is the key area where we can make real progress in changing the dynamic for the better. Workers and managers have the fundamental backgrounds to achieve success. To get there, we need to understand the problems we are trying to solve and how AI can help us overcome them. Not how AI can do the same, but how it can produce better.
My View of the Current State
Let me start by sharing my experience with co-development. I worked on it on and off for nearly 40 years at two national labs. The work was always focused on features, fixing bugs, or dealing with issues. Most of the time in code development was spent writing code, getting the syntax right, optimizing, and debugging. Over the years, the deeper thinking shrank from view. The tasks became ever more banal over time. Thinking about math and physics became uncommon, replaced by computer details. As a result, our codes have stagnated. Methods, models, and algorithms have all become fixed and merely ported.
The prospect of AI changes the dynamic considerably, since the work we used to spend all our time on is now largely automated. We still have responsibilities to check what AI produces, but my experience using Claude or OpenAI code tools has been miraculous. I can execute tasks that would have taken a lot of time in a very short period, with a relatively tiny cognitive load on my part. The gift is that I can move to thinking about other, better things. I have hours and hours freed up to imagine and create. No longer am I slaved to syntax wars.
The question is: what does that free up? What new responsibilities do I have, and what can we do with this? Over time, I noticed that writing code and dealing with computer hardware took up more and more of my time. Over my career, the value of a code developer’s time has steadily decreased. This was especially true during the Exascale program. Dealing with hardware and the challenges of writing working code became more time-consuming and difficult. Work on features and improving the value and power of the code faded into the background. The focus shifted toward porting code and simply carrying along legacy code. Our dreams became smaller.
This shift paralleled a decline in the very things that give code its value: algorithms, applied math, and physics. The entire code budget went to low-value things. Code swallowed methods and algorithms. Code developers spent less and less time on those areas as computing hardware, and the lowest-level mechanics of computer science became the focus of everything. Gradually, we lost the ability to do anything new or better. Only computers got faster. What we put on those computers stalled.
Opportunity Awaits
AI offers a chance to change this dynamic and significantly improve the thinking we do in code development. This is counterintuitive. AI, rather than killing thought, allows it to flourish. The key is that the thinking for work needs to be different. This applies to other fields as well. The key is that expectations and approach need to change to reflect it. Deeper thinking, creativity, and more value in what we do should become what is expected. As a side effect, that should be reflected throughout the educational process and all the way through co-development. Rather than dragging our feet in education, there is value in fully embracing the future.
“Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make things worse: complexity sells better.”– Edsger Dijkstra
I worked in very high-end organizations. I can only imagine how much worse code development must get as you move down the food chain to lower-level organizations. If things were this bad at the National Laboratories, what is it like in the trenches of some company? We have a chance to fix this problem and start producing code with more value, ingenuity, creativity, and thought put into it. This would have a profound effect and supercharge the area where I fear the developments of the last two decades have sapped almost all of the power. To put it differently, code development is broken. AI offers us the chance to fix it.
To achieve this, we need management to recognize that the new tools can fundamentally change the trajectory of code development. It is the answer to a huge problem. If they view this mainly as a way to reduce team size or improve efficiency while still producing the same product, we will miss the opportunity. Right now, this is the narrative winning. What a waste! The value should be managed first, not the budgets.
Right now, it feels like we are on a trajectory where code development is seen as fine as-is. It is not! We do not criticize what code development has become. We should. It is a shit show. We also do not acknowledge what is missing and what we are not doing that we should be doing. Over time, code development has evolved into a low-level, low-thinking, low-planning, low-creativity environment. This is toxic, full stop. It denies everything important and good about code. Code is abstract human thinking ported to incredibly fast thinking platforms. The key is powerful abstract thought!
How to Think About AI Coding
“Computer science is no more about computers than astronomy is about telescopes.”– Edsger Dijkstra
We need to recognize that our approach to code development needs to change. It needs to reflect the power these tools provide and to unleash people to think in ways they no longer do. There is a useful analogy in the history of coding. We have a blueprint for the phase change we need to go through.
Looking back at the early days of computing (the 1940s and 1950s), computer programming involved rewiring the machine. Think of it! We started with plug boards as a coding interface. This was an advance over human-powered calculators. Then we moved to machine code and assembler, which gave us more power. Our codes and methods could be more abstract than the plug boards. When Fortran and COBOL arrived, people who were skilled in assembler saw it as Armageddon and a horrible development. The coder lost a direct connection to the machine they were so intimately connected to. What we gained was the ability to express complex ideas. Codes, algorithms, and methods bloomed. The computer was unleashed by it.
A language that doesn’t affect the way you think about programming is not worth knowing.” – Alan Perlis
The same shift is happening now with AI coding tools. We can produce code without focusing on syntax and language expression the way we used to. The thing we fail to see is what the new technology allows. Just as the new languages allowed higher-level ideas to be expressed in the past. The new coding languages ultimately influenced the algorithms and methods we could envision. We can now implement ideas that were scarcely imaginable before. This complexity and capability can fuel an explosion, but we need to trust that code developers will thinkk about even bigger ideas. We need to manage and expect more. This is the opposite of the current thought and trajectory.
Beware of bugs in the above code; I have only proved it correct, not tried it.”– Donald Knuth
This is the possibility. There are also new responsibilities, reflected mainly in the need for much more extensive and broad-based testing of the code. Since we are not writing the bottom-level code, we need many more checks to ensure that what the AI produces is understood and meets the outcomes we want. The trust prospect is essential as AI is not as trusted as compilers. Test-driven development and thinking will be essential. Testing will become an even more important part of code development. With testing we can use AI in unleashing the creative energies we have bottled up as computing hardware has become ever more complex.
“We must give the mechanical verification of programs a serious try, for it is the only credible alternative to the present practice of debugging.”– Edsger Dijkstra
Closing Thoughts
What I came to recognize by the end of my career was how badly code development was broken. It had become garbage. I saw a budget that used to pay for creative methods and algorithms that expanded the capability of codes gone. It was replaced by grueling code work focused on syntax and subtle implementation details. This was simply because computing hardware had become so unresponsive and difficult to use. The budget was completely swallowed up with this effort and the cost of porting existing codebases.
What we saw was a value of code that became fixed, with the only improvement in capability coming from the speed of the new hardware. This grim vision of the future. Not surprising that this is exactly what we see with AI and the whole data center issue. AI needs this change in approach badly.
The system needs to evolve and change so it trains the human mind in ways it alone can produce. We must understand what is unique about human thinking. How the human mind can master AI as a capable assistant and tool. Humans create new things that have never existed before, and this is humanity at its best. Code development is the obvious place to make this advance. We need leadership that sees more rather than less.
Code development reflects this human characteristic in a product. For code development to flourish, we need to expect more than just working code (correct syntax and few bugs). We need new ideas, new concepts, new algorithms, and new methods that do more and produce more than what they replace.
“There is nothing so useless as doing efficiently that which should not be done at all.” – Peter Drucker
What scares me most is the key to this transition: management.
By the time I retired and left work, the manager’s job had degraded to a massive extent. It had shifted from leadership to an endless chain of bullshit activities. The focus was on finances and battles that only gave me reasons for contempt, not respect. Managers became increasinglytechnically weak and lacked the human skills to match. They were mainly capable of handling the bullshit they were given. The management job needs to be better too.
This is part of the problem with changing code development. Managers need to think, and they need to think deeply about what they should be doing. Not simply doing the same thing more cheaply. Right now, what they are doing is generally a waste of human effort and beneath what management should do. The real 0risk is that we let managers drive this change. If they do, they will choose the glass-half-empty version of the future and look to cut costs because they have no vision of a future that could be better. They will simply fuck up this massive opportunity for a better world.