{"componentChunkName":"component---src-templates-blog-post-js","path":"/you-have-to-beat-the-models-at-something/","result":{"data":{"site":{"siteMetadata":{"title":"sean goedecke"}},"markdownRemark":{"id":"f54fffeb-615c-5e17-94e2-7f2d62629af2","excerpt":"In 2025, I wrote that software engineers ought to be assessed by “value over replacement”: not how much money they made for their company, but how much they…","html":"<p>In 2025, I wrote that software engineers ought to be assessed by <a href=\"/value-over-replacement/\">“value over replacement”</a>: not how much money they made for their company, but how much they would have made compared to the average engineer in their position. I’ve always found it vaguely silly when engineers put “built a product that made $X” on their resumes, when they just did the <a href=\"/party-tricks/\">JIRA tickets</a> that came across their desk.</p>\n<p>Today, value over replacement is even more important. A replacement-level engineer in the 2010s was <em>fine</em>: maybe not worth promoting, but still <a href=\"/wicked-features/#why-build-wicked-features\">worth paying</a>, because writing code had a high fixed cost. Now writing code costs <a href=\"https://chatgpt.com/codex/pricing/\">a hundred bucks a month</a>. What are you doing that GPT-5.6-Sol or Claude Opus 5 wouldn’t do in your position? Why is it worth paying an extra two or three orders of magnitude for?</p>\n<p>This is a scary thought. But you’re not doing yourself any favors by pretending that LLMs <a href=\"https://garymarcus.substack.com/p/is-vibe-coding-dying\">can’t actually write code</a> and it’s all just a scam, or that LLM-written code is <a href=\"https://www.theregister.com/ai-ml/2026/05/16/ai-generated-code-is-pain-waiting-to-happen/5241574\">inherently so bad</a> as to cause companies using it to collapse next year. We are not going to wake up in 2027 to find that the AI craze is over and everyone is writing code by hand again. You ought to put some serious thought into what you can do better than the models in the medium and long term.</p>\n<p>Staying ahead of the models is a moving target. At the start of 2026, “make working changes to large codebases” was <a href=\"/what-llms-cant-do/\">in this category</a>, but now it’s not. For this reason, I doubt that you can retreat to some “hard engineering” area that requires deeper expertise. That might work in the short term, but not forever. If LLMs can find a better <a href=\"https://www.anthropic.com/research/riemann-zeta\">lower bound</a> on the Riemann hypothesis, they will soon<sup id=\"fnref-1\"><a href=\"#fn-1\" class=\"footnote-ref\">1</a></sup> be able to write solid high-performance kernel drivers or GPU shaders or whatever.</p>\n<p>I think it’s more useful to look at the tasks models <em>haven’t</em> gotten better at over time, and the tasks that are hard for them get better at in principle. The two best examples of these are:</p>\n<ol>\n<li>Deep familiarity with the codebase</li>\n<li>Technical communication</li>\n</ol>\n<h3 id=\"deep-familiarity\" style=\"position:relative;\">Deep familiarity<a href=\"#deep-familiarity\" aria-label=\"deep familiarity permalink\" class=\"heading-anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h3>\n<p>What do frontier LLMs get wrong? What kind of coding mistakes do they make? It’s been a long time since I’ve seen a straight-up hallucination from a coding agent, or a simple logic error like an off-by-one. The mistakes they make tend to be errors of <em>ignorance</em>:</p>\n<ul>\n<li>Not knowing that there’s a module in the codebase they could use instead of reimplementing some logic</li>\n<li>Making the change in the wrong system because they didn’t know System X was the standard place for this functionality</li>\n<li>Adopting a coding style that’s inconsistent with the company’s standard practice</li>\n</ul>\n<p>Other times they’re errors of <em>paranoia</em>:</p>\n<ul>\n<li>Implementing triply-redundant checks for a value that <em>technically</em> could be wrong but practically is set once from config and never updated</li>\n<li>Assuming that ten milliseconds of stale data is unacceptable and designing a complex, unnecessary system to keep it always up to date</li>\n<li>Building in fallbacks and “graceful” degradation into some code that ought to simply crash on error (e.g. a CLI tool, or a restartable k8s service)</li>\n</ul>\n<p>What do these errors have in common? They’re the kind of errors a smart engineer might make if they had no context on the system: they’re competent enough to be able to solve the problem, but they haven’t been around long enough to confidently say “yes, we can take this risk to avoid an extra three thousand lines of code”. Until someone cracks <a href=\"/continuous-learning/\">continuous learning</a> or <em>truly</em> massive context windows, this is just an inherent feature of how AI agents operate. If you can catch these errors, you’ll be providing real value.</p>\n<p>The only way to catch these errors is to be familiar with the codebase and familiar with the system in general. For much more on this, see my post <a href=\"/you-cant-design-software-you-dont-work-on/\"><em>You can’t design software you don’t work on</em></a>. But there’s also a psychological component to it. <strong>You have to be willing to confidently disagree with the agent.</strong> </p>\n<p>AI agents can be very convincing. Often they can get “stuck” on some error above where they’re not willing to take a particular risk, so they keep going back and sneaking in code to cover that case (or writing persuasive arguments about why that case is important). To add value, you need to be willing to say “this sucks, I don’t think we need X and Y at all, why can’t we do Z in a much simpler way?” It takes <a href=\"/taking-a-position/\">courage</a>.</p>\n<p>You can’t rely on other AI agents to review each other’s work. If you use the same model, it’ll reliably make the exact same assumptions and mistakes. But even if you use different models, they’ll also tend towards the same <em>kinds</em> of mistakes — ignorance and paranoia — for the same structural reasons. AI-driven review loops are in fact <em>more</em> likely to get these things wrong, because modern AIs have been <a href=\"https://en.wikipedia.org/wiki/Reinforcement_learning\">RL-ed</a> to try to find a few nitpicks no matter what. Having a critic AI and a worker AI bounce off each other is a really good way to end up with ten thousand lines of paranoid slop.</p>\n<h3 id=\"technical-communication\" style=\"position:relative;\">Technical communication<a href=\"#technical-communication\" aria-label=\"technical communication permalink\" class=\"heading-anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h3>\n<p>Another area where you can add value on top of AI is <em>communication</em>. Newer models are better at coding, but are paradoxically getting worse at writing. GPT-3.5 and GPT-4 had a human-like writing style at times. GPT-4o introduced the modern <a href=\"/on-slop/\">slop</a> idiolect, and the newer Anthropic models speak <a href=\"https://news.ycombinator.com/item?id=49402907\">“Claudish”</a>: a bizarre semi-baroque semi-truncated way of communicating that nobody enjoys. There have been a few bright spots — GPT-4.5 was okay, and I quite liked o3<sup id=\"fnref-2\"><a href=\"#fn-2\" class=\"footnote-ref\">2</a></sup> — but in general LLMs are not good at this. Here’s two reasons why.</p>\n<p>First, <strong>good writing is not a verifiable domain</strong>. If you want a model to get good at mathematics or coding, you can generate problems for it and automatically grade them. You can’t grade good writing. If you try to get humans to grade it — for instance, via the early OpenAI RLHF attempts — you get the kind of writing that sounds impressive to the average person when consumed in single-paragraph form. This is the origin of the “stick three hundred writing devices into every sentence” style. I think it’d be possible in principle to hand-pick some people with good taste and have them do it, but there are some obvious problems<sup id=\"fnref-3\"><a href=\"#fn-3\" class=\"footnote-ref\">3</a></sup> that prevent this from happening.</p>\n<p>Second, <strong>the labs have been monomaniacally focused on capability instead of communication</strong>. When you’re trying to train a model that can break new scientific ground or replace a software engineer, you might trade off some communication ability. In fact, I think we can identify exactly how this has been happening. If you look at <a href=\"https://www.reddit.com/r/ClaudeAI/comments/1ul1396/fable_5_leaked_chainofthought_in_web_interface/\">internal model reasoning tokens</a>, they tend to have strange word choices and oddly truncated grammar:</p>\n<blockquote>\n<p>RESOLUTION: charge the current-leg’s OWN saved-prefix occupancy EAGERLY: when leg i saves e<em>1..e</em>t: ALSO commit their occupancy AT LEG i</p>\n</blockquote>\n<p>If you were to translate this into proper English, you would probably end up with something that reads like Claudish:</p>\n<blockquote>\n<p>Charge the current-leg’s saved-prefix occupancy on a clean, eager path: when leg i saves e<em>1..e</em>t, commit the occupancy at leg i.</p>\n</blockquote>\n<p>I suspect that the weirdly alien writing style of some LLMs is because you’re reading a semi-literal translation of that model’s internal chain-of-thought, which has become nearly incomprehensible in pursuit of better problem-solving abilities. It is surprisingly hard to translate Claudish to good English: not only do you need to follow the convoluted, compressed language of the original, but you need the technical ability to understand the problem the model is solving.</p>\n<p>Because of all this, <strong>technical communication may be a surprisingly durable skill.</strong> In Peter Watts’ novel <a href=\"https://en.wikipedia.org/wiki/Blindsight_(Watts_novel)\"><em>Blindsight</em></a>, the world is full of cognitively augmented humans. The main character is a “synthesist”: someone whose job is to be a translation layer between these geniuses (who speak in abbreviations and gestures) and everyone else. Watts’ idea is that communication ability may be largely independent from — or even negatively correlated with — intelligence. A <a href=\"https://darioamodei.com/essay/the-adolescence-of-technology\">“country of geniuses”</a> may still need a bunch of ordinary smart people to translate their insights for everyone else.</p>\n<p>If you’re trying to communicate to humans, there are also huge advantages to having a human write the content. Many of us are becoming <a href=\"https://cymerys.com/w/im-becoming-ai-blind\">AI-blind</a>: developing an instinctive reflex that stops us reading when we encounter AI-generated content. It’s like the reflex that allows people to ignore flashing billboards or sidebar advertisements on websites. If you circulate some planned technical strategy as an AI-written document, most of your colleagues will have to physically force themselves to read it word-by-word.</p>\n<h3 id=\"conclusion\" style=\"position:relative;\">Conclusion<a href=\"#conclusion\" aria-label=\"conclusion permalink\" class=\"heading-anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h3>\n<p>Whatever you do, don’t be a <a href=\"https://gruhn.me/blog/2026-08-03/\">meat proxy</a>: someone who simply copies requests into an AI agent and submits their output as your own work product. Doing that is just begging to be fired, since you’re definitionally not adding any value yourself. Even if you have a cunning system of multiple agents — the so-called “software factory” — you’re still on dangerous ground. When the features of your system work their way into enterprise AI tooling (and they will), you’ll be disposable.</p>\n<p><strong>You need to find some way to leverage your expertise to do what the models can’t.</strong> Simply not using AI at all is better than being a meat proxy, since you’ll probably do some things better than the model would have, but it’s far better to figure out what AI can do and position yourself to fill those gaps. Right now, there are two main gaps: familiarity with the technical details of the system, and the ability to clearly and persuasively write about those details.</p>\n<div class=\"footnotes\">\n<hr>\n<ol>\n<li id=\"fn-1\">\n<p>If you’re thinking “but LLMs can do these things now!”, substitute your preferred example of high-difficulty software engineering.</p>\n<a href=\"#fnref-1\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-2\">\n<p>Although this was probably a “thank God it doesn’t speak like 4o” reaction.</p>\n<a href=\"#fnref-2\" class=\"footnote-backref\">↩</a>\n</li>\n<li id=\"fn-3\">\n<p>Defining good taste is hard, there’s no guarantee that AI lab researchers have good taste to start with, nobody will agree on examples, the bulk of users might not even like it, you won’t be able to get enough people to produce the volume of data you need, and so on.</p>\n<a href=\"#fnref-3\" class=\"footnote-backref\">↩</a>\n</li>\n</ol>\n</div>","frontmatter":{"title":"You have to beat the models at something","description":null,"date":"August 30, 2026","tags":["tech companies","good engineers","ai"]}}},"pageContext":{"slug":"/you-have-to-beat-the-models-at-something/","previous":{"slug":"/selling-out/","title":"Selling out"},"next":null,"preview":{"slug":"/ai-makes-weak-engineers-less-harmful/","title":"AI makes weak engineers less harmful","snippetHtml":"<p>Like other kinds of puzzle-solving, software engineering ability is strongly heavy-tailed. The strongest engineers produce way more useful output than the average, and the weakest engineers often are actively net-negative: instead of moving projects along, they create problems that their colleagues have to spend time solving. That’s why many tech companies try to <a href=\"https://www.levels.fyi/companies/jane-street/salaries\">build</a> a small, ludicrously well-paid team instead of a large team of more average engineers, and why so far this seems to be a winning strategy.<br /><a href=\"/ai-makes-weak-engineers-less-harmful/\">Continue reading...</a></p>"}}},"staticQueryHashes":["1146911855","3764592887"]}