원제 : Bazelを利用したMicro Modular Architecture
발표자료
https://speakerdeck.com/ra1028/micro-modular-architecture-with-bazel
// 원문
十分に発達した組織による開発では、本質的な機能間の疎結合化や逆コンウェイ戦略に則った組織構成への適応など、より高度な課題が様々出てきます。もちろんビルド・テスト時間の最適化といった個々の開発者の直接的な課題もその一つです。
どれだけアプリケーションアーキテクチャを洗練させ理解を進めても、これらの課題の解決は難しいでしょう。
そこでリードアーキテクトは、よりソフトウェア的なアーキテクチャを発展、また将来漸進的に進化できるように構成する必要があります。そのためには、構成要素を複数のモジュールに細分化し、組み換え容易にすることが重要です。
最近ではAndroidアプリ開発の流れか、2〜20ほどのモジュールからアプリを構築している所謂マルチモジュール化に挑戦しているチームも多くなりました。
これを更に発展させ、数百のモジュールからアプリを構築するためには通常の開発手法では無理が出てくるため、現担当プロジェクトではビルドツールにBazelを採用しています。
BazelはGoogleが開発し、iOSアプリ開発ではUberやLyft、Pinterestといったモバイルアプリに力を入れているテックカンパニーでも採用されている多言語向けのビルドツールです。
もちろんiOSアプリ開発への導入ハードルはかなり高いですが、効率的なモジュール定義や、CIマシンを含め開発者全員が同じキャッシュを共有するRemote Cacheなどの強力な機能も持っています。
このトークでは、モジュールを数百に細分化することでどのような利点があるのか、Bazelを採用することで何が可能になりどのような相乗作用があるのかをお話します。
Drawbacks of Monolith
Monolithic Application : 모든 기능이 연결되어 있는 카오스의 앱 …
Monolithic Application 문제
– Build time이 product의 복잡도와 함께 증가된다
– 잠재적으로 문제가 발생할 문제가 증가한다
Micro Modular Architecture

- 100개 이상의 작은 Module로 구성된 App
- Feature을 기능으로 Module을 분리
- 1가지 기능에서 필요한 복수의 화면도 1화면 1Module로 전부 분리시켜버린다.
- 각각의 Feature가 완전히 분리된 상태
- 상대적으로 큰 Feature를 개발할 때에는 작은 Module 몇 개를 모아서 개발한다
Q. 작은 모듈들이 너무 많아서 오히려 복잡해지는 문제가 발생하지 않는가 ?

- Group을 만들어서 구분한다.
- Applications Group

2. Features Group

- 의존도를 최대한 낮추는 Group
3. Domain Group

4. Libraries Group

4개의 Group의 의존성을 나타낸 그룹

- 의존성을 명확하게 나눠서 순환 의존을 없앤다.
What is Bazel?

Bazel의 장점
– 빌드시간이 빠르다 !!!!!!!!!!!!!!!!
Bazel의 단점
– 도입하는데 cost가 크다
– learning cost가 크다
– Xcode의 기능을 100% 사용하지 못한다
– Build option 설정에 실패하면 Xcode에서 일반적으로 빌드하는 시간보다 오히려 빌드시간이 늘어난다 !
사용

- WORKSPACE : dependency 를 정의
- Build : 모듈을 세분화시킬 때 편리편리
- xx.bzl : 빌드 세팅을 공통화 시킬 때 함수로 정의하는 것이 가능하다
- .bazelrc : Bazel의 빌드 옵션






Bazel + Xcode


Bazel와 비슷한 것들
- Gradle (안드로이드의 그것)
- Buck by Facebook
Bazel와 Micro modular architecture의 시너지

- Aggressive caching
- Test Results Caching : `bazel test//… –nocache_test_results`로 옵션 설정도 가능하당
- Remote Caching : 다른 개발자가 Build 하면 캐싱되어 또 다른 개발자가 새로 빌드하지 않아도 된다 !
결과적으로 테스트도, 프로젝트도 Caching이 가능하므로
개발중에 빌드할 필요가 있는 코드는 내가 수정하거나 새로 작성한 코드뿐.
Static Linking
- dynamic framework 는 빌드 때, 자동으로 link되기 때문에 build 시간에 영향이 크다.

- Bazel을 이용할 때에는 static library로 생성하는게 좋다.
Vezel 안에서의 모듈 의존 그래프


