# 닌자(2020)의 성공과 실패

> Clean Markdown view of GeekNews topic #18025. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=18025](https://news.hada.io/topic?id=18025)
- GeekNews Markdown: [https://news.hada.io/topic/18025.md](https://news.hada.io/topic/18025.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-11-30T09:47:57+09:00
- Updated: 2024-11-30T09:47:57+09:00
- Original source: [neugierig.org](https://neugierig.org/software/blog/2020/05/ninja.html)
- Points: 2
- Comments: 1

## Topic Body

- # Ninja의 성공과 실패

  - 약 9년 전, 필자는 Make와 유사한 빌드 시스템인 Ninja를 발표했음. 초기에는 부끄러웠지만, 현재는 널리 사용되고 있음.
  - Ninja를 사용하는 주요 프로젝트로는 Chrome, Android, Meson 프로젝트 등이 있음.
  - Ninja는 필자의 가장 성공적인 오픈 소스 프로젝트로, 2011년에 발표하고 2014년에 소유권을 넘겼으며, 현재는 세 번째 유지보수자에게 전달되었음.
  - 프로그래밍은 코드 작성보다 아키텍처가 중요하며, 아키텍처보다 사회적 문제가 더 중요하다는 것을 배웠음.

- # 기술적 세부사항

  - Ninja는 주어진 요구사항에 따라 명령을 실행하는 간단한 시스템임.
  - Ninja는 `ninja.build` 파일을 받아 파일의 수정 시간을 확인하고 필요한 명령을 병렬로 실행함.
  - Make와 비교했을 때, Ninja는 입력 빌드 언어의 기능이 적고, 빠른 실행에 중점을 둠.
  - Ninja는 입력 파일 경로를 메모리 객체로 매핑하여 경로 비교를 최적화함.

- # 아키텍처 노트

  - Ninja의 그래프 표현은 파일과 명령 사이의 이분 그래프를 사용하여 빌드 구조를 더 잘 캡처함.
  - C 헤더 종속성을 처리하기 위해 추가적인 종속성 데이터를 사용함.
  - Ninja는 비영구적인 데몬 프로세스가 아니며, 각 실행 시 처음부터 작업을 수행함.
  - 파일 상태는 커널이 이미 캐시하고 있어 사용자 영역에서 다시 캐시할 필요가 거의 없음.
  - Ninja는 Chrome의 빌드를 기반으로 설계되었으며, 대규모 프로젝트에서 확장성 문제를 겪고 있음.

- # '어셈블러' 은유

  - Ninja는 다양한 빌드 시스템의 기능을 구현하지 않고, 액션 그래프만 구현하여 사용자가 다른 생성기 프로그램을 선택하도록 함.
  - 이 설계는 Ninja를 빠르고 유연하게 만듦.

- # 기본값의 중요성

  - Ninja는 기본적으로 명령을 병렬로 실행하여, Make보다 더 안전하게 병렬 빌드를 수행함.

- # 속도

  - Ninja는 대규모 코드베이스의 증분 빌드 성능에 중점을 두었으며, 사용자 만족도에 큰 영향을 미침.
  - Ninja는 CPU를 적게 사용하여 전체 빌드 성능도 개선됨.

- # CMake

  - Ninja는 CMake와 잘 통합되었으며, 이 통합을 통해 LLVM 작업에 사용됨.

- # Windows 지원

  - Ninja는 Windows에서도 작동하며, 많은 초기 사용자가 Windows 사용자였음.

- # 관련 작업

  - Ninja의 설계는 Google의 빌드 시스템인 blaze/bazel에서 영감을 받았음.

- # 오픈 소스 유지보수

  - 오픈 소스 유지보수는 즐겁지 않으며, 사용자로부터의 요구와 비판이 많았음.
  - 필자는 소프트웨어를 통해 동료 해커들에게 인상을 주고자 함.

- # 최종 감사

  - Ninja의 유지보수자들과 기여자들에게 감사의 말을 전함.

## Comments



### Comment 31861

- Author: neo
- Created: 2024-11-30T09:47:57+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=42268310) 
- 프로그래밍은 코드 작성보다 아키텍처가 중요하고, 아키텍처보다 사회적 이슈가 더 중요하다는 의견이 있음
  - 이는 오랫동안 마음속에 있던 생각을 잘 표현한 것이라고 함

- Android의 빌드 시스템에서 Ninja의 역할이 큼
  - 초기에는 makefiles를 사용했으나, soong이라는 커스텀 선언적 빌드 시스템으로 복잡해졌음
  - Google은 Makefiles를 Ninja 빌드 파일로 변환하는 kati를 개발했음
  - Ninja로의 전환은 시간이 걸리지만, 전환 후에는 빠르게 작동함

- Google이 지연(latency)에 대한 연구를 진행했으며, 이 연구가 공개되기를 바라는 의견이 있음

- CMake를 사용할 때 C++20 모듈에 Ninja가 필요하기 때문에 당분간 사용될 것이라는 의견이 있음

- Ninja 대신 Samurai로 전환했으며, 모든 면에서 개선되었다고 함
  - 빌드 시스템은 모든 입력의 해시를 계산하고 레지스트리에 존재 여부를 확인하는 것이 필요하다고 생각함

- 정확성과 편리성, 성능 사이에서 타협이 필요하며, 의도적으로 선택해야 한다는 의견이 있음
  - 편리성을 위해 정확성을 포기하는 도구가 더 정확한 생태계를 만들 수 있다고 함

- 빌드 시스템에 대한 경험이 있으며, Ninja는 좋아하는 프로그래밍 언어로 구현할 수 있을 만큼 작다고 함
  - 자신의 빌드 시스템을 만드는 단계별 튜토리얼이 있는지 궁금하다고 함

- Ninja의 이름이 좋다고 생각하며, 더 빠르게 만들 수 있는 방법이 있다고 함
  - 도구가 이전 실행의 상태를 의도적으로 유지하지 않는다고 설명함
