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
관련 논문
OpenKnowledge – Obsidian/Notion의 오픈소스 AI-first 대안
Git 기반 동기화와 Claude/Codex/Cursor 연동을 내장한 로컬 우선 마크다운 에디터로, AI 에이전트의 두 번째 뇌(LLM Wiki)로 활용할 수 있는 오픈소스 도구다.
Unfireable Safety Kernel: AI 에이전트를 위한 Execution-Time AI Alignment
AI 에이전트가 자신의 안전장치를 우회할 수 없도록, 에이전트 프로세스 바깥에 수학적으로 증명된 강제 통제 게이트를 배치하는 아키텍처
RubyLLM: 주요 AI 프로바이더를 모두 지원하는 Ruby 프레임워크
OpenAI, Claude, Gemini 등 주요 AI 프로바이더를 단일 인터페이스로 통합한 Ruby 프레임워크로, Rails 통합과 에이전트 기능까지 지원해 Ruby 개발자가 AI 기능을 빠르게 붙일 수 있다.
Qwen-AgentWorld: 범용 에이전트를 위한 Language World Model
Alibaba Qwen 팀이 AI 에이전트가 행동 결과를 미리 시뮬레이션할 수 있는 'Language World Model'을 공개했다. 에이전트 훈련과 실행 경로 검증에 새로운 패러다임을 제시하는 연구다.
SHERLOC: Code Repair Agent를 위한 구조화된 Diagnostic Localization 프레임워크
버그 위치만 알려주는 게 아니라 '왜, 어떻게 고쳐야 하는지'까지 진단 리포트를 생성해서 코드 수정 에이전트의 성능을 높이는 training-free 프레임워크
peerd – 브라우저에서 완전히 실행되는 AI Agent Harness
백엔드 서버 없이 Chrome/Firefox 확장 프로그램으로만 동작하는 AI 에이전트 실행 환경으로, 브라우저 탭을 직접 조작하고 WASM Linux VM까지 구동할 수 있어 프라이버시와 보안을 동시에 챙길 수 있다.