シンプルとは結局なんなのか?
このテーマの新しい記事書きました。
アーキテクチャの勉強をするなかで、「あれっ?これってシンプルじゃないしKISSの原則に反するのでは?」とふと思いました。そこでそもそもシンプルとはなにか自分なりに考えてみました。対象分野はデザインではなくプログラミングです。
結論
出た結論としては以下です。
シンプルとは、目的を達成する上で無駄のないかつ効果的な状態のことであり、単に簡単であることや構成要素が少ないことを指すのではない。
質問
解説の前に次の質問について考えてみてください。
質問: どちらのコードがよりシンプルですか?
候補1
// 背景: 課金が成功しユーザーをアクティブにする。ただし、ステータスがゲストのユーザーのみ変更可能。
if(user.status === 'GUEST'){
user.status = 'ACTIVE';
}
候補2
// 背景: 課金が成功しユーザーをアクティブにする。ただし、ステータスがゲストのユーザーのみ変更可能。
if(user.canBeActivated()){
user.getActivated();
}
候補2はcanBeActivated()をgetActivated()の中に閉じ込めるやり方もあると思います。
解説
質問1のどちらのコードがシンプルだと思いましたか?多分バラバラの答えが出るのではないかと思います。なぜバラバラになるかというと前提にしている目的が異なるからです。
- (書きやすいから)候補1のほうがシンプルだと思う
- (読みやすいから)候補2のほうがシンプルだと思う
ではないでしょうか?あるいはwhatよりhowが実際に書かれてあったほうが理解しやすい人は候補1のほうが読みやすいかもしれないですね。このようにシンプルさとは目的と切り離せない関係にあることがわかります。シンプルさに対する議論をするときは、何に対してシンプルなのかを忘れないようにしましょう。
さて、ではプログラミングの目的とは何でしょうか?システムを作る目的は顧客の要求する機能を実現することです。であればプログラミングの目的は機能するコードを書くことであり、シンプルさとは書きやすいコードを書くことになりそうです。
あれっ?なんか実感と違いますね笑
現代のシステムは使い切りというのはありえなく、何かしらの保守や変更作業が必ず発生します。同一のコードに対して書くことよりも読んだり変更したりすることのほうが何倍も多いです。最初のシステムの目的が違います。システムを「作る」目的は顧客の要求する機能を実現することですが、システムを「維持する」ことも求められるのです。つまり、プログラミングの目的は機能するコードの他に保守や変更しやすいコードを書くことですね。
どのような性質がシンプルさの目的になるのか並べてみました。
- 書きやすさ
- 読みやすさ
- 再利用のしやすさ
- 変更のしやすさ
- 理解のしやすさ
- 保守のしやすさ
それぞれ完全に分離しているわけでもなく、網羅もできている感じはないです。もしこのような分類のほうが適切だよという方がいましたら意見ください。
シンプルさに対するよくある誤解
シンプルさを簡単であることや、単に構成要素が少ないことだと思っている人がいます。部分的には正しいのですが、簡単で構成要素が少ないだけでその目的が達成できていないものは、シンプルではないです。テレビのリモコンをシンプルにしようとして、電源ボタンしかなければ、チャンネルを変えることができず、役に立ちません。
シンプルを柔軟性と同列に扱う違和感
書籍によっては柔軟性よりもシンプルをとったほうがよいみたいな書き方がされています。しかし何に対するシンプルなのか明確ではないです。どちらかというと柔軟性とはシンプルの目的に位置する言葉であり、シンプルと同列に扱うものではないと僕は思います。この場合は変更のしやすさ(柔軟性を言い換えています)を優先することで、書きやすさと理解のしやすさが犠牲になるといった議論のほうが同じレベルでの議論になると思います。
まとめ
「こっちのほうがシンプルでいい」という発言には、文脈によって
- 書きやすさ
- 読みやすさ
- 再利用のしやすさ
- 変更のしやすさ
- 理解のしやすさ
が都合よく出たり消えたりします。シンプルの裏に何が潜んでいるのか、明らかにしてから議論するほうが混乱せずにいいなと思いました。
参考にした記事とキーワード
less is more
シンプルさは洗練
足し算よりも引き算のほうが大事
削ることが大事
理由
- 認知的負担の軽減
- 時間とお金の節約
- 選択肢が少ない方が迷わない
- 普遍的な存在。一貫性のあるもの
- 壊れにくい
- 構成パーツが少ない
シンプルにすることでヒットしたプロダクト例:
- 構成パーツが少ない
- iPhone – 物理ボタンを極力排除
- MacBook Air – DVDドライブ排除
- Twitter – 140文字まで
- Facebook – 実名プロフィール
- Instagram – 画像のみ
- Vine – 6秒までの動画
- Snapchat – 消える
- Medium – 記事を読むことだけにフォーカス
- GoPro – カメラから液晶を排除
- Kindle – 本を読むだけのデバイス
フォーカス
メッセージ性
無駄の排除
ミニマム
simple is not easy
シンプルとは本来複雑なものを、いかにわかりやすくするかということ
そのためには隠して伝えたいことだけ伝えることが大事?
単に要素数が少ないということではない?
Discussion
とはいいつつも、シンプルさの目的候補が
書きやすさ
読みやすさ
再利用のしやすさ
変更のしやすさ
理解のしやすさ
保守のしやすさ
と〇〇容易性という例しかでないあたり、簡単であることのニュアンスが強い気がする。