메뉴
HN
Hacker News 7일 전

클로드는 컴파일러가 아닙니다

IMP
7/10
핵심 요약

저자는 LLM을 단순히 자연어를 코드로 번역하는 '컴파일러'의 연장선으로 보는 시각을 반박합니다. 클로드와 같은 AI 모델은 전통적인 컴파일러처럼 단일 계층에 머무는 것이 아니라, 기획, 아키텍처, 코딩 등 전체 스택을 아우르며 수직적으로 작업하고 의사결정을 내릴 수 있다는 점에서 훨씬 더 진일보한 도구라고 설명합니다.

번역된 본문

2025년 초, 저는 '클로드는 컴파일러인가?'라는 글을 썼습니다. 당시 제 대답은 '모르겠다'였습니다. 하지만 이제는 확신합니다. 대답은 '아니다. 그것은 범주의 오류(category error)다. 컴파일러보다 더 낫다'입니다. 하지만 이를 이해하려면 약간의 설명이 필요합니다.

컴퓨터 프로그램은 악명 높을 정도로 복잡하고 까다롭습니다. 프로그램은 극도로 정밀한 수준에서 작동합니다. CPU 명령어 중에는 '대충 얼버무리는(wave hands)' 명령어 같은 건 없습니다. 반면 고차원적인 목표들은 구체적으로 정해져 있지 않은 경우가 많습니다. 매우 단순화된 세계관에 따르면, 소프트웨어는 여러 계층(layer)으로 만들어지며, 각 계층은 명세(specification)를 추가하고 '불필요한' 세부 사항을 숨깁니다. 비전은 전략이 되고, 제품 계획은 코딩 계획이 되며, 코드는 바이너리(binary)가 됩니다. 각 단계는 임원, VP(VP), PM, 아키텍트, 엔지니어, 컴파일러 등 서로 다른 역할에 의해 처리됩니다. 핵심은, 모든 단계에서 수많은 의사결정이 이루어진다는 것입니다. 명세 수준을 높인다는 것은 바로 이런 뜻입니다. (그래서 제가 엔지니어를 채용할 때 보는 두 가지 핵심 지표 중 하나가 '판단력'입니다. 다른 하나는 '협조심'이죠.)

소스 코드에서 바이너리로 변환하는 최하위 계층이 바로 컴파일러가 하는 일입니다. 컴파일러 역시 수많은 결정을 내립니다! 인라이닝(inlining), 레지스터 할당, 경고를 띄울지 아니면 프로그램 자체를 거부할지 등을 결정하죠. 이러한 결정은 중요합니다. 성능, 시스템 안정성, 예측 가능성 및 실패 모드를 결정하기 때문입니다. 컴파일러 엔지니어의 역할은 컴파일러가 일관되고 좋은 결정을 내리도록 만드는 것입니다. 신뢰할 수 있는 훌륭한 컴파일러는 소프트웨어 엔지니어가 이런 세부적인 결정을 내려야 하는 부담에서 벗어나게 해줍니다. 대부분의 엔지니어는 컴파일러가 어떻게 작동하는지 거의 모릅니다. 하지만 효과적으로 일하기 위해 그것을 알 필요가 없습니다.

2025년, 우리는 LLM을 사용하여 비교적 작은 단위의 코드를 생성하는 세상에서 살고 있습니다. 이러한 마인드 모델에서 코딩 에이전트는 소프트웨어 엔지니어와 전통적인 컴파일러 사이의 새로운 계층으로 자리 잡을 수 있습니다. 이는 자연어를 코드로 '컴파일'하여 엔지니어가 직접 결정하지 않아도 되게 만듭니다. 이러한 에이전트의 가치는 신뢰성과 내릴 수 있는 결정의 규모에 비례합니다.

문제는 이처럼 매우 단순화된 세계관이 실제로는 틀렸다는 것입니다. 추상화는 새어 나가기 마련이고 계층 간에는 마찰이 생깁니다. 새어 나가지 않더라도 우리는 어차피 그 계층 간의 경계에 구멍을 뚫고야 맙니다. 계층에 얽매이지 않고 여러 계층을 가로지르며 일하는 것은 매우 가치가 있습니다. 기계적인 친밀감(mechanical sympathy)이 중요합니다. 엠파이어 스테이트 빌딩이 1년도 채 안 되는 기간에 예산 이하로 건설될 수 있었던 이유 중 하나는 체계적으로 계층을 가로지르며 작업했기 때문입니다. 예를 들어, 외장용 크롬-니켈 강철 패널을 결정할 때 다음과 같았습니다.

'건축가, 시공사, 하청업체 어느 누구도 충분한 협의 없이 이 복잡한 건축 기술적 문제를 처리할 자신이 없었습니다. 따라서 충분한 예비 논의 후, 소유자, 건축가 및 시공사 대표, 자재를 압연하는 하청업체, 이를 제작하고 설치할 금속 가공자, 그리고 여러 준비 단계에서 모든 시트를 테스트할 검사관 등이 참석한 전 참석자 회의가 소집되었습니다.'

이 말을 소리 내어 읽으면 정말 당연한 이야기처럼 들립니다. 하지만 실제로는 우리가 체계적으로 실패하는 부분입니다. 저는 작업하기 느리고 비참하지 않은 방향으로 디자인을 안내할 수 있는 기회를 얻은 금속 가공자들이 얼마나 기뻐했을지 상상만 할 뿐입니다. 우리가 실패하는 이유 중 일부는 무엇을 물어볼 가치가 있는지조차 모르기 때문입니다. 최고의 임원들이 자신의 산업에 대해 깊은 지식을 가지고 있는 데에는 이유가 있습니다. 저는 그들 중 일부는 하위 작업자를 얕보는 태도('금속 가공 노동자가 나에게 무슨 말을 해줄 수 있을까?') 때문일 것이라고도 의심합니다. 하지만 상당 부분은 커뮤니케이션과 조직 관리의 오버헤드 때문이기도 합니다. 계층이 존재하는 데는 이유가 있습니다. 정보 은닉(information hiding)은 조직의 확장을 가능하게 하니까요.

클로드가 컴파일러보다 나은 이유는 스택 전체에 걸쳐 수직적으로 작업할 수 있기 때문입니다. 오늘날 LLM은 전략, 제품, 아키텍처, 코드 및 기계어(machine code)까지 아우르며 소통합니다. (아직은?) 숙련되고 전담하는 인간처럼 대부분의 개별 작업을 완벽하게 해낼 수는 없지만, 회의를 잡거나 허락을 구할 필요 없이 이 모든 것을 처리할 수 있습니다.

구체적인 예시가 있습니다. exe.dev VM(가상 머신)들은 vm-name.exe.xyz 와 같이 멋진 도메인 이름을 가집니다. 새 VM을 시작할 때 우리는 하나 또는 세 개의 CNAME 레코드를 추가합니다. 아주 쉽죠,

원문 보기
원문 보기 (영어)
In early 2025, I wrote Is Claude a Compiler ? At the time, my answer was: I don’t know. I’m now pretty sure the answer is “no, that’s a category error, it’s better than a compiler.” But this requires a bit of unpacking. Computer programs are notoriously intricate and finicky. A program operates at an extreme level of precision. There is no “wave hands” CPU instruction. High-level goals, meanwhile, are deeply underspecified. In a highly stylized view of the world, software gets built in layers, each one adding specification and hiding “unnecessary” detail. Vision becomes strategy, product plans become coding plans, code becomes binaries. Each step is handled by a different role: executive, VP, PM, architect, engineer, compiler. Critically, every step involves making lots of decisions. That’s what it means to increase the level of specification. (This is why one of my two key metrics for hiring engineers is judgment. The other is comity.) The bottom layer, from source code to binary, is what a compiler does. Compilers make lots of decisions! Inlining, register allocation, whether to emit warnings or reject a program outright. And these decisions matter: They drive performance, system stability, predictability, and failure modes. A compiler engineer’s job is to arrange for the compiler to make consistently good decisions. A good, trusted compiler frees a software engineer from having to make these decisions. Most engineers have little idea how compilers work; they don’t need to in order to be effective. In 2025, we operated in a world where we used LLMs to generate smallish chunks of code. In this mental model, a coding agent might slot in as a new layer between a software engineer and a traditional compiler. It “compiles” natural language to code, making decisions so the engineer doesn’t have to. Its value is proportional to its reliability and the scale of the decisions it can make. The thing is, this highly stylized view of the world is false. Abstractions leak and layers rub . And even if they didn’t, we’d poke holes in them anyway. Working across layers is extremely valuable; mechanical sympathy matters. Part of how the Empire State Building was constructed in under a year and under budget (!!) was by systematically working across layers. For example, when deciding about the exterior chrome-nickel steel cladding: Neither architects, builders nor subcontractors felt competent to deal with this complicated technical problem of construction without full consultation. Accordingly, after full preliminary discussion, an all-inclusive meeting was called which was attended by representatives of the owner, the architects and builders, the subcontractors rolling the material, the metal workers who were to fabricate and those who were to erect it, and the inspectors who were to test all sheets at the several stages of preparation. This sounds really obvious when you say it out loud. And yet we systematically fail at this in practice. I can only imagine the delight of the metal workers who had an opportunity to guide the design toward something that wasn’t slow and miserable to work on. Part of the reason we fail is ignorance of what is even worth asking about. There’s a reason that the best executives have deep knowledge of their industry . I also suspect that some of it is dismissiveness (“What could a line metalworker have to tell me ?”). But a big chunk is also communication and organizational overhead. Layers exist for a reason—information hiding enables organizational scaling. Claude is better than a compiler because it can work vertically across the stack. LLMs now talk strategy, product, architecture, code, and machine code. It can’t (yet?) do most individual tasks as well as an experienced, dedicated human, but it can do all of them, without having to schedule meetings or ask permission. Here’s a concrete example. exe.dev VMs have nice domain names: vm-name.exe.xyz . When we start a new VM, we add a CNAME entry or three. Easy, right? But our VMs start fast, so fast that even if we created the DNS entries before creating the VM, our users still had to sit around waiting for DNS to propagate, which occasionally took minutes, not seconds. We did the obvious thing: We wrote our own DNS server, so that DNS always immediately matched the source of truth. And life was good. But latency matters , so we added regions. And just like that, DNS became the long pole again, because all DNS was served out of Oregon. Also, deployments caused tiny DNS outages. To fix this, all we needed now was a geographically distributed but fully consistent DNS server. We did what a sensible engineer does when faced with a hard problem: cheat. We vibe-engineered a distributed DNS server tuned to our specific needs. The goals were clear: Reduce latency for users far from Oregon and increase uptime resiliency. But the rest was not. We had to figure out everything from the exact behavior we wanted (particularly under various failure conditions), to how it fit into our overall company plans, to the architecture that could best achieve those goals, straight through down to the fine implementation details. We hashed out the highest level strategic and architectural decisions in person. We’d make a fairly general-purpose DNS server and layer on our particular behavioral tweaks, use a hub-and-spoke model, use an append-only replication strategy, and have persistence at the edges. All that was left was to actually build it. I had LLMs research standard designs for distributed DNS systems, teach me about the guts and quirks of DNS, point out historic security failings, explore alternative implementation strategies (AXFR/IXFR? no thanks), research open source offerings, game out failure modes, and plan testing strategies. Once I had an initial sketch of a design that seemed promising, I prompted multiple concurrent agent loops into building the entire thing , including tests and adversarial code review. They raised a bunch of questions—at every level of detail, from major structural approaches down to line-level code concerns. As I answered them (or reverted answers that generated regret), I slowly converted what I had learned into very terse written guidance, codifying decisions that proved to be important. Then I asked new agents to compare the completed implementations and look for interesting deviations. It was shocking how many important decisions the agents never asked about but simply made—and made differently. Here’s an example. Replication uses the fairly obvious approach: Catch up by asking for everything since the last known entry, and then long poll for new entries. There’s one ugly twist: database rollbacks. Rare, but they do happen, and they break the “append-only” contract. The agents noticed this, and they solved it in wildly different ways. The design I ultimately settled on was to give every row a “timeline” field, as in “which timeline are you living in?” These are randomly generated, and every sync request for “entries since row N” includes the edge server’s timeline value for row N. If there’s a timeline mismatch, we know that history has been altered and fall back to a full clean re-sync. There were also obvious style differences between the systems built by different agents. Claude and Codex both agreed that Claude created a more elegant system but that Codex was more thorough. I worked through the list of major identified divergences, experimented, and then added more written guidance. Then I repeated that entire differential spec analysis process, twice. I know my aphorisms . Plan to throw one away; you will, anyhow. — Fred Brooks If you plan to throw one away, you will throw away two. — Craig Zerouni By the time I was ready to build a keeper, I had accumulated a scar-tissue document that was empirically sufficient to guide an agent through most of the important decisions, at every layer, ranging from high level goals through architecture down to the occasional low