ラスト1か月を炎上させないためのプロジェクトマネジメント

こんにちは、サイオステクノロジーの佐藤 陽です。
「SIOS社員が今年一年で学んだこと」のアドベントカレンダー 21 日目です。

私は元々サーバーサイド側のエンジニアでしたが、今年は自身初となる PM(プロジェクトマネージャー)として多く活動した 1 年でした。
この 1 年の経験から、プロジェクトマネジメントにおいて特に重要だと感じたポイントを備忘録も兼ねて紹介します。

はじめに

私はプロジェクトマネージャーとして、とある Web システム開発プロジェクトを担当しました。 Web システムの内容としてはよくあるもので、ここでは仮に「オンライン書店システム」を構築したとします。
概要としては、ユーザーが本を検索・購入できる機能を持ち、管理者が在庫管理や注文処理を行うシステムです。

システムの構成としてはフロントエンドがあり、バックエンドがあり、外部 DB があり、Azure 上にデプロイされるというものです。

はじめに要件定義を行い、設計・開発と順を追って進めていきました。 開発の中でいくつか課題は出たものの、致命的な遅れは発生せず、なんとかバッファを使いながらも予定通り進めていきました。

しかし、プロジェクトの終盤、リリース直前のタイミングにおいて多くのバグが発生し、ラスト 1 ヶ月は非常に高い負荷での対応に追われる形となってしまいました。

このとき、メンバーには非常に負担をかけてしまい、とても反省したポイントです。
そこでこの経験を踏まえて、なぜプロジェクトが最後の 1 ヶ月で非常に高い負荷の状態になってしまったのか、そしてそれを防ぐためにはどうすればよいのかを考えました。

なぜ最後の 1 ヶ月が苦しくなったのか

直接的な要因は、リリース直前のタイミングにおいて多くのバグが発生したことです。

ただし、アプリケーション開発を行うにあたってバグが発生すること自体は、ある程度は避けられないものだとも思います。
そのため、このときに本当に問題となったのは、「リリース直前のタイミングで、大量の」 バグが見つかってしまった点だと考えました。

なお、バグの主な原因としては以下のようなものがありました。

  • 仕様の解釈ズレ
  • フロントとバックエンドのインターフェース不整合
  • クラウド(Azure)環境特有の制約

そして、これらのバグがリリース直前まで潜んでしまっていた要因として、次のような点が挙げられます。

  1. フロントとバックエンドを結合した構築が遅れていた
  2. クラウド上にアップロードしての動作確認が遅れていた
  3. 1 と 2 のような環境が、気軽に触れられる状態になっていなかった

それぞれの実装時に、各機能の単体での動作確認などは行っていましたし、コードの品質も一定のレベルでは担保できていたと感じています。

ただし、いざクラウドにデプロイしてみると想定外のエラーが発生しましたし、 フロントとバックエンドとの連携がうまく取れておらず、リクエストやレスポンスに不整合が多く発生しました。

また、実際のアプリケーションを気軽に触れられる環境がなく、 UI を操作しての総合的な動作確認というものが十分に行えていなかった点も大きかったと感じています。

これを踏まえると、今回の記事で伝えたいことは次の 3 点です。

  • 早めにフロントとバックエンドを結合しておきましょう
  • 早めにクラウド環境へデプロイしましょう
  • 誰もが最新の環境を気軽に触れるようにしておきましょう

ただ、こういったことは既に色々なところで提唱されているはずだ、と思い少し勉強してみました。
そうすると以下のようなキーワードが引っかかりました。

  • ウォーキングスケルトン
  • フェイルファスト

せっかくなので、これらの考え方について学んだ内容を少し体系的にまとめていきたいと思います。

ウォーキングスケルトンを早く作る

1997 年に Alistair Cockburn によって名づけられたもので、「小さなエンドツーエンド機能を持つ、ごく小さな実装」として定義されています。

本番さながらの構成すべてを作り込む必要はなく、主要なアーキテクチャ要素(フロント、バックエンド、データベース)などが必要最低限に繋がった状態を指します。 スケルトン(骸骨)でありながら、ウォーキング(歩く)ことができる、というイメージと直結しますね。

例えば、上記の「オンライン書店システム」の例でいうと、

  • フロントエンド:検索画面のみ
  • バックエンド:書籍一覧取得 API のみ
  • データベース:書籍情報テーブルのみ

といった主要な要素がひとまずすべて繋がり、「検索画面から書籍一覧を取得して表示できる機能だけが動作する」状態がウォーキングスケルトンにあたります。
機能としては最終想定のものから大きく欠如していますが、主要な要素がすべて繋がって動作している点が重要です。

ここで気になるのは「MVP(Minimum Viable Product)」との違いです。

MVP はユーザーに提供することを前提とした「最小限の製品」です。 つまり、「最小限」といいつつ、ユーザーが目的を達成できるレベルの機能を持ちます。
ここで求められているのは、ユーザーの要望を実現できているか、です。

一方、ウォーキングスケルトンはあくまで内部向けの成果物であり、求められているのは「ちゃんと端から端まで動くか」を確認することです。

ウォーキングスケルトンが作られるのは、プロジェクトのかなり早い段階であるべきと考えられています。 Cockburn 氏の書籍では、以下のように述べられています。

大規模なプロジェクトが進行中でした。それは、リングを介してシステム間でメッセージをやり取りするというものでした。もう一人のテクニカルリーダーと私は、最初の1週間以内にシステム同士を接続し、リングを介して単一のヌルメッセージをやり取りできるようにしようと考えました。こうすることで、少なくともリングは動作するようになりました。 そして、毎週末には、その週にどんな新しいメッセージやメッセージ処理が開発されても、リングが完全な状態を維持し、前週のメッセージをすべて確実に通過させることを義務付けました。こうすることで、システムを制御された方法で拡張し、各チームの同期を維持することができました。

要するに、最初の 1 週間で「動く全体像(骨組み)」を作り、その後も常にリング全体が壊れていないことを保証し続けることで、複数チームが安心して機能追加できる状態を保っていた、という話です。

一度骨組みができたら、そこに少しずつ『肉付け』をしていきます。 具体的には、新しい API や画面を追加していく、既存の機能を拡張していく、といった形になります。
この時重要なのが、「ウォーキングスケルトン全体が常に動作する状態を保つ」ことです。
新しい要素を追加したり、既存の要素を拡張したりするたびに、全体がちゃんと動くかを確認しながら進めていきます。

また、こういったウォーキングスケルトンが存在すると、早めに様々なメンバーに触ってもらうことができ、様々なバグ報告やフィードバックが早期に得られます。

まさにこれがウォーキングスケルトンを用意する最大のメリットで、「いつでも触れる環境が早期から整備されている」ことで「後からまとめて問題が噴き出す」のをある程度防げることです。

また、ここで重要になるのが、「早めに CI/CD 環境を構築しておくこと」だと感じました。

例えば、次のような仕組みをプロジェクト序盤から用意できていると、ウォーキングスケルトンを常に動く状態で保ちやすくなります。

  • フロントエンドやバックエンドに関して PRがマージされるたびに
    • 自動でビルド・テストが走る
    • クラウド環境に自動でデプロイされる

こうしておくと、高い頻度でテストが実施されますし、 誰でも触れる最新の環境がクラウド上に常に用意されるため、色々な人に触ってもらいやすくなります。

ウォーキングスケルトンと CI/CD をセットで早期に整えておくことで、「いつでも動く骨組み」と「いつでも触れる環境」が両立し、結果として後半になってからの問題の噴き出しをかなり抑えられるはずです。

今回のプロジェクトでは、こういった「触れる環境の構築」がだいぶ後回しになってしまい、結果的に「まとめてバグが出る」状況を招いてしまいました。

もし開発のかなり早い段階で「検索画面から書籍一覧を 1 件だけ取得する」程度のウォーキングスケルトンを作っておけていれば、 こうした問題の多くは、ラスト 1 ヶ月ではなく、もっと余裕のあるタイミングで潰せていたはずだと痛感しました。

フェイルファストで早く失敗する

フェイルファストは、「失敗するならできるだけ早く、できるだけ小さく失敗しよう」という考え方です。
Google などでも採用されている考え方で、シリコンバレーのスタートアップ企業などで重要視されています。

今回のプロジェクトで言えば、

  • フロントとバックエンドを結合してみたら意図しない挙動が多く発生した
  • 開発の終盤で結合環境をデプロイして結合テストを落としたら多くのバグが見つかった

といった、ラスト 1 ヶ月で実際に発生していた事象を、もっと早い段階から意図的に踏みに行って潰すべきでした。

そして、先ほど紹介した「ウォーキングスケルトン」の手法と「フェイルファスト」のマインドは非常に相性が良いです。
ウォーキングスケルトンを早期に作成し、早めの検証を行うことで、

  • 仕様の解釈ズレやインターフェースの不整合
  • クラウド環境特有の制約

といった問題に、プロジェクトのかなり早い段階でぶつかり、そして潰しておくことが可能です。

また、ここで見落としがちなのが、チームのマインドセットです。

細かいミスを見つけたときに、それをためらわずに共有できる雰囲気づくりが欠かせません。
例えば、次のような文化が根付いていると理想的です。

  • バグを報告した人が責められない
  • むしろバグを見つけたら「ありがとう」と感謝される
  • チーム全体で品質向上に取り組む姿勢が共有されている

とはいえ、マインドセットだけではなかなか維持できないので、それを後押しするための「仕組み」も用意しておく必要があります。
例えば、バグや問題点を見つけたらすぐに報告できる運用フローを整備しておくことが重要だと考えています。

ポイントは、「迷わず機械的にフローに載せられるようにしておく」ことです。
そのために、GitHub 上にバグ報告用の Issue テンプレートを用意しておき、見つけた人はそれに沿って淡々と記入するだけにします。 その後の優先度付けや担当アサインは PM が引き取り、適切にハンドリングしていきます。

Slack などで都度報告して…となると、「文章をどう書くか」「どう報告したらよいか」といった形で迷いが生じ、 「このくらいのバグなら大きな支障もないし、まあいいか」となってしまうことも無いとは限りません。

まとめ

今回のプロジェクトでは、ラスト 1 ヶ月で多くのバグが発生し、メンバーにも大きな負荷をかけてしまいました。
振り返ってみると、バグが潜伏していたことよりも「バグが発見されるタイミングが遅すぎたこと」が、大きな要因だったと感じています。

  • ウォーキングスケルトンを早期に作ること
  • フェイルファストの考え方で、小さく早く失敗すること
  • それらを支える CI/CD や「触れる環境」と、バグ報告を歓迎するチーム文化を整えること

これらを意識できていればば、ラスト 1 ヶ月の過ごし方は大きく変えられたかもしれません。
自分自身への戒めも込めて、次のプロジェクトでは、今回の反省を活かしていきたいと思います。 

ではまた!

参考リンク

https://67bricks.com/blog/what-is-a-walking-skeleton-and-why-do-i-need-one

https://wiki.c2.com/?WalkingSkeleton

https://web.archive.org/web/20080511171042/http://alistair.cockburn.us/index.php/Walking_skeleton

https://henko.net/blog/break-down-silos-with-a-walking-skeleton/

 

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です