【Team & Project】LINEアプリのiOSクライアント開発をしているチームを紹介します

LINEの開発組織のそれぞれの部門やプロジェクトについて、その役割や体制、技術スタック、今後の課題やロードマップなどを具体的に紹介していく「Team & Project」シリーズ。今回は、LINEアプリのiOSクライアント開発チームを紹介します。マネージャーの富家将己と朴盛民に話を聞きました。

LINEアプリのiOSクライアント開発チームのzoom会議の様子

―― まず、自己紹介をお願いします。

富家:LINEのiOS版のエンジニアマネージャーをやっている富家です。仕事では、チームメンバーのマネジメントをしながら、技術検証など開発に関わるタスクも行っています。

:LINEアプリのiOS版のエンジニアマネージャーをやっている朴です。仕事ではLINT ProjectのメンバーとしてiOS側の作業をやっています。チームメンバーのマネジメントや他のチームのサポートも行っています。

―― お二人がLINEに入った理由、働くやりがいなどを教えてください。

富家:私は、前職の同僚の紹介で約5年前に入社したのですが、当時はすでに日本で最大のコミュニケーションサービスでした。しかし私はNAVERの時代から作られていたアプリの開発にこだわりを感じていて、どのようにアプリを作っていたかとても興味がありました。当初はファミリーアプリ開発を希望する形で応募したので、まさかLINEのMessagingサービスを開発することになるとは思いもしませんでした。ですが、今の開発メンバーの何人かと入社前から知り合いだったので、働きやすそうだなと思い入社を決めました。

:私の場合は、大学卒業後、新卒で韓国にあるLINE Plusと言うLINE株式会社の子会社に入社しました。そして韓国で1年間LINEのクライアントチームに入り、色々な開発スキルや協業技術を学びました。開発をしていると、LINEのアプリケーションを使うユーザーに興味が湧き、LINE株式会社への転職を決めました。転職と言っても仕事の内容はほぼ変わらずLINEクライアントチームに所属しています。

富家:LINEのサービスは、日本のみならず、台湾・タイ・インドネシアなど東アジア地域を中心に海外でも非常に多くの人が利用しています。そのような利用者が多い大規模なアプリ開発に携われること、そして、多くの人たちの生活に密着したサービスを改善することで、ユーザーの生活をアップデートできることにやりがいを感じています。自分が開発した機能について様々なフィードバックをいただくのですが、その中でも「とても便利になりました!」とポジティブな意見をもらえると本当に嬉しいです。海外の情報をいち早くキャッチアップできる、英語で仕事をするチャレンジもできる、そんな多国籍なチームでの開発はとても面白いですね。

:そうですね。常に色々な新技術や工夫を加えていくことでもっと安定的で効率的にユーザに必要な情報を伝えることはとても面白いです。そして色々な技術を持っている人と一緒に働くことで多様なスキルや観点からLINEを分析し、改善していくことは大きなやりがいに繋がっていると思います。

左からLINEアプリのiOSクライアント開発チームのマネージャーの富家と、開発担当の朴

―― チームの構成・役割などについて教えてください。

富家:LINEのMessagingサービスのiOSの開発は、アジアを中心に東京・福岡・韓国・台湾のエンジニアが協業して開発しています。東京では現在4チームに分かれて、それぞれのタスクを行なっており、新規機能開発からサーバとのコミュニケーションやストレージ管理などの基盤機能など広範囲な開発を分担して行なっています。組織としては、LINE開発2室という名称のLINEアプリのクライアント開発組織があって、その中にApp Dev1~7チームという名称でAndroidとiOSの開発チームがそれぞれ複数存在しています。iOS領域は現在4チーム構成で、App Dev2チームが主にLEGY, LINTなどのコア機能、App Dev4チームがDX改善, グループ, トークバックアップ、App Dev5チームがLINEプラットフォーム(LIFF), CWA, ウォレットタブ, 着せ替え機能, 新規登録・リストア、App Dev6チームがホームタブ, watchOSなどの新規分野, アプリサイズ軽量化などを担当しています。
しかし、開発業務の重要性やそれぞれのチームの開発リソースに応じて、適宜他のチームの開発業務を代わりに担当したり、一部実装をサポートしたりと臨機応変に対応しています。
基本的には各チームで担当する箇所を割り振っていますが、緊急で開発が必要だったりする場合は、臨機応変に組織してチームの枠を超えて対応する場合もあります。

  • App Dev2チーム
    • LEGY、LINTなどのコア機能
      LINEも開発されておよそ10年が経ち、当時は新しかった技術も今では古くなってきているため、次の10年に向けたアーキテクチャの変更を担っています。ネットワークやユーザーのデータの扱いをもっと現代的で安定的に行うための変更です。
    • LINE Beacon
      Beaconを使ってLINEと連動させる機能の開発、メンテナンスを行っています。
  • App Dev4チーム
    • DX改善
      LINEは東京のみならず、他の開発拠点でも非常に多くの人たちが関わっており、常に様々な変更が取り込まれていて、互いに影響し合っています。そのためビルド速度など開発に関わる環境の面での改善を行なっております。
    • グループ・トークバックアップ
      LINEのグループチャットの改善と、メッセージのやり取りをiCloudに保存する部分の改善などを行なっています。
  • App Dev5チーム
    • LINE関連機能のサービス開発
      LINEが提供しているwebプラットフォームLIFFやウォレットタブ、着せ替え機能などの機能追加・改善を行っています。
    • 新規登録・リストア
      LINEの新規登録画面や、リストアなどの開発を行い、セキュリティの向上に努めています。
  • App Dev6チーム
    • LINE関連機能のサービス開発
      ホームタブの追加開発を行っています。
    • watchOS, CarPlayなどの新規分野
      AppleWatch用アプリやCarPlayなどOSの新しい機能やデバイスに対応する開発を行っています。
    • アプリサイズ軽量化
      LINEは様々な機能を含んでいますが、様々な機能追加の中で、どんどんアプリのサイズが大きくなってきました。そのため、内容の整理整頓をして、アプリのダウンロードサイズがより小さく、適切になるような改善をしています。
チームについて話す富家

開発者は裁量労働制を採用しているので、基本的には出社、退社の時間は自由です。チーム間のコミュニケーションは、毎日12時に昼会を開催し、現在の開発進捗、課題の共有等を行なっています。また、他の拠点のメンバーとはLINEやslackを使って密に情報共有をしています。

現在東京オフィスのメンバーは日本人以外に外国籍の方が6割ほど在籍しています。非常に多国籍なチームの為、コミュニケーションの場では時折英語で話す機会もありますが、基本的にはチャットベースの会話になるので、英語話せない方でも読めると言う状況であれば問題なく仕事はできると思います。これから英語を使ってどんどん仕事していきたい、という人はとても合っている環境だと思います。また、英語しか話せない方でも大歓迎です。
毎年WWDCにはチームメンバーのうち何人かが参加し、新OSへのキャッチアップや、その対応など素早くできるような体制を準備しています。開発環境も常に最新のXcodeでビルドできるよう最新SDKへの対応やSwiftのアップデートに対応をするために計画をしています。さらにwatchアプリでは、先日リニューアルした際にはSwiftUIを用いた開発にもチャレンジしており、なるべく新しい概念を取り入れられるよう努力しています。

―― チームメンバーを紹介してください。

富家:先ほどお話しした通り、私たちチームは多国籍なメンバーが活躍しています。例えば、AltConfなどの海外でのカンファレンスで発表、LINEのプロジェクトの大変革を行うためにBazelの対応をしていただいている方や、iOS13でDark Modeの対応が入った際に、着せ替え機能を大改造してDark Modeの対応していただいている方、try! Swift、iOSDCやDroidKaigiなどのクライアント向けイベントでネットワークエンジニアとして活躍されている方など多彩なエンジニアが集まっています。

―― 利用技術・開発環境について教えてください。

富家:LINEは開発規模が大きいアプリなので、保守的な印象を持っている方が多いと思います。「Objective-Cで書かれているんですか?」とよく質問されますが、実際はSwift 5.1を67.5%使っています。残りの割合は、Objective-Cが29.5%、Othersが3%といったところです。また保守的な印象に伴って、利用している技術も特殊なものを使っていると思われている方も多いのですが、他に使用している技術は意外に普通です。こちらが利用しているライブラリ・フレームワーク・ツール等です。
Xcode(11.5)、Bazel 、Tulsi、XcodeGen、Feature flags、Apache Thrift、CoreData、SwiftGen、SwiftFormat、CI/CD、Jenkins、SwiftLint、SonarQube

ビルド環境の改善は私たちの課題の一つであり、現在新しいツールを取り入れるように努めていて、SwiftGenやBazelを使っています。以前はCocoaPods/Carthageを使用していましたが、全てBazelで管理するようにしたため、現在は利用をやめています。大規模なアプリを開発するうえで、ビルド速度およびビルド再現性は大きな課題です。この課題を解決するためにBazelを用いたビルドパフォーマンスの改善に取り組みました。

―― 今のチーム課題を教えてください。

:先ほどお話ししましたが、現在抱えている課題としては開発者の生産性に大きく影響するビルド時間を始め、私たちチームでは次の課題を抱えています。

  • SwiftとObjective-Cのハイブリッド
    • LINEをリリースした時はObjective-CがiOSアプリケーションを開発する時に使う開発言語だったのですが、今はSwiftと言う新しい言語を使うことになっています。LINEとしては新しいコードはSwiftで、既存のコードはObjective-Cを維持するハイブリッドタイプに進めることにしていますが、Xcodeのビルドに結構時間がかかるため開発の効率面としてもっと工夫が必要なところです。そのため、少しずつObjective-Cで書いてあるコードをSwiftに変えていってます。変換する方法はSwiftifyと言うツールを使うことも検討しています。
  • 大規模開発についての課題
    • マージンコンフリクトは大きな課題です。大きな機能開発やリファクタリングのためのブランチで作業することで時間が経つと衝突が生じる可能性が高くなります。
  • project.pbj コンフリクト
  • ブランチ間のコンフリクト
  • LINEのiOSのプロジェクトには毎日数々のコード修正が上がってきて、その中には他の同僚と一緒に管理するファイルも多いです。この状況だとファイル修正によるコンフリクトが頻繁に起こって、誰かがその差分を見ながら正しい形に合わせないといけません。普通のソースコードファイルならまだその差分が分かりやすい方ですが、Xcodeのビルド設定を持ってるproject.pbxprojファイルからコンフリクトが発生すると色々大変になってしまいます。まず、そのファイルがとても大きくて差分を開くだけで時間がかかります。そして、その内容がすごく複雑で読んで理解するのも大変です。その結果、一つ一つ差分の探索しながら正しく直す必要があり、非常に手間がかかる作業になります。

またバイナリサイズについても懸念事項です。LINEは様々な機能を持っており、次々に新しい機能が追加されています。それに伴いアプリのサイズがどんどん大きくなってきています。アプリのサイズが大きくなると、アプリのインストールに時間がかかってしまったり、ダウンロードのために通信料を使ってしまったり、アプリ全体のパフォーマンスに影響したりと、ユーザーの満足度に大きな影響を与えることになります。

しかし、LINEとして提供したいサービスがあるため、これらの兼ね合いも踏まえて解決策を考えなくてはいけません。

チームの課題について話す朴

―― 課題解決に向けた取り組みを教えてください。

:ビルド時間に関する取り組みの一環として、Bazelというビルドシステムを導入しています。Bazelではビルドの成果物をサーバにキャッシュすることができ、大人数のチームだからこそ効果が発揮できるビルドシステムです。最終的な目標としては最新のコードをプルすれば、ビルドの成果物が全てキャッシュサーバからダウンロードできる状態にすることです。実はすでにPRの一つのCIジョブとしてビルドの成果物をキャッシュサーバに上げています。この目標を100%実現するためには、コードのモジュール分け作業が欠かせません。コードを適切にモジュールに分割していけば、長い目で見て変更されないモジュールが増えるため、キャッシュがより活用できるようになると考えています。

大人数で開発するにあたって発生する問題「merge conflict」の一つの対策としては、QA対象のブランチと開発のブランチにおいて、定期的に自動的にマージPRを作るようにしました。そのPRで衝突があった場合、衝突を解決できそうな人を計算してアサインします。また、LINEのボットでも開発者のグループで周知し、衝突を積極的に防ぐ努力もしています。

Xcodeプロジェクトファイルの衝突については、YAMLでプロジェクト設定を記述できるXcodeGenを採用するようにしました。プロジェクトファイルはXcodeGenから生成されるので、プロジェクトファイルをリポジトリから削除することができ、衝突も起こりません。
また、「大きな機能開発やリファクタリングのためのブランチで作業することで時間が経つと衝突が生じる可能性が高くなる」問題を解決するためには、featureを使った開発方式を推奨しています。変更を早めにマージできる状態にしておけば、衝突を最小限にすることができます。
バイナリサイズについては10年近いサービスを続けているため、すでに利用が終わっている機能の削除や、サイズの大きいリソースの削除などを行なってきました。

また、アプリサイズを大きくし、起動スピードに影響のあるdynamic frameworkを基本的に禁止し、ほとんどをstatic frameworkとしました。そしてアプリバイナリを解析して、どの機能がどれくらいバイナリサイズを使っているかを計測できるようにしています。これらの情報をもとに企画と連携してアプリサイズについて、可能な限り軽量化できるよう努力しています。

現在、モジュール分けやObjective-Cの変換など、期限は明示せずこれらの課題の解決をチーム全体の目標とし、新規機能開発と並行して取り組んでいます。新しい機能開発もとても大切ですが、歴史のあるアプリだからこそ抱える技術的負債の改善、そして大規模開発におけるアプリならではの課題に対してオーナー意識を持って進めています。
また、これらの課題だけではなく、LINEのアプリをさらに良いものにするためのアイディアを持ち、開発を進める上でのフローの改善や自動化など、自分だけでなく周りに人のアプトプットを高められることを自らが提案・企画し自発的に取り組んで行ける人にとっては、とても面白い環境だと思います。

―― 最後に、クライアント開発iOSチームに興味を持ってくれた人にメッセージをお願いします。

間も無く10年目に突入するアプリで、多くの機能や技術的負債も抱えていますが、SwiftもSwift 1の時代から取り入れるなど、なるべく新しいOSのパラダイムを取り入れようと努力しています。
大きいアプリなので保守的な開発環境を想像されがちですが、このようにLINEのiOSクライアント開発では、開発環境をアップデートしてモダンな開発ができるように環境を整えています。すでに多くの人に日常的に使われているアプリなので、そこでキラー機能を作ってみたい、こう言う風にしたらもっと良くなるのにと思っている方に是非応募してほしいと思っています。

あなたとより素晴らしいLINEが作れることを期待しています。

クライアント開発iOSチームではメンバーを募集しています。

iOS クライアント開発エンジニア / LINEアプリ