抽象と具象の間:Goはなぜ気持ちいいのか。
goが何故こんなに気持ちいいのか分析してみよう。最初は微妙な仕様と思ったけど、使うと味が出てくる感じがする。。。
— 松下正嗣 (@masatsugumatsus) September 7, 2015
てなわけで、思うところをつらつらと書いてみる。ポエムだから、意味はあまり理解しようとしないほうがよい。
Go言語とは
手続き型のコードは分かりにくいのか?
→簡単な問題をとく場合は分かりやすい。コンピュータに対して、何をさせているのかが明確。ただし、複雑な問題を解く場合は分かりにくい。複雑な問題を解く場合は、詳細な情報が脳の処理能力を圧迫するから。複雑な問題を分かりやすくするために人間は問題を抽象化して、情報量を圧縮する。
オブジェクト指向や関数型は分かりやすいのか?
→オブジェクトや関数は手続きが抽象されたもの。抽象化された語彙に習熟している人にとっては分かりやすい。逆に、ある分野の初学者がいきなり抽象的な理論、専門用語を使って何かを説明されてもわからないようにその抽象を理解できないものにとっては分かりにくい。
オブジェクト指向や関数型のプログラムを理解しやすい、と感じる人は、オブジェクト指向や関数型が解決しようとしている問題を良く理解している人。抽象化は進めば進むほど、エキスパートにとってははるかに難しい問題を解くことが可能になる反面、問題領域の初学者にとってハードルを上げることになる。
人の問題と解決策の理解を促進するものは、抽象的な理論そのもの(オブジェクトや関数)でも、問題や解決策の赤裸々な記述(手続き)でもなく、抽象と具体を行き来するプロセスだと思う。
Goに備わった簡便な抽象化の仕組みであるインタフェースは手軽に問題を抽象化するが、具体的なコードと非常に近いところにある。
例えるなら、Javaが高校数学、Scalaが大学レベルの数学を駆使して問題を解けるようにするのに対して、Goは中学レベルの数学を利用して問題を解かせようとしている感じ。
その意味で、分散処理プラットフォームみたいな、高度な技術にJavaやScalaが好まれる、というのはわかる。
自分が最も尊敬するワインバーグの言葉に「小学校4年生が解けるより難しい問題を解こうとしているなら、何かが間違っている。」っていうのがある。
大抵の実践プログラマたちにとって、学術的で高尚な問題をとく、というよりも日常のありふれた問題を解くのが仕事だろう。
go言語の仕様には、ともすると問題を難しく考えすぎる自分らに対して、地に足のついた問題解決を促すメッセージを多分に含んでいる気がする。
「シンプルに考えよう。これで充分でしょ!」って。