요즘 코드를 짜다 보면 직접 타이핑하는 시간보다, LLM이 던져준 코드를 실행하고 고쳐보는 시간이 더 많다. Vibe Coding 흐름에서 언어 선택은 의외로 큰 차이를 만든다. 나는 여러 언어를 써보면서, Go가 특히 잘 맞는다고 느꼈다.

Go의 강점은 언어 차원에서 설계 일관성을 강제한다는 점이다. 함수가 실패할 수 있다면 반드시 error를 반환해야 하고, 호출한 쪽에서 이를 직접 처리해야 한다. 덕분에 프로젝트 전체가 같은 “return err” 패턴을 공유한다. 또 함수 인자에 디폴트 값이 없고 truthy/falsy 같은 암묵적 규칙도 거의 없다. 그래서 생성된 코드가 갈라지지 않고, 구조가 일정하게 유지된다. Go의 단순함이 실제로는 코드 생성 결과를 안정적으로 만드는 힘이 된다.

Python이나 TypeScript는 다르다. 예외 처리 방식이 다양하고, 언어 자체에도 암묵적인 규칙이 많다. 팀 차원에서 lint나 type checker를 도입할 수는 있지만, LLM은 언어에 제약이 적을수록 다양한 해법을 뒤섞어 내놓는다. 그 결과 코드베이스 안에서 설계 일관성이 쉽게 깨진다. 사람이 직접 관리하는 프로젝트라면 커버가 가능하겠지만, 빠른 iteration을 돌려야 하는 상황에서는 언어 자체가 구조를 제공해 주는 편이 훨씬 안정적이다.

Rust는 또 다른 극단이다. Result와 match를 통해 일관성을 철저히 보장한다. 하지만 모든 경우를 다 채우지 않으면 곧바로 컴파일이 막힌다. 안정성은 분명 높지만 Vibe Coding 특유의 빠른 리듬에는 잘 맞지 않는다. Go는 error 반환 패턴을 유지하면서도 Rust처럼 완벽한 경우의 수까지 요구하지 않는다. 그래서 생성 도구가 다루기 쉽고, 개발자도 더 빠르게 회전할 수 있다.

Python과 TypeScript는 설계 일관성이 쉽게 무너지고, Rust는 생산성이 희생된다. Go는 그 사이에서 균형을 잡는다. 그래서 Vibe Coding을 경험해본 사람이라면, 이 글의 논지에도 쉽게 공감할 것이다.

September 5, 2025

Author

Sin-Woo Bang Blog

Sin-Woo Bang