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