複雑さを憎み、シンプルさを愛せ
ソフトウェアを開発していて、「ああ複雑になってんな」と思うことがとてもよくある
ソフトウェアに限らず、時間と量が増えた物事は不可避的に「複雑」になる
なぜ複雑になるのか?ということを考える前に、複雑とはどういう状態かを考えてみよう
一般的に「複雑」が成立する条件として、
構成物が多い
関係性が多い
という2つの条件が挙げられるだろう
ボタンがたくさんあったり、モード遷移が多発するUIは使いにくいし、ポジションが多くてルールが多いスポーツは楽しむのが難しい
それらは単純に理解しなくてはいけないことが「多い」という状態だとも言える
逆にシンプルとは理解しなくてはいけないことが「少ない」状態である
所見で登場人物とその関係性などを誰でも理解できたらそれはとてもいい状態である
複雑かシンプルかの議論であれば、当然シンプルであるほうが望ましいのだが、物事は持続していくに連れ複雑化の一途を辿る
なぜかといえば時間の経過とともに要素は増えていくからだ
要素を増やさなければ物事は複雑にはならない。これは真理である
だが要素が増えなければ価値は生まれない。なぜなら何にどれだけの付加価値があるのかは予めわからないからだ
しかしそうやって無軌道に要素を追加していったら誰も理解できない複雑な物事が完成してしまう
労務や税金についての法律はその最も悪い例だとも言える
もともとは得た収入のうち一定の割合を税金として徴収するというシンプルな仕組みのはずなのだが、いろいろな条件でそれが増えたり減ったり計算方法が変わったりするという例外を作りすぎた結果、税理士という専門の職業がいなければまともに計算できないようなルールになってしまっている(最近はMFクラウドやSmartHRなどのクラウド労務でかなりまともになっているが)
ここから複雑性をより加速させる条件の一つが見えてくる
それは例外的な条件のための要素やルールをどんどん追加するということである
どんな物事でも一番はじめは単一の目的のために設計されているので、シンプルである
だが単一の目的のためでは汎用的な用途には向かないので、改修が必要になってくる
こういった改修は最初の時点では想定外なので、シンプルさを保ったまま要素を追加するのは難しい
どうすればいいのか
どうやってシンプルさを保ちながらより汎用的な仕組みを作っていくか
これは非常に難しい。銀の弾丸のようなものはない
ただ一つ言えることは、要素や例外ルールを追加することはどんな凡人でもできるということである
特に複雑性について意識しないで仕事を進めていくと、当たり前のように複雑になる
複雑になった物事はそれを複雑にした人以外の理解を阻害し、大変なコストを生む
そして歯止めが効かなければ最終的に自分自身でも理解ができなくなる
人間が生み出したものが人間の認知の限界を超えるのは簡単である。追加や拡張は一つずつだが、積み重なり絡まりあった紐はそう簡単には解けない
で、どうすればいいのか
自分がシンプルな設計について考えるときに意識する美意識を列挙してそこから何かを見出していく
対称性、相似性、納得感、一貫性、明示的、簡素さ、低コスト
対称性
説明するのが難しいのだが、グラフィックデザインのようにルールや設計にも対称性というものが存在する。
例えば、データの追加と削除はセットである。どちらかしかできないようになっていてはいけない。
ある値が増えたら、何かの値が減る。ゼロサム性。
機能的対称性。Aという機能の横にA'という機能を置く。^Aという機能は左右または上下離れた場所に置く
相似性
要素同士が似ている、あるいはどちらかのサブセットになっている
Aという機能を知っている人はA'という機能もすぐに理解できる
XのときYに対してすることと、VのときWに対してするときの過程と結果が似ている
サッカーとハンドボール、将棋とチェスなど
納得感
現実世界での慣習や物理現象に沿ったことが行われること
すでに当たり前のようにやったことのある動作や見たことのある現象が期待通りに起こる
物理的連続性。ワープしない、ソリッドなものが混ざらない、AtoZ
可逆性。1進めたらコスト無しで1戻せる。
車のハンドル、階段、天秤など。
一貫性
名前や用語などの使われ方や長さが似ている
遠目に見たときにもなんとなくなにか分かる
色、形、大きさ、向きなど
配置の順番が何かしらの優先度で決まっている
同じようなことをしたときの結果の度合いが異ならない
明示的
暗黙的な過程の隠蔽が少ない。何が起こるか、何が起こったかがわかる
今どうなっているのかがすぐに分かる
変化した場合にそれに気が付きやすい
能動的にアクションをさせる。許可をもらわずに勝手に決めない。
簡素さ
見た目にこだわりすぎない。ゴテゴテ情報を出しすぎない
親切になりすぎない。一度での成功を誘導するのではなくリトライのコストを下げる
機能を絞る。多機能になりすぎない。
低コスト
物理的、心理的コストが低い
失敗しても別に気にならない。繰り返しが苦にならない
再現が簡単。過程が速い。
結局どうすればいいのか
シンプルさを保つということは汎用性を高めるよりも遥かに難しいことだと思う
どうすればシンプルを保てるのか、ということは常に考えなくてはいけない
よく考えずに要素を増やしていくとすぐに手に負えない九龍城砦ができます