[[📒Productivityを上げるために大切な100のこと]] No94. 🥈 ---- 有名な法則の1つに[[コンウェイの法則]]というのがある。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://en.wikipedia.org/static/favicon/wikipedia.ico" /> <span class="link-card-v2-site-name">en.wikipedia.org</span> </div> <div class="link-card-v2-title"> Conway's law - Wikipedia </div> <a href="https://en.wikipedia.org/wiki/Conway%27s_law"></a> </div> 組織が設計するシステムは、その組織のコミュニケーション構造に沿ったシステムを設計してしまうというものだ。このことから、成熟していない組織では==プロジェクトとプロダクト群はほぼ同じスコープとなることが多い==。 ## プロジェクトとプロダクトが密結合の場合に起こること たとえば`Minerva`というサービスがあったとする。初期の組織構造はこうだ。 ``` Minerva PJの扱うプロダクト - Minerva ``` 時が進むにつれ、このサービスはいくつかのバリエーションを持つようになる。 ``` Minerva PJの扱うプロダクト - Minerva - Minerva mobile - Minerva premium - Minerva enterprise ``` これらはターゲットが異なる。たとえば`Minerva enterprise`は法人向けだ。さらに時は進み、組織はコンシューマーと法人それぞれに見合った組織を作ろうとする。 ``` コンシューマーPJの扱うプロダクト - Minerva - Minerva mobile - Minerva premium 法人PJの扱うプロダクト - Minerva mobile - Minerva enterprise ``` リポジトリは問題ない。リポジトリはプロダクトごとであり、その構成は易々変更できるものではない。つまり以下のままだ。 ``` リポジトリ - Minerva - Minerva mobile - Minerva premium - Minerva enterprise ``` 一方でそれ以外のもの、例えば[[Jira]]のような課題管理システム、[[Confluence]]のようなドキュメンテーションシステムはそうはいかない。それらは、==プロジェクトに依存して構成されていること==がある。つまり以下のようになっていたのだ。 ``` Jiraプロジェクト - Minerva PJ Confluenceスペース - Minerva PJ ``` 幸い、中の構成がプロダクトごとに疎結合となっていれば実害はほとんどない。だが、そうでない場合は==[[Jira]]や[[Confluence]]の中身を棚卸して、適切な粒度に切り分け移動しなければいけない==。これは非常に手間のかかる作業であるため、作業自体が放置されてしまうこともあるだろう。 ## プロジェクトとプロダクトを疎結合にする 対策は簡単だ。単なる組織構成であるプロジェクトの依存関係を極力薄くする。具体的には以下のように管理しておけばいい。 ``` Jiraプロジェクト - Minerva - Minerva mobile - Minerva premium - Minerva enterprise Confluenceスペース - Minerva - Minerva mobile - Minerva premium - Minerva enterprise ``` 冗長な部分があるかもしれないが、その場合は`Minerva`に集約するなどすればいいだろう。**プロジェクトである`Minerva PJ`に紐づける必要はない**。 そして、各リポジトリ、Jiraプロジェクト、スペースに**それらのプロダクトを管理する組織の権限を付与**すれば完成だ。==組織が変わったときの作業は権限の付け替えのみで済む==。 ここまでしなくても、Jiraプロジェクトやスペースの中でしっかり分離するよう設計をすればいいのではと思うかもしれない。だがそれはコーディングにおいて、**1つのファイルにまとめても、関数やクラスの設計が疎結合になっていればよい**と言っているに等しい。それが何を意味するかはここで説明するまでもないだろう。 ## プロジェクト単位のモノは不要なのか 組織のプロジェクト単位で作成された[[Jira]]プロジェクトや[[Confluence]]スペースは不要なのか。答えはNoだ。プロダクトとは独立して進める以下のような作業では、プロジェクト単位のモノも必要だろう。ざっくりいうと、**プロダクトと関係が薄いものだ**。 - プロジェクトや案件の進捗管理 - プロジェクトの運営やメンバに関すること これでようやく、プロジェクトとプロダクトが明確に分離できる。継承ではなく委譲の関係だ。プロジェクトマネージャーとプロダクトマネージャーもお互いの領分に集中できるだろう。 言葉にするとほんの100行だが、実際にこれらを実施することは決して簡単ではない。だからこそ、[[コンウェイの法則]]が現代でもムーブメントとなっているのだ。