前回ご紹介したセミナーからデプロイゲート 藤崎 氏による発表 より良いアプリを作る為の開発効率化のすすめ をレポートしたいと思います。
1人のプログラマーが3ヶ月でアプリを開発しなければならないとします。しかし資料もないし、経験もない、社内としての案もない。でもいいアプリを作りたいという思いはあります。だから1秒も無駄もなく開発に使いたいのです。しかし、開発においては余計なことで時間が取られることが多すぎます。私たちはこれをなんとかしたいと思っています。
いいアプリを作るための自動化について
- なぜ自動化が必要なのか?
- 実践してみよう
- 得られるもの
- 一歩先へ
なぜ自動化が必要なのか?
開発が早くなると無駄がなくなり、残業が減ることで いいアプリを作る為に集中できる からです。
前提として、人間の意志は弱いものです。そこで気合と根性に頼らず、仕組みで解決しようと考えました。環境は自然と人を動かします。人に直接命令をして変えるのは難しいですが、環境は人を変えることができます。同じようにいいアプリを作ることに集中できる環境を作るための自動化をしたいと考えました。
例えばコードをコミットしたら自動でテストされ、テストが通らないとリリースできない仕組みを作ります。そうすると、ちゃんと動作確認しよう、テストしようとなります。テストをすることで品質が維持できます。
実際、自動化するためのツールとしてJenkinsがありますが、最大の導入効果は チームメンバの意識の変化 と言われています。
ここからテストを自動化した時の良い変化について紹介します。
暗黙知を減らす
暗黙知を減らすために自動化が必要だと考えています。暗黙知がなぜ良くないかというと、
- 管理していている人が居なくなると止まる
- 新しい人が入ってくるのが難しくなる
- できる人が限られるので周りの人の待ち時間が増える
といった具合に事業リスクが高まることです。自動化することで、
- 全てが記述されて再現可能に
- タスクが一人に集中しないのでスケール
- 動作が記録されるので追跡できる
暗黙知がなくなればリスクが減り、スケールするということです。
気軽に試せるようになる
コードを書いてコミットすれば、変更が誰でも見られるようになるのはとても大事です。世の中のアプリの99%は人が作って、人が使います。最高のアプリを作ろうとした時に仕様書だけではつくれません。作ったその場で使う人に見せて意見をもらって直すのが一番です。そして、作る人にとって建設的なフィードバックは、モチベーションが上がるという効果もあります。
Web開発ではデプロイが高速化しましたが、アプリ開発ではまだ工程が多すぎます。そのためアプリ開発ではフィードバックをもらうのが難しいのです。そのころ社内で作ったのがDeployGateの前身です。
DeployGateは簡単に扱えて、SDKがなくても使えます。アップロードするかCLIでプッシュして、URLを送れば誰でも見られるようになります。
自動化の目的
自動化で気合と根性に頼らず、開発に集中するだけでいいアプリが作れるようになります。
- 全体の見える化
- ビルド自動化
- テスト自動化
- デプロイ自動化
1.全体の見える化
まず最初に、全体を見える化します。現状が見えないのは不安なので、すべての情報を流す場所を作ります。Slack/HipChat/IRCなどにGithub/Sentry/Twitterなどから飛んでくる情報を見えるようにすることで開発者以外のメンバーにも今、開発で何が起きているか認識できます。コミュニケーションもスムーズになります。
開発が見える化すると、何かあったら誰かがすぐに気付いて対応できます。開発者もコードレビュー依頼が上がってきた、新しいバージョンができた、アプリがクラッシュしたなどが1箇所で見え、その場でやりとりできるようになります。もしテストが失敗したら、晒されているのですぐ直す気になります。
なんでも繋がるSlackがおすすめです。
2.ビルド
ビルドは他社のサーバを利用するか自社でサーバを立てるかなのですが、他社のでしたらCircleCIやTravis CI、自社でしたらJenkinsが良いでしょう。既に開発にGitHubを使っているならCircleCIを使いましょう。circle.ymlを書くだけで使えます。
3.テスト
まず、自動テスト環境を先に空でもいいから作ります。テストが失敗したら、ビルドが失敗してマージしないようにすれば、テストが失敗したらすぐにわかります。何か問題が起きたところから不具合を再現するテストを書くと同じ問題は二度と起きません。全てをテストで行おうとすると大変ですが、再発防止策としてのテストは有効です。
これもcircle.ymlに少し書きます。失敗すると、先ほどのSlackに赤い記号が飛んできます。赤は危険、今すぐ直さないと、緑は大丈夫という仕組みと文化を作ります。GitHub上でも安全なことが一目瞭然です。手元で実行を忘れたり気づかずマージすることもありません。普段から、信号で赤=なにかまずい、緑=大丈夫という習慣が身についているので、同じようにしておけば、環境は自然と人を動かします。
4.デプロイ
DeployGateではAndroidはgradle、iOSはshenzehenに対応しています。gradleはビルドスクリプトとcircle.ymlに、shenzehenはcircle.ymlに記述します。コミットするだけで、誰でも手元に更新の連絡が届く環境が10分でセットアップ完了できます。
自動化で得られるもの
タイムラインの一本化
- 誰が何しているか分かる
- 問題にすぐ気づける、その場で解決できる
- 開発者以外の人もコミュニケーションがとりやすくなる
テストとデプロイ自動化
- コード書いてコミットするだけなので、開発に集中できる
- 意識せずとも品質を維持できる
- とにかく作って、見て、直すが気軽にできる
Webと同じようなサイクルが実現し、いいアプリしか作れなくなります。
自動化する上で考えていく
人のコストは高いので、ルールを作りましょう。例えば3回繰り返すと自動化といった具合です。
よくある議論として、自社内でやるか外部サービスを使うかという点があります。外部サービスを使うことのリスクを考えることが多いですが、外部サービスを使わないで、作ることのリスクを考えましょう。今は20分で最高の開発環境が無料で作れます。自社でやろうとすると、担当者を決めたり開発をはじめるまでに時間がかかります。
今は開発者をサポートするツールがたくさんあり、昔は大企業じゃないと持てなかった仕組みを数名のスタートアップ企業でも持てるようになっています。外部サービスを活用するか、自社で開発保守運用するかはよく検討する必要がありますが、何もしないままでは生き残れないかもしれません。
自分たちの開発の本質に集中しましょう。外部サービスの活用はROIの非常に高い投資になるので、おすすめしたいです。
おまけとしてついてくるもの
- 新しい技術を積極活用というブランディング
- 新しい人がチームに入ってもなじみやすい
- 世界の開発者との共通言語
- もっと便利にしたい、改善しようというマインド
質疑応答
Q:DeployGateのプッシュ通知とNCMBのプッシュサービスをつかうのとの差は?
A:自前でやるか外部のサービスを使うかの差です。
Q:iOSとAndroid版の違いについて教えて下さい
A:iOSは制限が厳しいです。Appstore以外で配布できない点です。配布制限が厳しいです。社外でテストをやりたい場合、100台までになります。