LLM이 소프트웨어를 제대로 만들 수 없는 이유
Why LLMs can't really build software
TL;DR Highlight
Zed 에디터 CEO가 LLM은 소프트웨어 엔지니어링의 핵심인 멘탈 모델 유지 능력이 없다고 분석하며 AI 코딩 도구의 현실적 한계와 올바른 활용법을 제시했다.
Who Should Read
AI 코딩 도구(Cursor, Claude Code, Copilot 등)를 실무에 쓰고 있거나 도입을 검토 중인 개발자. LLM에 어디까지 맡기고 어디서 직접 개입해야 하는지 판단 기준이 필요한 사람.
Core Mechanics
- 소프트웨어 엔지니어링의 핵심은 '요구사항의 멘탈 모델'과 '코드가 실제로 하는 일의 멘탈 모델' 두 가지를 동시에 유지하면서 차이를 좁혀가는 반복 루프인데, LLM은 이 두 모델을 동시에 들고 비교하는 능력이 없다.
- LLM은 코드 생성 자체는 잘 하지만, 테스트가 실패하면 코드를 고쳐야 하는지 테스트를 고쳐야 하는지 판단하지 못하고, 답답해지면 전부 지우고 처음부터 다시 짜는 패턴을 보인다. 이건 좋은 엔지니어의 정반대 행동이다.
- 사람은 문제가 생기면 전체 컨텍스트를 잠시 스택에 넣고 세부 이슈에 집중한 뒤 다시 돌아오는 '멘탈 스택' 조작이 가능한데, LLM은 컨텍스트 윈도우에 텍스트를 계속 쌓을 뿐 이런 추상화 수준 전환을 못 한다.
- 현재 생성형 모델의 구조적 한계로 세 가지를 꼽았다: 빠진 컨텍스트를 잘 못 찾는 문제(context omission), 최근에 본 내용에 편향되는 문제(recency bias), 없는 내용을 지어내는 문제(hallucination).
- 그렇다고 LLM이 쓸모없다는 건 아니다. 요구사항이 명확하고 문제가 단순한 경우에는 한 번에 결과물을 뽑아내는 데 탁월하고, 문서 합성이나 코드 초안 생성에도 좋다.
- 다만 비교적 복잡한 작업에서는 LLM이 정확한 컨텍스트를 유지하면서 반복적으로 해결책을 수렴시키는 게 불가능하므로, 요구사항 명확화와 코드 검증은 여전히 사람의 몫이다.
- Zed의 입장은 '사람과 에이전트의 협업'이되, 운전대는 사람이 잡아야 한다는 것. LLM은 도구일 뿐이라는 관점이다.
Evidence
- 한 개발자가 Cline + Sonnet 3.7로 Rails TDD를 하면서 '테스트 먼저 작성하고 작은 단위로 나눠서 리뷰하면 코드 vs 테스트 판단도 꽤 잘 한다'며, 최소한 주니어 엔지니어 수준은 된다고 반박했다. 다만 '완벽하진 않고 가끔 풀지 못하는 버그가 있다'고 인정했다.
- GPT5로 WebGPU/wgpu 렌더러를 만들다 런타임 에러에 막혀 LLM에 도움을 요청했더니 2시간 동안 그럴듯한 설명만 늘어놓고 해결 못 했는데, 직접 10분 생각하니 버퍼 포맷 불일치라는 단순한 문제였다는 경험담이 공유됐다. '쉬운 건 혼자 하고, 어려운 건 LLM이 못 하면 대체 뭐에 쓰냐'는 불만.
- 투자 관점에서 '인터넷도 90년대엔 엉망이었고, 트위터도 fail whale 시절이 있었지만 계속 성장했다. LLM도 2022년 대비 10배 나아졌으니 5년 뒤엔 이런 작업도 가능해질 것'이라는 기술 낙관론이 있었다.
- TDD의 Red-Green-Refactor 단계를 LLM에게 명시적으로 알려주면('지금은 RED 단계니까 테스트가 실패해야 정상') 코드 vs 테스트 판단을 훨씬 잘 한다는 실용적 팁이 공유됐다.
- Claude Code를 쓰면서 '멘탈 모델 유지 못 하는 문제'에 점점 더 좌절한다는 댓글과, 반대로 'enum 값 추가 같은 반복 작업을 여러 에이전트에 맡기고 자기는 아키텍처에 집중하니 개발 속도가 크게 올랐다'는 긍정적 경험이 공존했다.
How to Apply
- LLM에게 복잡한 작업을 맡길 때는 한 번에 큰 덩어리를 주지 말고, 문제를 작은 단위로 쪼개서 하나씩 지시하면 멘탈 모델 유지 실패로 인한 삽질을 크게 줄일 수 있다.
- TDD 기반으로 LLM을 쓸 때 Red-Green-Refactor 단계를 프롬프트에 명시하면('지금은 GREEN 단계, 이 테스트를 통과하는 최소한의 코드만 작성해') 코드/테스트 혼동 문제를 완화할 수 있다.
- LLM이 생성한 코드가 수백 줄 넘어가면 나중에 문제 발견 시 사실상 처음부터 다시 해야 하므로, 각 단계마다 직접 리뷰하고 검증한 뒤 다음 단계로 넘어가는 워크플로를 유지해야 한다.
- enum 추가 후 매칭 포인트 수정, 보일러플레이트 CRUD, 컴파일 에러 수정 같은 '지적 난이도는 낮지만 손이 많이 가는 작업'에 LLM을 집중 투입하고, 아키텍처 설계와 디버깅 판단은 직접 하는 식으로 역할을 분리하면 생산성이 올라간다.
Terminology
관련 논문
adamsreview: Claude Code용 멀티 에이전트 PR 코드 리뷰 파이프라인
Claude Code에서 최대 7개의 병렬 서브 에이전트가 각각 다른 관점으로 PR을 리뷰하고, 자동 수정까지 해주는 오픈소스 플러그인이다. 기존 /review나 CodeRabbit보다 실제 버그를 더 많이 잡는다고 주장하지만 커뮤니티에서는 복잡도와 실효성에 대한 회의론도 나왔다.
Claude를 User Space IP Stack으로 써서 Ping에 응답시키면 얼마나 빠를까?
Claude Code에게 IP 패킷을 직접 파싱하고 ICMP echo reply를 구성하도록 시켜서 실제로 ping에 응답하게 만든 실험으로, 'Markdown이 곧 코드이고 LLM이 프로세서'라는 아이디어를 네트워크 스택 수준까지 밀어붙인 재미있는 사례다.
AI Agent를 위한 Git: re_gent
AI 코딩 에이전트(Claude Code 등)가 수행한 모든 툴 호출을 자동으로 추적하고, 어떤 프롬프트가 어느 코드 줄을 작성했는지 blame까지 가능한 버전 관리 도구다.
Agent-Native CLI를 위한 설계 원칙 10가지
AI 에이전트가 CLI 도구를 더 잘 사용할 수 있도록 설계하는 원칙들을 정리한 글로, 에이전트가 CLI를 도구로 활용하는 빈도가 높아지면서 이 설계 방식이 실용적으로 중요해지고 있다.
Agent-harness-kit: MCP 기반 멀티 에이전트 워크플로우 오케스트레이션 프레임워크
여러 AI 에이전트가 서로 역할을 나눠 협업할 수 있도록 조율하는 scaffolding 도구로, Vite처럼 설정 없이 빠르게 멀티 에이전트 파이프라인을 구성할 수 있다.
Tilde.run – AI Agent를 위한 트랜잭션 기반 버전 관리 파일시스템 샌드박스
AI 에이전트가 실제 프로덕션 데이터를 건드려도 롤백할 수 있는 격리된 샌드박스 환경을 제공하는 도구로, GitHub/S3/Google Drive를 하나의 버전 관리 파일시스템으로 묶어준다.