はじめまして!テレビ&ビデオエンターテインメント「ABEMA」のiOSエンジニアの井原(@nonchalant0303)です。今回は、ABEMAのiOSチームのチュートリアルプロジェクトを活用した技術面のオンボーディングの取り組みについて紹介します。
目次
ABEMAのオンボーディング
ABEMAの開発組織は徐々に規模を拡大している組織で、正社員やインターンなどの様々な新規メンバーが毎月加わります。ABEMAの現状やKGI・KPIなどの事業面のオンボーディングは加わった直後に行われますが、コードの設計や命名などの技術面のオンボーディングは現場のメンバーに一任されています。
しかし、ABEMAのiOSチームにおいては、技術面のオンボーディングを行うメンバー、通称トレーナーの業務が明確に決められておらず、技術面のキャッチアップはトレーナーのスキルや新規メンバーのキャッチアップのスキルに依存しているのが現状でした。また、ABEMAのiOSアプリにはキャッチアップを阻害する様々な要因があり、実装スピードが上がるまである程度の期間を要することもありました。
キャッチアップを阻害する要因
ABEMAのiOSアプリでキャッチアップを阻害する主な要因は、ABEMAの機能の多様性や複雑性などのドメインの理解と、コード上に新旧の設計が入り混じっていることです。これらの複合的な要因により技術面のキャッチアップの難易度が上がっています。
ABEMAの設計は、2015年の立ち上げ時から開発の様々なニーズに伴い徐々に基礎設計を移行しています※1。ABEMAで採用している設計は以下のようなものがあります。
1. Flux
- 立ち上げ時に採用された設計
- ビジネスロジックの複雑性の増加に伴うテスタビリティの低下が課題
2. MVVM + Flux
- プレゼンテーションに関連するようなビジネスロジックをView層から分離して、テスタビリティの向上が目的
- ViewModelの実装の複雑性の増加に伴い、開発者によって入出力・状態・外部依存の定義にバラつきが課題
3. MVVM (Unio) + Flux
- MVVM + Fluxをベースに、入出力を明確にすると共に状態や外部依存の定義を型として、開発者による定義のバラつきを抑えるために Unio を採用
「Flux」→「MVVM + Flux」→「MVVM (Unio) + Flux」の順番で設計が移行していますが、完全には移行できておらずコード上にはこれらの新旧の設計が入り混じっています。そのため、新規メンバーがキャッチアップの際に古い設計を参照すると、最新の設計に準拠しないまま開発を進めてしまうことがありました。
そこで、最新の設計をキャッチアップするためのチュートリアル用のプロジェクトを同僚の安井さん (@akkyie) と協力して作成しました。
ABEMA iOS チュートリアル
ABEMA iOS チュートリアル は、ABEMA iOSアプリ開発で用いている開発環境やライブラリ、開発フローに慣れるためのサンプルプロジェクトです。
このプロジェクトは、いくつかの不具合が意図的に含まれており、それらの不具合を解決しながらABEMA iOSアプリのキャッチアップを行えます。チュートリアルプロジェクトでのキャッチアップは、ABMEA iOSアプリの本体コードでのキャッチアップと比較すると以下のようなメリット・デメリットがあります。
メリット
- 最新の設計のみで構成されており古いコードがない
- プロジェクトの規模が小さいのでビルドが高速
デメリット
- 機能や画面の命名などのドメイン知識が身につかない
ABEMA iOS チュートリアルの設計思想
本体コードでキャッチアップを行うと、前述の通りドメイン面や設計面などの複合的な要素によりキャッチアップの難易度が上がるので、このプロジェクトでは設計面や開発フローのキャッチアップのみにフォーカスして設計しました。このプロジェクトのデメリットのドメイン知識の理解は、設計面のキャッチアップがある程度完了してから、本体コードでキャッチアップするというように段階を踏んでABEMA iOSアプリのキャッチアップが行えます。
また、チュートリアルプロジェクトも4つのタスクで構成されており、設計面や開発フローのキャッチアップも段階を踏んで行えます。
タスク 1.
master ブランチの実装には不具合があり、一部動作しない機能があります。
⌘+Uでテストを実行すると、失敗している箇所があるはずです。
テストが通るように実装を修正してください。
キャッチアップできるスキル
- プロジェクトのセットアップ
- RxSwiftを用いたリアクティブプログラミングの基礎理解
タスク 2.
- セルにリポジトリの説明文を追加してください。
- 追加したロジックについてのユニットテストを追加してください。
キャッチアップできるスキル
- Unioを用いた基礎的なロジックの実装
- Unioを用いた基礎的なテストの実装
タスク 3.
APIClientは、時々エラーを返します。
- エラーが返ってきたときにアラートを表示するようにしてください。
- アラートを閉じたときに、データを再取得するようにしてください。
- 追加したロジックについてのユニットテストを追加してください。
キャッチアップできるスキル
- UIイベントを含んだUnioを用いたロジックの実装
- 基礎的なエラーハンドリング
タスク 4.
- エラーが返ってきたときにアラートを表示するようにしてください。
- アラートを閉じたときに、データを再取得するようにしてください。
- 追加したロジックについてのユニットテストを追加してください。
- 以下の仕様を満たすお気に入り機能を実装してください。
- セルか、セル上のボタンをタップしてお気に入りに追加/削除できるようにしてください。
- 同じセルは一度のみお気に入りに追加できるようにしてください。
- お気に入りに追加したリポジトリのみを表示する機能を追加してください。
- 別のタブにするかフィルタを付けるかなど、表示方法は任意です。
- アプリを再起動しても、お気に入りデータが消えないようにしてください。
- 保存方法は任意です。
- Issueに仕様がある程度わかるような説明文を書いてください。
- 追加したロジックについてのユニットテストを追加してください。
キャッチアップできるスキル
- 1機能の実装フロー
- Fluxの理解
- 永続化の実装
ABEMA iOS チュートリアルの活用事例
チュートリアルプロジェクトは、主にインターン生の最初のタスクとして活用しています。最初から業務タスクを任せるときの、キャッチアップに時間が取られ進捗が出ずモチベーションが下がるなどの悪影響が起きずに、新規メンバーの時間を無駄にせずキャッチアップを進められています。チュートリアルプロジェクトのレビューを通してトレーナーと新規メンバーの期待値を調整することにより、その後適切な業務タスクを任せられます。また、チュートリアルプロジェクトを活用すると、トレーナーのオンボーディングのスキルに依存せず、同水準での技術面のオンボーディングが行えます。
タスク1 ~ 4の解答例のブランチもあるので、興味がある方はぜひ取り組んでABEMA iOSアプリの開発の雰囲気を感じてみてください※2。