Velocidade de entrega e custo de manutenção pós IA
Entregar ficou rápido demais. O problema é que manter continuou custando o mesmo preço de sempre. ...
개요 #
오전 11시 17분에 프론트 PR을 열고, 11시 32분에 백엔드 PR을 열었다. 그리고 점심을 먹으러 갔다.
브라질 개발자 Elves Santos가 올해 초 하루 만에 끝냈다는 기능 이야기다. 고객이 직접 분석 공식을 설정할 수 있게 해달라는 요구였고, 마이그레이션 하나에 새 라우트 4개, 949줄짜리 화면, 그리고 하드코딩된 계산 전략 208줄을 공식 평가기를 호출하는 50줄로 바꾸는 작업이 한나절에 끝났다.
5개월 뒤 그는 같은 파일로 세 번 돌아갔다. 그가 쓴 글의 결론은 짧다. 아낀 건 그 오전 한나절이었고, 세 번의 복귀는 아끼지 못했다는 것.
하루 만에 끝낸 기능이 남긴 것 #
첫 번째 복귀는 2주 뒤였다. 새 분석 유형 3개가 생겼고, 누군가 서버에 들어가 하드코딩 전략 3개를 다시 추가했다. 14일 전에 범용 엔진이 폐기한 바로 그 맵에다가. 그 누군가는 본인이었다.
문제는 diff가 예전 버전 파일에서 시작한다는 점이었다. 코드를 쓴 사람이 새 경로를 못 찾은 게 아니라, 새 경로가 존재한다는 것 자체를 이해하지 못했다.
27일 뒤 또 돌아갔다. 분석 유형에 공식이 없을 때 코드가 throw new Error(JSON.stringify({...}))를 던지고 있었다. 예외 메시지 안에 JSON이 들어 있고, HTTP 핸들러가 그걸 다시 파싱해야 사용자에게 뭘 말할지 알 수 있는 구조였다. 고치는 데 코드 35줄, 테스트 175줄이 들었다. 테스트가 코드의 5배다. "배포했다"고 선언한 그 오전에 생각했어야 할 케이스에 대한 테스트였다.
지금 그 파일은 268줄이고, 여전히 본인이 남긴 주석 하나를 달고 있다.
// Keep for backwards compatibility with tests
프로덕션 코드 어디서도 읽지 않는 16개 항목짜리 맵이 그대로 남아 있다. 테스트 단언 14개가 거기 의존하고 있어서다. 그걸 뜯어낼 오후 한나절이 아무한테도 없었다. 테스트 파일은 351줄, 자기가 테스트하는 서비스보다 길다.
우리가 축하하는 건 원래 싼 쪽이다 #
Santos는 AI를 매일 쓴다고 못 박는다. "AI가 나쁘다"는 얘기가 아니라는 것이다. 그가 짚는 건 다른 지점이다.
AI가 실제로 싸게 만든 게 뭔지 보자. 보일러플레이트, DTO, 마이그레이션, 인생에서 40번쯤 만들어본 그 CRUD, 새 모듈의 뼈대, 한 번도 열어본 적 없는 라이브러리 이해하기. 전부 터무니없이 싸졌고 그는 이걸 되돌리고 싶은 마음이 조금도 없다고 했다.
그런데 이 목록에는 공통점이 있다. 전부 코드가 태어나는 순간이다.
소프트웨어는 평생 태어나기만 하지 않는다. 읽히고, 디버깅되고, 금요일에 급하게 수정되고, 지난달 입사한 사람에게 설명된다. 그쪽은 2019년과 똑같은 값을 치른다. 코드 양이 늘었으니 어쩌면 더 비싸졌을 수도 있다.
"나 3배는 빨라진 것 같은데"라는 감각은 사실일 수 있다. 다만 측정 대상이 원래부터 가장 빨랐던 구간일 가능성이 높다.
Photo by Renan Almeida on Pexels
새벽 3시에 터지면, 채팅창 안 열고 디버깅할 수 있나 #
글에서 딱 한 문장만 남긴다면 이거라고 그는 썼다. 머지 전에 스스로에게 던져보라는 질문이다.
답이 아니오라면 끝난 게 아니다. 그냥 밀어낸 것이다.
더 독한 버전도 있다. 이 코드를 한 번도 본 적 없는 사람에게 왜 이렇게 되어 있는지 설명할 수 있는가. 설명하지 못한다면 그 파일의 오너십은 본인에게 없다. 그리고 모델은 장애 당일에 같이 대기하고 있지 않다.
전부 손으로 짜라는 말은 아니다. 받아들이기 전에 읽으라는 말이다. 필요하면 화면에 손가락 짚어가며 한 줄씩.
200줄 읽는 데 10분. 읽지 않은 200줄을 디버깅하는 데 하루. 이 계산은 한 번도 바뀐 적 없다.
그가 뒤늦게 알아챈 디테일도 하나 있다. AI는 최소 해법을 거의 돌려주지 않는다. 완성된 해법을 돌려준다. 요청하지 않은 추상화, "유연하게 쓰라고" 붙은 선택적 파라미터, 프로젝트에 존재하지도 않는 유스케이스를 위한 인터페이스까지. 함수 하나를 요청했더니 프레임워크가 돌아온다.
그리고 그 줄들은 언젠가 팀의 누군가가 읽어야 할 줄이다. 티켓에는 아무도 안 적지만 거기 있다.
병목은 사라진 게 아니라 자리를 옮겼다 #
이 부분은 팀에서 직접 겪고도 한참 뒤에야 이해했다고 그는 적었다. 그리고 양쪽을 다 벤다.
첫 번째는 리뷰다. 쓰는 쪽 속도는 크게 올렸는데 보는 쪽 속도는 전혀 안 올렸다. 여전히 같은 인간의 뇌, 같은 24시간인데 이제 40개 파일짜리 PR이 큐에 쌓인다.
큐가 길어지면 늘 벌어지는 일이 벌어진다. 리뷰어가 diff 요약만 훑고, 테스트가 통과한 걸 확인하고, LGTM(looks good to me)을 날린다. 여기 있는 사람 전부 해봤고 본인도 했다고 그는 인정한다.
그러면 아무도 진짜로 쓰지 않은 코드를 아무도 진짜로 승인하지 않은 채 프로덕션으로 보내게 된다. 돈 내는 고객이 있는 그 프로덕션으로. 터지면 관련자가 둘인데 둘 다 그게 뭘 하는지 모른다.
리뷰를 AI에 넘기는 것도 해결책은 아니라는 게 그의 견해다. 사소한 것 잡는 데는 진짜 도움이 되지만, 리뷰는 버그를 찾으려고만 존재하는 게 아니다. 팀에서 최소 두 사람은 그 코드가 존재한다는 걸 알기 위해 존재한다.
두 번째는 본인의 단가다. 그리고 이쪽이 더 거슬린다고 했다.
이틀 걸릴 일을 2시간에 낸 날, 그 일의 기한은 영원히 2시간이 된다. 아무도 되돌아와서 "그중 얼마가 AI가 한 번에 맞춘 덕이고 얼마가 운이었나"를 묻지 않는다. 기준선은 올라가고 다시는 내려오지 않는다.
그러다 진짜 골치 아픈 문제가 온다. 어디에도 정답이 없어서 사흘을 앉아 생각해야 하는 종류의 문제. 그때 당신은 실제로 가진 적 없는 속도를 빚지고 있다.
프리랜서로 범위 단위 견적을 낸다면 더 나쁘다. 자기 가격을 스스로 디플레이션시키고 유지보수를 공짜로 떠안은 셈이다. Santos의 표현으로는, 오전 한나절을 청구했고 그 뒤 세 번의 복귀는 자기 시간으로 자기 주머니에서 냈다.
그가 막혀 있다고 말하는 지점이 여기다. 포기하기엔 너무 좋은 이 도구를 계속 쓰면서, 코드에 뭐가 들어가는지에 대한 통제권과 자기 노동의 가격을 공짜로 넘기지 않으려면 어떻게 해야 하는가.
지금 그가 하는 것 #
프리랜서 개발자로 일하면서 그는 이런 상황을 다루기 위한 사고 절차를 만들었다고 한다. AI를 쓰며 저지른 수많은 실수의 결과물이라는 설명이다.
코드가 아니라 문제를 설명한다. 예전에는 "X를 하는 함수를 써줘"라고 요청해서 그 완성된 해법을 받았다. 지금은 프로젝트에 이미 뭐가 있는지, 제약이 뭔지, 그리고 무엇보다 무엇을 원하지 않는지를 말한다. 무작위 추상화가 많이 줄었다.
작은 버전을 명시적으로 요구한다. "일반화하지 말고 해결되는 가장 단순한 걸 만들어줘." 이 한마디로 사라지는 코드 양이 상당하다고 했다.
PR 설명은 직접 쓴다. '어떻게'는 생성돼도 괜찮다. '왜'는 나중에 다시 생성할 수 없는 유일한 부분이고, 6개월 뒤의 본인이 필요로 할 부분이다.
괴물 PR이 나오면 쪼갠다. 귀찮아도 쪼갠다. 한 사람 머리에 들어가는 크기는 AI가 왔다고 달라지지 않았다.
테스트는 아픈 곳에 집중한다. 해피 케이스는 AI가 알아서 커버하고, 애초에 그건 가장 안 터지는 부분이다. 터지는 건 네트워크 실패, 이상한 페이로드, 그 오래된 고객사에만 존재하는 레거시 데이터다. 손해는 거기서 난다.
가격에 대해서도 하나 바꿨다. 코드를 견적하지 않고 해결된 문제를 견적한다. 작성에 쓰는 오전이 아니라, 그게 서 있어야 하는 한 달을 기준으로.
결국 일이 '선택하는 것'이 되었다 #
Santos는 이게 맞는 해석인지 모르겠다고 단서를 달았다. 매일 이걸 만지며 지금까지 본 것일 뿐이라는 것이다.
그의 정리는 이렇다. AI는 엔지니어링이라는 일을 없앤 게 아니라 그 일의 기계적인 부분을 없앴다. 그리고 기계적인 부분이 사라지면서, 늘 대충 넘길 수 있었던 부분이 드러났다. 시스템을 이해하고, 기준을 갖고 결정하고, 그 뒤로 프로덕션에서 그걸 지탱하는 일이다.
빨리 타이핑하기만 하던 사람은 우위를 잃었다. 생성된 200줄을 보고 "이거 틀렸고, 이유는 이거다"라고 말할 수 있는 사람은 더 가치가 올라갔다. 그리고 그 사람이 실제로 하는 일을 보라고 그는 덧붙인다. 선택지를 평가하고 어떤 단점을 짊어질지 골랐다. 시장에서는 그걸 트레이드오프라고 부르고, 그게 우리에게 남은 일이다.
지금 일반화하고 복잡도를 지불하거나, 오늘 하드코딩하고 나중에 지불하거나. 값을 치르지 않는 선택은 없고, 눈 뜨고 한 선택과 자동으로 한 선택이 있을 뿐이다.
배포 속도는 데일리에서 보여주기 쉽다. 유지보수 비용은 자기를 찾아내는 날까지 숨어 있다.
생성하라고, 많이 생성하라고 그는 말한다. 다만 서명하기 전에 자기가 생성한 걸 읽으라고.
이 글은 위 출처를 바탕으로 한국 독자를 위해 재작성한 기사입니다. 원문의 사실과 수치에 근거하며, 별도의 견해를 포함하지 않습니다.

