어떻게 하면 복잡성을 배제할 수 있을까요?
How do you keep complexity out?
핵심 요약
LLM이 과도하게 복잡한 코드를 생성하는 문제를 해결하기 위한 실무적인 전략과 노하우를 공유합니다.
- 과도한 엔지니어링 — LLM이 불필요한 예외 처리와 복잡한 구조를 기본값으로 생성함
- 반복적 개발 — 사용자 피드백을 반영한 점진적 개발이 모델의 과잉 대응으로 방해받음
- 해결 전략 — 별도 세션 활용, 코드 삭제 강제, 예산 설정 등 실무적 대응책 논의
- 모델 한계 — 모델이 코드 품질보다 복잡한 문제 해결에 최적화되어 발생하는 현상
모델 성능이 좋아질수록 이상한 반비례 관계가 눈에 띄는데, 일반적인 소프트웨어 개발에는 오히려 점점 쓸모가 없어지고 있다는 거야.
괜찮은 일반 소프트웨어는 내부 복잡도는 최소화하면서 가장 유용한 기능을 제공하는 법이지. "최종 사양"이라는 건 애초에 알기 어렵거든. 왜냐면 진짜 쓸만한 제품은 사용자 피드백이랑 분석 데이터를 바탕으로 조금씩 발전하면서 나오는 거니까. 그러니까 "그냥 프롬프트를 제대로 짜면 되잖아" 같은 소리는 집어치워. 각 반복 과정을 완벽하게 고정할 만큼 정교한 프롬프트는 결국 코드 그 자체랑 다를 게 없는데, 우리가 LLM을 쓰는 이유가 바로 그 코딩 노가다를 피하려고 하는 거잖아.
이상적으로는 대충 정의된 기능을 LLM한테 던져주고, 가장 단순한 구현으로 가장 단순한 버전을 받아내는 게 최고야. 사용자가 굳이 건드릴 일 없는 구석은 좀 거칠어도 되고, 문제 생기면 빨리 실패하고 쉽게 복구되는 그런 거 말이야.
근데 이놈들은 기본값이 무조건 오버 엔지니어링이야. 모든 엣지 케이스, 일어날 확률 제로인 레이스 컨디션, 말도 안 되는 입력 조합까지 다 커버하려고 들어. 간단하게 하라고 말해도 제대로 안 먹혀. 그냥 꼼수만 늘어날 뿐이지(구조를 다시 짜는 것보다 대충 가지 하나 치는 게 기술적으로는 더 단순해 보이니까). 게다가 이놈들은 우리 사용자가 어떻게 행동하는지 전혀 모르니까, 최악의 상황을 가정하고 제일 "안전한" 코드만 짜대. 이걸 해결할 만한 사용 맥락이나 불변 조건 같은 건 아무리 생각해도 답이 안 나와.
내 AGENTS.md 파일은 온통 애원하는 내용뿐이야. 제발 단순하게 짜라, 빨리 실패하게 해라, 미리 방어 코드 넣지 마라, 우회하지 말고 구조를 다시 짜라. 복잡도 체크도 자동화해 놨지. 그래도 모델들은 지 버릇 못 고쳐. 마치 가장 어려운 문제만 풀도록 RL(강화학습)이라도 된 것 같아. 못 박는 데 필요한 건 그냥 망치인데, 엄청나게 강력하고 전문적인 도구를 쥐여주고는 그걸로 못질을 시키고 있는 꼴이지. 그나마 나한테 좀 먹혔던 건, 위에 말한 거 다 해놓고 구현 한 번 돌린 다음에, 다시 여러 번에 걸쳐서 단순화하고 신뢰성 검증하는 과정을 거치는 것뿐이었어.
이거 진짜 제대로 해결한 사람 있어?


