분업화의 시대를 넘어, 다재다능의 시대로
“약은 약사에게, 치료는 의사에게, 프로그램이 필요하면 개발자에게.” 이 명제는 지난 백 년간 늘 유효했다. 인류가 문명 사회를 이룰 수 있었던 배경은 바로 이러한 분업화였다. 수백만 년에 걸쳐 인류 문명을 지탱해온 사고방식이자 생산 방식인 셈이다. 이 역사에 틈을 내려는 시도는 빈번하게 있었다. 근래 가장 충격적이었던 변화는 산업혁명에서 시작된 대대적인 인력 감축이다. 기계가 도입되면서 노동자들은 갈 곳을 잃었다. 그럼에도 우리는 여전히 분업하고 있다. 그러나 또 한 번 그 역사에 균열이 생기고 있다. 아직은 (다행스럽게도) 열렸다 닫혔다 하는 불안정한 틈이지만 말이다.
회사에 입사한 뒤 필요한 프로그램이나 매크로, 자동화를 직접 만들 수 있으리라고는 단 한 번도 생각해본 적이 없었다. 입사 직후에는 그저 엑셀 파일을 입맛에 맞게 손봐주는 매크로 정도를 짜고 싶었다. 함수를 걸고 이것저것 만지는 일이 너무 번거로웠기 때문이다. Visual Basic은 어머니가 예전에 정보처리기사 자격증을 따실 때 사용하셨다는 정도로만 알고 있었다. 그때만 해도 ChatGPT는 4.0, 4.1 버전이었다.
아마 ChatGPT도 나 때문에 답답했을 것이다. 하지만 인턴이라 시간이 많았던 나는 몇 시간씩 붙잡고 늘어지며 GPT를 괴롭힐 수 있었다. 다그치고 살살 달래다 보면 완벽하진 않더라도 조금씩 진전을 보였고, 그 모습이 나를 미치게 만들었다. 그러다 어느 순간 깨달음이 찾아왔다.
컴퓨터는 인간의 사고방식대로 사고할 수 없다. 엑셀에서 어떤 칸은 빨간색, 어떤 칸은 노란색으로 칠하고 싶다면 컴퓨터에게 패턴을 제시해야 한다. “홀수 칸은 빨간색, 짝수 칸은 노란색으로 칠해줘”라고 하면 가능하지만, “내가 좋아하는 숫자 칸은 빨간색, 싫어하는 숫자 칸은 노란색으로 칠해줘”라고 하면 불가능하다.
이건 AI도 마찬가지다. AI는 자연어를 이해할 수는 있지만, “어떤 것이 좋고 나쁜지” 같은 추상적인 질문을 던지면 자기가 학습한 데이터를 바탕으로 추론해서 답할 뿐이다. 내 생각대로 답해주리라는 보장은 전혀 없다. 따라서 AI에게 프롬프트를 작성할 때는 최대한 구체적으로 써야 한다. 엑셀 매크로 외에도 Google Colab에서 구동하는 파이썬 프로그램, Swift 기반 아이폰 키보드 앱을 만들어보면서 점점 바이브 코딩에 재미를 붙이게 되었다.
규칙을 이해하고, 규칙을 만든다
이번에는 Claude Code 등 AI 수준이 한층 향상된 환경에서 프로그램을 만들 기회가 생겼다. 고객사에서 보내주는 바코드 정보 파일을 파싱해야 했다. 바이브 코딩에서 가장 먼저 해야 할 일은 사람이 어떤 규칙으로 일하는지 곰곰이 따져보고 글로 옮겨 적는 것이다. 마치 얼굴 한번 마주하지 못한 채 떠나는 후임에게 인수인계서를 남기듯이 말이다.
규칙을 떠올려본다. ABCDEFGHIJ, 이렇게 10자리 바코드를 ABCDEF / GH / IJ로 나눠야 한다. 제공되는 바코드는 항상 10자리이며, 11자리나 12자리는 없다. 끝의 9, 10번째 자리인 I와 J를 그 순서 그대로 분리한다. 끝의 7, 8번째 자리인 G와 H도 그 순서 그대로 분리한다. 남은 1~6번 자리 바코드는 그대로 둔다.
실제로 사용한 프롬프트는 다음과 같다.
자 원본 파일은 A열에 NO가 A1에 있고, 그 밑으로 숫자 번호야. B열에 B1엔 Style이라고 제품 코드가 있어. B2부터 쭉 내려가는데 몇개 있는지는 랜덤이야. 예를 들면 B2에 ‘LW6SA15301089’가 있다고 치자. 이거를 지금 프로그램에 돌리면 C열에 C1에 Sheet Name이 나올거야. 그러고 C2부터 각 시트 번호가 나오지. 그러면 D열 D1에 ecommerceId를 추가해주고, E열에 ecommerceId2를, F열에 ecommerceId3를 추가 해줘. G열에 G1에는 rgstName. 그 다음 G2부터는 LW6SA15301089에서 끝 네자리를 뺀 LW6SA1530 이 들어가야 하고 H열에 H1에는 Option1이고, 그 다음 H2부터는 LW6SA15301089에서 끝 네자리를 뺀 LW6SA1530이 들어가. I열에 I1에는 Option2이고, 그 다음 I2부터는 LW6SA15301089에서 끝 네자리 중 왼쪽 두자리인 10이 들어가. J열에 J1에는 Option3이고, 그 다음 J2부터는 LW6SA15301089에서 끝 두자리인 89가 들어가.
실제 프롬프트에서는 엑셀의 행과 열까지 하나하나 맞췄다. 물론 사람이 직접 나눠놓은 엑셀 파일을 보여주고 “이 패턴을 읽고 그대로 데이터를 파싱하는 프로그램을 짜줘”라고 명령할 수도 있다. 그러나 예외 상황은 어떻게 할 것인가? AI가 다른 방식으로 이해해버린다면? 바로 그 지점에서 우리는 수많은 에러와 할루시네이션을 만나게 된다. 심지어 이렇게 꼼꼼히 프롬프트를 작성하더라도 AI는 분명 할루시네이션을 일으킨다. 그리고 우리는 (적어도 나는) 개발 지식이 부족해 간단한 버그나 오류조차 직접 수정할 능력이 없다. 따라서 여기에 반드시 추가해야 하는 것이 바로 검증 단계다.
역순으로 생각하고, 검증 단계를 도입한다
아주 간단한 자동차를 직접 만들어본다고 가정해보자. 자동차를 처음 만들 때 가장 중요한 것은 무엇일까? 아마도 프레임, 바퀴, 엔진, 차체 순일 것이다.
프레임이 있어야 바퀴를 달 수 있고, 프레임 위에 엔진을 얹어야 바퀴를 구동할 수 있으며, 차체가 없으면 사람이 탈 수 없다. 프레임이 없는데 완벽한 엔진만 있어봐야 소용이 없다. 엔진을 따로 보관해두고 처음부터 다시 만들면, 이제는 그 엔진이 새 프레임에 들어가지 않는다. 프레임을 엔진에 맞추면 바퀴가 걸린다. 결국 처음부터 순서대로 잘 만들어야 한다.
반대로 운전자의 입장은 다르다. 운전자는 차체에 올라타 시동을 걸고 바퀴를 움직여 운전한다. 즉 우리 머릿속에서는 차체가 가장 중요하고, 그다음이 엔진, 그다음이 바퀴 순이다. 프레임은 생각조차 하지 않는다. 이런 사고 흐름으로 자동차를 만들기는 어렵고, 수많은 시행착오를 거쳐야 한다. 그래서 우리는 역순으로 생각해볼 필요가 있다. 프로그래밍도 마찬가지다.
물론 한번에 무엇부터 만들어야 하는지 파악하는 것은 불가능하다. 무엇이 중요한 ‘뼈대’인지 파악한 다음, 잘못 만들었다 싶으면 처음부터 다시 만들 수 있는 용기도 필요하다.
대한통운 전산에 택배를 등록하려면 특정 규칙에 맞춰 엑셀 파일을 작성해서 업로드해야 한다. 매일같이 고객사 주소와 전화번호를 복붙하다 보니 진절머리가 났다. 귀찮고 시간이 너무 아까웠다. 우리 직원분들은 매일 택배 출고 준비가 완료되면 각 브랜드명과 수량을 체크해서 보내주신다.
예를 들면 ‘A브랜드 3, B브랜드 정상 3, B브랜드 불량 1…’ 같은 형태다. 그런데 정상과 불량이 가는 곳이 다른 브랜드도 있고, 그렇지 않은 브랜드도 있다. 다시 말해 앞서의 바코드 파싱처럼 단순한 로직만으로는 해결하기 어려운 문제였다. 규칙을 따로 저장해둘 필요가 있었다.
이런 복잡성 때문에 여러 차례 시도해봐도 제대로 작동하는 프로그램을 만들기가 쉽지 않았다. 그래서 프로그램의 전체 구조와 개발 순서를 먼저 정리해보았다.
가장 먼저 필요한 것은 정해진 규칙에 따라 엑셀 파일을 생성할 수 있는 파트였다. 그다음은 규칙을 저장해둔 엑셀 파일에서 규칙을 불러오는 파트, 자연어(‘A브랜드 3, B브랜드 정상 3, B브랜드 불량 1…’)를 읽어 파싱하고 저장된 규칙과 매칭하는 파트가 필요했다. 따라서 해당 순서대로 프로그램을 구현해달라고 요청한 후 검증을 위한 프롬프트를 추가했다. 다음은 검증 단계를 포함한 프롬프트다.
송장 자동 생성 프로그램 폴더 안에 구글 Colab 파일이 들어 있어. 해당 파일을 Colab에서 구동 가능한 상태로 유지해. 아래 4가지 목표를 차례대로 달성해야 해.
1번 목표를 달성했다면 이 Colab 파일이 Colab 환경에서 정상적으로 돌아가는지 검증해. 구글 인증 등 예측 불가능한 외부 변수는 무조건 가능한 것으로 가정해. 검증 단계에서 에러가 발생하면 처음부터 다시 시작해 다른 접근을 시도해.
1번 목표를 완료해 검증에 통과하면 2번 목표로 넘어가. 검증에 실패하면 1번 목표를 다시 시도해.
2번 목표를 완료해 검증에 통과하면 3번 목표로 넘어가. 검증에 실패하면 2번 목표를 다시 시도해.
3번 목표를 완료해 검증에 통과하면 한 번 더 검증해. 이 단계에서는 총 소요 시간을 대략적으로 추정해. 구글 인증, 텍스트 입력 속도 등은 1초로 고정해. 그다음 4번 목표로 넘어가. 검증에 실패하면 1번 목표부터 다시 시도해.
4번 목표는 중요한 과제야. 3번 목표 두 번째 검증 단계의 소요 시간을 3~10초 단축하는 것이 목표야.
4번 목표를 완료하면 검증해. 이번 검증 단계에서는 속도까지 체크해. 검증에 통과하면 ‘송장_자동_생성_프로그램_v1.2’로 .ipynb 파일을 추가 생성해. 검증에 실패하면 1번 목표부터 다시 시도해.
1, 2번 목표는 각각 파트들이 내가 정의한 대로 동작하는 것이고, 3, 4번 목표는 송장을 뽑는 데 시간이 너무 오래 걸려 최적화 목표로 지정했다. 3, 4번 목표는 전체를 수정할 필요가 있기 때문에 더욱 엄격하게 검증할 수 있도록 하였다.
이때부터 바이브 코딩을 하며 시행착오를 겪던 각종 할루시네이션 등의 문제가 줄어드는 것을 느낄 수 있었다. 이제 규칙을 찾을 수만 있다면 프로그램으로 만드는 것이 어렵지 않다는 자신감이 있다.
발터 벤야민은 우리가 기술 복제 시대를 살고 있다고 말했다. 그는 사진을 통해 예술이 대중화된 것을 두고 찬사를 보냈다. 우리는 이제 사진으로 그림을 복제하는 단계를 넘어, 글자로 사진과 그림을 생성하는 기술 복제 시대에 들어섰다. 흐름을 거스를 수 없다면 그 위에 올라타야 한다. 깨진 틈이 있어야 그 사이로 빛이 들어온다. 분업화가 깨지고 있다. 이제는 다재다능한 사람만이 살아남을 수 있는 시대로 접어들었다.






댓글이 닫혔습니다.