26P by GN⁺ 5달전 | ★ favorite | 댓글 8개
  • 대규모 코드베이스에서 작업하는 것은 소프트웨어 엔지니어에게 가장 어려운 일 중 하나임. 개인 프로젝트나 오픈 소스 프로젝트로는 이러한 경험을 얻기 어려움
    • 수백만 줄의 코드, 100-1000명의 엔지니어가 동시에 작업, 최소 10년 이상 된 코드베이스
    • 복잡성과 시간이 쌓인 상태를 이해하는 별도의 능력을 요구

가장 큰 실수는 일관성의 부족

  • 가장 흔한 실수는 기존 코드베이스를 무시하고 자신의 기능을 구현하는 것임. 이는 일관성을 유지하지 못하게 하여 코드베이스의 혼란을 가중시킴
    • 보통 기존 코드베이스와 상호작용을 최소화하여 자신의 깨끗한 코드를 유지하고, 기존의 "레거시" 코드를 피하기 위해 독립적으로 구현함
  • 일관성은 코드베이스의 복잡성을 줄이고, 미래의 개선 작업을 용이하게 함
  • 예를 들어, API 엔드포인트를 구현할 때 기존의 인증 방식을 따르는 것이 중요함. 이는 코드베이스의 지뢰밭을 안전하게 통과할 수 있게 해줌
  • 일관된 패턴이 없으면 모든 코드를 수작업으로 업데이트해야 하며, 이는 점점 더 어려워짐

기타 중요한 요소

  • 서비스의 실제 사용 방식 이해
    • 가장 자주 사용되는 주요 API 엔드포인트와 중요 경로(hot path)를 파악
    • 사용 빈도가 높은 코드에 대한 변경은 신중히 처리
  • 테스트와 모니터링의 중요성
    • 대규모 프로젝트에서는 모든 상태를 테스트할 수 없으므로 주요 경로만 테스트
    • 코드를 방어적으로 작성하고 점진적 배포 및 모니터링에 의존
  • 의존성 추가를 자제
    • 의존성은 보안 문제 및 유지보수 비용 증가를 초래
    • 꼭 필요한 경우, 신뢰할 수 있는 의존성 선택
  • 코드 제거는 신중히 하지만 적극적으로
    • 프로덕션 데이터를 분석하여 안전하게 호출을 제거한 뒤 코드 삭제
    • 불필요한 코드를 제거하면 코드베이스의 유지보수가 용이해짐
    • 이는 대규모 코드베이스에서 가장 가치 있는 작업 중 하나임
  • 작은 PR로 작업하고 다른 팀의 코드에 영향을 미치는 변경 사항을 먼저 처리해야 함
    • 도메인 전문가가 문제를 발견하고 사고를 방지할 수 있게 해줌

왜 대규모 코드베이스가 중요한가?

  • 대규모 코드베이스의 가치
    • 대부분의 기술 회사는 대규모 코드베이스에서 수익 창출
    • "레거시 코드베이스" 작업이 회사의 실제 업무를 의미
  • 코드 분리 전 이해 필요
    • 대규모 코드베이스를 분리하려면 먼저 전체적인 작동 방식을 충분히 이해해야 함
    • 이해 없이 대규모 재설계는 불가능

요약

  • 대규모 코드베이스는 중요한 비즈니스 가치를 지님
  • 가장 중요한 것은 일관성 유지
  • 새로운 기능 구현 전에 기존 코드를 조사하고 패턴을 따를 것
  • 기존 패턴을 따르지 않는 경우, 매우 좋은 이유가 있어야 함
  • 프로덕션 환경에서 코드가 어떻게 사용되는지 이해할 것
  • 모든 경우를 테스트할 수 없으므로 테스트에 과도하게 의존하지 말고 모니터링 및 점진적 배포에 의존
  • 코드 제거 기회를 적극 활용하되 신중히 처리
  • 도메인 전문가가 검토할 수 있도록 작은 PR 단위로 작업

일관성이 중요하긴 한데, 그렇다고 코드 개선을 미루거나 기존의 잘못된 패턴을 반복하는 것도 좋은 방식은 아니라..어려운 문제죠. 일관성을 지키느라 동일한 기술부채를 쌓아나가는 모양이 될 수도 있으니까요.

다른 무엇보다도 코딩 규칙은 지켜야죠.
특히 들여쓰기 규칙...

자동으로 잡아주는 툴링을 적용할 수 없는 도메인에 계신가요..?ㅠㅠ

울어드릴게요.. ㅠㅠㅠㅠㅠㅠㅠㅠ

Hacker News 의견
  • 기존 코드베이스가 일관성이 없을 때, 새로운 방식을 도입하고 문서화하며 피드백을 받는 것이 중요함. 기존 코드와의 일관성을 유지하려고 노력해야 함.

    • 기존 코드가 나쁘더라도 주변 코드와의 일관성을 유지하며 작업하는 것이 중요함.
    • 팀원들이 비협조적일 경우, 기존 코드의 문제점을 강조하고 새로운 접근이 실험적임을 설명하는 것이 도움이 됨.
  • 기존 코드베이스의 도구를 사용해야 하지만, 새로운 코드베이스를 구축하는 것이 더 즐거울 수 있음.

    • 코드베이스의 결합도가 높을수록 변경이 어려워질 수 있으며, 테스트 커버리지가 부족하면 문제가 발생할 수 있음.
  • 큰 코드베이스를 분할하기 위해서는 먼저 이해가 필요하며, 경험이 없는 팀이 이를 시도하면 실패할 가능성이 큼.

    • 새로운 팀이 기존 시스템을 이해하지 못하면 프로젝트가 실패할 수 있음.
  • 큰 코드베이스에서 무작위로 개선하려는 시도가 많음.

    • 개선할 부분을 찾고, 실제로 긍정적인 영향을 미칠 부분을 판단하는 것이 중요함.
    • 개선할 부분을 알고 언제 멈출지를 아는 것이 중요함.
  • 코드베이스의 진화를 유지하는 것은 어려움.

    • 절대적인 일관성은 실험을 허용하지 않으며, 실험이 없으면 성공도 없음.
  • 코드베이스가 크고 인력이 부족하면, 새로운 사람이 생산적이 되기까지 시간이 오래 걸림.

    • 이런 환경에서 일하는 것은 경력에 좋지 않을 수 있음.
  • 코드베이스를 깔끔하게 유지하는 것은 기능을 출시하기 위한 최소한의 작업만 해야 함.

    • 이는 정치적으로 영리한 엔지니어들이 기능 출시를 목표로 한 전술적 선택일 수 있음.
  • 일관성이 가장 중요하지 않으며, 코드베이스의 일부를 개선하는 것이 좋음.

    • "용암층 반패턴"은 일관성을 유지하려는 시도보다 더 나은 시스템을 만들 수 있음.
  • "일관성의 결여는 치명적인 실수"라는 말은 100% 맞음.

    • "로마에 가면 로마법을 따르라"는 철학을 따름.
  • 엔지니어로서의 세 가지 격언:

    • 명확성, 일관성, 간결성
    • 고통을 올바른 곳에 두기
    • 엔트로피와 싸우기

프로젝트의 규모 != 성숙도
일관성이 매우 중요한 것임에 동의하지만, 이것을 구실로 코드베이스 개선의 우선순위를 낮게 가져가는 것은 지양해야할 부분이라 생각해요.
프로젝트는 항상 살아숨쉬고 성장해나가기 때문에 적당한 때에 개선을 해내지 못하면 그것을 돌이키는데에는 더 많은 시간과 노력이 필요해질테니까요.

저도 동의합니다. 20년 이상된 프로젝트를 다루고 있지만, 현재에 비해 정말 미숙한 부분이 많습니다.
일관성이 코드에 대한 이해력을 높일 수 있다는 장점이 있지만, 구조의 한계는 기능의 한계를 유발해 서비스 발전의 발목을 잡기때문에, 때로는 과감한 개편도 필요하다고 생각합니다.