안녕하세요? 모바일 개발팀입니다

쏘카 앱을 개발하는 모바일 개발자 아릉입니다. 쏘카는 2019년경 앱의 모든 코드를 새로 만드는 개편을 했습니다. 그때 이후로 지금까지 이어온 개발 철학과 그 실행에 대해서 소개하고, 또 이후 여러 글을 통해 그 과정에서 배우게 된 것들에 관해서도 이야기하려고 합니다.

생산성

모든 사람이 자유롭고 행복하게 이동하는 세상을 만듭니다.

이것은 쏘카를 표현하는 문구입니다. 우리 팀은 이 비전을 실현하는 과정에서 개발팀의 행복과 성장에도 큰 가치를 두고 있습니다. 쏘카 앱 개편 당시, 더 나은 시스템을 구축하면서 동시에 개발자도 행복하게 코딩할 수 있는 환경을 조성하고자 했습니다. 회사와 구성원의 win-win을 추구해야 지속 가능하고 안정적인 미래가 열린다고 보았기 때문입니다. 그렇기 때문에 이 추구는 단순하게 기분이 좋거나, 여유로운 일정에 대한 것만은 아니었습니다.

잉여 곡물의 증가에 따라 문명이 발전할 수 있었듯이, 이러한 조직이 질적으로 개선되기 위해서는 잉여 시간을 확보하는 것이 필수적이라고 판단했습니다. 잉여 시간은 인프라 개선, 라이브러리 도입, 새로운 기술 학습 등 생산성 향상을 위한 재투자로 이어지고, 이는 다시 잉여 시간이 증가하는 선순환을 창출합니다. 그런데 대개 시장은 경쟁적이기 때문에, 시간 자원의 외연이 확장되기를 기다리고 있을 수는 없습니다. 따라서 조직 내부에서 잉여 시간을 얻기 위해서는 생산성을 향상하는 데에 집중해야 합니다.

개발자 경험 Developer Experience

쏘카프레임 앱 프레임워크는 Android, iOS 네이티브 개발시 동일한 추상화 위에서 앱을 개발하기 위한 개발 프레임워크입니다. 개발자의 사고방식을 가이드하고, 논리를 규격화하는 것을 추구하고 있습니다. 플랫폼과 다양한 라이브러리를 동일한 기조로 래핑하여 사용성을 통일하고, 예외 처리를 위한 정규화된 방법을 제공합니다. 또한, 엄격한 코딩 컨벤션과 제식화된 기반을 통해 코드의 정합성을 높이고, 마치 한 사람이 작성한 듯이 코드의 일관성을 유지합니다. 이는 인지적 축약을 유도하여 생각을 할 때 헤매지 않게 하고, 사람의 버릇을 형성해서 실수를 없애고자 하는 의도가 반영되어 있습니다.

이를 통해 개발 과정에서 발생할 수 있는 불확실성을 최소화하고, 선택의 문제를 매번 새롭게 고민하지 않게 하며, 개발자가 콘텐츠를 조달하는 데 집중할 수 있도록 지원합니다. 모든 구현 철학과 택틱이 섬세하게 정립한 결과, 단순히 개발자의 가독성을 확보하는 것을 넘어, 서비스의 조달 시간을 단축하고 전형적 문제가 발생할 가능성을 차단합니다. 또 모든 팀원이 모든 부분을 동일한 사고 방식으로 수정할 수 있기 때문에 서로의 실수를 바로잡기에도 유리해지며, 위임이 편하기 때문에 일손 운용에도 유리합니다.

플랫폼의 경계를 극복하기

쏘카프레임 앱 프레임워크는 Android와 iOS 양 플랫폼이 공유할 수 있는 추상화의 경계를 드러내도록 만들어졌습니다. 그래서 한 쪽의 개발 경험만을 가진 사람이 다른 쪽의 코드를 봤을 때, 플랫폼 환경의 올바른 모듈적 구성을 이해하기 쉽고, 좀 더 빠르게 상대측의 코드를 이해할 수 있습니다. 현실적으로는, 서로 다른 프로젝트를 먼저 시작하고 나중에 교차 개발을 하는 방식을 통해 거시적 로드맵의 시간을 단축할 수 있기를 기대하고 있습니다. 이는 당연히, 크로스플랫폼 개발 환경을 사용하는 것에 비해서는 빠르지 않습니다. 대신, 기존에 네이티브 개발로 시작한 서비스에서 쉽게 채택할 수 있는 방법이고, 플랫폼 통합적 퀄리티와 장기적 안정성을 잃지 않는 장점이 있습니다.

높은 수준의 추상화 레이어를 쌓았으며, 넓은 커버리지를 제공하려 합니다. 필요할 법한 대부분의 요소에 대해 라이브러리나 택틱이 만들어져 있기 때문에, 뭐가 되고 뭐가 안 되는지 매번 새롭게 조사할 필요가 없습니다. 없는 건 할 법하지 않으니까 없는 것이고, 되는 건 매뉴얼에 있습니다.

또 쏘카프레임을 구성하면서 신경을 쓴 부분 중 하나가, 화면만 웹으로 갈아끼운 것처럼 만들 수 있고, 또 필요에 따라 어느 웹 화면을 다시 네이티브로 구현해도 문제가 없도록 하는 것이었습니다. 이것은 앱 개발자만이 아니라, 웹 개발자까지 포함해서 일손을 효율적으로 활용하는 데에 도움이 될 것입니다. 동시에 서비스 유동성과 UI 완성도 간에 선택 가능성을 넓히기 위한 것이기도 합니다.

개인차와 성장

앱 개발은 백엔드 개발에 비해 플랫폼에 대한 지식과 맥락적 이해가 중요한 역할을 합니다. 그런데 어느 플랫폼이든 유저에게 닿고자 하는 동일한 이상을 위하여 스택을 쌓아 올리는 것이고, 또 한 시대의 기술적 방향성도 완전히 다를 수는 없습니다. 그렇기 때문에 구체적 플랫폼이 달라도 모바일 OS라는 정체성을 가진 한 큰 맥락은 같을 수밖에 없습니다. 그렇지만 누구나 그런 공통점을 잘 발견하고 추상화할 수 있는 능력을 갖추고 있는 상태는 아닙니다. 주니어 개발자에게 단기간에 플랫폼 지식을 주입하여 성장을 기대하는 것은 불확실하고 비효율적이며, 제품 안정성에도 부정적인 영향을 미칠 수 있습니다. 따라서 우리의 프레임워크를 만들 때, 콘텐츠를 구현하는 사람에게는 플랫폼 지식의 영향을 최소화하고, 라이브러리를 개발하는 사람은 기존에 만들어진 주변 라이브러리의 설계와 철학으로부터 도움을 받을 수 있도록 했습니다.

이런 환경 속에서 주니어의 경우 초기 진입 장벽이 높아지지만, 난이도가 올라가는 게 아니라 배울 양이 많아지는 것입니다. 쏘카프레임 영역의 코드는, 플랫폼에 대한 아주 정확한 설명서이기도 합니다. 주니어는 비즈니스 기능을 개발하면서 이 설명서를 계속 접하게 되고, 그러면서 점점 플랫폼이나 환경의 진실한 모습을 이해해갑니다. 시니어는 플랫폼이나 환경의 변화를 미리 쏘카프레임에 반영해두고, 또 앞으로 필요할 것으로 여겨지는 기반 기능을 개발합니다. 대체로 할 것, 배울 것, 미리 해둘 것이 항상 존재합니다. 이것들을 명확하게 나눠 진행할 수 있다는 점이, 일손을 효율적으로 운용하는 데에 도움이 됩니다.

앱 프레임워크가 가져오는 효과

쏘카프레임 앱 프레임워크가 가져오는 효과들을 나열하면 다음과 같습니다.

  • 제품 안정성 향상: 정형화된 코드는 자잘한 실수를 예방하고 제품 안정성을 향상합니다.

  • 개발 속도 향상: 불필요한 고민을 줄이고 콘텐츠 구현에 집중하여 개발 속도를 높였습니다.

  • 스트레스 감소: 예측할 수 있는 개발 환경은 스트레스를 줄이고, 개발자가 업무에 몰입할 수 있도록 지원합니다.

  • 기획 피드백 속도: 넓은 커버리지를 제공하기 때문에 대부분의 구현안을 세부 사항까지 빠르게 검토할 수 있습니다.

  • 인적 구성에 유리함: 주니어가 빠르게 배우고 콘텐츠 개발에 기여할 수 있게 합니다. 소수의 시니어가 큰 영향력을 행사할 수 있습니다.

  • 개발자 성장 촉진: 프레임워크를 이해하고 기여하며 플랫폼에 대한 이해와 개인의 설계 능력을 향상합니다. 누적된 논리 기반 위에서 사고의 품질을 높일 수 있습니다.

  • 효율적인 시간 활용: 콘텐츠 개발 일정에 여유가 있을 때는 프레임워크를 개선하여 끊임없는 발전을 도모합니다.

  • AI 코드 완성의 정확성: 인간이 배우기 좋은 코드 택틱은 AI 입장에서도 배우기 좋습니다. 일관된 기존 코드는 훌륭한 트레이닝 셋이 됩니다.

실제로 행동하기

가장 큰 어려움은, 이런 의도에 걸맞게 실제로 행동하는 것입니다. 특정 아키텍처를 사용한다고 말하는 팀들도 앱 내의 모든 코드가 단일 규격을 따르는 경우는 드뭅니다. 예외 없이 모든 코드가 지침을 따르기 위해서는 사람들에게 정규화된 코딩의 이점을 이해시킬 필요가 있습니다.

또, 실제로는 한 벌의 프레임워크 세트를 만들어 뒀다고 해서 그것을 영구히 사용할 수는 없습니다. 모바일 그룹은 현재 프레임워크의 효율성에 안주하지 않고, 미래를 위한 준비에도 힘쓰고 있습니다. 구성원들의 아키텍처 이해도를 높이고, 변화하는 기술 트렌드에 대응하여 다음 세대의 프레임워크를 구축하는 것도 준비하고 있습니다.