"The design is the work; the code is an artifact."
I agree with that, but my take might not be what you're thinking. What matters most is indeed understanding users' and customers' needs, then designing the simplest, most extensible system that satisfies those needs. (I hate the word "architecting" 😄. "Architect" is a noun!) The real fun is in designing incrementally over time while maintaining simplicity and coherence as the system evolves.
Design work is multifaceted, of course. You need to talk to people to understand their needs; maybe actually do their job for a while, or at least observe them as they work. You need a broad range of skills, from communication and UI to user experience and usability engineering, testing, security, systems thinking, and more. You need a solid foundation in software architecture and the skill to create the appropriate architecture for the problem at hand and keep it good as the system scales. This has nothing to do with connecting "frameworks" as if they're LEGO blocks.
I've never adhered to the design-up-front-then-mindlessly-implment-it philosophy. We do not create blueprints (or "specs") that are implemented more or less exactly by a contractor (or LLM). In my experience, that's the least effective way to work [with a few obvious exceptions].) To me, the best designs emerge over time—the product of conversations and feedback around working code and continuous adjustment, and coding is a significant part of the design process.
Architecture is a collaborative activity, not something that one "brilliant" person does and then passes the <snif> implemenation to mindless minions who do what they're told. People keep trying that. It never works. Automated minions (i.e., an LLM) are no exception.
Coding is a substantial skill, and a lot of design work goes on as you're writing the code and discovering design flaws. Programmers are architects—they make architectural decisions with almost every line of code they write. That said, a lot of the coding is rote work I'd as soon slough off onto an LLM, but to imagine that 100% of coding fits that category is delusional. It takes a skilled programmer to understand which parts need a human touch and which parts don't.
And I am a realist who understands computing and AI deeply, having worked in the field for over five decades - where I continue to work - both witnessing the changes as well as inventing things that made those changes possible.
AI is useful.
But I’m certain AI will not do 80% of the economically valuable work humans do today, for 80% of all jobs.
This post gets it.
There is a weird obsession in some of the niches of the AI industry to remove humans: Let the LLM think longer, use loops, let the LLMs judge their ownn output, create a constellation of AI agents and let them go wild.
I say slow things down, keep humans in the loop, have human experts review at least some of the AI responses, continue to invest in human-labeling. You might not have a burst of output in the beginning, but you will avoid the compounding slop that David warns about.
@golubev_mikhail@mikhail_golubev В позиции есть очевидный хороший ход требующий аккуратного расчета. Очень сложно представить, что есть другое креативное решение.
Прямо иллюстрация к известной фразе Ласкера.
@gselendal - AI has no concept of "correct" or "incorrect"
- AI has no concept of "good" and "bad"
- AI has no concept of 'right' and 'wrong'
- AI doesn't know good code from bad code
- AI isn't trying to build a better future;
- AI doesn't innovate
I start with very informal specifications written by hand. I have an agent convert these into harder specifications that are subdivided into tasks. I review these.
Then I feed those tasks into the specifier agent, which converts each task to Gherkin, prunes the Gherkin, and then hands it off to the coder agent. I spot check the Gherkin.
The coder agent writes acceptance tests directly from the Gherkin. Then writes unit tests. Then writes code. When all those tests pass, the coder agents hands off to the refactorer agent.
The refactorer agent reduces crap to 6 or below, and reduces any duplication. Then it write property tests and gets them to pass. Then it hands off to the architect agent.
The architect agent runs language mutation and covers any uncovered sections, and kills all survivors. Then it runs Gherkin mutation and kills any of those survivors. Then it runs the entire test suite, and when it passes it hands the result off to the specifier, coder, and refactorer.
I spot check the code.
This is an exercise of transformations from the informal to the formal through managed stages, with human interaction decreasing with each stage.
Raw computer power is the limiting factor. Those mutation tests are CPU intensive.
@Grady_Booch Brain may be computable in theory. But also the complete computation may require same resources as modeling Jupiter’s Great Red Spot. Perhaps, the full computational model is not required to imitate its work.
One of the dysfunctions that AI amplifies is the software industry's focus on output. The move to AI is all about increasing output. Robot monkeys type faster and produce more output than people. The problem, of course, is that it's never been output that's the problem. Producing a garbage product faster benefits nobody; never has. It's good outcomes (e.g., happy customers, painless improvements) that we need, not more output.
That's not to say that, within limits, producing code faster is a bad thing. For one thing, getting working code into customers' hands faster gets us better feedback sooner. But. The best way to increase speed, whether or not AI is in the picture, is to not build things nobody wants. AI often does the opposite. I was reading this morning about the huge security holes in systems created by several of the vibe-coding platforms. Nobody wants security breaches. The customers certainly don't, and ultimately, given the legal liability and loss of customer goodwill, neither does the company. The same applies to even big platforms like Amazon, getting buggier and buggier by the minute. Nonetheless, the siren call of more output seems to push companies into doing things that are not in their best interests.
The other related assumption is that more code is somehow a good thing. That's also never been true. More code adds complexity. It hides bugs. It's harder to maintain (even with an AI doing the maintaining—loading 500K lines of code into a single context to fix a bug is not only expensive, but will probably introduce five more bugs for every one you fix). We always want the smallest, simplest thing that solves exactly the problem at hand and nothing else. Ego-driven development by people who pat themselves on the back and do a happy dance every time they create more more more, without bothering to look at what, exactly, that "more" entails, gets us nowhere good.
I have to add—to head of the inevitable wild-eyed cultists—that I am far from opposed to AI assistance. I use it myself, and any software shop that doesn't avail itself of effective tools has got worse problems than an output focus. However, we have to use AI in the context of producing value; value to both the customer and to the engineers. Value is not proportional to quantity.
"Stop looking for full time work. Start looking for fractional work. That’s a real flip in your brain about how you approach everything that comes next. The conversations you take. The way you describe yourself."
https://t.co/c9pPBLDtHW
This is a worthwhile read from Meta engineer @championswimmer (who I met last time I was in London - great guy)
His point is that a lot of these “AI layoffs” could well be backwards: they are prob happening because more AI spend doesn’t correlate with better business results…