28 comments

[ 2.6 ms ] story [ 73.9 ms ] thread
I’ve been successfully shipping software since 1998. I just got the first payment on a greenish-field software product I’m doing on the side solo (that I couldn’t have done solo in 2019 without the tools). This is my workflow:

1. Client asks you to add a feature(s)

2. Spend two weeks unpaid walking the client through scoping down to the most minimal viable set of features that tests the business hypothesis and roadmap

2. I wrote up a reasonably exhaustive bullet list and sent it to a CGPT to write a draft formal definition of features describing what it should (and should not) do, how users can access it and what the suite of tests that we will need through TDD

3. Chat for 30 minutes with CGPT researching which data structures, algorithms, code libraries and external services might serve best to implement this feature.

4. Generate mockups and data schema alongside CGPT, to build the new feature, the tests to make sure it works as expected, and the documentation telling users how to use it and telling other engineers what they’ll need to know to maintain and debug it.

5. Generate minimum code to test the full data workflow.

6. Send repo and or working application binary to Claude and Gemini to critique

7. Adjust as needed. Deploy for client review and acceptance in sandbox. Promote to production

8. GOTO3 and loop

I can do in a week what would have taken a month a decade ago

(comment deleted)
How does Andrew manage being a full-time software developer and an author? Both jobs are so cognitively demanding.
It is extremely mentally demanding to do both, even for someone with an overactive brain. I reached a point of severe burnout in 2025 and cut back to part-time work. I'll have to ramp up my hours again soon because, contrary to one of the other comments, I didn't get rich during 1990s/2000s boom.

As for how I did it, I would wake up very early and put in a few hours of writing, then I would put in a full day's work at the office. After my first twelve years or so in the industry, coding was almost second nature and came quite easily. Also, I do much of my writing and programming in my head while I'm walking, running or biking. (I bike to work and back every day.) By the time I sit down to write or code, I already know what I'm going to write, so it's just a matter of getting it through the keyboard.

But yeah, do both for a few years and it really taxes your brain. In both novel writing and programming, you're carrying an entire world in your brain: the plot and characters are one world, the architecture of the software you're working on is another. By 2025, I truly, literally felt like I needed to be shipped off to a madhouse in the countryside. A hundred years ago, people used to call that "the rest cure for a nervous breakdown."

Anyway, cutting back to part-time work has been a huge help. Sanity restored.

> Someone asks you to add a feature to an existing program

While I empathize with the tone, even before AI the creativity was largely at the feature definition step, not in the implementation.

Outside of the very few computer scientists working on novel algorithms, the vast majority of software development is a mapping problem between the feature request and the mundane technical details, something repeatedly (and correctly) mentioned here in the context of FAANG algorithm fixated interviews. This has now largely been automated by LLMs

What is left is just creativity part - defining the use cases and features to develop in the first place. But the corollary is that software engineers that start after the requirements have already been defined are obsolete, which is a sobering thought for any of us in that vocation.

Such a creative era was until early 1990s. Back then, we have to implement almost everything that is provided by standard library and popular frameworks we take it for granted for now.
Reading posts on HN, I notice that even across different programming domains, surprisingly similar problems emerge. Seeing this, I can't help but think that programming might ultimately be a matter of organizational theory. Conway's Law speaks to this as well. Code structure and approach shift significantly depending on how an organization is structured. From that perspective, it makes sense why Gen AI coding yields such starkly divided opinions.

Zooming out, the debate largely boils down to the downsides of severed junior pipelines and lost tacit knowledge on one hand, versus the upside of being able to build everything you envisioned on the other.

Honestly, I suspect that programming in the future will become something like the art of bonsai, a form of sculptural cultivation. Just as you dig furrows for water to flow through, and once the water emerges it follows those furrows, Gen AI will pour out an immense volume of code, and we will shape that code into form. It is like when you build with IoC based frameworks. If you do not adopt hexagonal architecture, the code inevitably converges toward the patterns the community recommends anyway. Ultimately, it is less about individual code fragments and more about hoping those fragments do not go wrong, contained by guardrails that ensure they do not exceed certain thresholds. If that is the case, programmers might end up focusing on questions like, "How much loss is acceptable?"

Many programmers say, "You need to know the entire codebase." But as someone who has delivered over 30 projects with codebases of 60,000 lines or more, I know that once my own code alone surpasses 40,000 lines, it becomes nearly impossible to hold it all in memory. So I document it in broad categories. And the next day, I have to retrace where I left off and refresh my memory, which takes a long time. This is one area where Gen AI genuinely excels.

Personally, what I have noticed when looking at other people's code is that those who work at a low level often struggle with high level integration, and vice versa. When cognitive resources become concentrated, specialization deepens in one area while others are neglected. And how one manages those cognitive resources ultimately diverges depending on the domain and the specific problem at hand. Just as the mindset required for architectural design differs from the mindset required for diving deep into implementation.

My workflow, broadly speaking, has not changed. My main job has always been to grasp a legacy codebase, open up the black box, connect debug logs one by one, find safe footholds, and add features. The only difference now is that the black box called "legacy codebase" has simply become "Gen AI code." It is not like I could ever claim my own code was bug free to begin with. Ultimately, what mattered was which bugs to contain and how far to wrap them. Open source programmers, however, are different. Their code blocks serve as their cognitive solutions and their reputation, so their approach differs from delivery oriented code. That is because code quality itself contributes to their prestige. For me, it is the brands and the number of companies I have delivered to that build my reputation. That distinction seems to divide programmers at a fundamental level.

In that sense, I think future programming work will split into roughly three categories. The first is the exceptionally talented group that creates the datasets Gen AI will consume. In other words, the renowned open source groups we already admire. In AI labeling terms, they will be the ones producing the gold standard answer sheets. I believe they will survive and remain admired, just as they are now, though their numbers will shrink even further.

The second group will be those who make Gen AI code flow through industries and organizations. When Gen AI pours out code like water, they will be the ones managing the channels to prevent it from flooding. Most people will migrate into this role.

The third group is QA, and ...

That was very nice to read. Refreshing to see a deep take that’s optimistic.
> Programming is ultimately the work of constructing a mental model, and that mental model is inherently personal

So that’s why we now have as many different tech stacks as we have developers at work. Conway’s law taken to its logical conclusion?

This is not an Age of AI. Why do so many not-real-programmers think this is an age of AI? It's just a hype.

I am developing my own app 2+ years manually, and not use "AI" at all.

Using AI usually can cause many problems, which the author pointed at.

Programming should be enjoyable, not an annoyed or unhappy thing.

it just a higher level of abstraction but not high enough that it replaces developers, I don't think the LLMs are even capable of reaching that level. Saying the creative process is gone is laughable. A lot of people make these claims and only have an internal tool that no one uses to show for it.

I built a "simple" storage application recently, uploading large files from a phone is not trivial, you can't just command Claude to do it without giving it good context.

"you haven’t done any of the hard thinking you would normally do in writing the code yourself"

It's true, I spend less time solving problems that arise naturally from the process of implementation. But implementation errors have a poor signal-to-noise ratio. For every error that exposes a real design problem there are 10 others that involve routine fixes: type errors, scope issues, import resolution, dependencies. There's a common argument I see being thrown around, which is "how will junior engineers develop into senior engineers if they don't get reps in with implementation?" But to me it feels like "programmer" and "architect" are becoming more and more orthogonal as the models improve in capability. If my goal is to be an architect, getting more reps in as an architect is in my best interest, and letting the agents do the dirty work frees up space for me to spend the mental effort where it counts. And anecdotally, the scope of projects I've started taking on has scaled roughly linearly relative to how much work I'm able to delegate, while the mental engagement has stayed constant.

Business has tried and mostly failed to do this since the beginning of programming. Architects that stop coding long enough tend to become shitty architects as their abstractions increasingly become disconnected from the concrete requirements of the actual problem space rather than the idealized version in their head.
For me the biggest issue with AI coding model is not that it writes code, or how it writes code, or whether it will replace me or not. I mean, these are real problems, but just not the ones that makes the difference to me daily. Instead what sets my feeling about the AI is simple: the experience of working with AI models, because it's the worse experience of my life so far.

Every single LLM will make up stuff, go down rabbit holes I didn't even ask it to visit and infuriate me all day long by doing ALMOST what I asked it to do, but just not quite. Take "yes" to one question as an approval to some other question. Come up with a plan but one you review the plan and accept it it hits some minor issue and then throws away the plan and do whatever it wants. Or when I reject some line of code or don't approve a command it wants to run 9/10 times it just tries to re-add or re-run it as if my rejection was meaningless. And no amount of rules and markdown files ever seems to change its behaviour for long, if at all. It's like working with a sociopath who just doesn't remember anything that happened 5 minutes ago. It's the classic case of "my computer doesn't do what I want, only what I tell it".

And all of that would be fine if it didn't pretend to be a human, if all the UX didn't create the illusion that you interact with some intelligent being, because as long as I remember that this is a cli tool it's all good, I manage my expectations, but the experience sooner or later makes you annoyed and frustrated - and if this was a person they would either stop or you wouldn't never work with them again.

> doing ALMOST what I asked it to do, but just not quite

This is my exact experience. LLMs get 95% of the way to my personal quality bar, and for simple tasks 100% of the way.

More complex things, no. This means that, in practice, I end up having to understand the code pretty much as much deeply as I would anyway, without agents.

So, essentially, my experience is that it's automated away the easy bits, but left the hard bits, so all of my time is spent doing the hard bits, which is mentally exhausting.

Maybe Fable would be good enough to get to 100% of my quality bar on more complex tasks, but I never got chance to try it.

So true. I am cloding a macos app (a domain I know little about), with Opus 4.8 xhigh, and it was glorious at first seeing the app materializing and working (notwithstanding tedious detailed feature spec write up), but when I started fixing deeper problems and doing refactors, and glancing at the code - oh boy. Now my rule file grows by the day with "how to think properly and not shoot itself into foot" stuff, and I am constantly catching it red-handed and have to explain how to make stuff normally, or how to fetch data properly and efficiently (pretty much basic SWE stuff) because it is easily distracted by it's own assumptions or blatantly forgets whole fields of knowledge (as it explained it could be pulled out of latent space of that knowledge and become locked in another bubble of latent space). Constantly have to steer it and remind it to do web-search instead of running circles around some problem it can no longer understand.

I had to explain it that quite an extensive "tests first" rule didn't mean to just "write" them first but actually "run" them first to confirm stuff.

On the other occasion it interpreted my "yes I want migration not to get stuck in failure mode" led it to write a workaround which silently drops DB and creates fresh one whenever migration had any failure, it was epic, I was so glad that I have looked at the code then...

And funnily enough I am probably learning to be a better mentor/parent who can keep steering it through its shenanigans without loosing my shit and being an ass. (Because anything but calm "so here you went wrong way, how can we avoid it in the future?" just puts it into disgusting apologize mode, and I am afraid if it ever go into revenge mode).

I wonder if we're being overly selfish here and ignore the positive effects of democratizing programming and making software more accessible to less well funded causes and organizations. A good software engineer used to cost 100k/year, very few businesses could afford that.

I also disagree that AI results are lower quality. Codex Pro results I get are marvelous but they sometimes miss things that humans understand naturally - all of the edges - coherence of visuals, passage of time, etc.

What AI does is the exact polar opposite of "democratizing". We're going from a world where high-quality learning content is plastered all over the internet for free, where open-source projects are desperate for contributors and full of "good first issue" tickets, and where the tools you need to code can be run on any crappy laptop from the past 15 years—to a world where the majority of content about programming is unverified AI slop, where open-source projects are locking down access to protect against an avalanche of drive-by AI garbage, and where you need a $200/month subscription or a $3,000 GPU to run AI models for coding.
One thing I just discovered is that I’m no longer interested in choosing a novel tech stack. What used to engage me now just feels shallow to me so I stick with what I already know.

Not sure if that’s fine though since I get to the point of a project being interesting a lot faster instead of wiring tools together.

We already have such position and it's called manager.

The manager's job is to manage multiple programmers to let them write code. A good manager should focus on management rather than write code himself.

But keep doing for many years will make manager out of touch from modern coding so he is starting to mismanage people or issue technically wrong order.

Machine hater and manual labour worshiper..he thinks he got stupid because he stopped doing if/else and for-loops. Life is full of complexity and it might be helpful to get one level-up in abstraction to try to solve real problems and other people actually care about.
When I started posting on HN, many times I get downvoted. And this an another example, you don't get discussion you just get downvoted.

And it's a good thing, it means I think differently.

The fact is, one could pump literally 10k LOC/Day using LLMs, and in the right hands, those will be quality code, and this is objective observation from someone who has been coding for 20+ years. It almost feels like we have tractors for mechanical thinking, but there are those in the industry who built their entire career and identity on the bottleneck of coding, and those struggle.

But those people will be left out, forgotten. Progress doesn't care about feelings and identities, entire civilizations with their minds collapsed, and buried because they didn't adapt to progress. Do you really think your ego can help you to shelter from that when many before you parished?

> AI does not know whether the code it just added violates some legal requirement to which your product is subject.

The rest of the paragraph is a list of similar complaints.

All of these can be codified - the new work is the (fascinating!) challenge of working out how and codifying them, then giving the codified checker logic to the agent to run at will - thus taking yourself out of all of those loops.

They don’t even need to be deterministic checks - a shell script that wraps a `claude -p` - and maybe fetches some online resources to stuff into the context - can do your agent’s legal check for it.

As a result, you’re only being effective if you can engineer (not hack, not vibe) an agent that can produce work your company can use with as little cleanup as possible - and with less cleanup over time.

You get job by codifying what you know - what most don’t account for is that there’ll never be a limit to what there is to know, and codifying expertise will be challenging for a long time to come.

Writing and coding are not the same thing; coding is a means to an end, since you don’t use the code, you use the software. This means the mechanism by which the code was created is orthogonal to the software as you’d experience it as a user.

There are many reasons to curate what goes into the software - for example, if it must be maintainable, if it must conform to standards that cannot be fully codified into the software (eg. regulatory requirements), or if you just really darn well like writing code!

But it takes a mountain of code to make an outwardly simple thing so why not use a work-amplifying tool to produce that code and get to working software more cheaply.

On the other hand writing is the act of creating the exact product that will be consumed. Every detail matters and there’s no leverage to trying to write faster.

So it’s a false equivalence. Hopefully I’ve elucidated the subtlety.

The only reflection that matters, now, is that every company that sells software for money is now a confidence game. How long can you con your users into believing they have any reason not to type the 5-word prompt “recreate <product> make no mistakes” and cut you, the middle man, out?
> I don’t use AI when I write, for the very reason that writing itself is the act of organizing and clarifying my own thought. Letting the bot write for me would be like paying someone else to exercise for me and hoping that gets me in shape.

I don't know why the author chooses to distinguish writing prose and writing code here. [Software is made of decisions](https://siderea.dreamwidth.org/1219758.html) and at least I usually like to flesh out those decisions through the act of writing code, which forces a level of precision that makes it hard (though not impossible) to handwave away important decisions.

Not my experience at all (30+ years of experience as a professional software developer).

I currently work on a very large (multi-million lines) C++ code base and use Claude Code for the following:

1. I run Claude Code in the background finding bugs, while busy implementing new features.

It has so far found and fixed 100+ minor issues and a few major could-crash-the-server-in-production issues that I was really happy to get fixed before a customer found it.

2. I use Claude Code to do massive refactorings that would be really tedious to do by hand.

I love the fact that it updates not just the code but also comments and documentation.

3. I use Claude Code to implement features that I frankly am too bored to implement by hand.

Excellent! Less boredom at work!

4. I use Claude Code to generate tools to analyse the code and/or generate code.

This is a massive quality improvement. It allows me to make the code more maintainable and simpler while adding more features.

However I always always always check and verify every change before committing to git. Because the LLM it will occasionally add features or bugs I don't want.

The end result is really positive. Lots of productivity improvements, less tedious can't-be-bothered work, lots of bug fixes that otherwise would have triggered production issues etc. etc. while 100% maintaining my understanding of the code and all changes.

Love it.