Apparently everyone needs a hot take on “AI” / LLMs and whether Software Engineering is obsolete.
FWIW none of the textual content on this blog is generated using LLMs or any form of Machine Learning. Every summary, opinion, or attempted witticism is mine. I did use generative AI for image generation as an experiment for one blog image.
Image Generation #
A few years ago, I was given a photobook of midjourney-generated images for my birthday; a wild acid trip through the nonsensical combinations of “sharks”, “drums”, and “star wars”. More of an amusing novelty than original, emotion- or thought-provoking art.
I have tried using Image Playground on my mac a few times, and the results are best used as a source of inspiration than a final artwork. That’s still helpful, but I won’t be uninstalling Affinity any time soon. As an aside, I’m not convinced that Canva’s purchase of Serif and release of Affinity as a no-cost download is a good thing, as I suspect it will lead to the enshittification and abandonment of Affinity over time. Hopefully my paid-for copy of Affinity Designer 2 will continue to operate offline, even if Affinity goes away.
For example, the funky SRE logo I’ve used in a few places on this blog started as an AI-generated image based on a vague idea. One major problem is the model is working with tokenized input, so it cannot spell or inspect the letters used in the input. Prompting for an image containing the letters “SRE” resulted in a lot of images with the letters “SE” only:
Prompt: The letters “SRE” in metallic blocks.
Generated image:

I guess there are a lot of “SE” logos (Special Edition, Student Edition, etc). However much I add to the prompt, eg “ensure the letter R appears”, the poor model can only churn out mangled variations of the two letters S and E.
If I take a step back and think “Maybe I’m being too specific- perhaps the model is capable of generating the idea as well as the image?”
Prompt: Metallic logo for Site Reliability Engineering.
Generated image:

A gear that looks solid and engineered, but turns out to mesh with nothing, has a bunch of implementation flaws, none of the circles are aligned, the name is nonsensical and gets in the way of the functionality, and is resting on a single point (of failure).
No notes.
Turning slop into content #
The generated logo image gave me ideas for the structure, materials, and look of the image I wanted to make.
So I started in tinkercad:

This gave me my basic shapes and dimensions.
Then I imported the mesh into Fusion360, adding bevels to the edges and constructing the other two letters:

The default rendering options in Fusion360 are pretty nice, and I was really happy with the result.
Then I took the final mesh and imported it into Blender, where I could add other image elements. I’m still finding my way around Blender, and while I haven’t yet got the materials and lighting quite right, I’m happy enough with the result:

But what about generating code? #
A year or so ago, I played with copilot in VSCode. I used it once to write some code to create a kubernetes resource using the API. It was very cool to write a docstring for a function and then watch the body of the function be filled out.
Although the code didn’t work directly, it was a useful framework for fixing up the missing or incorrect attributes.
Again, it was a useful foothold to go from “nebulous goal” to “concrete implementation”, even though the actual result was flawed and unusable.
Soon after, I disabled copilot suggestions in AutoComplete as they were distracting nonsense. Which was around the same time the CTO was wanting to reduce costs on the copilot subscription, so I guess that worked out ok.
So what’s new? #
LinkedIn is full of folks with entrenched positions of either “AI can generate complete working APIs now (based on my years of experience and a lot of prompt engineering)” or “Stochastic parrots generate shit code while boiling the oceans (real programmers use vi)”.
Since I’m a firm believer in “strong opinions, weakly held” and data-informed decision making, I wanted to see if things had improved.
A few months ago, I spoke with an AI startup (not really AI but they have the TLD .ai so we
respect their self-identification) who were insistent that all their engineers use Cursor. That
week, Cursor changed their pricing model and r/cursor was in uproar. I don’t know if that
startup is still seeing a net benefit from their Cursor expenditure, but I’m sure it changed the
calculus.
I didn’t sign up for Cursor myself, based on the pricing uncertainty. But I did try out claude-code this week.
Again, I found myself a little stuck with a coding project. While I could have chained myself to the desk and brute-forced it, I didn’t want the stress or the headache and it seemed like an opportunity to try something different.
I’m adding some NoSQL / ORM-like helper classes to my
geeklib repo on codeberg as a storage backend for some
personal financial data processing. Having run /init in claude-code on the codebase, it
generated a pretty good summary in CLAUDE.md (no obvious errors or missing key details).
I asked claude to generate a reload method on one of my clasess, to delete and recreate a
bunch of documents in the DB. Which it did, but in a kinda basic and clunky way. Had I written
that myself, I would have got about halfway through and realized that deleting docs was a basic
operation and added that to the helper class. So then I asked claude to add a delete method to
the helper class and got this response:
I've added a delete() method to the CouchDBData base class at geek/db/couchdb.py:200-207. The method:
- Validates that the object has a revision (throws ValueError if not, preventing deletion of objects not
yet in the database)
- Calls self.db.delete(docid, rev) to remove the document from CouchDB
- Clears the _rev field on success to mark the object as no longer in the database
- Returns a boolean indicating success
I also updated the QifFile.reload() method to use this new delete() method instead of directly calling the
database API, making the code cleaner and more consistent with the existing patterns.
Now, I’m not going to jump up and down yelling “Eureka! It’s sentient!”, but it is a notably cool result. Probably not worth the energy and water required to generate it (considering I could have done the same with half an hour and a cup of coffee, with the coffee being the main energy cost), but it did help me make progress on the project.
- Is code generation going to take away my job?
- No.
- Does it generate code on a level with a standard-issue code monkey?
- Maybe a junior one.
- Does it know what to build, or why?
- No.
- Is it able to identify and reproduce patterns in my codebase?
- Yes.
- Am I excited about paying money to a company which is proven to have stolen training data?
- Hell no.
- Are the other big AI companies any better?
- Probably not.
- Are there more ethical alternatives?
- Maybe. I hope so. If I find one, I’ll post it here. Models like devstral might be helpful, though I don’t have a GPU or Mac with 32GB around to run it locally.
Summary #
For now, for me, generative models have some neat capabilities with some relevant use cases. I just don’t think the current Machine Learning ecosystem (“AI with everything”) is ethically, fiscally, or environmentally responsible. The cost to provide the service far exceeds the price people are willing to pay for those capabilities. The $20/month model is probably not sustainable, but $200 or $2000 isn’t cost-effective for users.
It seems daft that we’re in a situation where every provider is losing money on every token they process and praying for something like Moore’s Law to make them profitable before the world runs out of money for chat bots. Companies have been shedding skilled workers because it is currently cheaper to replace them with bots, even though bots are a reputational and legal minefield and likely to increase in price over time (with the current state of hardware and model resource requirements).
Agentic Architectures are a replay of the 90s Intelligent Agent hype train (which went nowhere despite having some very neat capabilities for some relevant use cases).
As with many things, there are some interesting things to watch out for, and the situation is likely not as bad or as good as the loudest voices are proclaiming.