//
바이브 코딩 너머 개발자 생존법 · 애디 오스마니
AI에게 자연어로 요청하면 코드가 나온다. 하지만 그 코드가 개발자의 의도를 정확히 반영하는지는 별개의 문제다. AI는 프롬프트를 해석하고, 학습된 패턴에서 가장 확률이 높은 구현을 선택한다. 이 과정에서 개발자의 의도와 AI의 해석 사이에 간극이 생긴다.
저자는 이 간극을 줄이기 위해 AI의 해석 방식을 이해해야 한다고 말한다. AI는 프롬프트의 키워드, 코드베이스의 기존 패턴, 학습 데이터에서 가장 빈번하게 등장한 구현을 조합하여 코드를 생성한다. 따라서 개발자는 생성된 코드를 볼 때 "내가 요청한 것"이 아니라 "AI가 해석한 것"이 무엇인지를 먼저 파악해야 한다.
AI가 생성하는 코드에는 흥미로운 경향이 있다. 학습 데이터에서 가장 많이 등장한 패턴, 즉 보편적 해결책(Common Solution) 을 우선시한다는 것이다. 스택오버플로우에서 가장 많은 추천을 받은 답변과 유사한 코드가 생성되는 경향이 있다.
이 특성의 장점은 검증된 패턴이 적용된다는 것이다. 단점은 프로젝트의 특수한 요구사항이나 엣지케이스를 반영하지 못한다는 것이다. 예를 들어, AI에게 "인증 미들웨어를 구현해 줘"라고 하면 일반적인 JWT 검증 코드를 생성하지만, 해당 프로젝트의 특수한 권한 체계나 멀티테넌시 요구사항은 반영하지 못할 가능성이 높다.
엣지케이스는 AI가 가장 취약한 영역이다. 정상 경로(Happy Path)는 학습 데이터에 풍부하지만, 예외 상황에 대한 처리는 프로젝트마다 다르기 때문에 패턴 매칭만으로는 해결되지 않는다.
AI가 생성한 코드를 받아들이기 전에 가독성과 구조를 점검해야 한다. 저자는 다음의 체크리스트를 제안한다.
| 점검 항목 | 확인 내용 |
|---|---|
| 네이밍 | 변수, 함수, 클래스 이름이 의도를 정확히 반영하는가 |
| 책임 분리 | 하나의 함수/클래스가 하나의 책임만 담당하는가 |
| 추상화 수준 | 같은 함수 내에서 추상화 수준이 일관적인가 |
| 중복 | 불필요한 코드 중복이 있는가 |
| 의존성 | 불필요한 외부 라이브러리를 도입하지 않았는가 |
| 프로젝트 컨벤션 | 기존 코드베이스의 스타일과 일관적인가 |
AI는 종종 필요 이상으로 장황한 코드를 생성하거나, 프로젝트의 기존 패턴과 맞지 않는 스타일을 사용한다. 이를 그대로 받아들이면 코드베이스의 일관성이 무너진다.
AI가 생성한 코드에서 버그가 발생했을 때, 저자는 "무엇이 잘못됐는지"보다 **"왜 문제가 발생했는지"**를 먼저 파악하라고 조언한다. AI에게 "이 버그를 고쳐 줘"라고 바로 요청하면, 증상만 치료하고 근본 원인은 남겨둘 가능성이 높다.
효과적인 디버깅 프로세스는 다음과 같다.
AI에게 디버깅을 맡길 때도, 단순히 "안 돼, 고쳐 줘"가 아니라 "X 상황에서 Y가 발생하는데, Z 때문인 것 같다. 이 방향으로 수정해 줘"와 같이 분석 결과를 함께 전달하면 결과가 훨씬 좋아진다.
저자는 리팩터링의 목표를 인상적인 표현으로 정의한다. "AI가 생성한 사실이 드러나지 않는 수준으로" 코드를 다듬어야 한다는 것이다.
AI가 생성한 코드의 전형적인 흔적은 다음과 같다.
리팩터링은 기능 변경 없이 코드의 내부 구조를 개선하는 작업이다. AI가 만든 코드를 프로젝트의 기존 스타일에 맞추고, 불필요한 부분을 정리하고, 더 명확한 표현으로 교체하는 과정을 거쳐야 한다.
AI가 생성한 코드를 검증하는 가장 확실한 방법은 테스트다. 저자는 세 가지 레벨의 테스트를 모두 적용할 것을 권장한다.
개별 함수나 모듈의 동작을 검증한다. AI에게 테스트 코드 생성을 맡길 수 있지만, 테스트 케이스의 설계는 개발자가 해야 한다. AI는 정상 경로의 테스트를 잘 만들지만, 엣지케이스와 경계값 테스트는 종종 누락한다.
여러 모듈이 함께 동작할 때의 상호작용을 검증한다. AI가 생성한 코드는 개별적으로는 정상이지만 다른 모듈과 결합했을 때 문제가 발생하는 경우가 많으므로, 통합 테스트가 특히 중요하다.
사용자 관점에서 전체 시스템의 동작을 검증한다. AI가 생성한 코드가 실제 사용자 시나리오에서 기대대로 동작하는지를 확인하는 마지막 방어선이다.
AI에게 테스트 코드를 생성하게 할 때는 "해피 패스만 테스트하지 말고 엣지케이스도 포함해 줘"라고 명시적으로 요청하라. 그리고 생성된 테스트 목록을 보고, 빠진 시나리오가 있는지 직접 점검해야 한다.
AI가 생성한 코드를 "이해"한다는 것은 단순히 읽는 것이 아니다. AI의 해석 방식을 파악하고, 보편적 해결책의 한계를 인식하고, 구조를 점검하고, 근본 원인 중심으로 디버깅하고, AI의 흔적이 남지 않도록 리팩터링하고, 세 가지 레벨의 테스트로 검증하는 전체 과정이다. 이 과정을 거쳐야 비로소 AI가 생성한 코드가 자신의 코드가 된다.