池田尚史氏に聞くチーム開発の極意「進め、現場のチーム開発 ~チーム開発実践入門」レポート

6月19日、DeNAヒカリエ本社の会議室にてDevLOVEのイベント進め、現場のチーム開発 ~チーム開発実践入門~が開催されました。本稿ではチーム開発実践入門の著者である池田尚史氏@ikeike443の発表を中心にレポートします。

イベント開会の挨拶 ~DevLOVEとは

DevLOVE主催者である市谷聡啓氏@papandaの挨拶をもってイベントが開催されました。DevLOVEは6年続けている開発者向けのコミュニティで今回は170回目の開催とのこと。

HangarFlight

飛行機乗りにとって、空がまだ未知で危険なものだった時代。格納庫に集まってお互いの体験を話し合い、空を知ろうとしました。DevLOVEはまさにそういう場にしようという思想のもと作ったイベントだそうです。デベロッパーにとっては、開発の現場とは未知なるもの遭遇の場です。⁠Hangarに集まって、お互いの経験を話し合い、システム開発を知る」というコンセプトで開催されています。

DevLOVE主催者の市谷聡啓氏
画像

「チーム開発をスムーズにするために何ができるか」

「言いたいことは本に全部書いてある⁠⁠、そう言って池田氏の発表が始まりました。

スライド「チーム開発をスムーズにするために何ができるか」

今回は本の中身に少し触れつつ、チーム開発の課題ってそもそも何なのか、プロジェクトの課題、ツールの情報は散逸していること、執筆にあたって気にしたことについて話が進みました。

池田尚史氏
画像

チーム開発の課題

チーム開発について語る前に、ソフトウェア開発やプロジェクトについて触れる必要があります。ソフトウェア開発プロジェクトによくある課題として、次の事柄を取り上げました。

プロジェクトの目標が定まっていない

よくある過ちで「プロジェクト達成の定義」がされていない状態でプロジェクトが進むことがある。これでは、いつまでたってもプロジェクトが完了することはない。

誰が要件を決めるのか不明

誰がOKと言えば良いか、決裁者が不明のままプロジェクト進行することがある。また確認する人が居ない状態でプロジェクトが進むと、最終成果物が思っていたものと違う可能性もある。

価値を提供できているのか不明

プロジェクトの目標や要件が決まっていても、そこに価値がなければ成功とは言えない。プロジェクトを進める意義はあるのか、利益が度外視されていないかなどの共通認識で持っておく必要がある。

リスク管理ができていない

いわゆるプランBが無い場合に一つの失敗ですべてが破綻するプロジェクトもある。プロジェクトを進める上で、リスクヘッジのための代替策は用意しておくべき。

チームがパフォーマンスを出していない

一人で開発していた時のパフォーマンスが100%の時、2人になったからといって200%にはならない。

これらを言い換えると、次の言葉になります。

  • ゴールはどこ?
  • 決めるのはだれ?
  • 利益は出るの?
  • リスクは見えているの?
  • チーム開発はうまくいってるの?

「見ての通り、⁠チーム開発⁠はあくまでプロジェクトの問題の一部であり、それだけでプロジェクト全体が改善するわけではない」と池田氏は述べていました。

チーム開発を始めるにあたって考えるべきことについては、次の事柄を挙げました。

  • 方法論はどんなものを使うの?
  • コミュニケーションプランはどうする?
  • 成果はどう測るのか?
  • チームビルディングはどうする?
  • 開発ツールはどう使うのか?

ツールで解決できる問題

このようにツールはあくまでチーム開発を進める上で考えるべき事象の一部でしかない。そしてチーム開発は、プロジェクトを成功に導くための大事な基礎であると話しました。

プロジェクト > チーム開発 > ツール

チーム開発をしていく上では、次の課題を挙げました。

  • 市場の変化は早い
  • 計画は容易に変わり得る
  • 臨機応変に変化に対応しなければならない

これらの課題に対応するためには、次の点が重要だと言います。

  • 遅すぎる開発サイクルはNG
  • 複数人が素早く並行して開発できること
  • でもデグレードは起こしてはいけない

そして、ツールで解決できる問題として、次のことを挙げていました。

  • 重要メールが多すぎて優先順位が決められない
  • テスト環境で動かしてみるまで、アプリが壊れていることに気づかない
  • 自信を持ってリファクタリングできない
  • バグの発生時期、修正時期がわからない、追跡できない
  • 開発環境で動くものが本番環境では動かない
  • リリースが複雑で属人的、時間がかかる、よく失敗する

本を執筆するにあたって気にしたこと

ここ3~5年Webを見て実践し続けている人なら新しいツールを活用できるだろうが、新人さんや訳あってキャッチアップしてこれなかった人はどうなるんだろう?ということを考えながら、チーム開発実践入門の執筆にあたったそうです。

また、これまで出版されたプロジェクト管理本の多くは次のような切り口で取り上げていると言います。

  • 予算管理の話
  • 工数管理、見積もりの話
  • チームのモチベートの話
  • 採用の話

これらはもちろん大事ですが、⁠作らない人」の 話ばかりです。

逆に「作る人」向けの、開発ツールに関する本の多くは次のような切り口で取り上げていると指摘しました。

  • ツールの紹介
  • インストール方法、コマンド解説
  • 事例紹介
  • チケット管理、バージョン管理、CI、CD等々をバラバラに解説

池田氏は、それぞれの本は担当している人にとってはたいへん有益な情報が載っているが、チーム開発全体を俯瞰できるわけではないことに言及し、⁠開発の流れ全体を把握したいという方にチーム開発実践入門を読んでいただきたい」と述べていました。

2012~2013年に起きた開発環境の変化

執筆の話を受けた2012年頃の池田氏の開発環境は次のようなものでした。

  • SVN/Backlog/Bugzilla/ReviewBoard/Jenkins
  • Git/Githubはまだ試している段階
  • Chef/Vagrantはまだまだ本格的ではなかった

この当時に執筆していたら今回のような本には仕上がらなかったと言います。なぜなら「2013年にCIは当たり前になってきた」⁠このような背景とGitHubも使う会社も増えてきて、デプロイの自動化周りを支えるツールもホットになってきた」⁠2012年ではなく2013年から2014年にかけて執筆したからこそ、良い本に仕上がった」と話していました。

自身のトラウマが克服するための自叙伝でもある

特に第2章「チーム開発で起きる問題」は池田氏の実体験を元に執筆し、自身のトラウマが克服するためにも書いていました。そして、自分が体験してきた、トラウマになっているような現場で働いている人たちを少しでも減らしたい。手助けになればという想いを込めたそうです。今回の発表のまとめとして、池田氏は、

『チーム開発実践入門』が開発現場のゴールへの地図になれば

という言葉で締めくくっていました。

各章の紹介

次に、書籍チーム開発実践入門の各章を紹介しました。

第1章:チーム開発とは

最適なプラクティスはケースバイケース。これをやれば正解というのはなく、状況に応じてベターなパターンの組み合わせが何通りもある。自分が関わるプロジェクトに最適なプラクティスを選択できるかが鍵。

第2章:チーム開発で起きる問題

チーム開発の現場で実際に起きがちな問題をケーススタディで紹介。池田氏の実体験を元に書かれている。ありがちな問題として次の事柄がある。

  • 課題管理ができていない
  • デグレードが頻発
  • 環境ごとに動きが違う

それらの問題の解決策を3章以降で解説していく。

第3章:バージョン管理

バージョン管理はチーム開発をスムーズにするための基礎の基礎。この章ではデータベースマイグレーションに関しても解説している。また、バージョン管理システムの歴史に触れている。バージョン管理システムはこの20年で進化してきた。変化が激しいものなので、歴史を知ると色々と捗ることがあるはずだ。

20年前新人だった人は今は40代になり決裁権を持つようになっている。しかし、彼らがその激しい変化をウォッチしているわけではないので、その人たちには変化をウォッチして良いものを選択できるようにしてほしいと思っている。

第4章:チケット管理

チケット管理システムはOSS/商用のものがたくさんあり、それらについて紹介している。チケット駆動開発についても簡単に解説。次のように、チケット管理に向くフェーズ、向かないフェーズもある。

  • 定型的な課題監理に向いている
  • 流動的な課題の監理には否定形ドキュメントを使うべき

課題の粒度と使うべきツールについても示唆している。

第5章:CI(継続的インテグレーション)

ここまでの章を実践すれば普通のチーム開発が回せるようになってくるはず。継続的改善に必要不可欠なのがCI。

(ここで、CIを現場で導入しているかどうかの質問をしたところ、会場の人は半分ぐらいの人がCIが現場に入っていると挙手していました。)

CI導入がどうして必要不可欠なのかは次の2点が挙げられる。

  • 市場の変化のスピード
  • コストメリット(CIを導入することで最終的なコストは削減される)

CIについてはJenkinsをベースに解説。市場の変化のスピードについていくためには、たくさんの改修やリファクタリングする必要がある。それらをするためにはCIを回さなければ品質が保てない。Pull RequestをCIする方法(GitHub Pull Request Builder Plugin)の解説やTravisCIにも触れている。

また、CIの運用について説明をしており、その一環でビルドが壊れた時のゲームについても写真付きで解説。例としてビルドを壊した人がシルクハットを被って業務に望むという罰ゲームの事例を紹介していた。ビルドを壊した人を言葉で攻め立てるわけではなく、ゲーム感覚で罰ゲームを設けるぐらいが良さそうとのこと。

第6章:デプロイの自動化(継続的デリバリー)

第6章は株式会社シャノン、本稿執筆の藤倉が執筆。この章は様々なツールに関して紹介している。執筆中に情報のアップデートがあり、特に2013年から執筆開始したメリットがあった。Bootstrapping, Configuration, Orchestrationの3フェーズに分けて解説し、ツールの例としてKickstart, Vagrant, Chef, Capistrano, Fabric, Serverspecを活用したデプロイの自動化や、クラウド時代のブルーグリーンデプロイメントについて取り上げた。またPaaSも使ったデプロイについても紹介している。

ただし2013年終わりから2014年前半に爆発的にヒットしたDockerを始めとするimmutable infrastructureについては触れるに留まったことが心残り。

第7章:リグレッションテスト

第7章は株式会社シャノンの井上氏が執筆し、受け入れテストとそのリグレッションの自動化について解説。ここでいうテストはユニットテストとは異なる。意外とこの分野に関して情報はあまり公開されていない。デグレードを絶対に起こさず機能追加していくには必須の考え方。特にB2B向けのサービスでは重要。

(井上氏は上海から執筆していました。また当日は上海から帰国していました。)

共著の両名は池田氏の前職の同僚で、B2B向けSaaSを開発・運用していました。ここではデグレードしないというのは非常に重要で、そこではリグレッションテストの自動化が必須になっていた。この章ではシャノンで実践しているSelenium1を使ったリグレッションテストの自動化について説明している。

(ここでSeleniumを使ったテストを現場で使っている人について質問しましたが、挙手はパラパラと挙がる程度でほとんどいませんでした。)

時間のかかるSeleniumテストの高速化についても解説。一般的に言ってプログラミングが不得意な人の多いQA担当者とともに、いかに効率的に受け入れテスト自動化に取り組むかについても示唆している。内容としては2年ほど前にJenkinsユーザカンファレンスにて井上氏が発表した内容がベースになっている。

まとめとして、本書は特定の技術的の深い話題を扱っているわけではなく、広く解説しているので新人さんや技術トレンドに疎い人に読んでもらい、チーム開発のプラクティスの一例を感じ取ってほしいという狙いで書いたと述べていました。

本の中身から漏れたもの

なお、次の事柄はストーリー上の理由やページ数の都合上省かれました。別の機会があればこういったことも紹介したいとのことです。

  • プロジェクトの見積もり、計画
  • 運用における振り返りと改善企画
  • サービス企画、製品企画と開発を両立するには
  • コードレビューのやり方、ツール
  • コーディング規約
  • エディタの使い方、フォーマットのそろえ方など
  • 開発環境を良くするための予算のたて方稟議の通し方
  • スモールスタートのやり方
  • etc, etc, etc...

以上で池田氏の発表は終わりました。

チーム開発の課題について参加者全員でディスカッション

次に、チーム開発の課題について、参加者同士でディスカッションを行い意見交換する時間が設けられました。

画像

参考テーマとして次の項目を挙げています。

  • ① 新人を率いてチーム開発をする際のポイント
  • ② チームとして、成果を出すためにどうやってチーム力を上げていくか、優先してすることがあれば教えてほしい
  • ③ 例えば影響力がない人でもどうやれば、良いチーム作りができるのか
  • ④ 例えばRedmineひとつにしても、会社的に重要と思われている傾向の中、上の人をどう説得すればいいのか
  • ⑤ オフショアチームや文化が異なるメンバーとのチームビルディング
  • ⑥ チームで同一の方向を向いてやっていくために必要なこと
  • ⑦ ツールに関して運用フローやHowToの社内ドキュメントを書く?書かない?
  • ⑧ どうやって導入していくのか。具体的な導入の苦労話を聞いてみたい
  • ⑨ 企画・エンジニア間のコミュニケーションを円滑に進めるためには

最初はパラパラとしか会話が聞こえてこない感じでスタートしましたが、だんだんと会場内の熱気が高まってきていました。まさにDevLOVEのテーマでもあったHangarFlightという言葉がピッタリな雰囲気が出ており、参加者全員各々の持っている課題やその解決策についてぶつけあっていました。

グループディスカッションの様子
画像

池田氏に質問

グループディスカッションを踏まえて、参加者から池田氏への質疑応答を行いました。

Q:新しいツールをいれる際の教育コストについての質問です。一番詳しい人がやり方を教えるなどの方法があると思うがどういう方法が良いでしょうか。

A:あなたが、プロジェクトマネージャーという立場であれば、業務プロセスに入れてしまい「使わざるを得ない」という状況にしてしまえば良いでしょう。そうすれば自ずと使えない人は質問してきて、現場に落とし込まれていくはずです。

Q:大きいプロジェクトをやっています。いろんな開発ツールが出ているが、ツールの変更する場合、チームメンバーからの反発が起きてしまいます。例としてはSVNからGitに変える場合メリットを求められることがあります。こういった場合どうすれば現場に新しいツールを導入できるようになりますか。

A:プロジェクトが大変な状態では、無理にツールを変更する必要はありません。なぜならGitを入れることは目的ではないからです。また、反発するには理由があるはずなので、それをきちんとヒアリングしてみると良いでしょう。ヒアリング結果をちゃんと反映させることでより良い物になるはずです。もし新しいツールを現場に導入する場合は、次のプロジェクトやサブプロジェクトに導入するのをお薦めします。

Q:チームのメンバーを底上げするために必要なものは何でしょうか。チームメンバーのスキルはまちまちで、スキルレベルの低いメンバーを一定のレベルまで上げるにはどうすれば良いのですか。

A:地道な作業だがコードレビューをしっかりやる・勉強会を開催するということやると良いでしょう。コードをきちんと見てあげることが重要です。プログラムの成長は、良いコードに触れることだと思うのでそういった機会を地道に作っていくしかないかなと思います。

Q:本の中にコードレビューのことを書きたかったけど、書けなかったと言っていましたが、コードレビューをする場合どういったコツがあるのですか? 私達のチームではコードコードレビューの文化が根づいていません。

A:「コードレビューのコツは私が知りたいです」⁠会場笑い⁠⁠ コードレビューは大変・時間がかかるものというのを共通認識として持ちましょう。Pull Requestしたタイミングで、私の例で言えば、最低1人は指名してコードレビューしてもらった上でマージするようにするプロセスを構築します。スキルの低いメンバーのコードレビューは必ず見る・当番制にしてみんなで見るようにします。

個人的にコードレビューする時に気にしているのは、メソッド・関数名、変数名などを見ています。初見でそのコードの意図が読み取れないコードは危ないという経験則があります。

終わりに

世界中でチームで開発をしていて、自信をもって上手くいってると言えるような現場は多くはないでしょう。中にはデスマーチになり辛い思いをしている人も多くいると思いますが、チーム開発実践入門を手に取り、改善活動のきっかけや、進むべき方向性のヒントを手に入れてみてください。

おすすめ記事

記事・ニュース一覧