Grief and the AI split
blog.lmorchard.com241 points by avernet 3 days ago
241 points by avernet 3 days ago
I think the article misunderstands completely. "Craft" coders are chasing results too — we're just chasing results that last and that can be built upon. I've been in this game for a while, and a major goal of every single good programmer I've known has been to make themselves obsolete. Yes, I enjoyed meticulous hand crafted assembly, counting cycles and packing bits, but nobody had to talk me into using compilers. Yes, I've spent many fruitful hours writing basic CRUD apps but now that's easily done by libraries/frameworks I'm not eager to go back. Memory management, type systems, higher level languages, no-/low-code systems that completely remove me from some parts of the design loop, etc etc etc. All great: the point of computer programming is to have the computer do things so we don't have to.
I think the real divide we're seeing is between people who saw software as something that is, fundamentally, improvable and understandable; and people who saw it as a mysterious roadblock foisted upon them by others, that cannot really be reasoned about or changed. And oddly, many of the people in the second category use terminology from the first, but fundamentally do not believe that the first category really exists. (Fair enough; I was surprised at the second category.) It's not about intelligence or whatever, it's a mindset or perspective thing.
Yeah, I like this framing a lot. There comes a point, after working on a system for a while, when there are no details: every aspect of how the system works is understood to be in some way significant. If one of those details is changed, you understand what the implications of that change will be for the rest of the system, its users, etc. I worry that in a post-AI software world, that’ll never happen. The system will be so full of code you’ve barely looked at, understanding it all will be hopeless. If a change is proving impossible to make without introducing bugs, it will be more sensible to AI-build a new system than understand the problem.
I sometimes wonder if modularity will become even more important (as it has in physical construction, e.g. with the move from artisanal, temperamental plaster to cheap, efficient drywall), so that systems that AI is not able to reliably modify can easily be replaced.
> It's not about intelligence or whatever, it's a mindset or perspective thing.
I agree with everything except this last sentence. What you wrote looks highly intelligent and I would suspect a lot of people in the second camp are not up to par with this.
Wise+intelligent people realize that intellectualizing every fucking thing in their life is a trap, and that they should rely more on other things. Not the least of which is buy-in, which is often not about rationality either.
It might take intelligence to notice the problem, but we all know people who haven’t and some who might never. My previous job has the oldest I’ve ever met and I wanted to strangle him at least once a week. I haven’t added anyone to my Do Not Hire list in over a decade. Except him. He made himself indispensable at every opportunity and had some of the most convoluted code (and vocabulary) I’ve encountered in a long time. I spent way too much time extracting his claws from code I’d written that he made an absolute hash of.
> and a major goal of every single good programmer I've known has been to make themselves obsolete.
I’ve always heard this mantra when coders were thinking they’re untouchable, not so much now.
i wonder, is the divide something like Pirsig's classical vs romantic ? First see mostly-functionality / facts, want to understand to the bones, latter see .. appearance / utility / feelings, want to just-get-on-with-it ?
You are repeating the same thing. You think having good maintainable good is important - more than the first camp.
That does not mean you are correct. This mindset is useful only in serious reusable libraries and open source tools. Most enterprise code involves lots of exploring and fast iteration. Code quality doesn’t matter that much. No one else is going to see it.
When the craft coders bring their ideology to this set up, it starts slowing things down because they are optimising for the wrong target.
When the code is low-quality, you can’t reason well about it, can’t reason well about what changes to apply and what their effects will be, can’t reason about what the outcome will be when making changes to the context (inputs, environment) the code is run it. Instead everything becomes an experiment on a black box or gray box, whose behavior you can’t well predict in advance.
Engineering is the task of making things behave predictably and reliably. Because software is malleable and rarely “finished”, this applies to changing software as well.
I’m pretty sure that there is more than one divide regarding AI among developers, but one of the dividing lines concerns the predictability and reason-ability of the tools and the code. AI fundamentally lacks these qualities.
> Most enterprise code involves lots of exploring and fast iteration.
And when the code base is 250,000 lines of garbage all the way down, this is impossible. The projects where I’ve had free rein to kill tech debt and SDLC footguns with impunity have all been the ones where velocity maintained or increased over time. All the rest have ground to a halt.
There’s value in customers believing you’ll get there soon and the code will actually work. They can be patient if you have an air of competence. But they will switch to some other clown car if it’s cheaper than your clown car.
> Code quality doesn’t matter that much. No one else is going to see it.
This is just false for anyone who has worked in the industry for any meaningful amount of time. Do you seriously never encountered a situation where a change was supposedly easy on the surface, but some stupid SoB before you wrote it so bad that you want to pull your hair out from trying to make it work without rewriting this crap codebase from scratch?
at least where i have worked, you need to identify the context. certain projects require good readable code and certain projects require you to iterate fast and explore.
in my experience very few projects were serious enough that required such scrutiny in code.
Sounds like you’ve never had a prototype become foundational infrastructure before, or dealt with someone else’s.
I have many times and if you spend too long over architecting a prototype you start to get annoyed looks and tons of questions from PMs who just want something that looks right today (we can fix it/optimize it later)
you can always change it later. this is exactly the dogmatism i'm speaking about - you need to prioritise pushing things. the clean up can come later.
ironically it is your camp that advices to not use microservices but start with monolith. that's what i'm suggesting here.
> you can always change it later. this is exactly the dogmatism i'm speaking about - you need to prioritise pushing things. the clean up can come later.
Everyone that says this has not been the one that had to fix the code later. They have already moved to the next jobs (or have been fired). Engineers do know the tradeoff between quality and speed, and can do hack if that’s what needed to get the project to the finish line. But good ones will note down the hack and resolve it later. Bad ones will pat themselves in the back and add more hacks on top of that.
> You can always change it later.
People seem to think that technical debt doesn't need to be paid back for ages. In my experience bad code starts to cost more than it saved after about three months. So if you have to get a demo ready right now that will save the company then hack it in. But that's not the case for most technical debt. In most cases the management just want the perception of speed so they pile debt upon debt. Then they can't figure out why delivery gets slower and slower.
> ironically it is your camp that advices to not use microservices but start with monolith. that's what i'm suggesting here.
I agree with this. But there's a difference between over-engineering and hacking in bad quality code. So to be clear, I am talking about the latter.
I think your target is the wrong target myself. Now what?
If more people think like you we won’t have jobs because company won’t make profit
If people think like you we won’t have jobs because everyone would fucking die when cars, MRI machines, nuclear power plans and ICBMs, airplanes, infra, payments start misbehaving. Now what?
this is a category error that i specifically called out in my comment.
What is the category of code that does not need quality? You need it to not interact with real world, with people's finances, with people's personal data. Basically it's the code that only exists for PMs to show to investors (in startups) and VPs (in enterprise), but not for real users to rely on.
> What is the category of code that does not need quality?
For example there exist "applications"/"demos" that exist "to show the customer what could be possible if they hire 'us'". These demos just have to survive a, say, intense two-hour marketing pitch and some inconvenient questions/tests that someone in the audience might come up with during these two hours.
In other words: applications for "pitching possibilities" to a potential customer, where everything is allowed to be smoke and mirrors if necessary (once the customer has been convinced with all tricks to hire the respective company for the project, the requirements will completely change anyway ...).
Yeah, that's what I mean - prototypes. The caveat is though that before agentic coding skills to build a prototype and skills to build a production system were generally the same, so a prototype did not only provide a demonstration of what is possible in general, but what your team of engineers can do specifically. Now these skills will diverge, so prototypes will not prove anything like that. They are still going to be useful for demonstrations and market research though.
Where?
> That does not mean you are correct. This mindset is useful only in serious reusable libraries and open source tools. Most enterprise code involves lots of exploring and fast iteration. Code quality doesn’t matter that much. No one else is going to see it.
Here? Most of those that I’ve listed IS boring enterprise code. Unless we’re taking medical/military grade.
fair, you have presented specific niche where the ~quality~ correctness is important in enterprise - not just libraries.
but most people aren't writing code in those places. its usually CRUD, advertisement, startups, ecommerce.
also there are two things going on here:
- quality of code
- correctness of code
in serious reusable libraries and opensource tools, quality of code matters. the interfaces, redundancy etc.
but that's not exactly equal to correctness. one can prioritise correctness without dogmatism in craft like clean code etc.
in most of these commercial contexts like ecommerce, ads - you don't need the dogmatism that the craft camp brings. that's the category error.
Maybe you’re too entrenched in the web section of software development. Be aware that there’s a lot of desktop and system software out there.
Even in web software, you can write good code without compromising in delivery speed. That just requires you to be good at what you’re doing. But the web is more forgiving of mistakes and a lot of frameworks have no taste at all.