대규모 기존 코드베이스에서 엔지니어들이 저지르는 실수
(seangoedecke.com)- 대규모 코드베이스에서 작업하는 것은 소프트웨어 엔지니어에게 가장 어려운 일 중 하나임. 개인 프로젝트나 오픈 소스 프로젝트로는 이러한 경험을 얻기 어려움
- 수백만 줄의 코드, 100-1000명의 엔지니어가 동시에 작업, 최소 10년 이상 된 코드베이스
- 복잡성과 시간이 쌓인 상태를 이해하는 별도의 능력을 요구
가장 큰 실수는 일관성의 부족
- 가장 흔한 실수는 기존 코드베이스를 무시하고 자신의 기능을 구현하는 것임. 이는 일관성을 유지하지 못하게 하여 코드베이스의 혼란을 가중시킴
- 보통 기존 코드베이스와 상호작용을 최소화하여 자신의 깨끗한 코드를 유지하고, 기존의 "레거시" 코드를 피하기 위해 독립적으로 구현함
- 일관성은 코드베이스의 복잡성을 줄이고, 미래의 개선 작업을 용이하게 함
- 예를 들어, API 엔드포인트를 구현할 때 기존의 인증 방식을 따르는 것이 중요함. 이는 코드베이스의 지뢰밭을 안전하게 통과할 수 있게 해줌
- 일관된 패턴이 없으면 모든 코드를 수작업으로 업데이트해야 하며, 이는 점점 더 어려워짐
기타 중요한 요소
-
서비스의 실제 사용 방식 이해
- 가장 자주 사용되는 주요 API 엔드포인트와 중요 경로(hot path)를 파악
- 사용 빈도가 높은 코드에 대한 변경은 신중히 처리
-
테스트와 모니터링의 중요성
- 대규모 프로젝트에서는 모든 상태를 테스트할 수 없으므로 주요 경로만 테스트
- 코드를 방어적으로 작성하고 점진적 배포 및 모니터링에 의존
-
의존성 추가를 자제
- 의존성은 보안 문제 및 유지보수 비용 증가를 초래
- 꼭 필요한 경우, 신뢰할 수 있는 의존성 선택
-
코드 제거는 신중히 하지만 적극적으로
- 프로덕션 데이터를 분석하여 안전하게 호출을 제거한 뒤 코드 삭제
- 불필요한 코드를 제거하면 코드베이스의 유지보수가 용이해짐
- 이는 대규모 코드베이스에서 가장 가치 있는 작업 중 하나임
-
작은 PR로 작업하고 다른 팀의 코드에 영향을 미치는 변경 사항을 먼저 처리해야 함
- 도메인 전문가가 문제를 발견하고 사고를 방지할 수 있게 해줌
왜 대규모 코드베이스가 중요한가?
-
대규모 코드베이스의 가치
- 대부분의 기술 회사는 대규모 코드베이스에서 수익 창출
- "레거시 코드베이스" 작업이 회사의 실제 업무를 의미
-
코드 분리 전 이해 필요
- 대규모 코드베이스를 분리하려면 먼저 전체적인 작동 방식을 충분히 이해해야 함
- 이해 없이 대규모 재설계는 불가능
요약
- 대규모 코드베이스는 중요한 비즈니스 가치를 지님
- 가장 중요한 것은 일관성 유지
- 새로운 기능 구현 전에 기존 코드를 조사하고 패턴을 따를 것
- 기존 패턴을 따르지 않는 경우, 매우 좋은 이유가 있어야 함
- 프로덕션 환경에서 코드가 어떻게 사용되는지 이해할 것
- 모든 경우를 테스트할 수 없으므로 테스트에 과도하게 의존하지 말고 모니터링 및 점진적 배포에 의존
- 코드 제거 기회를 적극 활용하되 신중히 처리
- 도메인 전문가가 검토할 수 있도록 작은 PR 단위로 작업
일관성이 중요하긴 한데, 그렇다고 코드 개선을 미루거나 기존의 잘못된 패턴을 반복하는 것도 좋은 방식은 아니라..어려운 문제죠. 일관성을 지키느라 동일한 기술부채를 쌓아나가는 모양이 될 수도 있으니까요.
Hacker News 의견
-
기존 코드베이스가 일관성이 없을 때, 새로운 방식을 도입하고 문서화하며 피드백을 받는 것이 중요함. 기존 코드와의 일관성을 유지하려고 노력해야 함.
- 기존 코드가 나쁘더라도 주변 코드와의 일관성을 유지하며 작업하는 것이 중요함.
- 팀원들이 비협조적일 경우, 기존 코드의 문제점을 강조하고 새로운 접근이 실험적임을 설명하는 것이 도움이 됨.
-
기존 코드베이스의 도구를 사용해야 하지만, 새로운 코드베이스를 구축하는 것이 더 즐거울 수 있음.
- 코드베이스의 결합도가 높을수록 변경이 어려워질 수 있으며, 테스트 커버리지가 부족하면 문제가 발생할 수 있음.
-
큰 코드베이스를 분할하기 위해서는 먼저 이해가 필요하며, 경험이 없는 팀이 이를 시도하면 실패할 가능성이 큼.
- 새로운 팀이 기존 시스템을 이해하지 못하면 프로젝트가 실패할 수 있음.
-
큰 코드베이스에서 무작위로 개선하려는 시도가 많음.
- 개선할 부분을 찾고, 실제로 긍정적인 영향을 미칠 부분을 판단하는 것이 중요함.
- 개선할 부분을 알고 언제 멈출지를 아는 것이 중요함.
-
코드베이스의 진화를 유지하는 것은 어려움.
- 절대적인 일관성은 실험을 허용하지 않으며, 실험이 없으면 성공도 없음.
-
코드베이스가 크고 인력이 부족하면, 새로운 사람이 생산적이 되기까지 시간이 오래 걸림.
- 이런 환경에서 일하는 것은 경력에 좋지 않을 수 있음.
-
코드베이스를 깔끔하게 유지하는 것은 기능을 출시하기 위한 최소한의 작업만 해야 함.
- 이는 정치적으로 영리한 엔지니어들이 기능 출시를 목표로 한 전술적 선택일 수 있음.
-
일관성이 가장 중요하지 않으며, 코드베이스의 일부를 개선하는 것이 좋음.
- "용암층 반패턴"은 일관성을 유지하려는 시도보다 더 나은 시스템을 만들 수 있음.
-
"일관성의 결여는 치명적인 실수"라는 말은 100% 맞음.
- "로마에 가면 로마법을 따르라"는 철학을 따름.
-
엔지니어로서의 세 가지 격언:
- 명확성, 일관성, 간결성
- 고통을 올바른 곳에 두기
- 엔트로피와 싸우기
프로젝트의 규모 != 성숙도
일관성이 매우 중요한 것임에 동의하지만, 이것을 구실로 코드베이스 개선의 우선순위를 낮게 가져가는 것은 지양해야할 부분이라 생각해요.
프로젝트는 항상 살아숨쉬고 성장해나가기 때문에 적당한 때에 개선을 해내지 못하면 그것을 돌이키는데에는 더 많은 시간과 노력이 필요해질테니까요.