이 문서는 Vibe Coder vs Software Engineer의 한글 번역입니다.
목차
목차 보기
핵심 요약
📌 TL;DR (클릭하여 펼치기)
주요 내용
- 바이브 코더와 소프트웨어 엔지니어의 차이는 도구가 아니라 책임이 시작되고 끝나는 지점에 있습니다.
- 저자는 AI가 생성한 작업물을 평가할 새로운 기준으로 “안전한 머지까지 걸리는 시간(time to safe merge)“을 제안합니다. 이는 리뷰 가능성, 리스크, 테스트 품질, 소유권, 롤백 가능 여부를 모두 포함하는 지표입니다.
- 여섯 가지 차이를 순서대로 짚습니다. (1) 측정 지표 (2) 작업의 단위 (3) 소유권 (4) 컨텍스트를 다루는 방식 (5) 발견과 딜리버리의 경계 (6) 팀 안에서 배우는 방식.
- AI가 생성한 코드도 손으로 짠 코드와 같은 기준을 통과해야 하며, 저자가 각 변경의 의미를 설명하지 못하면 머지할 준비가 된 것이 아닙니다.
- 주니어 엔지니어가 시스템 이해를 건너뛰기 위한 용도로 AI를 쓰면, 더 많이 만들어내는 대신 더 적게 배우게 됩니다.
주의사항
- 이 경계는 고정된 정체성이 아니라 모드 전환의 문제입니다. 같은 사람이 발견 단계에서는 바이브 코딩을, 딜리버리 단계에서는 엔지니어링 방식을 쓸 수 있어야 합니다.
- AI 도구가 테스트·롤백·리뷰에서 나아질수록 안전한 머지 비용은 줄어들 수 있지만, 완전히 사라지지는 않습니다. 결과를 책임질 누군가가 있는 한 어느 정도의 규율은 항상 필요합니다.
원문 작성일: 2026년 6월 14일
작성자: Yusuf Aytas
10여 년 전, 저는 Java 개발자 vs. 소프트웨어 엔지니어라는 글을 쓴 적이 있습니다. 그때는 사람들이 자신의 직업적 정체성을 Java라는 언어와 얼마나 깊이 결부시켰는지 미처 깨닫지 못했습니다. 제 목표는 특정 언어로 규정되는 사람과, 문제 해결을 더 폭넓게 사고하는 사람을 구분하는 것이었습니다.
이 논의 전체는 하나의 전제에서 출발했습니다. Java가 곧 “정답”이 되어버린 것입니다. 많은 개발자가 Java를 기준으로 사고하기 시작했습니다. 도구가 모든 문제를 바라보는 렌즈가 되어버렸습니다. 그리고 문제가 그 렌즈에 맞지 않으면, 문제 쪽을 억지로 구부려서 맞췄습니다.
이 비유를 너무 확대하고 싶지는 않습니다. AI는 그저 또 하나의 프로그래밍 언어나 프레임워크가 아니기 때문입니다. AI는 소프트웨어를 만드는 경제학 자체를 바꾸고 있습니다. 그럼에도 예전의 패턴은 여전히 존재합니다. 강력한 도구가 등장하면 사람들은 자신의 정체성을 그 도구에 감고, 결국 기술(craft)은 도구로 축소되어 버립니다.
이제 질문은 AI가 코드를 짤 수 있느냐가 아닙니다. AI는 이미 코드를 짜고 있고, 날이 갈수록 더 잘하고 있습니다. 진짜 질문은 그 과정에서 어떤 종류의 작업물이 나오는지, 그리고 그 결과물이 실제 코드베이스에 들어가 실제 사용자, 실제 데이터, 실제 컴플라이언스 요건, 실제 장애, 그리고 그것을 유지보수해야 하는 실제 사람들과 만났을 때 무슨 일이 벌어지느냐입니다.
바로 여기서 저는 바이브 코더와 소프트웨어 엔지니어 사이의 차이를 발견합니다. 바이브 코더는 프로토타입으로 소프트웨어를 만들어서 아이디어를 검증해보고 싶어하는 사람입니다. 소프트웨어 엔지니어는 소프트웨어 개발 생명주기 전체를 고민하는 사람입니다. 그러니 이 차이는 도구의 차이가 아닙니다. 책임이 시작되는 지점과 끝나는 지점의 차이입니다.

제발, 이거 머지해도 될까요?
잘못된 측정 지표
바이브 코딩을 둘러싼 논의는 아직도 대부분 엉뚱한 것을 측정하고 있습니다. 사람들은 아이디어에서 앱까지 얼마나 빨리 도달했는지를 보여줍니다. 이건 나름의 가치가 있습니다. 특히 목표가 아이디어를 검증하는 것이라면 더욱 그렇습니다. 하지만 소프트웨어 개발 팀 안에서는 누군가가 그 코드를 리뷰해야 합니다. 누군가는 그 코드 뒤에 담긴 의도를 이해해야 합니다. 누군가는 그 의존성이 정말 거기 있어야 하는지 판단해야 합니다. 누군가는 그 테스트가 실제 동작을 검증하는지 확인해야 합니다. 누군가는 스키마 변경을 적용해야 합니다. 누군가는 팀 간 변경 사항을 조율해야 합니다. 누군가는 롤백 작업을 해야 합니다. 누군가는 런북을 작성해야 합니다. 누군가는 장애 호출에 응답해야 합니다.
이 중 어느 것도 취미 프로젝트에는 없습니다. 그래서 저는 AI가 생성한 작업물을 전혀 다른 지표로 측정해야 한다고 생각합니다. 바로 “안전한 머지까지 걸리는 시간(time to safe merge)“입니다. 이 지표에는 리뷰 가능성, 리스크, 테스트 품질, 소유권, 롤백 가능 여부, 그리고 작성자가 그 변경의 핵심적인 의사결정을 설명할 수 있는지가 모두 포함됩니다. AI 덕분에 코드 생성은 저렴해졌지만 안전한 머지는 더 비싸졌다면, 팀은 생각만큼 이득을 본 게 아닙니다.
이것이 첫 번째 차이입니다. 바이브 코더는 첫 번째 동작 버전까지 걸리는 시간을 측정합니다. 소프트웨어 엔지니어는 안전한 머지까지 걸리는 시간을 측정합니다. 첫 번째 동작 버전까지의 시간은 작업이 발견(discovery) 단계일 때 유용합니다. 안전한 머지까지의 시간은 작업이 공유 코드베이스에 들어갈 때 반드시 필요합니다. 이 지표에는 리뷰 비용, 테스트 비용, 배포 비용, 롤백 비용, 조율 비용, 그리고 향후 유지보수 비용까지 모두 담겨 있습니다. 그래서 데모는 잘못된 결승선입니다. 데모는 무언가를 보여줄 수 있다는 것만 증명할 뿐, 팀이 그것을 소화할 수 있다는 것은 증명하지 못합니다.
산출물은 진척이 아니다
AI가 도와서 만든 코드는 더 커지는 게 아니라 더 좋아져야 합니다. 도구 덕분에 더 많이 생성할 수 있다면, 사람은 더 많이 제약해야 합니다. 그러지 않으면 작업을 줄이는 게 아니라 뒤로 미루는 것일 뿐이고, 그 유지보수 부담은 결국 다른 누군가의 몫이 됩니다. AI가 도와서 만든 코드라고 해서 다른 기준을 적용받을 수는 없습니다. 손으로 직접 짠 코드와 똑같은 기준을 통과해야 합니다. 그러니 변경 범위는 좁아야 합니다. 존재해야 할 이유가 하나여야 합니다. 관련 없는 정리 작업이 딸려 오면 안 됩니다. 모델 기분에 따라 파일 절반을 재포맷해서는 안 됩니다. 명확한 설명 없이 패키지를 추가해서도 안 됩니다.
모델이 너무 많은 걸 생성해서 변경이 커졌다면, 쪼개야 합니다. 저도 이런 경험을 많이 했습니다. 열 줄이면 짤 수 있는 걸 위해 모델이 신나서 그렇게나 많은 보일러플레이트를 만들어냅니다. 그러니 작성자가 의미 있게 바뀐 파일 하나하나를 왜 바꿨는지 설명하지 못한다면, 그 변경은 준비된 게 아닙니다. 이것이 기본적인 소유권입니다.
두 번째 차이는 작업의 단위입니다. 바이브 코더는 생성된 산출물 자체를 진척으로 여깁니다. 소프트웨어 엔지니어는 어떤 변경이든 그것을 책임의 단위로 여깁니다. 생성된 산출물은 크고 지저분하고 일시적일 수 있습니다. 하지만 진짜 변경 관리는 그렇게 대충 할 수 없습니다. 리뷰할 수 있을 만큼 좁아야 하고, 신뢰할 수 있을 만큼 설명 가능해야 하며, 시스템의 절반을 끌고 들어오지 않고도 머지할 수 있을 만큼 경계가 명확해야 합니다. 이 지점에서 속도는 유용해지거나 리뷰 부채로 바뀝니다.
AI는 책임을 대신 질 수 없다
생성된 코드를 리뷰하는 일은 일반 코드를 리뷰하는 일과 다릅니다. 사람이 코드를 짤 때는 보통 의사결정의 흔적이 남습니다. 그 결정이 틀렸을 수도 있지만, 적어도 그 경로를 설명할 수 있는 사람이 있습니다. 왜 그 추상화를 썼는지, 왜 그 규칙을 그 자리에 넣었는지, 왜 그 패키지를 선택했는지, 왜 테스트를 그런 모양으로 만들었는지 물어볼 수 있습니다.
AI가 생성한 코드에서는 그런 결정들 중 일부가 사실 결정이 아닙니다. 단지 시스템이 자동으로 완성한 것일 뿐입니다. 작성자가 생성된 산출물을 자신이 소유한 작업으로 전환하지 않은 채 리뷰를 요청한다면, 리뷰어는 두 가지 일을 동시에 해야 합니다. 리뷰 그 자체와, 저자성(authorship)을 되짚어 복원하는 일입니다.
소유권이 세 번째 차이입니다. 바이브 코더는 “모델이 만들었어요”라고 말할 수 있습니다. 소프트웨어 엔지니어는 “제가 이 코드를 책임집니다”라고 말해야 합니다. 이는 작성자가 리뷰를 요청하기 전에 생성된 산출물을 하나의 엔지니어링 결정으로 전환해야 한다는 뜻입니다. 코드는 모델에서 출발했을지 몰라도, 책임까지 거기 머물러 있을 수는 없습니다.
컨텍스트는 파일만이 아니다
이제 모델은 아주 많은 코드를 읽을 수 있습니다. 하지만 그렇다고 시스템을 이해하는 것은 아닙니다. 일부 컨텍스트는 코드 안에 있지만, 엔지니어링 컨텍스트의 상당 부분은 다른 곳에 있습니다. 장애, 오래된 마이그레이션, 고객 행동, 운영상의 고충, 팀 관례, 보안 요건, 컴플라이언스 규칙, 그리고 과거의 이상한 결정들 속에 존재합니다.
이 정보를 주지 않으면 모델은 갖고 있지 않습니다. 설령 정보를 주더라도, 모델은 엔지니어처럼 그 컨텍스트를 계속 짊어지고 다니지 않습니다. 모델은 자신의 컨텍스트 윈도우 안에서만 작동합니다. 작업이 커질수록 모델이 부분적으로는 최적화하면서 전체적으로는 무언가를 망가뜨리기가 더 쉬워집니다.
그래서 “그냥 이 전체를 고쳐달라고 시키면 되지”라는 태도는 나쁜 습관인 동시에 아직 제대로 작동하지도 않습니다. 저도 게을러서 이런 식으로 여러 번 시켜본 적이 있습니다. 더 나은 방법은 코드를 요청하기 전에 결정해야 할 폭을 먼저 좁혀두는 것입니다. 제가 더 구체적으로 지시할수록, 모델은 더 나은 결과를 내놓습니다. 그런데 구체적으로 지시하려면 무엇이 필요할까요? 바로 제가 무엇을 하려는 건지 스스로 제대로 이해하고 있어야 한다는 것입니다. 저는 경험 많은 엔지니어들이 AI에서 가장 큰 가치를 얻어낼 지점이 바로 여기라고 생각합니다. 모델에게 더 많은 자유를 주는 게 아니라, 더 적은 자유를 주는 방식으로 말입니다. 자유는 주말 취미 해킹에는 유용합니다. 프로덕션에는 제약이 필요합니다.
이것이 네 번째 차이입니다. 바이브 코더는 모델에게 목표를 줍니다. 소프트웨어 엔지니어는 모델에게 경계가 명확한 과제를 줍니다. 엔지니어링은 바로 그 경계가 명확한 과제 안에서 일어납니다. 이 인터페이스를 쓰세요. 이 레이어는 건드리지 마세요. 이런 식으로 말입니다. 좋은 프롬프트는 마법이 아닙니다. 그것은 대개 엔지니어가 이미 그 경계를 이해하고 있다는 증거일 뿐입니다.
바이브 코딩은 딜리버리 과정 안에 자리하지만, 어디에나 있을 순 없다
Zig를 만든 Andrew Kelley는 최근 인터뷰(꼭 보시길 강력히 추천합니다)에서, 자신의 프로젝트가 AI 기여를 금지하고 있으며 이를 예외 없이 쓰레기라고 불렀다고 말했습니다. 그 말에 공감합니다. 메인테이너들은 관련 없는 변경이 잔뜩 섞이고, 레거시 동작을 깨뜨리고, 이상한 의존성이 추가되고, 자신이 제출한 코드를 설명하지 못하는 기여자들이 만든 거대한 AI 생성 풀 리퀘스트를 마주하고 있습니다.
하지만 그들이 묘사하는 난장판이 AI에 대한 심판은 아닙니다. 바이브 코딩이 경계선의 잘못된 쪽에 떨어질 때 나오는 결과일 뿐입니다. 그러니 저라면 그것을 금지하지 않고, 제자리를 찾아주겠습니다.
그 경계선이 다섯 번째 차이입니다. 발견(discovery) 대 딜리버리. 메인테이너의 오후 시간을 통째로 잡아먹는 바로 그 풀 리퀘스트도, 프로토타입을 빠르게 스파이크하는 상황이라면 아무 해가 없습니다. 그런 일회용 코드는 아무도 소유하지 않습니다. 발견 단계는 목표가 배움이나 아이디어의 빠른 반복이기 때문에 난장판을 견딜 수 있습니다. 딜리버리는 목표가 실제 비즈니스 성과이기 때문에 설명되지 않는 난장판을 견딜 수 없습니다. “99.9%는 맞았어요”라고 말할 수 없는 상황입니다. 때로는 그냥 맞아야만 합니다. 그것이 현실적인 경계선입니다.
솔직히 말하면 이 경계선은 계속 움직입니다. 도구가 테스트, 롤백, 리뷰에서 더 나아질수록 안전한 머지 비용의 일부는 줄어들 것입니다. 줄어드는 것과 사라지는 것은 다릅니다. 결과를 책임질 누군가가 존재하는 한, 어느 수준의 규율은 항상 필요합니다. 틀렸을 때 치를 대가가 낮은 곳에서는 바이브 코딩을 쓰고, 틀렸을 때 치를 대가가 고객이나 팀, 비즈니스에게 돌아가는 곳에서는 엔지니어링 규율을 쓰세요.
견습의 문제
주니어 엔지니어들은 AI를 쓸 것입니다. 마땅히 써야 합니다. 잘만 활용하면 AI는 코드를 설명하고, 여러 접근법을 비교하고, 예시를 만들어주고, 학습 속도를 높여줄 수 있습니다. 하지만 이것에는 나쁜 버전도 있습니다.
주니어 엔지니어가 시스템을 이해하는 과정을 피하려고 AI를 쓴다면, 더 많이 만들어내면서도 더 적게 배울 수 있습니다. 이는 나쁜 거래입니다. 엔지니어링 초기 몇 년은 사람들이 머릿속 멘탈 모델을 구축하는 시기입니다. 그 모델은 자기 머릿속에 직접 지어야지, 기계에서 빌려올 것이 아닙니다.
시스템 바깥에 머물면서 모델에게 계속 고쳐달라고 시키는 것만으로는 그 판단력을 기를 수 없습니다. 이것이 매니저들에게 가장 어려운 부분 중 하나입니다. AI는 단기적으로 주니어를 더 생산적으로 보이게 만드는 동시에, 그들을 뛰어난 엔지니어로 성장시키는 학습 루프를 약화시킬 수 있습니다. Kelley가 Zig에서 AI를 금지한 더 깊은 이유가 바로 여기 맞닿아 있습니다. 그는 코드 리뷰를 “컨트리뷰터 포커(contributor poker)“라고 부릅니다. 프로젝트가 코어 팀으로 키울 만한 사람을 찾아내는 방식, 즉 패를 하나씩 까 보이며 상대의 실력을 가늠하는 게임 같은 과정이라는 뜻입니다. AI가 제출한 코드는 이 과정을 깨뜨립니다. 기여자가 코드베이스를 배우지도, 피드백을 흡수하지도 않기 때문입니다.
이것이 마지막 차이입니다. 엔지니어링에는 어느 정도의 견습 과정이 필요합니다. 바이브 코딩은 혼자 일하도록 유혹합니다. 사람은 팀 안에서 일하고 배웁니다. 소프트웨어 엔지니어는 다른 사람과 함께 일하면서 자신의 기술을 발전시킵니다. 이 일은 코드만이 아닙니다. 핵심은 판단력이지, 산출물이 아닙니다. 소프트웨어 엔지니어는 무엇이 위험하고 무엇이 위험하지 않은지 판단할 줄 압니다. 그 판단력은 시스템, 그리고 사람들과 직접 부딪히면서 만들어집니다.
그 차이
바이브 코더는 주된 산출물이 아이디어 구체화(ideation)일 때 유용합니다. 그들은 아이디어와 클릭 가능한 무언가 사이의 거리를 좁혀줄 수 있습니다. 누군가 실제 엔지니어링 역량을 쓰기 전에, 많은 아이디어가 이런 대접을 받을 자격이 있습니다.
소프트웨어 엔지니어는 주된 비용이 소유권일 때 필요합니다. 그들은 시스템에 무엇이 들어오는지, 어떻게 리뷰되는지, 어떻게 보안이 유지되는지, 어떻게 테스트되는지, 어떻게 운영되는지, 그리고 나중에 어떻게 바뀔지를 통제합니다. 이 구분은 운영상의 구분입니다. 그리고 고정된 정체성도 아닙니다. 같은 사람이 발견 단계에서는 바이브 코딩을 하고, 딜리버리 단계에서는 엔지니어링 모드로 전환해야 합니다. 핵심 기술은 지금 자신이 어느 모드에 있는지 아는 것, 그리고 한쪽 모드의 습관이 다른 쪽으로 새어 들어가지 않게 하는 것입니다. 바이브 코딩은 더 빨리 배우도록 도와줍니다. 소프트웨어 엔지니어링은 그 배움에 영원히 대가를 치르는 일을 막아줍니다.