사람이 유지보수할 것처럼 코드를 작성하라

TMT

https://unstack.io/write-code-like-a-human-will-maintain-it

LLM의 가장 좋은 점 중 하나는 하루 종일 코드를 대신 써준다는 것입니다. DRY 원칙이 무슨 상관인가요? 네 개의 파일에 흩어진 똑같은 긴 조건문을 직접 고칠 필요가 없습니다. AI가 알아서 다 해주니까요! 그렇지 않나요?

최근 AI와 함께 만들던 프로젝트에서 저 자신이 이런 부분을 대충 넘기고 있다는 걸 깨달았습니다. 라우트 핸들러, 백그라운드 작업, API 엔드포인트, 웹훅 등 여러 곳에 똑같은 접근 권한 검사가 필요했는데, 그때마다 필요한 내용을 설명하면 모델이 동작하는 코드를 만들어줬고, 저는 그걸 그대로 머지했습니다.

매번 만들어진 코드는 대략 이런 모습이었습니다:

if (user.isActive && user.hasPermission('read') &&
    !user.isSuspended && account.status === 'open') {
    // do a thing
}

사실상 매번 똑같은 조건문이었습니다. 조건 네 개에 변수 이름만 조금씩 다르고, 단어 한두 개만 바뀐 복사-붙여넣기 로직이었죠. 훨씬 깔끔한 방법이 있습니다. 예를 들어 공용 헬퍼로 빼는 것처럼, 제가 직접 짰다면 당연히 분리했을 방식이죠. 하지만 그러지 않았습니다. 코드는 잘 돌아갔으니까요! 테스트도 통과했고, 나중에 다시 손댈 사람도 제가 아니었으니까요.

바로 여기에 게으름이 있습니다. 모범 사례를 따르지 않아도, 유지보수하기 골치 아픈 코드라는 걸 알아도, 그게 무슨 상관인가요? 나중에 뭔가 바꿔야 하면 제가 아니라 LLM이 처리할 텐데요.

하지만 LLM은 진공 상태에서 코드를 쓰지 않습니다. 여러분의 코드베이스를 읽습니다. 열어둔 파일, 이미 자리 잡은 패턴, 최근에 만든 변경 사항까지요. 코드베이스에 머지하는 모든 지름길은 "여기서는 일을 이렇게 한다"는 신호가 됩니다. 다음에 같은 접근 규칙이 필요한 엔드포인트를 하나 더 요청하면, 모델은 기본 원칙에서 출발하지 않습니다. 저장소에 이미 들어앉아 있는 네 개의 복사본에서 출발합니다.

그래서 다섯 번째 엔드포인트를 요청하면 똑같이 복사된 코드로 다섯 번째 조건문이 나옵니다. 리팩터링을 요청해도 모델은 다섯 개를 전부 그대로 둡니다. 여러분의 코드가 원래 그렇게 생겼으니까요. 나쁜 패턴은 더 이상 일회성이 아니라, 여러분의 스타일로 간주됩니다.

이런 식으로 계속 내버려 두면, 나중에 고치려 할 때 LLM이 모든 사례를 빠짐없이 찾아내리라고 정말 믿을 수 있을까요?

물론 이런 게 몇 개 있다고 큰일이 나지는 않습니다. 늘 그렇게 시작하지만, 코드 스멜은 차곡차곡 쌓입니다. 중복된 조건문 하나, "만능(god)" 함수 하나, "나중에 정리하자"며 머지한 코드 하나가 다음 프롬프트에 신호를 한 겹씩 더합니다. 결국에는 프롬프트만으로는 쉽게 빠져나올 수 없는 지경이 됩니다. 적어도 직접 소매를 걷어붙이고 손을 더럽히지 않고서는요.

가장 답답한 대목은 이겁니다. 저는 유지보수를 LLM에 맡기고 있다고 생각했지만, 실제로는 점점 나빠지는 습관을 LLM에 학습시키는 내리막길을 걷고 있었던 겁니다.

사람이 유지보수할 것처럼 코드를 작성하세요. LLM은 여러분이 하는 모든 것을 빨아들였다가 그대로 되돌려주는 스펀지입니다. 그러니 좋은 것을 흡수하게 하세요.

Edit this page

On this Page

No Headings