セカイノカタチ

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

プログラミングとは、世界の複雑さを難しさに変換する作業だ

f:id:qtamaki:20160710064614j:plain

プログラミングとは、世界の複雑さを難しさに変換する作業だ。

人月の神話によれば、ソフトウェアの複雑さは付帯的事項ではなく、本質的だという。

世の中は、複雑にできている。

膨大なデータとルールが存在し、リアルタイムに互いに相関しながら変化し続けている。

それらの複雑な事象の共通項や隠されたルールを導き出し、符号化していく事が、プログラミングの本質となる。

「簡単なコードは複雑性が高い」という性質は、一般的に言えることだ。

初心者は、コピペや重複した処理を書きがちである。

上級者は、それがどんな結果をもたらすかを知っており、毛嫌いする。

それは、制御不能なソフトウェアの出来上がりである。

ソフトウェアは、それに取り組む人間が、改変や改修することが不可能になった時点で破綻する。

制御不能とは、複雑さがプログラマーの限界を超えることである。

簡単なコードが、より早く破綻することをベテランエンジニアは知っている。乗り心地の良いサスペンションが、レースで役に立たないのと同じことだ。

では、どうするのか?

コードを抽象化するのだ。

抽象化とは、世界の複雑なルールとデータから、共通項を見つけ出し、コードの重複を省いていく工程にほかならない。

より高度な抽象化は、より難解な理論によって成り立ち、理解するための力を必要とする。

情報が圧縮され、高圧で保存されてるようなものだと考えれば良い。

そもそも、プログラミングとは、より頻度の高い事象により良い符号をあたえ、繰り返しを圧縮していくという意味で、ハフマン符号化と何ら違うところはない。

より複雑な事象を符号化し、人の制御下に置くためには、より圧縮率を高める必要がある。

それには、より難しい概念を必要とする。

ソフトウェアが扱う問題の領域を拡大し深化させるためには、なるべく長い間プログラムを制御可能な状態に維持し続けなければならないのだ。

今、世界中で扱われるデータとルールの量は物凄い勢いで増えている。

つまり、現実世界のアナログデータがものすごい勢いで、符号化されているということだ。

これにより、プログラマーと彼らが生み出すソフトウェアは、より複雑な事象をコンピュータの世界に落とし込まなければならなくなっている。

複雑なデータは高度なソフトウェアを必要とし、高度なソフトウェアは、より複雑なデータをコンピュータの世界に引き込む。

現在起こっている、人類の進化を一言で表すと、この循環に行き着くことになる。

ソフトウェアと社会は、お互いがお互いに影響を与え合う間柄で、正のスパイラルによって加速度的に進化を推し進めているのだ。

「ソフトウェアを簡単に書けるようにしよう!」という試みは、残念ながら本質から外れているため、必ず失敗する。

簡単さは、複雑さをそのまま取り込むと言うことに他ならず、複雑さは、放っておくと指数関数的に増大するので、すぐに破綻してしまう。

ソフトウェア開発に於いて、必要なスローガンは「より難しい概念を扱えるようにしよう!」となる。

他と競争する力を生み出す正常進化と呼べるものは、より難解で抽象度の高い概念を扱うことだ。

最新の言語やライブラリ、プログラムコードは「複雑」なのでは無く「難しい」のだ。

「○○言語で書かれたコードは複雑すぎる(実は難しいのだが)」「もっと簡単に出来ないのか?」などと言う声をよく聞くが、複雑さはソフトウェアの本質であり、対処方法が「難しくする」しかない以上、これは不可能なのだ。

これからもプログラミングはどんどん難しくなる。

理解できない人間は退場するしかないのだ。

これは、万人にとっては受け入れ難い事実かも知れない。

しかし、事実なのだ。

これから先、コンピュータの世界は、より高度な概念が必要となり、より先鋭化するだろう。

最先端の概念には、超高密度に圧縮された概念が詰まっており、一部の専門的な分野を持つエキスパートしかたどり着けないかもしれない。

プログラマーは立ち向かわなければならない、全ての情報が一点に集中するようなコンピューティングの地平を目指して。

そこがこそが、ピリオドの向こう側を目指すプログラマーたちの集う約束の地だからだ。