ComplexとComplicated
日本語だとどちらも「複雑」を意味するが、英語だと「Complex」と「Complicated」の2つの単語が該当する。
両者は明確な違いが無いともされるが、使い分けられるケースもある。Complicatedの方が頑張れば解消可能とされ、「複雑」じゃなく「込み入った」という訳語があてられることもある
Cynefin Frameworkにおける使い分け
Complicated: 分からないことは分かっている。理解するのは難しいが、時間と労力をかければ最終的にはわかる
Complex: 分からないことが分からない。
英語ぷらすでの説明
Complicated: 関係性や状況が複雑。物理的でなく心情的・観念的にややこしい
Complex: 構造や手順が複雑。物理的な複雑さ
対義語から
Complexの対義語としてSimpleが使われるが、Complicatedの対義語としてはあまり使われない。 ComplicatedにはEasyが対義語とする向きもあるが、これはComplicatedが心情的な複雑さに使われるからだろう。
Simple Made Easy
https://raw.githubusercontent.com/matthiasn/talk-transcripts/master/Hickey_Rich/SimpleMadeEasy/00.03.19.jpg
Simpleは1つの役割、1つのタスク、1つの概念などを指す。なので、対義語であるComplexはそれらが複数混ざり合ったものを意味する。
ソフトウェアにおけるCompexとComplicated
以上のことからソフトウェアの設計において、ComplexとComplicatedを次のように使いたい。
Complex: 1つのエンティティ、1つのクラス、1つのfunctionに複数の責務・概念が混ざっている。単一責任原則(SRP)に違反した状態
Complicated: エンティティやクラス、functionの数が多く、それぞれの役割や関係性を理解するのが厄介。
つまりComplexなものは、うまいこと責務・概念が1つずつになるように分割すればSimpleにできる。(これは凝集度をあげることに繋がる)
だが、これで日本語で言う「複雑さ」が解消されるわけではない。
Complexな状態だった時に比べて、構成要素が増えるので今度はComplicatedな度合いが上がる。
ただしSimpleなものたちがComplicatedになっている状態は、認知負荷の問題と捉えることができるので、適切なグルーピングによって分割統治して、それを軽減するのが戦術になる。(これは結合度を下げることと捉えることができる)
人物相関図にグルーピングしていないと、非常に複雑な物語に見えるが、グルーピングすることで部分にフォーカスできるようになるし、個人間の関係性で表していたものをグループ間の関係としてまとめれることもあり、Complicatedな度合いが軽減できる。
https://s.yimg.jp/images/bookstore/ebook/web/content/image/sakuhin/15305/img/ver2.0/img_soukanzu_main.jpg
複雑さとは何か?
A Philosophy of Software Design
複雑さの症状として以下3点が挙げられている
変更箇所が多い
低凝集もしくは密結合の状態と考えられ、ComplexもComplicatedも原因となり得る。
認知負荷が高い
Complicatedな度合いが高い
Unknown Unknowns
Complexな状態
まとめ
ComplexとComplicatedは異なる
高凝集・疎結合を達成するには順序がある。
1. まずComplexなものをSimpleにする (高凝集)
2. その上で構成要素をグルーピングすることでComplicatedを解消する (疎結合)