【組織設計】ソフトウェアの内部品質に生じる問題と組織設計の関係性

# はじめに

今回の記事は、松本 成幸（まつもと しげゆき）さんによって作成された Speaker Deck のスライド記事「[ソフトウェアの内部品質に生じる様々な問題は組織設計にその原因があることも多い / Internal Quality Issues Caused by Organizational Design](https://speakerdeck.com/mtx2s/internal-quality-issues-caused-by-organizational-design?slide=109)」を、スライド画像＋文章で個人的にわかりやすくまとめたものになります。

「ソフトウェアの品質と組織設計の関わり」について書かれたこちらの記事は私自身にとって非常に参考となるもので、備忘録として残すだけでなくせっかくなら他の方にもぜひ読んでいただきたいという思いで記事にしました。

<br>

※ご本人から許可をいただき記事内容やスライド画像を引用させていただいてます。

# 概要

![a (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/b4baba4b-1680-bf03-ee36-ba7b1a950189.png)


- テーマ
- 技術的負債とは？
- 悩ましいのは「無謀な負債」
- 原因となった組織設計のカタログ
    - 共有リソースプール
    - 不連続なチーム
    - 非オーナーシップ制
    - 保守・運用の分離
    - 品質保証の一極集中
    - 行き過ぎた固定化
    - ドメイン知識の過疎地
    - 無力な他己管理型チーム
- 組織設計はソフトウェア設計に影響する

# テーマ

![a (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/d3debb33-94c7-45a8-6888-8321d5322cc6.png)

今回のテーマです。

<br>
<br>

![a (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/fb90e632-aaf2-1967-3dcb-bfaa8ec29034.png)

一般的に「技術的負債」と聞いて連想するのは、

- 内部品質の問題
- 特に保守性の低下
    - 理解容易性
    - テスト容易性
    - 変更容易性

これらが原因となり、プロダクト開発の生産性が悪化します。

変更容易性で簡単な例を挙げるとすれば、共通化すべき機能をそのまま見送ってしまったことで、あとから機能変更やテストがかなり面倒になるあれのことです。

<br>
<br>


![a (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/929e2a20-e1b2-c56f-ac5d-3d7495936aea.png)

技術的負債に対しては、対症療法（リファクタリングやリアーキテクティング）を施しつつも根本的な原因を取り除かなければ新たな問題が増え続けることは変わりません。

そのため、対症療法だけでなく原因療法も必要不可欠となります。

<br>
<br>

![a (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/f3aab05c-e269-ae4e-c1a8-b958fc5cd3d2.png)

そこで、今回の記事では問題を生じさせている原因として「組織設計」に焦点を当ててみていきます。


<br>
<br>

# 技術的負債とは？

![a (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/15cd3086-b55c-a75a-4ce5-d3db3b5670c8.png)

技術的負債とは？

<br>
<br>

![a (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/5f24703b-e571-b7aa-ea61-78012131309a.png)

まず例として、あるプロダクトの３か月後のリリースを目指して開発チームを投入します。

<br>
<br>

![a (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/73af0256-1e82-9f9e-444f-d995741ce216.png)

しかし実際の工数としては４か月かかる開発のため、１か月分が不足しています。

<br>
<br>


![a (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/49a6d21d-73e5-1c35-7760-9b18ef758363.png)

負債を抱える前提で計画通りの３か月でリリースすることにします。

この段階で、１か月分の負債を抱えていることを開発チームは認識していますが、経営側は気付いていません。

<br>
<br>


![a (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/c5e008bf-3079-fed3-c0f7-d7631087cf7d.png)

では「１か月分の負債を抱える」とはどういうことか？

<br>
<br>

![a (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/4234a1f0-0c32-3bfa-ac81-e08673e6ebcf.png)

「１か月分の負債を抱える」ことと引き換えに、「あるべき内部構造とのギャップ」を１か月分残したということです。

<br>

３か月の時点でリリースをしていることが前提であるため、「見える機能（振る舞いに関するもの）」は理想と現実で一致しているはずです。（でなければプロダクトとしてお客様に提供することができません）

<br>

ですが、本来であれば４か月かかる開発を１か月分早めて見える機能を実現したことで、「見えない機能（構造に関するもの）」においては理想とのギャップが生まれてしまったことになります。

これが「あるべき内部構造とのギャップ」です。


<br>
<br>

![a (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/b4c22a7e-de05-f7be-bd8d-fdec70a3890a.png)

ここで負債と引き換えにした早期リリースのイメージを見てみます。

横軸がかかった時間、縦軸が機能数になりますが、負債を選択した方が生産性が高まるように見えます。

<br>
<br>

![a (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/6056d35f-3270-c4f6-36ac-878261fe1027.png)


ですが実際には、負債を重ねるほど生産性が低下していきます。開発者の方であればなんとなく理由がわかるのではないでしょうか。

内部品質の負債が大きくなるほど利息が膨らみ、保守性と生産性が低下します。

そしてそれらを放置してしまうと、あるタイミングで負債なしの開発と生産性が逆転しています。


<br>
<br>


![a (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/c8cb8545-23d1-0d5e-0f36-4179891b652c.png)

世界初のウィキを開発したアメリカのプログラマ「Ward Cunningham」の言葉です。

- 初回のコード出荷は負債を抱えにいくようなもの
- 危険なのは負債が返済されない場合
- 適切ではないコードに費やされた時間は全て、その負債の利息


<br>
<br>



![a (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/50a22d60-a8c7-2b9d-b776-b42bb829b806.png)

先ほどのプロジェクトの続きを見てみます。

<br>
<br>


![a (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/11d486e8-ca90-0ad3-bcfb-e7663f452b27.png)

仮に負債を抱えた状態で新しい機能を追加するとします。

<br>
<br>

![a (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/baf13226-1671-3b90-9b2b-5518d4fabca0.png)

そこで選択肢は２つあります。

1. 負債を抱えたままで、機能追加を進める
1. 負債を返済してから、機能追加を進める

<br>
<br>


![a (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/e2f5ddb2-c91e-67f1-f561-b2a2d21cc703.png)

### 負債を抱えたままで、機能追加を進める

負債を抱えたままででの機能追加は、結局利息の支払いによって生産性が落ちてしまい、リリースを遅らせることになります。

また、経営側は遅延している理由を認識できていません。

<br>
<br>


![a (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/67bd4a2b-cd7c-c4bb-941a-54fb7a436a24.png)

### 負債を返済してから、機能追加を進める

機能追加の前に負債を返済すると、その分リリースが遅れてしまいます。

また、負債の返済であるリファクタリングやリアーキテクティングの重要性について経営側から理解されないこともあります。

<br>
<br>


![a (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/c6551d6a-4c18-b207-6d95-1678ecc275a0.png)

上記の通り、いずれにせよリリースは遅れるということです。

<br>
<br>


![a (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/08006fe5-e195-d994-7c45-4874c30528fb.png)

リリースの遅れは遅延コストとなってビジネスに影響します。

例えばそのプロダクトによって100万円/月の利益が生まれるとするなら、リリースが２か月遅れることにより200万円の損失になります。

<br>
<br>




![a (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/c5333a83-94c9-6b46-f54b-95129f31aa79.png)



ではどちらを選択することが、合理的な意思決定となるでしょうか。

<br>
<br>

![a (24).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/a6b87a8c-3249-572c-2e4d-6f2f5f57fb73.png)

負債とは、その合理的な意思決定について話し合うためのコミュニケーションツールになります。

- 負債を抱えたまま機能追加を進めることで生産性が落ちるのはなぜ？（経営者）
- 技術的負債を返済することの重要性は？（経営者）
- リリース遅延によるビジネスへの影響は？（開発者）

<br>
<br>

# 悩ましいのは「無謀な負債」

![a (25).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/7e7e2087-7306-d487-c6c3-e1213989d322.png)

悩ましいのは「無謀な負債」

<br>
<br>

![a (26).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/a755e135-e68b-80e5-59bc-97b2d402778a.png)

この章では、組織設計がもたらす「無謀な負債」とその内部品質の問題について取り扱います。

<br>
<br>

![a (27).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/ab9550b0-904e-3f71-a58a-8fa96562269e.png)

アメリカのソフトウェア開発者の「Martin Fowler」による「負債の４分類」です。

横軸が「無謀」「慎重」、
縦軸が「意図的」「無自覚」になります。

<br>
<br>


![a (28).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/4cdac216-0669-7d0e-05c3-b9177171e2cb.png)


- その設計のままでのリリースが、負債と引き換えであることを...
    - 理解している → 意図的な負債
    - 理解していない → 無自覚な負債
- 負債によって生じる影響の大きさを適切に...
    - 評価していない → 無謀な負債
    - 評価している → 慎重な負債

これらを４つの象限に分類すると、

- 無謀で無自覚な負債
- 無謀で意図的な負債
- 慎重で無自覚な負債
- 慎重で意図的な負債

<br>
<br>

![a (29).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/487ffdab-52d5-d6e4-e1e2-4e9cd966e725.png)

### 左下第１象限「無謀で無自覚な負債」

現状の設計のままリリースすることが負債と引き換えであることを理解しておらず、
負債による影響の大きさも適切に評価できていない状態です。

- 対象とするプロダクトを適切に設計する知識やスキルを開発チームが有していない
- 自分たちではコントロールできず、自覚もないまま負債を積み重ね続ける

負債が増え続けることにより利息の支払いに追われ、生産性が低下し続けます。

<br>
<br>


![a (30).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/ab70d209-5260-80d9-d178-2fc47d7ef00c.png)


### 左上第２象限「無謀で意図的な負債」

現状の設計のままリリースすることが負債と引き換えであることを理解しているが、
負債による影響の大きさが適切に評価できていない状態です。

- 優れた設計に割く時間などないと考え、クイック＆ダーティでやると決めている
- 負債による生産性低下を楽観視、あるいは軽視する傾向がある

優れた設計より、クイック＆ダーティの方が早期のリリースを実現できると考えていますが、
実際はクイック＆ダーティの選択がチームの開発スピードを奪うことに繋がります。



<br>
<br>

![a (31).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/f292b0aa-f722-0222-5ce7-33c86fddc8ff.png)

### 右上第３象限「慎重で意図的な負債」

現状の設計のままリリースすることが負債と引き換えであることを理解しており、
負債による影響の大きさも適切に評価できている状態です。

- 早期のリリースが、負債による生産性低下とのトレードオフであると知っている
- その上で、合理的な意思決定を下す

開発スコープがペイオフラインより下であれば、チームは早期のリリースのために負債を選択する可能性があり、
開発スコープがペイオフラインより上であれば、チームは優れた設計を選択します。


<br>
<br>

![a (32).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/d6001ffc-6c5c-dffd-07a9-5c36b179bfd6.png)


### 右下第４象限「無謀で無自覚な負債」


現状の設計のままリリースすることが負債と引き換えであることを理解していないが、
負債による影響の大きさは適切に評価できている状態です。

- プロジェクトを通してチームが得た学びと、自分たちが作り上げたソフトウェアとの乖離を問題視している（ウォード・カニンガムの言う負債）

チームは優れた設計を選択して良い仕事をやり終えたが、
プロジェクトで得た学びによってより適した設計を理解し、負債を抱えてしまっていることに気付きます。

<br>
<br>

![a (33).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/d10bcb5e-2778-96df-cd4c-5a7386f281d6.png)

ここまで４つの象限を確認しましたが、そのうちの「慎重な負債」は問題であるとは言えません。

慎重であり「意図的」であれば負債の対処も頭にあり、
無自覚であっても後から最適な選択肢に気付き、対処することができます。

<br>
<br>

![a (34).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/416725d9-42b5-2c93-9105-fdd56de33ad0.png)

悩ましいのは「無謀な負債となった内部品質の問題」による生産性の悪化です。

慎重と比較すると意図的であれ無自覚であれ、負債としての内部品質に向き合えていない状態に見えます。

<br>
<br>

![a (35).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/cd9cd565-81b6-617b-4afe-299099575862.png)

それでは、ここからは組織設計がもたらす「無謀な負債」とその内部品質の問題について取り扱っていきます。

<br>
<br>

# 原因となった組織設計のカタログ

![a (36).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/3eae83e8-94af-804c-8feb-f66e20773af6.png)

この章からは 原因となった組織設計のパターンごとに

- どういった原因でどういった問題が発生するか
- 解決策

を見ていきます。

<br>
<br>

![a (37).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/a69cbced-f99a-68a6-bf14-2cb6f08ba7ca.png)

組織設計の項目は全部で８つありますが、無謀な負債の中でもそれぞれ「意図的」「無自覚」「どちらにも当てはまる」に分類すると以下のようになります。

- 意図的
    - 品質保証の一極集中
    - 行き過ぎた固定化
    - 無力な他己管理型チーム
- 無自覚
    - 共有リソースプール
    - 不連続なチーム
    - 保守・運用の分離
    - ドメイン知識の過疎地
- どちらにもあてはまる
    - 非オーナーシップ制

<br>
<br>

## 共有リソースプール

![a (38).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/779a7a72-b5d3-d55b-7194-530ffcaa25aa.png)

![a (39).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/fbfeafee-0906-420d-2ab1-f6408e33514a.png)

共有リソースプール（プロジェクトアサイン対象のエンジニアが存在する、多くの部署やチーム）に関する課題は、左下第１象限の中でも「知識不足・スキル不足」に当てはまります。

画像の例では、プロジェクトチームに参画するメンバーのプロジェクト適正度にバラつきのあることがわかります。

<br>
<br>

![a (40).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/39337d5d-5f47-eb95-4932-b58eacc5afbb.png)

- マネージャーはエンジニアリング部門（共有リソースプール）から、スケジュールに余裕のある人をなんとかアサイン
- 優秀な人材であるほどプロジェクトを掛け持ちしている場合が多い

上記の理由から、プロジェクトに対する知識やスキルにバラつきが出てしまい（プロジェクトへの適正度）、プロジェクトチームをベストメンバーで組むことが難しくなります。

<br>
<br>

![a (41).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/d6ab095c-24e7-4178-7167-58d674d140c7.png)

例えば、プロジェクトメンバーの間で

- 信頼関係が既に構築できているか？（初めて顔合わせすることや、人間性が合わないこともある）
- お互いのハード／ソフトスキルを理解しているか？（非効率的な作業の割り振りにつながる）

これらが上手く揃わなければ、未成熟なチームワークでプロジェクトがスタートしてしまいます。

<br>
<br>

![a (42).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/2bfef469-17a0-fd2f-bcfa-68a067cb0a6e.png)

知識不足やスキル不足により、問題のある設計・実装の混入を防ぐことが難しくなります。

- 信頼関係を築けていない
- お互いの能力や特性を知らない
- お互いに遠慮がある状態

このような状況では上手くフォローし合えず、内部品質の悪化につながります。

<br>
<br>


![a (43).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/7c47f4aa-65c1-b342-0db1-a46d29d23716.png)

- プロジェクトに適したチーム編成になるかは運次第
- チームワークもメンバーの組み合わせ次第

↓

問題のある設計・実装の混入を防ぎきれない

<br>

ではどうすればよいでしょうか。

<br>
<br>


![a (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/a29dde4b-5498-6a1b-3f1e-94508b936b1f.png)

解決策としては、チームを固定化してプロジェクトをアサインすることです。

チームを固定化することで

- お互いにフォローし合える
- チームワークが育つ

ということに繋がり、エンジニアを「リソース」として捉えないことが重要になります。

プロジェクトにアサインするのは「人」ではなく「チーム」であることが理想です。

<br>
<br>



## 不連続なチーム

![a (45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/ab892b28-576f-9b0d-aaaa-abeb86a6a3e3.png)

<br>
<br>


![a (46).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/30331f20-c755-ebe2-d441-bd84c1b41247.png)

「不連続なチーム」とはそのままですが、終了した前プロジェクトと新たに開始した新プロジェクトを比較してアサインされるメンバーが異なるような状況です。

これも左下第１象限の「知識不足・スキル不足」に分類されます。

<br>
<br>


![a (47).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/5cb68729-2bca-2f4d-d78d-47e5699c5647.png)

プロジェクトの終了と同時にメンバーが解散してそれぞれ別のプロジェクトへ移動した場合、
前プロジェクトの開発過程で蓄積された学び（スキルやドメイン知識など）はどうなってしまうでしょうか。

<br>
<br>


![a (48).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/ab4fb14c-d97c-5453-cea6-c0e8e6142468.png)

前チームと顔ぶれが異なってくるため、蓄積された学びの喪失に繋がります。

ドメイン知識であればドキュメントに残す等の方法もありますが、新規メンバーへの共有コストは高くなると考えられます。

<br>
<br>


![a (49).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/5b315cc1-8939-a18b-de45-45ee80bb49e6.png)

新チームによってまだ十分な学びが蓄積されていない状態でプロジェクトが開始されてしまうため、プロダクトの不理解による内部品質の低下が起こりやすくなります。

<br>
<br>


![a (50).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/4b0ae9d0-1123-2612-6c31-252f53dee20b.png)

- プロジェクト終了に伴うチームの解散
- チームの不連続性による「学び」の喪失

↓

不十分な知識による設計が内部品質の低下を招く

<br>

ではどうすればよいでしょうか。

<br>
<br>


![a (51).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/5bcacbf4-ef4b-29bc-0a2d-cdd7123d087d.png)

解決策としては、プロダクトに対してチームを組織化することで、連続性を持たせることができます。

プロジェクトではなく「プロダクト」に対して開発チームを組織化することで、同一チームが担当プロダクトの開発プロジェクトに繰り返し携わることができ、学びが蓄積されていきます。

<br>
<br>


![a (52).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/e2f760f2-ff13-c72a-65de-e8bef1b457f6.png)

また、プロセスの反復により学びを蓄積し不確実性を崩していくことにも繋がります。

プロジェクトやイテレーションという過程の中で、

- 新機能やプロジェクト、プロダクトのナレッジをアウトプット
- それらの知識を蓄積
- 効果として、
    - ユーザー・ビジネス価値の向上
    - 方法不確実性の削減（プロジェクトナレッジ）
    - 目標不確実性の削減（プロダクトナレッジ）

といった反復が行われ、結果として不確実性の低減やユーザー・ビジネス価値を向上させることができます。

<br>
<br>




## 非オーナーシップ制

![a (53).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/7b7ea842-2b81-0d09-f7e4-104a6347a1bf.png)

<br>
<br>


![a (54).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/a42363bd-c555-2f28-de11-e8e09c142511.png)

オーナーシップとは、個人や組織が与えられたタスクや割り振りに対して主体性をもって取り組む姿勢やマインドのことです。


「非オーナーシップ制」は、第１象限と第２象限の

- 知識不足・スキル不足
- クイック＆ダーティ

に当てはまります。

<br>
<br>


![a (55).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/18ebbbe1-f84c-b2ba-0017-16b5621db90b.png)

オーナーシップ制の存在しないチームでは、開発者が不特定多数のコンポーネント（機能）に無作為な変更を加えるといった状況が起こります。

必要に応じて誰でもコード変更が可能であり、多くの開発者が様々な意図で変更を加えます。

<br>
<br>


![a (56).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/8745db61-b620-9b3b-17fd-02aebb73feba.png)

しかしコンポーネントに対する知識や理解度は開発チームや開発者ごとに異なるはずです。

<br>
<br>


![a (57).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/36946f50-254d-c8f5-b9e6-b29630ca5901.png)

多くの人が手を加えることやコンポーネントに対する理解度の差によって、

- 設計の一貫性の喪失
- 誤解に基づく設計
- 不安による消極的な設計

といった複雑化に繋がり、オーナーシップの欠如によってそれが繰り返される悪循環となります。


<br>
<br>


![a (58).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/81d3596f-627a-0a9a-7842-eba85c02e59b.png)

さらに、大勢による変更は外部品質の問題を引き起こす可能性もあります。

マイクロソフトの自社製品に対する調査結果は以下の通りです。

- トータルのコントリビューター数やマイナーコントリビューターが多いコンポーネントは、リリース前後における故障が増加する
    - コントリビューター：コンポーネントを変更／コミットした人
    - マイナーコントリビューター：コンポーネント全体のコミット数のうち、5%未満の貢献にとどまるコントリビューター


<br>
<br>


![a (59).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/03b2600d-4b0a-38e0-2897-6e46a0db4bae.png)

- コンポーネントに変更を加える開発者が多数
- コンポーネントに対するそれぞれの理解・経験のバラつき

↓

設計の複雑化と、割れ窓化によるその悪循環を招く

<br>

ではどうすればよいでしょうか。

<br>
<br>


![a (60).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/2eb22186-a869-a841-2438-1c318d5debad.png)

解決策としては、開発コードをオーナーシップ制で管理します。

プロダクトやコンポーネント、コードに対して特定のオーナーを決めます。
オーナーは個人ではなくチームでの共同所有とします。

また、チーム外に対しては「弱い／強いコード所有」という扱いを設けます。

<br>
<br>


![a (61).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/767de250-a43a-0096-549a-f7cf7af94071.png)

チーム外に対する「弱いコード所有」の場合はオーナーチームに対してプルリクを提出し、オーナーチームの承認を経てコンポーネントへマージされます。

チーム外に対する「強いコード所有」の場合はオーナーチームに変更依頼を提出し、オーナーチームの承認を経てコンポーネントが変更されます。

いずれの場合も、コードの変更に対する品質の責任はオーナーチームが持ちます。

<br>

※こちらの「弱い／強いコード所有」と「プルリク→マージ／変更依頼→変更」の関係性が理解できなかったため、どなたかわかる方がいればコメントください。

<br>
<br>




## 保守・運用の分離

![a (62).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/ebd3ace0-7e32-987b-6d2b-9b70dd95ead4.png)

<br>
<br>


![a (63).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/cdf5d8a5-b96b-c1a5-57c3-1d86d4c1a304.png)

そのままですが、開発と保守・運用で別チーム、別メンバーがアサインされるような状況です。

「保守・運用の分離」は第１象限の「知識不足・スキル不足」に該当します。

<br>
<br>


![a (64).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/5439a6e3-c834-6703-8d27-47e7a25087fe.png)

まずは開発チームの状況です。

- 開発チーム
    - 保守・運用を考慮した設計に必要な知識・経験に乏しい
    - そのため、保守・運用の容易さが考慮されない設計や実装となる

<br>
<br>


![a (65).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/8f5ca87a-c562-74e0-4eff-5d269b4e416c.png)

次に、保守・運用チームにプロダクトが引き渡された後の状況です。

- 保守・運用チーム
    - 適切なドキュメントがない
    - ソースコード内にコメントがない
    - 調査に必要なログが記録されていない
    - 簡易な再稼働ができない
    - etc.

こういったことが原因で保守・運用の低効率、高負荷に繋がってしまいます。

<br>
<br>


![a (66).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/b2283a5c-bfd0-de5b-8759-17779c1c9ca3.png)

- 保守・運用面の考慮がない設計と実装

↓

保守・運用面の効率を下げ、負荷を高めてしまう。

<br>

ではどうすればよいでしょうか。

<br>
<br>


![a (67).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/49c99c59-d7ba-ea9c-d8ec-4ccd3d42027b.png)

解決策としては、チームを担当プロダクトの開発・保守・運用すべてに責任を持つ「プロダクトチーム」とします。

<br>
<br>


![a (68).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/80d49970-f231-dddb-0502-35bd02d950d0.png)

You build it, you run it. / Werner Vogels

「開発者に運用責任を与えることで、顧客と技術の両方の観点において、サービス品質が大幅に向上した。」
「作った人たちが運用も担う。」

<br>
<br>



## 品質保証の一極集中

![a (69).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/4dfded6b-79d4-5a06-51ad-0f84c43b376c.png)

<br>
<br>


![a (70).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/f1e5abc4-6427-98b9-9157-fc17d4e7d172.png)

そのままですが、品質保証の担当が一か所に集中している状態です。

「品質保証の一極集中」は、第２象限の「クイック＆ダーティ」に分類されます。

<br>
<br>


![a (71).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/a75f8ab0-4f05-364d-9d0a-d9b1f830fd68.png)

開発フェーズを終えたプロダクトが開発チームからテストチームに受け渡された後、多くの問題をテストチームは抱えることになります。

- 毎回プロダクトに欠陥が多く、品質が低い
- そのため網羅的なテストを実施してなんとか品質をカバー
- 結果、テストフェーズがリリース前のセーフティーネット的な存在に

テストチームが品質の全てを担っている状態です。

<br>
<br>


![a (72).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/a2bdb37d-47e6-7363-26a3-ed7b2120d276.png)

今回の場合、開発フェーズは機能を実装することが最優先になっています。

特に時間に追われていたりすると、テストフェーズを信頼してテストコードを書く優先度が低い状態に陥りがちで、
そうなると開発チームは時間ギリギリまで機能の設計・実装に費やすことになってしまいます。

<br>
<br>


![a (73).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/b3aeeda0-ad9d-26e2-b6ee-be53b6d60280.png)

結果としてテストのないコードが量産されてしまい、品質保証はテストフェーズに丸投げという事態が起こります。

- プロダクションコード：実装完了
- **テストコード：なし**
- 動作確認：手動で正常系のみ

<br>
<br>


![a (74).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/a7bb69cc-dc25-e133-4d8b-dcebb3b72ee3.png)

レガシーコードとは、単にテストのないコード／マイケル・C・フェザーズ

「レガシーコードとは、単にテストのないコード」
「テストがあれば、検証しながらコードの動きを素早く変更することができる。テストがなければ、コードが良くなっているのか悪くなっているのかが本当にはわからない。」

<br>
<br>


![a (75).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/3cd3f138-e139-197b-7940-4f7024c7aaed.png)

- テストフェーズでの網羅的なテストによるセーフティーネット
- 開発フェーズは機能を実装することが何より最優先

↓

テストのないコードが量産される

<br>

ではどうすればよいでしょうか。

<br>
<br>


![a (76).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/9e82c63e-bc11-8861-554c-b77defbc3cfb.png)

解決策としては、品質保証に対してチーム全体でアプローチをとり、開発者テストを開発者チームの責務にします。

<br>

【開発者テスト】

- ユニットテスト
- コンポーネントテスト
- 機能テスト
- 非機能テスト
- etc.

テストフェーズだけに頼らず開発フェーズの時点で品質を要素分解して、いつ誰が、何を担うのかを明らかにすることが重要です。

<br>
<br>


![a (77).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/80b63172-7b88-be2e-b3f8-568572573842.png)

チーム全体アプローチ（Whole-Team Approach）

- 品質に責任を感じるのはテスターや品質保証チームだけではない
- テスターや指名された品質保証の専門家だけでなくチーム全体の仕事。アジャイルチームは全員が「テスト熱中症」

<br>
<br>


![a (78).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/ccce691c-4428-c3f6-9540-716cc53db1cf.png)

開発者テストを

- 縦軸
    - ビジネス面
    - 技術面
- 横軸
    - チームをサポートする
    - プロダクトを批評する

の象限のうち４つに分類した

- 機能テスト
- 探索テスト／ユーザー受け入れテスト
- コンポーネントテスト／ユニットテスト
- 非機能テスト

の中での担当範囲は画像のようになります。

開発したコンポーネントのテストやユニットテストはもちろんですが、
機能テストや非機能テストの一部も担うことで品質保証の役割を分散させています。

<br>
<br>




## 行き過ぎた固定化


![a (79).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/9f8dfef5-88b3-b410-a28d-89fceea975a9.png)

<br>
<br>


![a (80).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/4f7a49ae-08fd-60a0-8736-06174c3a6d2d.png)

「行き過ぎた固定化」は流動性のないチームを指し、業務が属人化している状態です。

※属人化：特定の業務に関する情報を担当者しか把握していない状態

第２象限の「クイック＆ダーティ」に分類されます。

<br>
<br>


![a (81).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/dd113245-9af1-6ab7-0089-34cdc7f68a35.png)

固定チームメンバーで業務を続けていると、それぞれの得意分野ができ始めることで役割分担も固定化されていくことが多いです。


- この類の仕事はAさんが速い
- この分野はBさんが詳しい

<br>
<br>


![a (82).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/a47c700b-b128-2695-85c7-6aa8bf6b8b68.png)

そして同じような役割分担が続いた結果、業務が属人化してしまいます。

- この類の仕事はAさん「しか」できない
- この分野はBさん「しか」知らない

<br>
<br>


![a (83).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/20ce16b3-1464-2977-cb1f-ba7b89c1aad7.png)

長い間 新メンバーの加入がないような固定チームは、

<br>

業務が属人化する
↓
固定化された役割分担を崩すきっかけがない
↓
各自の仕事のやり方を言語化・可視化する動機がない
↓
人が読むことを前提としないコード
- ドキュメントなし
- コメントなし
- 複雑化など

<br>


このような過程で理解容易性の低下が起こります。

<br>
<br>


![a (84).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/ce093649-e628-17bf-82c8-7764d66fea63.png)

- 固定チームメンバーで仕事を続けると、役割分担まで固定化していく
- 同じような役割分担が長く続いた結果、業務が属人化する

↓

属人化したコードは、理解容易性が低い

<br>

ではどうすればよいでしょうか。

<br>
<br>


![a (85).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/fa0ba3be-8254-a427-923d-f02697bfc3fa.png)

解決策としては、固定チームの中でもなにかしらの流動性を持たせます。

<br>

例えばオンボーディング等のようなチームに流動性を持たせるきっかけを作ることで

- 各自の仕事のやり方を言語化・可視化する動機となる
- 人が読むことを前提とするコード
    - ドキュメント有り
    - コメント有り
    - シンプル化など

<br>
このように理解容易性の改善に繋がります。

個人的なお話ですが、こういったことを防ぐためか
些細な業務であっても常にマニュアルに残すことを意識しているチームが最近は増えてきているように感じます。

<br>
<br>



## ドメイン知識の過疎地

![a (86).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/2ebbcb04-f88b-85a5-f72b-b7850a18f2d3.png)

<br>
<br>


![a (87).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/7877fbc6-96ca-a188-e9b7-9fad819d402f.png)

「ドメイン知識の過疎地」とは、ドメイン知識（プロダクトに関わる知識）が不足している環境のことを指し、第１象限の「知識不足・スキル不足」に分類されます。

<br>
<br>


![a (88).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/215b138d-b223-851d-2f0d-0d743ba00927.png)

開発フェーズの前に先行で動くことになる企画チームは、市場の観察や顧客との対話を通して豊富な知識量を持ちます。

<br>
<br>


![a (89).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/9d6de8f4-354c-802c-75e5-9b4aa323962d.png)

そして後続の開発チームが得る知識ですが、これは企画チームから間接的に説明を受けた最小限の知識のみとなることが一般的です。

市場の観察や顧客との対話を直接実施した場合と比較して、知識量がこぼれ落ちてしまうことは明白です。

<br>
<br>


![a (90).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/4fb72881-24c3-2b1a-b2c3-c5213bb4b34b.png)

そこから開発チームは知識不足のまま、設計をスタートさせることになります。

これによる問題は、先行で動いた分析チームの設計意図を適切に組み込むことが難しいところにあります。

<br>
<br>


![a (91).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/920693d6-8557-ee4b-737c-6a599ca2466e.png)

書籍『ドメイン駆動設計』での失敗例／エリック・エヴァンス

「開発者の役割を誤って分割したために、モデリングが実装から切り離されてしまい、進行中の深い分析が設計に反映されなかった。」

<br>
<br>


![a (92).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/540b9c38-ffc8-0480-7d88-af32d6f545f8.png)

- 先行の企画チームは市場の観察や顧客との対話を通して豊富な知識量を持つ
- 皇族の開発チームが得る知識は、間接的に説明を受けた最小限のみ

↓

開発チームは知識不足のまま設計することに

<br>

ではどうすればよいでしょうか。

<br>
<br>


![a (93).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/450a5f5c-1a80-a485-a09b-8a2d6563fe20.png)

解決策としては、企画と開発の業務機能をオーバーラップさせ サイロ化を解消します。

※サイロ化：組織の中でシステムや部門が分断され、独立している状態

<br>

開発チームとドメインエキスパート（企画チーム）を密接に関わらせることで

- 企画・分析
- 開発

のように分断された役割ではなく

- 企画・分析（企画チーム）
- 分析・開発（開発チーム）

といった業務機能をそれぞれのチームに持たせ、ドメイン知識を増やし設計に組み込むことができます。


<br>
<br>




## 無力な他己管理型チーム


![a (94).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/1dbe9637-90ae-e371-0397-5de68363e046.png)

<br>
<br>


![a (95).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/c3c78f1a-21f1-67f4-b521-b2da59d2c9b9.png)

「無力な他己管理型チーム」は強い権限を持つマネージャーと、権限の弱い開発チームとの管理体制を指し、

これらは第２象限の「クイック＆ダーティ」に分類されます。

<br>
<br>


![a (96).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/a051ad72-d6c8-a6c1-1317-c0f8d77dc148.png)

このように権力に強弱のある非対等な関係性では、

- 誰が何を、いつ、どのように行うか

といった決定権が開発チームに存在しません。

つまり自己管理型ではなくマネージャーによる他己管理型のチームとなってしまいます。

<br>
<br>


![a (97).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/5d8e9296-0a25-ad9d-a39c-d97465f033be.png)

マネージャーと開発チームではお互いに見えているものが異なるためそれぞれ優先するものが違うのは当然ですが、権力の強弱により正しい優先順位の決定が下せない環境が生まれます。

<br>

- マネージャー
    - ユーザー・ビジネスのために開発を
    - 早期のリリース
    - 見える機能（振る舞いに関するもの）
- 開発チーム
    - 内部品質の改善
    - 見えない機能（構造に関するもの）

<br>
<br>


![a (98).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/2154147e-b344-ef29-a9ff-3f8b102ae2ea.png)

そして、そういった環境下で内部品質の問題が徐々に積み上がっていき、生産性と品質を低下させます。

<br>

どこかで手を付けない限り、どんなに頑張っても様々な要因で内部品質の問題は積み上がる

↓

生産性の低下が続いていく

↓

本番稼働後のトラブルも増えていく

<br>
<br>


![a (99).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/40f97e08-4e7e-2fcb-ea1a-75fdd6958063.png)

- 「誰が何を、いつ、どのように行うか」の決定権がチームにない
- お互いの視野が違うにも関わらず、権限が対等ではない

↓

内部品質の問題が徐々に積み上がり、生産性と品質を低下させていく

<br>

ではどうすればよいでしょうか。

<br>
<br>


![a (100).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/1e6ec415-f1bc-a425-7fd3-c5c6a281405c.png)

解決策としては、相互信頼に基づく対等な関係を築くことで自己管理型のチームを作ります。

マネージャーと開発チームの両者がそれぞれの見ている問題の理解に努め、
「誰が何を、いつ、どのように行うか？」という意思決定を適切に行える環境を作ることが重要です。

<br>
<br>


![a (101).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/28ea2f24-7d59-2673-608f-e7e4d917daa8.png)

「見える（振る舞いに関するもの）」「見えない（構造に関するもの）」
「ポジティブな価値」「ネガティブな価値」に当てはまる４タイプのバックログアイテムに対し、

ユーザー、ビジネス、開発者のトライアングルの中でやるべきことを決めていきます。

<br>
<br>




# 組織設計はソフトウェア設計に影響する

![a (102).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/04be8c91-7664-58eb-f261-c879f8b225d1.png)

<br>
<br>


![a (103).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/308dcc74-02c8-956e-b4f8-a4cfea4bf81c.png)

ここまで組織設計と内部品質に影響を与えるパターンを８つみてきましたが、組織設計がソフトウェア設計に与える影響の大きさがわかりました。

<br>
<br>


![a (104).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/2d2df48b-a3cd-73fd-193a-a822b5bb5492.png)

そしてソフトウェア設計が生産性に与える影響も非常に大きいです。

<br>
<br>


![a (105).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/1f332158-5080-42e4-1d84-bbac9cea3af4.png)

内部品質（保守性、理解容易性やテスト容易性 etc.）の悪化は、最終的に市場投入までの時間を遅らせることもわかりました。

<br>
<br>


![a (106).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/431cc3a7-d94e-eb92-6cdb-513dcd858701.png)

コード品質の悪化は市場投入までの時間の予測可能性も下げます。

- 含まれる欠陥
- 平均開発時間
- 最大開発時間

高品質なコードに比べて上記が増えることで、

- 予定外の作業が増える
- 開発時間が長くなる
- 計画に対する予測可能性が下がる

といった問題に繋がり、市場投入を計画通りに進めることが困難です。

<br>
<br>


![a (107).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/636dab39-1685-c7ae-fe7a-2136753c9011.png)

そして、市場投入までの時間の遅れはビジネスに悪影響を与えます。

<br>
<br>


![a (108).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/5d8098a8-84da-157f-0a2d-99c677ff22d0.png)

様々な組織設計の改善パターンがありましたが、より良い組織設計に近づけるために常に理想の組織設計像を探し続けることが重要です。

- 組織設計がソフトウェアに当たれる影響は大きい
- ソフトウェア設計が生産性に与える影響も大きい
- それは「市場投入までの時間」と「遅延コスト」という形でビジネスに影響を及ぼす
- ソフトウェア設計がそうであるように、組織設計も何が正解であるかは不確実で流動的
- したがって、完璧な答えにたどり着くことは決してない
- だから、ソフトウェア設計と同様に、組織設計もリファクタリング・リアーキテクティングを繰り返す必要がある
- その探索を続ける中で、組織は生産性を維持・向上させることが可能になる

<br>
<br>


![a (109).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/80893759-a7d3-c9e3-976f-03f760e89461.png)



# 最後に

今回引用させていただいた記事はX（旧：Twitter）で他のエンジニアの方が貼っていたリンクから見つけたのですが、私自身が文字に起こして読み直せるようにするだけでなく、この内容を多くの方に読んでいただきたいという思いから引用させていただきました。

エンジニア４年半ほどでまだ未熟ですが、過去に参画してきたプロジェクトで感じていたことが図や言葉にされていて非常に参考になります。

- 負債を抱えたままで開発を続けることのリスク
- 根本的な内部品質を見直すことはもちろん重要だが、そもそもそれができる組織設計なのか
- ソフトウェア設計と同じように、組織設計もリファクタリング・リアーキテクティングが重要

全てを理想通りに設計することが難しいのは当然ですが、課題に対して少しでも視野を広げて改善策を提案できるように、引き出しはたくさん用意しておきたいです。

<br>

最後に、引用元の記事の著者である松本 成幸さん、この度は記事をご提供いただきありがとうございました。

<br>

【引用】

- 記事：[ソフトウェアの内部品質に生じる様々な問題は組織設計にその原因があることも多い / Internal Quality Issues Caused by Organizational Design](https://speakerdeck.com/mtx2s/internal-quality-issues-caused-by-organizational-design?slide=109)
- 著：松本 成幸（まつもと しげゆき）