2024.10.10
将来は卵1パックの価格が2倍に? 多くの日本人が知らない世界の新潮流、「動物福祉」とは
AbemaTV モバイルアプリの開発体制と開発プロセスの話(全1記事)
リンクをコピー
記事をブックマーク
波戸勇二氏(以下、波戸):先ほどのサーバーサイドなどの音声の話とはちょっと毛色が変わって、今回はモバイルアプリのクライアントの話です。モバイルアプリの開発体制と開発プロセスの話ということで、始めたいと思います。
簡単な自己紹介ですが、AbemaTVでiOSエンジニアをやっている、波戸と申します。よろしくお願いします。
(会場拍手)
アジェンダですが、最初はざっくり「AbemaTVのiOSチームって、どうやって開発してるの?」。今、10人いるんですけど、どのような体制で開発しているのかをお話ししたいと思います。
まず開発体制ですが、AbemaTVの開発局は現在50名程度が在籍しています。図にすると、左からディレクター、サーバー、デザイン、ウェブ、iOS、Android、QAといった感じです。あと、各チームから代表者が出て、ボードのメンバーがいるというかたちになります。
iOSはその一部になるんですけど、その中でもチームが分かれています。ビデオチーム、グロースチーム、本質改善チーム、テレビデバイスチームと、大きく4つに分かれています。
iOSチームなんですけど、先ほど言った通り、現在は10名体制でやっています。立ち上げ当初は4名程度だったので、だいぶ増えたかたちになります。ここでは、みんなに顔出しOKをもらったので(スライドに)載せています。
先ほどの大きく4つに分かれていたところなんですけど、ビデオ、グロース、本質改善、テレビデバイスを(メンバーの顔写真で)分けると、こんな感じになります。
現状AbemaTVの対応デバイスは、PC、iPhone/iPad、Android/タブレット、Apple TV、Android TV/Amazon Fire TV、Google Cast。iOSチームが担当しているところはiPhone/iPad、Apple TVで、Google CastはTV側のレシーバーとクライアント側のセンダーがあるのでセンダー側の担当範囲になります。
iOSチームが管理しているコードベースですが、リポジトリがけっこうあります。大きく2つ、iOSとtvOSでリポジトリがあります。
その他にはAPIの共通のモジュールとプロトコルバッファを使っているんですけど、プロトコルバッファのSwiftファイル、共通のスクリプト群などを入れてるコマンドシェルフiOS、あとはモックや検証用のプロジェクト、ツールなどを管理しています。
これはコードのファイル数とか行数を出したものです。一昨日くらいに出したのかな。iOSが90,000行くらいですかね……。tvOSが27,000行で、APIも少し、3,800行くらいあります。
これはiOSリポジトリのGitHubのインサイトで、コミット数とかマージコミットも見れます。注目してほしいのはプルリクエスト数で、これは資料を作った日がバレちゃうんですけど、9月19日から10月19日の間で、プルリクエストが1ヶ月の間で162個マージされているといった感じです。営業日換算すると、だいたい毎日7〜8個のプルリクエストがマージされていることになります。
(図の中の)一番右に、すごくコミットしてない人がいるんですけど(笑)。これはデザイナーで、画像の差し換えや文言変更などを、デザイナーがプルリクエストしてくれています。
これはtvOSで、ちょっと少ないんですけど、57個のプルリクエストで、営業日換算で1日2〜3個のプルリクエストがマージされていて、APIもちょこちょこ入っています。
なにが言いたいのかといいますと、みんなしっかり仕事をしていますよ(笑)。というのは冗談で、毎日大量のコードの変更がされているということが言いたくて。そして、それらをどういったフローで開発しているのかをお話したいと思います。
基本的にはiOSチーム、AndroidやWebも大体同じなんですけど、スクラムで2週間ごとのスプリントで開発しています。もうちょっと細かくした図なんですけど、これは少し前に実践していたフローで、開発を2週間、QAを1週間というかたちで2週間ごとの申請でやっていました。
ただ、これはちょっと問題があって、「開発とQA期間の重複が辛いです」という声があがっていたんです。
QAの期間中にバグの対応とか多く入ると、次のスプリントにモロに影響が出てしまい少し無理があったので、改善しました。現在は開発期間1週間、QA期間が1週間という重複しない定義で行っています。今のところ、これでけっこうスムーズにいっていると感じています。
長い開発はスプリントを跨いだかたちになって、フライングというか、QA期間中から始まる開発も案件によってあります。計画ミーティングごとになにをやるか決めるんですが、ある程度の先のスプリントの開発まで決めているので、こういった調整が容易になっています。
あと、タスクがそもそもどのように決まっているのかというところなんですけど、パターン1はけっこう一般的です。プロデューサー、プランナーが立案して、それを実現させるための機能を考えて、タスクに落とし込む。いわゆるトップダウンといったタスクです。
パターン2はエンジニアがコードの品質やパフォーマンス、継続的な開発のための試作を洗い出してタスク化するというものと、モックを作っちゃって「どうですか?」とか言ったり、勝手に実装して「入れていいですか?」といったパターンもあります。
タスクの見積もりはタスクのストーリーポイントを付けているんですけど、これはスクラムに詳しい人だと「え?」と思われるかもしれないです(笑)。1ポイントは軽微なもの、2ポイントが0.5スプリント、3ポイントが1スプリントか、またはそれ以上という、けっこうおおざっぱな付け方をしています(笑)。
数値の付け方としては、AbemaTVは事業の流れがはやく、案件の優先度がコロコロ変わるので、ガチガチに付けるよりも一人ひとりがどれくらいの案件を抱えているのかという目安として、今は使っています。
タスク優先度の定義は、優先度は5段階でS、A、B、C、Dとあります。S、A、Bが上矢印、C、Dが下矢印というところです。上矢印はスプリント期間に開発完了、テスト、リリースが必須のもの。これが間に合わなければ、先ほどのスプリントで示した図の、定常リリースを遅らせる判断をするものになります。
CとDは「次に回してもいいよ」という定義をしています。こういった共通言語を定義していると、ディレクターとかの会話がスムーズにいったりする利点もあります。
会議体ですが大きく4つあって、スプリント計画と、スプリントの振り返りのスプリントレビュー、メンバー各自の案件のミーティング、iOSチームは定例週1でやっています。けっこうミーティングは少ない方なのではと思っています。
使っているツールを紹介しますね。けっこう一般的で、チャットツールのSlack、CI用のBitrise、チケット管理のJIRA、ドキュメントツールのConfluenceとesa、自動化でJenkinsを使っていて、cmdshelfも自動化の一環ですね。あと、コード管理のGitHubなどです。
cmdshelfについては知らない方もいるかもしれないので、少し紹介します。リモートリポジトリの実行可能ファイルをローカルにダウンロードして、ローカルファイルのように統合して扱えるツールで、iOSチームのトッシーさんという方が作ってくれています。
これは実際の例で、iOSの共通のスクリプトをリポジトリに入れています。左がリポジトリで、cmdshelf remote addでリポジトリのURLを追加すると、そこの実行可能ファイルが全て追加されます。
実行するときは、cmdshelf runでリストで出てきたやつを実行できるといったかたちです。メンバーが新しく入ったとき、どこにのあるのかわからないものなどを共通化しておくとけっこう便利になります。
続いて開発スタイルを紹介します。プルリクエストについてです。これはCONTRIBUTING.mdの抜粋ですが、プルリクエストなどをするときのガイドラインになります。最後のコミットのあと3人以上からOKをもらう、軽微な場合は2人以上でOK、極力テストコードを付ける、極力デザイナーの確認をとるなどといったことを定義しています。
AbemaTVは活発なレビュー文化で、これが平均より多いのか少ないのかわからないですが、感覚的にはけっこう多い印象です。そのため、プルリクエストのコメントから議論に発展することも多々あります。
コーディング規約として、これはObsevableの公開方法をGoodとBadみたいな感じで書いてあるんですけど、「こう書きましょう」みたいなプロジェクトで統一した書き方を目指しています。
あとはテストですが、今テストケースが2,009ケースあって、極力テストは書く方針で進めているんですけど、基本UI周りは書いていません。そこは設計でカバーしていて、ビューにはロジックを書かずモデル層とかロジックの部分のテストは書くようにしましょうという方針にしています。
右の図は、iOSの週一定例シートの抜粋です。急ぎでないものは、各自思いついたときに議題に入れてもらって、定例で結論を出してアクションしていくやり方をしています。すぐに解決したいものはGitHubとかSlack上での議論で、開発のルールをどんどん更新していっています。
次にブランチ戦略ですが、基本はGitHubフローで、開発用のマスターブランチとQA用のqaブランチを2つ作っています。そして各自でトピックブランチをマスターqaから作って作業する流れをとっています。
シンプルにこのようなかたちになっていて、マスターブランチがあって、QA期間中はqaブランチを使う方法にしています。
これにスプリントの図を当てはめると、こういうかたちです。左が仮で、スプリント2.2.0で、真ん中が2.3.0、右が2.4.0。真ん中の2.3.0を見ますと、ここが開発期間。マスターブランチからトピックブランチを切って、マスターにプルリクエストしてマージするといった期間です。
2.3.0のQA期間中はQAブランチからトピックブランチを切って、プルリクエストしてQAにマージするかたちをとります。この期間中のマスターは、2.4.0の開発をしていることになります。そして2.3.0の申請が終わったら、QAブランチをマスターにマージする。申請が終わったらというよりも、適宜マージする形式です。
このブランチ戦略のいいところとしては、これを間違えるとプルリクエストのマージができないといった課題が発生しがちなので、そういったことがあまり発生しないこと。基本はGitHubフローなので、シンプルでわかりやすい。スクラム開発のスプリントサイクルにうまく当てはめやすいのかなと感じています。
次にベータ配信について、テスト用アプリの配信の自動化フローについてお話しします。
図のような感じになっていて、まずデベロッパーがGitHubにプルリクエストして、レビューを通ってマージされるとbitriseがフックしてジョブを起動します。ビルドしたら、継続的に「Crashlytics」でベータアプリを配信しています。
対象ブランチは、マスターとqa、先ほどお話したものですね。あと、マスターとqa以外にqa-xxxxxのようにqaハイフンで始まる名前のブランチをあげると、配信するようにしています。
これは特別なバージョンでなにか確認しておきたいために用意しているといったかたちになります。QA期間中はテストフライトにも配信していて、本番と同じ状態で確認できるようにしています。
Slackの通知についても、いくつか自動化しているものを紹介します。このあたりは……だいたいみなさんもやっていると思うんですけど、左上がCocoaPodsの、「ライブラリアップデートがあるよ」というときに通知してくれるものです。
これはベータ配信のときにお話した、「QAビルドが配信されたよ」というお知らせもSlackに流れます。あと、「クラッシュがけっこう起きてるよ」という通知もSlackに流していたり。(右上の)K.I.T.T.……これはなんだっけ?(笑)。
あ、これは自前のbotなんですけど、レビューがしばらくされていないプルリクエストを自動で見て、「これ見てね」とお知らせを流していたり、あとは「通知の証明書が切れそうだよ」など、App Storeのレビューも、Slackに流しています。
あとは、AppleのRSSとかも流していますね。これは「iOS11のベータ10がきたよ」というものです。
次にQAの効率化についてお話したいと思います。機能が多くなって複雑になってくると、QAの時間も比例して大きくなっていくと思いますが、その効率化のためにデバッグメニューを用意しています。現状のデバッグメニューの機能について、いくつかピックアップしてご紹介します。
アクティビティーモニターは、CPUとメモリ使用率を表示するものですね。あと通知周り、通知のテストとかけっこう面倒くさいと思うんですけど、クライアントで設定して5秒後に送るとか、ローカルの通知のシミュレートをできるようにしています。
アプリの保存情報とかキーチェーンとか、データベース、画像キャッシュを削除できるようにしていたり。ユーザー区分とか、サービスによってけっこうやっていたりすると思うんですけど、1週間に何回起動したかとかそういった区分をステータスを変更してテストできるようにしています。
あとはアニメーションの速度を変更したり。動画のサービスなので、再生の動画のビットレートやレゾリューション、セグメントファイルの転送時間とか、AVPlayerから取得できるものは、ほぼオーバーレイで表示できるようにしています。
ログ出力確認ですね。これはGAログって書いてあるんですけど、3つくらい種類を送っていて。QAチームから、「ログを管理ツールから確認するのがけっこう大変です」という声があがったことがあったんです。
バグがあった時など、気づくのが遅くなるんですよね。そういった時にコンソールで、まずは動作としてちゃんと出ているかという早期のバグ発見に役立っています。
その他だと、iOSチームは社外のカンファレンスの登壇を積極的に行っていたり、隔週でチーム内ランチ勉強会を開催しています。10人いるので、隔週でやっているとそんなに負担にならないので、チームビルドというか、知見の共有という意味で良い取り組みになっているかなと思います。
(スライドの)これは開発風景ですね。
最後に、まとめです。AbemaTVは事業的に先を見据えたサービスなので、その場しのぎで開発していくと、長期的な開発のどこかで破たんしてしまうという可能性もあると思います。
なので、AbemaTVのモバイル開発においては、長期的な視点で開発スピードとアプリの安定性、コードの品質を保った継続的な開発ができるように、意欲的に取り組んでいます。ということが、今回の発表で伝われば良かったかなと思います。
以上簡単にはなりますが、まとめということで、発表を終わりにしたいと思います。ありがとうございました。
(会場拍手)
関連タグ:
2024.11.13
週3日働いて年収2,000万稼ぐ元印刷屋のおじさん 好きなことだけして楽に稼ぐ3つのパターン
2024.11.11
自分の「本質的な才能」が見つかる一番簡単な質問 他者から「すごい」と思われても意外と気づかないのが才能
2024.11.13
“退職者が出た時の会社の対応”を従業員は見ている 離職防止策の前に見つめ直したい、部下との向き合い方
2024.11.12
自分の人生にプラスに働く「イライラ」は才能 自分の強みや才能につながる“良いイライラ”を見分けるポイント
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.11.11
気づいたら借金、倒産して身ぐるみを剥がされる経営者 起業に「立派な動機」を求められる恐ろしさ
2024.11.11
「退職代行」を使われた管理職の本音と葛藤 メディアで話題、利用者が右肩上がり…企業が置かれている現状とは
2024.11.18
20名の会社でGoogleの採用を真似するのはもったいない 人手不足の時代における「脱能力主義」のヒント
2024.11.12
先週まで元気だったのに、突然辞める「びっくり退職」 退職代行サービスの影響も?上司と部下の“すれ違い”が起きる原因
2024.11.14
よってたかってハイリスクのビジネスモデルに仕立て上げるステークホルダー 「社会的理由」が求められる時代の起業戦略
2024.11.13
週3日働いて年収2,000万稼ぐ元印刷屋のおじさん 好きなことだけして楽に稼ぐ3つのパターン
2024.11.11
自分の「本質的な才能」が見つかる一番簡単な質問 他者から「すごい」と思われても意外と気づかないのが才能
2024.11.13
“退職者が出た時の会社の対応”を従業員は見ている 離職防止策の前に見つめ直したい、部下との向き合い方
2024.11.12
自分の人生にプラスに働く「イライラ」は才能 自分の強みや才能につながる“良いイライラ”を見分けるポイント
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.11.11
気づいたら借金、倒産して身ぐるみを剥がされる経営者 起業に「立派な動機」を求められる恐ろしさ
2024.11.11
「退職代行」を使われた管理職の本音と葛藤 メディアで話題、利用者が右肩上がり…企業が置かれている現状とは
2024.11.18
20名の会社でGoogleの採用を真似するのはもったいない 人手不足の時代における「脱能力主義」のヒント
2024.11.12
先週まで元気だったのに、突然辞める「びっくり退職」 退職代行サービスの影響も?上司と部下の“すれ違い”が起きる原因
2024.11.14
よってたかってハイリスクのビジネスモデルに仕立て上げるステークホルダー 「社会的理由」が求められる時代の起業戦略