セカイノカタチ

世界のカタチを探求するブログ。関数型言語に興味があり、HaskellやScalaを勉強中。最近はカメラの話題も多め

"Simple"と"Easy"は相反する

「EasyでなくSimpleを求めよ」とは、最近(特にプログラミングの世界で)よく言われることですが、EasyとSimpleは、似ているようで違う概念です。

日本語だと、「簡単」と「単純」と訳すのが妥当でしょうか?

日本語でも、似たような響きの言葉になります。

そもそも、言葉の定義でいうと、この二つは同じような意味を指しており、最近言われるような深い意味は無かったのかもしれません。しかし、Easy/Simpleの些細な概念の違いは、この世界の構造にかかわるような重要な真理が秘められていると思いますので、あえてここでは二つの概念について掘り下げてみたいと思います。

まず、Easy(簡単)ですが、この言葉を反対にすると、Difficult(難しい)です。それに対して、Simple(単純)の反語は、Complex(複雑)になります。

Easy/Simpleは、同じような言葉ですが、反語にすると、DifficultとComplexと、全く違う言葉になります。

これをプロットするとこんな感じでしょうか。

f:id:qtamaki:20180823080242p:plain

こうすると4つの領域が出現するわけですが、それぞれについて見てみましょう。

Easy / Simple

簡単で単純なものです。

これは簡単ですね。「こんにちは」みたいな一言の会話や、「1,2,3,4,5...」みたいな数列とか、「printf("Hello, world!!"」みたいな単純なプログラムが該当して、元々情報量が少なく、労せずして簡単で単純な構造を持つことができます。

Easy / Complex

簡単で複雑なものですが、これはダラダラと情報量が多いことを指します。

井戸端会議の長話とか、Twitterのタイムラインとか、ログファイルやセンサーの生データ、簡単だけどやたら長いプログラムなど、一つ一つの情報は簡単に理解できるのですが、量が多くて関係性も整理されていないため、全容を把握するのは困難です。

世の中で自然発生するデータは、主にこの性質をもったものが多く、新米プログラマが書くプログラムコードが、重複や無駄、複雑な関係性を持っていてメンテナンス困難なのは、この領域に存在するからです。

Difficult / Simple

単純で難しい領域です。

俳句や漢詩、歌の歌詞など、短いセンテンスの中に複雑さを閉じ込めて、シンプルにまとめ上げています。短いからと言って、決して簡単なわけではなく、さまざまな制約や文化背景など、読み解くのにはそれなりの教養が必要となります。

数式などもこの領域に入るでしょう。短い式の中に、この世界の法則を記述しており、良い式であれば、より多くの事象や計算に対して、良い結果を出します。

プログラミングでも、良いコードというのは、物事の本質を突き、高度な抽象化構造を持っています。

情報量が多いものをシンプルに保つためには、「難しさ」を避けて通れないということです。これが、EasyとSimpleが相反するという意味になります。

Difficult / Complex

最後に、複雑で難しいという領域ですが、対象となる情報量が多くて、難しさを上げても、シンプルさを保ちきれないものになります。

例えば、宇宙ロケットや核融合炉など、この領域の事象も枚挙にいとまがないと思います。

最近のニュースですと、望月教授の「ABC予想」の証明などは、世界中の最高の数学者が読解を試みても、年単位の時間がかかってしまう代物だそうで、膨大な量の「複雑さ」を「難しさ」に変換して抑え込もうとした結果なのだと思います。

「異世界からきた」論文を巡って: 望月新一による「ABC予想」の証明と、数学界の戦い | WIRED.jp

ポイントは情報量

ここでポイントとなるのは、情報量です。シンプルかそうでないかという議論は、暗黙的に世界の様子を写し込むという行為が前提となっています。

例えば、俳句であったり、数式であったり、アプリであったりするものは、現実世界の情報を何らかの形で写し込んだものです。

f:id:qtamaki:20180823171743p:plain

その時、元となる対象の情報量と、写し込んだ対象の記述量との差が、情報の圧縮率となり、情報の「濃度」ともいえるものとなります。

世界は無限の複雑さを持っていますが、そこから一部を切り取り、圧縮して符号化した結果が文字であり、数式であり、プログラムコードということになります。

どれだけ多くの複雑さを取り込めるかという問題は、符号化の難しさに関わってきます。より難度の高い抽象化を行うことにより、少ない記述量で多くの問題に対処できるように、情報を圧縮し、濃度を高めることができるのです。

結局シンプルとは何なのか?

シンプルであるということは、結果の記述量が少ないということを表します。

対象の情報量が少なければ、「シンプル=簡単」で問題ないのですが、情報量が増えていくと、シンプルさを保つのが困難になってきます。

より多くのケースにうまく合致する法則を探し出して組み合わせ、全体の複雑さの増加を抑える必要があります。

情報の圧縮には「必ず」難しさがともないます。

物事をシンプルに保つということは、簡単さとは相反する行為なのです。

f:id:qtamaki:20180823164654p:plain