소프트웨어 인수인계를 오래가게 만들기
"성공적인 인수인계는 마지막 달에 결정되지 않는다. 런북, 재현 가능한 환경, 유지보수 리듬, 그리고 두렵지 않은 의존성 업데이트."
인수인계는 첫날부터 시작된다
인수인계는 프로젝트 말기의 의식으로 상상되곤 합니다. 몇 번의 회의, 급하게 쓴 100쪽짜리 문서, 저장소 아카이브. 그리고 다음 팀은 문서가 더 이상 존재하지 않는 시스템을 설명하고 있다는 것, CI가 넉 달째 빨간불이라는 것, 화요일에 만료되는 인증서가 어디 있는지 아무도 모른다는 것을 발견합니다.
성공하는 인수인계는 이벤트가 아니라 첫날부터 유지되는 프로젝트의 속성입니다. 길잡이 질문은 단순합니다. 내일 팀이 바뀐다면 오늘 무엇이 기록되어 있어야 하는가? 이어지는 모든 내용은 이 질문에서 나옵니다.
실제로 인계되는 것
소프트웨어는 소스 코드로 환원되지 않습니다. 인계되는 것은 그것을 운영하는 능력이고, 그 능력은 다섯 가지 목록에 담깁니다.
- 런북. 배포, 복구, 알려진 장애의 진단 방법을 정확한 명령어와 함께.
- 접근 지도. 환경, 서드파티 서비스, DNS, 인증서, 관련 시크릿. 사람의 기억이 아니라 금고에.
- 의사결정. 코드가 말하지 못하는 "왜"를 설명하는, 짧고 날짜가 적힌 아키텍처 결정 기록.
- 인정한 부채. 취약한 것, 우회한 것, 임시인 것의 정직한 목록. 비싼 것은 숨겨진 부채이기 때문입니다.
- 캘린더. 인증서와 도메인 만료, 메이저 버전 지원 종료, 라이선스 갱신.
이 목록 중 하나라도 없으면, 인수인계는 최악의 순간에 그것을 발견하게 됩니다.
재현 가능한 환경이 토대다
세상의 어떤 문서도 명령어 하나로 재구축되는 환경을 대신하지 못합니다. 코드로 기술된 인프라, 커밋된 lock 파일로 고정된 버전, 생성되거나 익명화된 개발 데이터, 그리고 초록불을 유지하는 CI. 초록 CI야말로 진짜 인수인계 계약이며, 시스템이 설명된 그대로라는 실행 가능한 증명입니다.
가장 정직한 테스트는 반나절이면 됩니다. 프로젝트를 한 번도 만져본 적 없는 사람에게 README만 보고 설치하게 하는 것. 그가 던지는 질문 하나하나가 인수인계의 구멍이고, 메운 구멍은 즉시 현재 팀에게 이익이 됩니다.
유지보수는 리듬이지, 반응이 아니다
유지보수는 반응으로만 존재할 때 실패합니다. 언론에 오른 취약점, 장애, 강제된 업그레이드. 리듬을 가질 때 성공하며, 그 리듬은 세 층위에 담깁니다.
자동화 도구(Renovate, Dependabot)가 제안을 열고, CI가 판정하고, 팀이 결정합니다. 여섯 달을 기다린 마이너 업데이트는 사실상 메이저가 됩니다. 자주 오르는 작은 계단이 억지로 오르는 큰 계단을 언제나 이깁니다.
두 가지 규칙이 리듬을 지속 가능하게 합니다. 첫째, 예산. 일정에 확보된, 협상 불가능한 반복 창. "남는 시간"에 의존하는 유지보수는 존재하지 않기 때문입니다. 둘째, 명시적인 버전 정책. 어떤 부품이 최신 버전을 따르고, 어떤 것이 장기 지원을 따르는지, 언제까지인지.
Semver는 약속이 아니라 관례다
시맨틱 버저닝은 작성자의 의도를 말할 뿐, 당신 시스템의 현실을 말하지 않습니다. 마이너 버전이 당신도 모르게 의존하던 동작을 깨뜨릴 수 있습니다. 신뢰는 다른 곳에서 옵니다. 프로젝트의 실제 사용을 덮는 테스트, 업그레이드 전에 읽는 체인지로그, 그리고 작고 격리되어 쉽게 되돌릴 수 있는 묶음 단위의 업데이트. 월간 묶음 창이 작동하는 이유도 그것입니다. 적당한 묶음을 함께 테스트하고 함께 되돌릴 수 있으니까요.
활동이 아니라 건강을 측정하라
인계되는 소프트웨어는 자기 계기판을 지니고 가야 합니다. 사람에게 경보를 보내는 소수의 가용성·오류 지표, 수명이 끝나가는 의존성 목록, 업데이트 지연의 평균 나이. 지표는 적게, 그러나 지켜볼 것. 아무도 열지 않는 대시보드는 회의용 소품이지 계기가 아닙니다.
마지막 테스트: 빈손으로 열쇠 넘겨보기
인수인계의 가장 좋은 검증은 필요해지기 전에 이루어집니다. 프로젝트 밖의 사람이 문서화된 것만 사용해 모의 인시던트를 진단부터 수정 배포까지 맡는 훈련입니다. 훈련 비용은 하루, 돌아오는 것은 유일하게 중요한 정보입니다. 이 시스템은 만든 사람들의 이탈을 살아남을 수 있는가?
우리가 적용하는 체크리스트
- 운영 가능한 런북: 배포, 복구, 진단, 명령어 포함.
- 접근과 시크릿은 금고에 목록화. 머릿속에 두지 않는다.
- 아키텍처 결정 기록은 일하면서 그때그때.
- 부채와 우회는 가차 없이 문서화.
- 명령어 하나로 재구축되는 환경, 초록 CI 필수.
- 리듬: 보안은 며칠, 마이너는 월간, 메이저는 계획적으로.
- 업데이트 제안은 자동화, 판단은 사람이.
- 만료 캘린더: 인증서, 도메인, 지원 종료일.
- 일 년에 한 번 빈손 인수인계 훈련.
잘 인계된 소프트웨어는 완벽한 소프트웨어가 아닙니다. 다음 팀이 일주일 뒤 이렇게 말할 수 있는 소프트웨어입니다. "우리가 어디에 발을 딛고 있는지 안다."