「TestFlight」によるテストアプリ配信の省力化と開発ノウハウ
ここまでのまとめ
最後に、ここまでの内容を振り返り、実際の開発で気付いた点を共有させて頂きます。
はじめに、無駄のないチーム開発を実現する4つのツール、「youRoom」「Pivotal Tracker」「Heroku」「TestFlight」のそれぞれについて、全体像をご説明しました。「youRoom」と「Pivotal Tracker」は、プロダクトオーナーと開発者の無駄のないコミュニケーションを実現するためのツールです。プロダクトオーナーと開発者は「動くソフトウェア」を元に「youRoom」と「Pivotal Tracker」を通じて開発を行っていくのですが、この「動くソフトウェア」を素早く実現する手段として、次に「Heroku」と「TestFlight」をご紹介しました。
この連載では、上記で挙げた4つのツールを実際に使うことができるようになることを第一の目標としていたため、少し詳細に立ち入りつつツールの説明をしてきましたが、最後に開発の振り返りとして気付いた点をいくつか共有させて頂きたいと思います。
「動くソフトウェア」を元にした開発ではこまめなアクセプトが重要
「動くソフトウェア」を元にした開発では、チケットのこまめなアクセプトが重要になります。こまめなアクセプトによって以下のようなメリットを得ることができます。
- チケットがどんどんアクセプトされていくと、アクセプトする側もされる側も開発がどんどん前進して行っていることが分かり、プロジェクトを楽しく進めることができる。
- こまめにアクセプトされるためにはこまめにリリースする必要があるため、リリース作業が軽量化され、リリース時の不具合が極小化される。
- 特に外部連携が必要なプロダクトでは、こまめなリリースによって連携時の不具合の特定が容易になる。
今回もチケットのこまめなアクセプトにより、開発を円滑に進めることができました。
インターフェース仕様はGoogle Spreadsheetで共有した
基本的にドキュメントは作成せずに開発を進めますが、インターフェース仕様はGoogle ドキュメントのSpreadsheetにてアプリ・サーバサイドの担当者間で共有しました。インターフェース仕様はプロダクトの成長に応じてどんどんアップデートしていくため、アプリ側の挙動、サーバサード側の挙動はその都度明確にしておく必要があったためです。
Google Spreadsheetでは変更履歴の管理も行えるため、いつ誰がどこに手を入れたかが簡単に分かる仕組みになっています。このため「この仕様はいつ決まったんだろう?」といった問題に悩まされることなく、円滑にインターフェース仕様を共有することができました。
サーバサイドはHerokuの30秒制限を意識する
Herokuで気をつけなければいけない制約として、以下の制約があります。
- リクエストを受け付けてから30秒以内にレスポンスが返らない場合はタイムアウトになる。
- 1Dynoにつき同時に受け付けることのできるリクエストは1つだけである。
1リクエストにまるまる30秒使える訳ではなく、リクエストが集中した場合は実際に処理されるまでの待ち時間も含めてカウントされるため、より素早いレスポンスを心がける必要があります。
サーバサイドのパフォーマンスチューニングによって対応する手段もありますが、より効果的なのは、リクエスト自体を細かく分割する方法だと思います。「AnkiBlank」ではデッキの同期時に全てのカードの情報をアプリ・サーバ間で同期しますが、この同期を1リクエストで行ってしまうとカードのデータ量に応じてタイムアウトの発生する確率は高くなります。そのため、同期の際は1カードずつリクエストを分ける手段をとることで、タイムアウトの発生を抑えました(カード同期中に途中で失敗した場合はトランザクションとして誤ったデータがサーバにストアされてしまうため、その場合の実装は別途行う必要があります)。
さらに細かく、アップロードとダウンロードとでリクエストを分ける手段も検討しましたが、現状ではカード単位のリクエストでタイムアウトを抑えることができています。
1リクエスト単位のデータ量と処理量については意識して設計する必要があります。
拡大するスマホアプリ開発に向けて
これまで全4回にわたり、ツールを活用した無駄のないチーム開発についてご紹介しました。スマホアプリとサーバサイドを連携させる仕組みはポピュラーではありますが、インターフェース仕様等様々な取り決めを行う部分があるため、プロジェクトを推進していく上で問題が起こりやすい仕組みであるとも思います。ぜひ、ご紹介させて頂いたツールを活用して、無駄のないチーム開発に取り組んでみてください。
ここまで読んで頂き、ありがとうございました。