こんにちは。組織・基盤開発本部エンジニアリングマネージャーのid:daiksyです。
はてなでは、毎年夏にサマーインターンシップを開催しています。今年は京都オフィスでの講義パートと、リモートでのプロダクト開発実践パートとの2部構成での開催です。
ここでは、講義パートで実施した「チーム開発」講義の様子を紹介します。
講義の目的
はてなサマーインターンシップ2024では、インターン生は最終的にはてなで実際のプロダクトを開発しているチームに配属されます。そして配属先で、はてなブログなどの実際に運用中であるプロダクトの機能開発を体験します。
インターンシップ前半の講義パートは、後半のプロダクト開発にむけて、Webアプリケーションを開発するために必要なさまざまなことを学びます。以下のリストが今年の講義カリキュラムです。
- 講義「Web/HTTP/API」
- 講義「RDBMSブートキャンプ」
- 講義「コンテナ」
- 講義「コンテナオーケストレーション(k8s)」
- 講義「ライティング」
- はてなの編集スタッフによる、ブログによる情報発信の必要性と技術文書を書くためのテクニック
- 講義「フロントエンドブートキャンプ」
- 講義「インフラ」
- 講義「AI開発」
- 講義「チーム開発」
このエントリで紹介する「チーム開発」は、講義パートの最後のカリキュラムであり、翌日から実際の開発チームでスムーズに開発に取り掛かるための「チームの一員として開発するための要点」を学びます。
なぜチーム開発を学ぶのか
本講義では、まず「なぜチーム開発を学ぶ必要があるのか?」という問いについて考えてみます。
グループとチーム
人が集まってなにか特定の目的に向けた活動を行う場合、その集まりを大別すると「グループ」と「チーム」という分け方が考えられます *1
グループは、「各自の責任分野内で業務を遂行するのをお互いに助け合う目的で交流する集団」であり、その集まりの成果の上限は、個々のメンバーが投入した労力の総和です。
対してチームは、「協調を通じてプラスの相乗効果を生む集団」です。個人の労力の総和よりも、高い効果を発揮することが期待できます。
スポーツに例えると、グループは水泳や陸上のリレーのようなものです。グループのスコアは、その集団に属するメンバーの個人成績の合計になります。 チームは、サッカーやラグビーのようなもので、お互いに協調しなければ成果が出ません。個人の能力はもちろん重要ですが、チームとしての成果は単純に個人の能力を足し合わせるだけでは表現できません。
プロダクト開発はグループかチームか
プロダクト開発を行う際は、その開発・運用に必要なすべての職種の人が集められます。これを「職能横断型チーム(クロスファンクショナルチーム)」と呼びます。このようなチームは、お互いの仕事に依存関係が生じます。たとえば、UIデザイナーとフロントエンドエンジニアは、相互に情報をやり取りしながら仕事をしなければなりません。
さまざまな役割の人が、成果のために協調し、相互に依存しながら仕事をする必要があるため、プロダクト開発のための集まりは「チーム」であると言えます。このような集まりで仕事をするためには、各々が好き勝手に動いていては効果的な動き方ができません。つまり、相互に協力するための仕組みやルールが必要となります。そしてそれらを学ぶ必要があります。
複数の人間が協働するための仕組み
人間は昔から「複数の人が協力して大事を成す仕組み」を考案し続けています。たとえばピラミッドの建造には高度なマネジメントが必要だったに違いありません。このような歴史の延長上に、ソフトウェア開発のためのさまざまな開発プロセスが存在します。
本講義では、はてなでのチーム開発に必要な最低限のことを学んでもらうため、開発プロセスの詳細な解説は省きますが、ここ数年のはてなではアジャイル開発の手法の1つである「スクラム」を使うチームが多いです。
チーム開発の要点
この講義で最低限身につけて欲しい、チーム開発で重要なポイントは次の3点です。
- ゴールと計画の共有
- 途中作業の共有
- 成果物の共有(検査)
これらの要素を意識することで、チーム全体で共通認識を持ち、円滑に開発を進めることができます。
ゴールと計画の共有
チーム開発において、インターン期間中に最低限意識しておいてほしいことの1つ目は、ゴールと計画の共有です。プロジェクトの目的や、どのような順序で開発を進めていくのか、このプロダクトによってもたらされる価値はなにか、それをどう評価するかなど、さまざまなことをチーム全体で共有しておく必要があります。
この認識がずれていると、各自がバラバラな方向に進んでしまい、後になってから「こんなはずじゃなかった」という事態になりかねません。認識を合わせるためには、目標の設定や管理、成果物の共有方法などを明確にしておくことが大切です。
一見すると簡単そうですが、これらの共有を実際にやるとなると難しいもので、さまざまなツールや手法があります。
- リーンキャンバス
- インセプションデッキ
- ユーザーストーリーマッピング
興味があればこれらの手法を調べてみてください。
途中作業の共有
チーム開発でインターン期間中に最低限意識しておいてほしいことの2つ目は、途中作業の共有です。
チーム開発において、各自がバラバラに作業を進めるのではなく、こまめに情報共有を行うことが重要となります。具体的には、自分が今どのような作業をしているのか、どこで困っているのかなどを共有します。
こうすることで、早期に問題を発見したり、他のメンバーからアドバイスをもらったりすることができます。 インターン後半はリモートでの活動になるため、ここは特に注意してください。オフィスや研究室で顔を合わせているときとは違って、お互いが意識して自分の様子を共有しない限り、チームメンバーに察してもらう、などということは期待できません。
日報やミーティング、チャットツールなどを活用して、積極的に情報共有を行いましょう。 また、手元のソースコードは長時間ローカルで抱え込まずにこまめにGithubなどへpushして途中経過を共有してください。
成果物の共有(検査)
チーム開発でインターン期間中に最低限意識しておいてほしいことの3つ目は、成果物の共有(検査)です。 チームで開発を行う以上、その成果物はチーム全体で共有する必要があります。 成果物を共有することで、メンバーやステークホルダーからフィードバックをもらったり、問題点を早期に発見したりすることができます。
また、こまめに成果物を検査することで、期待通りの品質に近づけるための改善を速やかに行うこともできます。
ワークショップ
最後に、講義内容を実際に体験してもらうために、「紙飛行機のワークショップ」を実施しました。
紙飛行機をきちんと飛ばすためには、メンバー全員が折り方を揃えておく必要があります。極端な例ですが、1人だけ誤解して折り鶴を折っていたら紙飛行機は完成しません。
1人1回しか折れないので、当然ですが前の人がどこまで折っているか、途中経過を共有できなければ自分が次にどう折ればよいのかわかりません。
最初のスプリントで質の高い紙飛行機を折るのは難しく、何度か改善を繰り返して品質は安定します。
これらを実際体験してもらいました。実施した結果は以下となりました。
最初は形にはなっているけど指定した距離を飛べない飛行機であったのが、スプリントを経るごとに質が上がっていきました。 ワークショップを盛り上げるちょっとした仕掛けとして、はさみとペーパーナイフを1つずつ用意し、わざとチームによって道具が異なる、という状況を作りました。「使ったことがなくておもしろそうだから」という理由でペーパーナイフを選択したチームは、最初は紙を切るだけで大苦戦をしていましたが、やがてストレスなく使いこなせるようになり、スプリントごとに飛行機の生産数が増えました。
最後に紹介するXのPostは、ワークショップ終了後に飛行機を片付ける id:daiksyの様子です。
午後からは @daiksy による「チーム開発」の講義でした💻
— hatenatech (@hatenatech) 2024年8月21日
座学の後は開発チームとして紙飛行機を作るワークショップ🛩️
紙飛行機は上手く作れたでしょうか?
#hatenaintern pic.twitter.com/OaDJcS0dEO
「チーム開発」はとても奥深いもので、学ぶべきことは膨大にあります。しかし、最も大事なのは「価値の高いプロダクトを素早く開発すること」です。本講義は短い時間での学習でしたが、要点を身に着けてより良いプロダクト開発を実践されることを願っています。
*1:『組織行動のマネジメント』スティーブン P.ロビンス著、髙木晴夫訳、2009年、ダイアモンド社