「バックログアイテムごとに机を囲もうぜ」をスローガンにモブ作業をしたら、劇的な生産性向上を実感しました

チームでの開発が進む中、知識の伝搬やトラブルシューティングの効率化が求められることが多々あるかと思います。私たちもそうした課題に日々チャレンジしています。この投稿では、そうした中、私たちが取り組んでみて、チーム内のコミュニケーションが向上し、開発効率が大幅に改善された「バックログアイテムごとに机を囲もうぜ」という取り組みをご紹介したいと思います。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">スプリント振り返り会で生まれた標語です。 <a href="https://t.co/tmOWZ1xh3V">pic.twitter.com/tmOWZ1xh3V</a></p>&mdash; クラフトマンソフトウェア (@craftsmansw) <a href="https://twitter.com/craftsmansw/status/1633355922126012416?ref_src=twsrc%5Etfw">March 8, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 文脈

本稿ではチーム開発の効率化に焦点を当てますが、その文脈を説明しておいたほうがいいと思うので、少し弊社のチームについて触れます。

### やっていること

私たち株式会社クラフトマンソフトウェアでは自社サービスを開発しています。私たちの目標は「すべての開発が楽しさ100%になる」ことです。そのために、開発者がインフラの心配をせず、開発だけに集中できるPaaS（Platform as a Service）を開発しています。

技術スタックは、TypeScript、Rust、Kubernetes、そしてAWSです。PaaS機能を実現するために、画面にはTypeScriptを用いてフロントエンド開発を行い、バックエンドおよびKubernetesのオペレーターの開発にはRustを使用しています。現在は仮説検証フェーズにあり、とにかく速く動くものを作りたいという段階です。

### チーム

チーム構成については、以下の通りです。

- フルスタックエンジニア：1名
- フロントエンド開発者(TypeScript)：2名
- バックエンド開発者(Rust)：2名
- インフラエンジニア(Kubernetes, AWS)：1名

メンバーのスキルレベルにはばらつきがあります。例えば、Rustに詳しい人から、Rust入門者までいます。人によっては、担当領域をまたいで開発することもありますが、全員が全員オールラウンダーというわけではなく、各々が得意分野を持っているのが現状です。このため、チームのコラボレーションは定型化されているわけではなく、ベストプラクティスを模索しながら進めているフェーズです。

## 解決した問題

いままでどんな課題が私たちのチームに有ったのかを説明します。

### 知識伝搬の難しさ

特定の技術やインフラ構成に関する知識がチーム内で十分に共有されておらず、情報の伝達が困難である問題がありました。

### スタックによる役割分担の弊害

フロントエンド、バックエンド、Kubernetesオペレーターなど、異なる技術スタックによって役割分担が生じており、他分野の未知を既知にするための調整が必要ですが、それがオーバーヘッドになる問題がありました。

### 作業の停滞と作り直し

他分野の知識が不足しているため、作業が数日止まることがあり、未知のまま作業を進めた結果、後から作り直しが発生する問題がありました。

### トラブルシューティングの遅さ

他の人が作成したものを動かそうとする際に、トラブルシューティングに時間がかかる問題がありました。

### 非同期的な作業による問題の顕著化

メンバーが異なる場所や時間で異なるフィーチャーに取り組む際、上記の問題が顕著に現れることがありました。

### 初めてのタスクへの取り組みの遅さ

あるメンバーにとって初めてのタスク（例えば、Rust言語やソフトウェア設計）は時間がかかりますが、他のメンバーが詳しい場合でも、協力を得ることが難しい状況がありました。

### コードレビューによる出戻り

非同期的な作業でコーディングし、その成果物をプルリクエストという形でコードレビューを受けていました。中には、コードレビューのタイミングで根本から作り直すという出戻りが発生していました。コーディングにあてた時間の多くが無駄になるという問題がありました。

## 結合会という成功体験

結合会という会がうまくワークしました。結合会は、フロントエンド・バックエンド・オペレーター・インフラの各担当者が成果を持ち寄り、すべてのコンポーネントを結合してひとつ機能が動くようにすることを目標にする会です。会議室に集まり、テーブルを囲んで対話やトラブルシューティングしながら結合を進めました。

## バックログアイテムごとに机を囲もうぜ

このプラクティスは、上記の問題点を解決するために考案され、成功体験を原体験として導き出されました。

### 思想

「バックログアイテムごとに机を囲もうぜ」は次の考え方に重きを置いています。

- 同じトピックを同期的に取り組む
- 個人ワークではなくチームワーク
- コミュニケーションを重視

### ルール

#### 1つのバックログアイテムにフォーカス

チームでは同時に1つのバックログアイテムだけに集中することで、効率的なタスクの進行を促し、知識の共有を円滑化します。各メンバーが関連する技術やタスクを同時に学習・理解することで、スキルセットの向上と共有が促進され、プロジェクト全体の進行速度が向上することが期待されます。また、全員が同じ目標に向かって取り組むことで、チームの一体感も高まります。

#### 机を囲むレイアウト

メンバーはテーブルを囲むように配置されることで、コミュニケーションが容易になり、問題解決に迅速に取り組める環境を整えます。これにより、視線や声が届きやすい状態が保たれ、メンバー同士の相互理解が促されます。また、対面で議論ができることで、よりダイレクトなフィードバックが可能となり、問題解決のスピードが向上します。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「プロダクトバックログごとに机を囲もうぜ」をやっている様子 <a href="https://t.co/eiNzphKvEd">pic.twitter.com/eiNzphKvEd</a></p>&mdash; クラフトマンソフトウェア (@craftsmansw) <a href="https://twitter.com/craftsmansw/status/1636288208601485313?ref_src=twsrc%5Etfw">March 16, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#### 声を上げる文化の醸成

困った際には積極的に声を上げ、他のメンバーに助けを求めることを奨励します。このような文化を醸成することで、チーム内での知識の伝播が促進され、未知の問題に対処する際のオーバーヘッドが削減されます。同様に、困っているメンバーがいればすぐに助けることも大切です。積極的な支援を行うことで、チーム内での信頼関係が強化され、より円滑なコラボレーションが実現されます。

### テクニック

「バックログアイテムごとに机を囲もうぜ」を実践するにあたって次のような効果的なテクニックがあります。

#### VS Code Live Shareでのコード共有

VS Code Live Shareを利用することで、メンバー全員がリアルタイムで同じコードを編集・閲覧することができます。これにより、チーム内でのコードレビューやペアプログラミングが容易に実現され、コーディングの質を向上させることができます。また、問題が発生した際にも、他のメンバーがすぐにアクセスして解決に取り組むことが可能です。

#### 設計図を共有するモニターの活用

設計図やアーキテクチャ図を大きなモニターに表示し、みんなで共有しながら議論を行うことで、チーム全体での理解が深まります。明確なビジュアルが提供されることで、抽象的なアイデアや概念を具体化しやすくなり、メンバー間のコミュニケーションも円滑になります。また、必要に応じて設計図を随時更新することで、プロジェクトの進行状況をチーム全体で把握しやすくなります。

#### ブレインストーミングセッションの実施

アイデアの発散や問題解決に取り組む際には、ブレインストーミングセッションを実施します。このセッションでは、メンバーが自由に意見やアイデアを出し合い、さまざまな視点から問題にアプローチすることができます。新しい解決策や改善点が見つかることで、チーム全体での知識やスキルが向上し、プロジェクトの質も高まります。

### コードリーディングセッションの実施

必要に応じてコードリーディングセッションを実施することで、チームメンバーが互いのコードを理解しやすくなります。セッションでは、各メンバーが自分が担当したコードや機能を他のメンバーに説明し、質問や意見交換ができる場を設けます。これにより、コードの品質向上やバグの発見が容易になり、さらにチーム内での知識共有が促進されます。

## 採用しなかった代替手段

### フルスタックエンジニアリング

上の問題を解決するために、フルスタックエンジニアリングが検討されました。一つの機能をフロントエンドからインフラまで一人が担当するというものです。しかし、以下の理由から採用されませんでした。

- プロダクトの性質上、一人が担えるほど技術的に簡単なものではない
- 属人化が避けられず、知識が伝搬しにくい

## 成果

「バックログアイテムごとに机を囲もうぜ」という姿勢で取り組んでみて、様々な成果が実感できました。

まず、一緒に作っているという一体感がより強く感じられるようになりました。困っていたらすぐにフォローに入れる環境が手に入りました。一緒に作業しなければ知り得なかった他分野(例えば、TypeScript開発者にとってのRust)を学ぶことができ、他分野への関心と理解が深まりました。

次に、なにより嬉しかったことは、常に結合した状態で動くものがあるという安心感です。今までは、結合してみるまでの時間が1週間〜数週間と長かったため、不安な時間を過ごすこともありましたが、今は常に結合しているのでこれがありません。

最後に、今までの組み方と比べて、開発にかかる時間が大幅に短縮されました。これまでは、1つのユースケースを実装し終えるのに1週間以上かかっていたものが、1日目にはほぼ動く状態になり、翌日にはリファクタリングやテストにも着手できるようなスピード感に変わりました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">弊社AppThrustチームの昼休みの様子。 <a href="https://t.co/LQpFb4zwDD">pic.twitter.com/LQpFb4zwDD</a></p>&mdash; クラフトマンソフトウェア (@craftsmansw) <a href="https://twitter.com/craftsmansw/status/1636196356099547136?ref_src=twsrc%5Etfw">March 16, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 結論

「バックログアイテムごとに机を囲もうぜ」という取り組みを実践することで、チーム内での知識伝搬やトラブルシューティングの効率化ができるようになりました。同じトピックを同期的に取り組むことや、個人ワークではなくチームワークを重視し、積極的なコミュニケーションを心がけるようにしています。具体的なテクニックとして、VS Code Live Shareや設計図を活用することで、チーム全体での協力が円滑に進みました。この取り組みに興味を持った方はぜひ実践してみて、開発効率を向上させてみてください。