소개: Figma to React | 피 (새 탭에서 열림)
Figma는 비대해진 C++ 코드베이스로 인한 긴 빌드 시간을 단축하여 개발자의 피드백 루프를 개선하고 생산성을 극대화하는 성과를 거두었습니다. 단순히 고사양 하드웨어를 도입하는 것에 그치지 않고, 빌드 과정의 병목을 정밀하게 측정하고 헤더 구조 최적화 및 분산 빌드 시스템을 도입하여 빌드 속도를 획기적으로 개선했습니다. 이러한 노력은 결과적으로 대규모 코드 수정 시에도 개발자가 신속하게 결과를 확인할 수 있는 쾌적한 엔지니어링 환경을 구축하는 결론으로 이어졌습니다.
빌드 데이터 시각화와 병목 지점 파악
- Clang의
-ftime-trace플래그를 활용하여 각 소스 파일의 컴파일 과정과 템플릿 인스턴스화에 소요되는 시간을 상세하게 데이터화했습니다. - 수집된 JSON 데이터를 Chrome 브라우저의
about:tracing도구로 시각화하여, 어떤 헤더 파일이 반복적으로 파싱되고 있는지 또는 특정 템플릿이 얼마나 많은 시간을 잡아먹는지 직관적으로 분석했습니다. - 이를 통해 막연한 추측이 아닌, 실제 수치에 기반하여 최적화 우선순위를 결정할 수 있는 기틀을 마련했습니다.
헤더 의존성 관리 및 전방 선언 활용
- 헤더 파일 내에 불필요하게 포함된 다른 헤더들을 제거하고, 실제 구현 파일(.cpp)에서만 포함하도록 구조를 변경했습니다.
- '전방 선언(Forward Declaration)'을 적극적으로 사용하여 헤더 간의 복잡한 의존성 연결 고리를 끊어냄으로써, 특정 헤더 변경 시 재컴파일되는 파일의 숫자를 최소화했습니다.
- 'Include What You Use(IWYU)' 원칙을 적용하여 각 파일이 컴파일에 꼭 필요한 최소한의 심볼만 참조하도록 정돈했습니다.
Unity Build와 Precompiled Headers (PCH)
- 여러 개의 소스 파일을 하나의 큰 컴파일 단위로 묶는 'Unity Build' 기법을 도입하여, 동일한 헤더가 수천 번 반복해서 파싱되는 오버헤드를 줄였습니다.
- 표준 라이브러리(STL)나 외부 라이브러리처럼 변경이 거의 없는 무거운 헤더들을 'Precompiled Headers(PCH)'로 구성하여 빌드 초기 단계에서 한 번만 처리되도록 최적화했습니다.
분산 빌드 인프라 및 캐싱 적용
- 로컬 머신의 CPU 코어 수 한계를 극복하기 위해 Google의
Goma나Remote Build Execution(RBE)와 같은 분산 컴파일 시스템을 구축했습니다. - 수백 대의 원격 서버 노드에 컴파일 작업을 분산시켜 수천 개의 파일을 동시에 처리함으로써 전체 빌드 시간을 물리적으로 단축했습니다.
ccache와 같은 컴파일러 캐시 도구를 병행 사용하여, 코드가 변하지 않은 부분에 대해서는 이전 빌드 결과를 재사용함으로써 불필요한 연산을 제거했습니다.
지속적인 빌드 성능 모니터링
- 빌드 시간 최적화는 일회성 작업으로 끝나지 않도록, CI(지속적 통합) 단계에서 빌드 시간을 모니터링하고 성능 저하가 발생할 경우 이를 추적하는 체계를 구축했습니다.
- 템플릿 메타프로그래밍의 과도한 사용을 경계하고, 복잡한 템플릿 구조가 빌드 성능에 미치는 영향을 코드 리뷰 과정에서 검토하는 문화를 형성했습니다.
C++ 프로젝트의 규모가 커질수록 빌드 시간은 기하급수적으로 늘어날 수 있으므로, 초기부터 -ftime-trace를 통한 시각화 습관을 들이는 것이 중요합니다. 특히 헤더 의존성을 느슨하게 유지하고 분산 빌드 환경을 구축하는 것은 대규모 팀의 개발 속도를 유지하기 위한 필수적인 투자입니다.