잡담··6 min read

완벽주의 vs 일단 배포하기

코드가 마음에 안 드는데 일정은 다가온다. 완벽함을 버리는 게 성숙인지, 타협인지.

배포 3시간 전에 리팩토링을 시작한 사람

나다. 지난주 금요일 오후 3시. 배포가 6시로 잡혀 있었다. 기능은 다 돌아간다. 테스트도 통과한다. 근데 코드가 마음에 안 들었다.

함수 하나가 47줄이었다. 쪼개야 한다. 변수명도 data는 너무 모호하다. userActivityLogs로 바꿔야 한다. 에러 메시지도 더 구체적으로.

3시부터 리팩토링을 시작했다. 4시 반에 끝날 줄 알았는데 5시 20분까지 걸렸다. 중간에 다른 부분까지 건드렸다. 결국 테스트가 2개 깨졌다. 5시 40분에 테스트 수정 완료. 배포 20분 전.

PR 올리면서 손이 떨렸다. 리뷰어한테 "급하게 리팩토링했는데 봐주세요" 했다. 리뷰어 표정이 좋지 않았다.

(이런 짓을 매번 하면서도 못 고친다.)

동작하는 코드 vs 아름다운 코드

"Done is better than perfect." 페이스북 벽에 적혀 있었다는 그 문구. 알고 있다. 동의도 한다. 근데 실천이 안 된다.

머리로는 "돌아가면 된다"를 알지만, 마음이 "이건 아닌데"를 외친다. 코드가 지저분한 채로 배포하면, 마치 옷에 얼룩이 있는데 그냥 나가는 기분이다. 나만 알고 있지만 계속 신경 쓰인다.

근데 현실은, 사용자는 코드를 안 본다. 사용자한테는 기능이 되느냐 안 되느냐가 전부다. 내가 47줄짜리 함수를 3개로 쪼개든 말든 사용자 경험에는 차이가 없다.

그러면 누구를 위한 완벽인가. 나를 위한 거다. 내 자존심을 위한. 이걸 깨닫는 데 3년이 걸렸다.

완벽주의가 만든 사고들

완벽주의 때문에 사고가 난 적이 2번 있다.

첫 번째: 배포 직전에 "이것만 하나 더" 하다가 프로덕션 DB 마이그레이션 스크립트를 잘못 건드렸다. 롤백하는 데 1시간 17분 걸렸다. 팀 전체가 야근했다.

두 번째: "이 아키텍처가 마음에 안 든다"면서 리팩토링에 2주를 썼다. 원래 기능 개발 일정이었는데. 결과적으로 스프린트를 밀었고, 리팩토링 결과물도 생각보다 별로였다.

이런 경험을 하고도 완벽주의를 못 버리니까, 이건 성격의 영역인 것 같다.

일단 배포하는 사람들이 부럽다

팀에 한 명 있다. 코드가 좀 지저분해도 "일단 배포하고 나중에 고치자"를 실천하는 사람. PR 올리는 속도가 나의 2배다.

처음에는 "저렇게 대충 하면 나중에 기술 부채가 쌓일 텐데"라고 생각했다. 근데 1년 지나서 보니까, 기술 부채가 쌓이기는 했지만 심각한 수준은 아니었다. 오히려 빨리 배포해서 피드백을 받고 수정하는 사이클이 더 효율적이었다.

반면 나는 완벽하게 만들려다가 배포가 늦어지고, 피드백도 늦게 받고, 그 사이에 요구사항이 바뀌어서 다시 짜는 일이 있었다.

누가 봐도 "일단 배포"가 맞는데, 머리와 손이 따로 논다.

타협점을 찾는 중

완전히 완벽주의를 버릴 수는 없다. 그래서 규칙을 세웠다.

  1. 배포 당일에는 리팩토링 금지.
  2. "나중에 고칠 것" 목록을 만들어서 기록만 해두기.
  3. 리팩토링은 별도 티켓으로 분리.

이론적으로는 완벽한 규칙이다. 실천율은... 60% 정도. 40%는 여전히 "이것만 하나만 더" 모드에 빠진다.

진짜 성숙한 개발자는 불완전함을 견딜 수 있는 사람인 것 같다. 나는 아직 견디기 어렵다.

관련 글