LLM 시대, '지루한' 프로그래밍 언어를 써야 하는 이유
이 글은 코딩 에이전트가 더 안정적인 결과를 내기 위해서는 파편화가 덜하고 일관된 '지루한' 기술 스택을 선택해야 한다고 강조합니다. 자바스크립트나 파이썬처럼 생태계가 복잡한 언어는 LLM이 학습한 데이터마저 다양하게 파편화되어, 모델이 구식 패턴이나 엉뚱한 코드를 생성할 확률(추론의 도박)을 높입니다. 반면 Go나 Ruby on Rails처럼 강력한 컨벤션(규칙)을 가진 언어는 일관된 학습 데이터를 바탕으로 에이전트가 훨씬 더 예측 가능하고 신뢰도 높은 코드를 작성하게 만듭니다.
LLM에는 '지루한' 언어를 사용하세요 (2026년 4월 20일)
안녕하세요, 저는 소프트웨어 컨설팅 그룹인 Sancho Studio를 운영하고 있는 Jacob입니다. 우리는 기업들의 기술 리더십, 전략 및 보안을 지원합니다. 저는 '일관성은 복리로 쌓인다'는 생각에 계속해서 고통하고 있습니다. 지난 2년 동안 여러 다양한 프로젝트에 참여한 컨설턴트로서 이 사실을 뼈저리게 느꼈습니다.
대형 언어 모델(LLM)은 불일치하는 기술의 단점을 증폭시키고, 일관된 기술의 장점을 조용히 강화합니다. 파편화가 가장 심한 언어와 생태계는 에이전트(Agentic)의 결과물이 가장 좋지 않으며, 가장 강력한 규칙(컨벤션)을 가진 생태계가 최고의 결과를 냅니다. 저는 이러한 효과가 방대한 말뭉치(Corpus)로 학습된 거대 모델의 패러다임에서 어떤 도구가 살아남을지를 점점 더 결정짓게 될 것이라고 생각합니다.
코드 생성이 저렴해졌다고 해도, 추론(Inference)을 실행하는 것은 일종의 도박입니다. 모델이 언제 패키지를 설치하기로 결정하거나 2019년에 쓰이던 기이한 코딩 패턴을 생성할지 전혀 알 수 없습니다. 우리가 토큰(Tokens)을 가지고 도박을 하고 있다고 가정한다면, 우리는 평균적인 결과물을 내기 위해 강력하게 일관되고 강화된 모델 가중치(Weights)를 대표하는 임베딩(Embeddings) 세트에 베팅해야 합니다. 소프트웨어 개발에서 이는 실제로 이상적입니다. 왜냐하면 평균적인 프로그램은 일반적으로 기본적인 작업, 즉 정보 처리, 파일 읽기/쓰기, 네트워크 요청 응답 등을 수행하기 때문입니다.
AI 시대 이전에 엔지니어들은 매년 자신을 재발명하는 듯한 언어들에 대해 불평했습니다. 이러한 불만은 사실이었지만 대부분 미적인 문제였으며, 인간이 불필요하게 변하는 생태계를 유지 관리하거나 따라잡아야 한다는 좌절감의 증상이었습니다. 돌이켜 보면, 2024년 'State of JS' 설문조사는 상대적으로 파편화된 생태계를 보여줍니다. 인간에게 파편화는 짜증나는 일입니다. 모든 것의 공개 말뭉치로 학습된 모델에게 파편화는 강화 학습이나 에이전트 하네스(Harness)에서 해결해야 하는 문제에 더 가깝습니다 (예를 들어, Claude Code가 유출되었을 때 Anthropic이 JavaScript 프레임워크에 대해 일부 편향(Bias)을 하드코딩한 것을 볼 수 있었습니다).
Python도 마찬가지지만 약간 다른 결의 문제입니다. "어떤 패키지 관리자를 사용하고 계신가요?"와 같은 단순한 질문은 언어 버전, 패키지 관리자 버전, OS 호환성의 매트릭스를 만들어내며, 이는 기술 리드로서 완전히 머리가 아픈 일입니다. pip, poetry, 또는 uv 중 하나를 사용해야 할까요? 당신의 툴체인이 중요한가요, 아니면 크로스 컴파일을 하고 있나요? 어떻게 하면 Python 패키지가 조용히 C 종속성(Dependency)에 링크되어 있는지 알 수 있을까요? async를 사용하고 있나요, 아니면 대신 작업 큐(Task Queue)를 사용하고 있나요? Django인가요, FastAPI인가요? 모델의 관점에서 볼 때, 이 모든 것을 작성하는 방법은 너무 많으며, 학습 시 최신 편향(Recency bias)이 도입되지 않는 한 말뭉치는 이 모든 방법을 대략적으로 동일한 가중치로 반영합니다.
이것이 의미하는 바는 저에게 매우 명확하며, 여러분에게도 그래야 합니다... 학습 말뭉치에서 분산(Variance)이 낮은 언어와 생태계는 코딩 에이전트에 의해 더 잘 표현되고 더 안정적으로 실행됩니다. 고차원 벡터 공간(Higher dimension vector spaces)에서 학습 데이터의 코사인 유사도(Cosine similarity)는 모델의 어텐션(Attention) 및 MLP 레이어가 다음 토큰을 예측하도록 학습하는 기반입니다. 일관된 말뭉치는 일관된 추론 토큰을 생성합니다.
이러한 패턴은 다른 언어에서도 유지됩니다. 에이전트 작업에서 일반적인 JavaScript 백엔드와 비교하여 Rails 프로젝트에 대한 추론은 더 일관된 출력을 생성합니다. 이는 Ruby가 어떤 철학적(Platonic) 의미에서 더 나은 언어라서가 아니라, 본질적으로 '하나의 Rails'만 존재하기 때문입니다. 동일한 기본 기능 위에 서로 다른 벤 다이어그램을 제공하는 프로덕션급 JavaScript 프레임워크는 최소 12개는 있습니다.
'설정보다 컨벤션(규칙)'은 인간 프로그래머에게 승리였습니다. 왜냐하면 유연성은 과대평가되어 있고 제약 조건은 우리를 자유롭게 해주기 때문입니다. 20년이 지난 지금, 기계에게도 마찬가지이며 어쩌면 더 그렇습니다. 모델은 단지 어떤 결과가 가장 가능성이 높은지를 풀어내고 있을 뿐입니다...
Go 언어는 우연이든 의도든 이 원칙을 가장 잘 구현하고 있습니다. 수년 동안 Golang은 프로그래머들이 계속 요구하던 편의성과 고차원적인 표현(특히 제네릭, Generics)을 거부해 왔으며, 이러한 저항은 대중들에게 매우 인기가 없었습니다.