brunch

You can make anything
by writing

C.S.Lewis

by 갬성개발자 Oct 28. 2021

Large Scale 앱을 생산성 높게 개발한다고요?

2021년 10월, iOS 개발자들의 이야기 feat. jinny

안녕하세요 iOS 앱 개발하는 지니입니다.

10월 초, 에어비엔비 팀이 Large-Scale iOS 앱을 개발하며 겪은 어려움과 세가지 솔루션을 도입하여 생산성을 높인 이야기를 공유해주셨습니다.


https://medium.com/airbnb-engineering/designing-for-productivity-in-a-large-scale-ios-application-9376a430a0bf


너무 좋은 내용이라 간단 요약합니다. (Buck 공부해봐야겠어요!)




[1] 에어비엔비 앱 규모


- 75명의 iOS 엔지니어가 함께 일하고 있음

- 62개 언어로 앱을 제공




[2] 문제


# 1.

- lib/ 라고 불리는 flat directory 안에 대부분의 코드가 있었음 (hierarchy 또는 categorization 없이)

- 그래서 엔지니어가 범용 기능의 기존 구현을 찾기가 어려웠음

- 그로인해 중복 구현을 해서 같은 task를 구현하는 여러 코드가 많이 생기고 사용자에게 제공한 바이너리가 부풀려졌음.


# 2.

Xcode는 iOS 엔지니어가 가장 편안하게 작업할 수 있는 도구이지만

Xcode는 우리 코드베이스의 사이즈와 복잡성에 맞게 확장되지 않았음.


Xcode project files은 PR에서 리뷰하기 어려웠고

팀이 커지면서 프로젝트 파일에서 충돌도 많이 발생했음.


large codebase로 인해 Xcode를 여는 것 조차 귀찮아졌음.

1년전, 모든 소스코드가 있는 workspace를 로드할 때 1-2분 정도가 걸린다고 측정했음


대부분의 iOS 엔지니어는 긴 빌드 시간과 느린 반복 루프에 좌절.

(어느 창의적인 엔지니어는 외부 모니터의 플러그를 뽑으면 랩톱이 코드를 더 빠르게 컴파일한다는 것을 발견...ㅎㅎ 많은 엔지니어들이 열 조절로 인한 생산성 손실을 방지하기 위해 USB-C 충전 케이블을 MacBook Pro의 오른쪽 에 연결하는 방법을 스스로 훈련...ㅎㅎ)


Airbnb의 코드베이스가 500,000줄 미만의 코드일 때 이러한 문제는 더 강력한 하드웨어로 해결할 수 있었지만 실질적인 한계가 존재했음.

빌드가 완료되기를 기다리는 데 많은 시간을 할애할 때 최선을 다하고 있다는 느낌이 들기 어려웠고

소규모 프로젝트를 수행하는 회사에서 온 iOS 엔지니어가 너무 큰 코드베이스의 느린 속도에 익숙해지기도

어려웠음.



==> Airbnb가 계속해서 세계적 수준의 iOS 애플리케이션을 제공하기 위해서는 무언가가 바뀌어야 한다는 것을 알고 있었다!!!




[3] 세가지 솔루션


위에서 언급한 문제를 해결하기 위해 수년 동안 많은 솔루션을 조사하고 구현함.

우리 규모에 맞게 효율적으로 운영할 수 있었던 세 가지 가장 큰 수단에 대해 설명할 것!

이는 빠르게 성장하고 있는 다른 중소 규모의 iOS 팀에도 적용될 수 있을 것으로 기대됨.



3.1 최신 빌드 시스템 채택 (Adopting a modern build system)


Facebook의 Buck 빌드 시스템 을 채택함 (2019년에는 Buck의 선언적 빌드 시스템으로 완전히 전환함)

아래 github 레포에 Buck 설정을 공유!!


https://github.com/airbnb/BuckSample


Buck-based Xcode workspace는 빌드속도를 향상시켰음.

또한 Xcode launch time을 개선하기 위해 전체 코드베이스의 일부만 사용하여 Xcode workspace를 생성하기도 했음.



3.2 모듈 유형 설계 (Designing module types)


코드에 계층 구조가 없어 검색하기 어려운 문제를 해결하기 위해, organizational structure를 디자인함.

모듈은 모듈 유형(module types) 이라고 하는 의미상 의미 있는 그룹 (semantically meaningful groups) 으로 구성됨.


그리고 모듈 유형에 대한 정확한 문서를 작성함.

모듈 유형의 개념은 iOS 개발자가 Airbnb에서 일하는 데에 있어서 기본적으로 알아야하므로

이 문서는 내부 개발자 포털에서 호스팅됨.


각 모듈 유형에는 엄격한  visibility rules 가 있음.

이러한 가시성 규칙은 해당 유형의 모듈 간에 허용되는 종속성 (dependencies) 을 정의.

개별 모듈은 해당 모듈 유형에 의해 부과된 제한 이상으로 가시성을 확장할 수 없음.


개별 모듈은 모듈화의 이점을 누리고 모듈에 대한 예기치 않은 인바운드 종속성 (inbound dependencies) 을 피하려는 일부 대규모 팀에서 사용하는 기술인 가시성을 강화할 수 있었음.


코드의 90%가 lib/ 에서 모듈 유형 으로 마이그레이션 되었음.

의미적으로 의미 있는 모듈 유형 (semantically meaningful module type) 은 매우 큰 코드베이스의 목차 역할을 하게 되었음. 엔지니어는 그것을 보고 합리적으로 정확한 멘탈 모델 (reasonably accurate mental model) 을 즉시 가질 수 있게 되었음.


아래 영상에서 동료 Francisco는 코드 구성 전략이 폴더에서 모듈 유형으로 어떻게 발전했는지 자세히 설명하고 이 대규모 마이그레이션을 운영하는 방법에 대해 설명함.


https://www.youtube.com/watch?v=KhZcSRXJHFs&t=190s



3.3 Dev Apps 만들기 (Creating Dev Apps)


build systems과 iOS application architecture에 대한 에어비엔비의 투자는

세번째 혁신인 Dev Apps를 가능하게 했음.


Dev App은 하나의 모듈과 그 모듈의 dependencies에 대한 임시 Xcode workspace 임.

Xcode workspace에 코드가 적으니까 더 빨리 컴파일 할 수 있음.


Airbnb 모듈용 Dev 앱


여러 상황에서 전체 Airbnb 애플리케이션을 빌드해보는 것은 여전히 중요함!

(특히 기능이 서로 상호 작용하는 방식을 테스트하려면 더더욱)


그러나 충분히 격리되고 잘 테스트된 코드로 작업할 때 Dev App만으로도 자신 있게 변경 사항을 제공할 수 있음.


우리의 노력은 팀이 독립적으로 운영할 수 있는 생태계를 만들었고

Dev App에서의 코딩은 simpler, smaller project에서 코딩하는 즐거움을 줌.


Dev App은 빌드에 필요한 코드를 줄이기 위해 mocked dependencies 를 사용하도록 권장됨



+

마지막으로 위의 변화들로 모듈 종속성을 추가 및 제거하는 것이 간단해지고 컨플릭트를 쉽게 해결할 수 있게됨.


feature module에 종속성을 추가하는 최근 PR의 일부




[4] 더 나아가


# 1.

에어비엔비는 업계 전반에 걸쳐 iOS 개발을 발전시키는 데 열정적임

large-scale mobile application을 개선하는 커뮤니티에 참여함


https://mobilenativefoundation.org/


# 2.

생산성 향상을 위한 여정은 아직 끝나지 않았음.

Swift static analysis 를 사용하여 boilerplate code를 만들고 코드 이식성 (code portability)를 높일 기회를 탐색하고 있음


https://github.com/apple/swift-syntax



==> 앞으로도 iOS 개발의 build/test/run iteration loop (빌드/테스트/실행 반복 루프) 를 계속 강화할 것!! 애플의 축복받은 modern build system도 갈망하고 있음!!





[ 우리는 채용 중 ]

https://careers.kakao.com/m/jobs/P-12253


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari