Slide 1

Slide 1 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 「JapanTaxi」iOS アプリを 継続的かつ安定してリリースするための取り組み

Slide 2

Slide 2 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved ⾃⼰紹介 2 Yosuke Imairi • JapanTaxi (2017.5 -) • iOS app Developer

Slide 3

Slide 3 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 3 「JapanTaxi」アプリの開発体制 & iOS ユニットの複数⼈開発における取り組み

Slide 4

Slide 4 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 「JapanTaxi」アプリを⽀えるチーム/ユニット 4 Server iOS Android ユニット

Slide 5

Slide 5 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 「JapanTaxi」アプリを⽀えるチーム/ユニット 5 Server iOS Android チーム

Slide 6

Slide 6 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 「JapanTaxi」アプリを⽀えるチーム/ユニット 6 Server iOS Android PM

Slide 7

Slide 7 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved LeSS (Large-Scale Scrum) 7

Slide 8

Slide 8 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 「JapanTaxi」アプリを⽀えるチーム/ユニット 8 Server iOS Android PM プロジェクト A プロジェクト B

Slide 9

Slide 9 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 9 iOS ユニットとして 安定してアプリを継続的にリリースするにはどうすればよいか

Slide 10

Slide 10 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 安定して継続的なリリースを⾏うために 10 - 1.コードの品質を保つ - アーキテクチャやコーディング規約に沿った設計や実装 - バグが⽣まれにくいようにする - 提供したい機能の開発が遅れることを防ぐ - 2.効率よく複数⼈開発する - 迅速なコードレビューの意識付け - 共通作業の⾃動化 - 3.リリースサイクルの明確化

Slide 11

Slide 11 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 1.コードの品質を保つ 11

Slide 12

Slide 12 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved SwiftLint 12 - 基本的に //swiftlint:disable は禁⽌ - 乱⽤すると SwiftLint を導⼊した意味がなくなるから - すべてのルールを有効後、無効にすべきルールを絞る - 無効にしたルールは理由を記述する

Slide 13

Slide 13 text

- 既存のビジネスロジックが壊れないようにするための担保 - なるべく実装時に書くように⼼がける(仕様を忘れないように) - 複数⼈開発では、誰がどの機能を修正するか分からない - QA での⼿戻りを少なくするため - QA チームの負担を軽減 - バグ修正の時間を減らして、本来の開発に集中する Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved Unit Test 13

Slide 14

Slide 14 text

- Unit Test のテンプレート(Quick/Nimble, Mockの定義) - モックの⾃動⽣成 - Unit Test を書ける状態を保つ(DI etc..) - ⽇頃の開発時に⼼がける必要あり Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved Unit Test を書くにあたっての⼼理的障壁を下げる 14

Slide 15

Slide 15 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 15 https://blog.japantaxi.co.jp/2019/12/25/6656 JapanTaxi iOS UnitTest

Slide 16

Slide 16 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 2.効率よく複数⼈開発する 16 (コードレビュー)

Slide 17

Slide 17 text

- コードの品質を保つためにコードレビューを⽇々⾏っている - コードに対するコミュニケーションの場 - コードの誤りの指摘以外にも、気になったことは気軽にコメント Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved コードレビュー 17

Slide 18

Slide 18 text

- 対応したこと - 対応していないこと - 対応すべき範疇を超えているもの - 別の Pull Request で対応するもの - スクリーンショットなどで修正差分を提⽰ - 微妙な実装になったところ、懸念点 Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved Pull Request の Description 18 レビュアーとの円滑なコミュニケーションを図る

Slide 19

Slide 19 text

- ( ´-`).。oO (みんな忙しくてレビューしてくれない…) - Pull Request を⻑時間放置することは危険 - マージ先とのコンフリクト解消コスト - 何を修正したか⾃分が忘れる - 途中でレビュアーが交代 Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved Pull Request が溜まりがち問題 19

Slide 20

Slide 20 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved Pull Request が溜まりがち問題 20 Pull Panda ͷ׆༻ͯ͠ίʔυϨϏϡʔ΁ͷҙࣝ෇͚

Slide 21

Slide 21 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved Pull Assigner 21 - Pull Assigner でレビュアーの⾃動アサイン - レビューの負担を均⼀化 - レビュアーは 1 ⼈を選定し明確化する

Slide 22

Slide 22 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved Pull Analytics 22 - 24時間以内にレビューがされたかどうかの確認 - iOS ユニットの定例 MTG で毎週確認(⽬標: 90% )

Slide 23

Slide 23 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved Pull Reminder 23 - 朝とお昼に Slack のチャンネルにリマインドを投稿 - 送りすぎると耐性がつくので注意

Slide 24

Slide 24 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved ⾃動レビュー 24 - 機械的にレビューできることは Bot で(レビュアーの負担軽減) - SwiftLint の警告をコメント - 使われていない定義を指摘 - Ruby スクリプトで未使⽤のメソッドやプロパティやクラスを 精査し、Danger を利⽤してコメント

Slide 25

Slide 25 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 2.効率よく複数⼈開発する 25 (⾃動化)

Slide 26

Slide 26 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 共通の作業を⾃動化 26 - ユニットメンバの共通作業を make コマンドで統⼀ - 環境構築 - ライブラリの導⼊ - テンプレートの導⼊ - モック⽣成 - GraphQL の schema 更新や API.swift の⽣成 - Bitrise のワークフローを作成し、様々な作業を⾃動化 誰でも安⼼して同じ作業が⾏える仕組みの構築 CIの活⽤で開発作業時間を確保

Slide 27

Slide 27 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved リリースまわりの作業を⾃動化 27 - Slack から TestFlight へのアップロード - DEV, STG, PROD /japantaxi-passenger-ios b:release/4.4.15|w:testflight - Slack から コードフリーズ作業 - リリースブランチ作成 - バージョン更新 - Branch protection rules 追加 - Beta で配信 /japantaxi-passenger-ios b:master|w:code-freeze|ENV[RELEASE_APP_VERSIION]:4.4.16

Slide 28

Slide 28 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 28 https://blog.japantaxi.co.jp/2019/12/18/6190 JapanTaxi iOS Bitrise

Slide 29

Slide 29 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 3.リリースサイクルの明確化 29

Slide 30

Slide 30 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved リリースサイクル 30 - 開発したものは素早くユーザに届けたい - 安⼼してリリースしたい - 無理なくリリースできるサイクル - 曜⽇を固定化すると他部署と調整がしやすい - 予定された⽇に間に合わなかった場合は次のリリースに持ち越し

Slide 31

Slide 31 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 毎週⾦曜⽇にコードフリーズ (※) 31 (※) QAに提出するバイナリの作成 コードフリーズ

Slide 32

Slide 32 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved コードフリーズの翌週にQA 32 コードフリーズ QA

Slide 33

Slide 33 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 毎週⾦曜⽇に審査提出 33 コードフリーズ QA 審査提出

Slide 34

Slide 34 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 毎週⽔曜⽇にリリース 34 コードフリーズ QA 審査提出 リリース

Slide 35

Slide 35 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 毎週⽔曜⽇にリリース 35

Slide 36

Slide 36 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved このような取り組みの結果… 36

Slide 37

Slide 37 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 安定して継続的なリリース 37 - バグ修正や機能改善、新機能などを毎週リリース - 2019 年は合計 41 回リリース - バグによる Hotfix は 2 回 - 複数チームでプロジェクトを進める - 数ヶ⽉かかる⼤規模な開発と並⾏して、細かな改 善も継続的に⾏えた - リリースサイクルの明確化

Slide 38

Slide 38 text

Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved 2020年もがんばります 38

Slide 39

Slide 39 text

จষɾը૾౳ͷ಺༰ͷແஅసࡌٴͼෳ੡౳ͷߦҝ͸͝ԕྀ͍ͩ͘͞ɻ Proprietary and Confidential ©2017 JapanTaxi, Inc. All Rights Reserved ˟102-0094ɹ౦ژ౎ઍ୅ా۠لඌҪொ3-12 3-12 Kioicho Chiyoda-ku, Tokyo 102-0094 Japan TEL 03-6265-6265ɹFAX 03-3239-8115 www.japantaxi.co.jp