2 minutes
바이브 코딩의 기술

염재현 - 로보코 컨설턴트
바이브 코딩(vibe coding)이라는 말을 들어본 적 있는가? 원래 이 표현은 칭찬이 아니었다. 직관과 느낌에만 의존해 코드를 작성하면서, 엄격한 구조나 규칙은 종종 무시하는 개발자들을 다소 비꼬는 의미로 쓰였다. 그런데 흥미롭게도, 최근에는 인공지능(AI), 특히 대규모 언어 모델(LLM)을 활용해 프롬프트만으로 코드를 생성하는 방식과 연결되어 사용되고 있다. 물론 LLM을 사용하더라도 충분히 모범적이고 유지 보수가 쉬운 코드를 작성할 수 있다. 특히 시행착오 없이 한 번에 잘 작동하는 코드를 얻었다면, 그건 바이브 코딩이 제대로 통했다는 뜻이며, AI 기반 개발의 본질을 제대로 이해했다는 의미이기도 하다.
“AI 코딩이 컴파일러와 비슷하지 않냐?“라는 질문을 가끔 듣는다. 표면적으로는 맞다. 컴파일러가 코드를 기계어로 바꾸듯, LLM은 자연어 프롬프트를 코드로 바꾼다. 그러나 둘 사이의 유사성은 그 정도가 전부다. 가장 큰 차이는 결정성이다. 컴파일러는 같은 입력에 항상 같은 출력을 내지만, LLM은 같은 입력에도 미묘하거나 전혀 다른 출력을 내놓는다. 불완전하거나 맥락 없는 프롬프트를 입력하면 엉뚱한 결과가 나오기도 한다. 코드 언어는 명확하지만 인간의 언어는 애매모호하기 때문이다. 그래서 LLM은 언제나 의도를 “추측"해야만 한다.
그럼 이렇게 비결정적인 도구를 어떻게 믿고 사용할 수 있을까? 그 답은 다른 확률 기반 시스템을 신뢰하는 방법과 비슷하다. “수렴"이라는 개념이다. 예를 들어, 최적해를 찾을 때 무작위를 허용하며 조금씩 범위를 좁혀가는 ‘시뮬레이티드 어닐링(Simulated Annealing)‘과 비슷하다. 머신 러닝을 이용할 때 사용하는 확률적 경사 하강법 (Stochastic Gradient Descent) 역시 확률적으로 점점 좋은 결과로 수렴한다. 심지어 우리 인간 개발자도 매일 컨디션과 성과가 다르지만, 좋은 습관과 체계를 통해 신뢰할 만한 결과로 수렴한다. 즉, 완벽함이 아니라 유용한 결과로 수렴하도록 구조화하면 LLM도 충분히 신뢰할 수 있다.
LLM을 제대로 활용하려면 몇 가지 원칙을 따라야 한다.
첫째, 과감히 단순화하라. LLM은 종종 과도하게 복잡한 구조를 만들려고 한다. 필요 없는 클래스, 추상화, 복잡한 구조는 삭제하고 최소한의 형태로 유지하라. 단순화는 오류 가능성을 줄이고, 문제점을 빠르게 파악할 수 있게 해준다.
둘째, 작은 단계로 접근하라. 한 번에 모든 걸 해결하려고 하면 실패한다. 명확한 요구사항부터 작성하고, 모호한 부분은 예시로 풀어라. 필요하면 설계 문서를 만들게 하고, 그것을 함께 검토하라. 이렇게 차근차근 단계를 밟으면 오류를 줄일 수 있다.
셋째, 자동화를 적극 활용하라. 예시가 생기면 바로 실행 가능한 테스트로 전환하라. 코드 포매터, 린터, 유닛 테스트를 자동으로 수행하는 스크립트를 만들어두면 좋다. 사소한 스타일 문제는 자동 포매터에게 맡기고, LLM이 변경 후 스스로 테스트를 수행하고 실패한 부분을 수정하도록 유도하라. 자동화는 비용도 적게 들고 속도도 빠르다.
마지막으로, 좋은 입력을 제공하라. LLM은 불확실할 때 갈팡질팡한다. 최신 문서, 정확한 API 정보 같은 신뢰할 만한 입력을 주면 무한한 반복과 불확실성을 크게 줄일 수 있다.
과거 조롱의 대상이었던 바이브 코딩이 이제는 AI 시대의 강력한 사고 방식으로 떠올랐다. 하지만 직감만으로는 부족하다. 이 게임은 결국 수렴을 잘 조율하는 일이다. 단순화하고, 자동화하며, 명확하게 방향을 제시하라. 그러면 모델이 바른 길을 찾아 스스로 ‘바이브’를 탈 것이다.