色々なプログラミング言語を触ってみた方が良いと思う理由

「○○が書けるからそれ以外のプログラミング言語を勉強する必要性は感じない」というような意見を聞いて、その時、直観的に「それは違うんではないかな」と思ったんだけど、どう違うと思うのかを上手く説明出来そうになかったので適当に相槌を打っといた、ということが何回かあったので、どう違うと思うのか、改めて考えみた。

やりたい事やり方は分けて理解した方が良い。

普段はあまり意識しないけれども、アルゴリズムとそれを特定の言語で表現したプログラムは、別のレイヤーに属する物である。林檎でお腹は膨れるけれど、「林檎」という言葉を味わうことはできない、という事。
アルゴリズムによって現実の世界で何らかの機能を果たそうとすると、必ず何かしらの言語でプログラムとして表現される必要がある。だので、それらは別物なんだけれど、普段その事を意識する事はあまりないし、難しい。
話を分り易くするために、敢えて単純化して、以下ではアルゴリズムを考える事は知的で創造的な思考で、それをプログラムとして表現するのは単純で機械的な作業である、という立場を取る。自分が本心からこんな風にドラスティックに考えている訳ではなくて、敢えて単純化して話を分り易くしようとしている。大事なことなので二回言いました。
有名な話だけど、FizzBuzzを書けないプログラマが居る。なかなか納得し難い事態ではあるのだけれど、まぁ会社に入って大量のSEと仕事をしていると、何となく分かってしまう。ここに面白いジョークがあって、問題をこのように書けば、彼らでもFizzBuzzを書けるだろう、と。確かに、そう思う。ここで、FizzBuzzの要件からこのような手順を明示的に導き出せるのが、アルゴリズムを考えるという能力である。そして、この詳細設計書の手順を逐語的にコードに置き換えるのが、プログラムとして表現するという作業である。

単一の言語だけにしか触れないよりも、様々な言語に触れた方が、アルゴリズムについて考える能力を効率良く伸ばす事が出来ると思う。

自分は、普段はC++で仕事をしているが、ちょっと前にLispを勉強し始めた。LispC++は大分違う。そして、自分は、LispよりはC++の方が経験が深い。なので、Lispを書いていると「C++だったらすんなり書けるのに、Lispだとどう書いて良いか分からん。うがー」という事がままある。この時、頭の中にはC++のコードが浮かぶ。そして、「C++でこうやって書いているのは、一体、何をやっているんだろう」と、思考がアルゴリズムのレイヤーに及ぶ。そこでやりたい事をクリアにした後、Lispでそれを実現する為のやり方を考える事になる。もし、自分がC++でしかプログラムを書いてこなかったならば、こういう頭の使い方をする機会はなかっただろう。

特定のどの言語からも独立した概念としてアルゴリズムを捉えられるのは有用な事であると思う。

全く触った事が無い言語でFizzBuzzを書け、と言われた時、アルゴリズムのレイヤーで物事を考えた事がない人は、お手上げだろう。少なくとも短時間で仕上げる事は難しいと思われる。Hellor Worldから始めて、様々な練習問題を解き、その言語における色々なやり方を頭に詰め込み、そのレパートリーが充分に広がった所で、FizzBuzzのプログラムが書けるようになるだろう。一方で、FizzBuzzを実現する為に必要なやりたい事を言語とは独立に頭に思い浮かべる事ができる人は、短時間で実装に辿り着く事が出来る。最終的に必要なやりたい事のやり方をググれば終わりだ。
日本語で作文をする際も、分かりやすい文章を書く為には、まずは言いたいことが何であるかをはっきりと意識する必要がある。その上でそれを伝える為に最も良いと考えられる言い方を模索しなければならない。思い付いたことをだらだらと並べるだけでは、何が言いたいのか全く分からない文章が出来上がる。
プログラムを書く時も同じで、やりたい事をキチンと意識して、それを分り易くコードとして表現するという態度で望まないと、とても簡単に、もの凄く分かりづらいコードが出来上がる。何に使われるのかよく分からない変数の宣言がだらだらと至る所に散漫と散らばっていたり。本来、分けて書かれるべき別個の処理のロジックが混在してしまっていたり。そんな調子で、最終的には、一つの関数に、考えられる全ての条件下における全ての必要な処理を何千行も費やして押し込めてしまう事になる。こういうプログラムをリファクタしたりデバッグするのは、とても、しんどい。



こういった事態を避ける為に、プログラムとは独立にアルゴリズムを把握出来る能力は、役に立つ。やりたい事を実現する為に必要かつ充分な準備は何か。やりたい事は、それより小さな粒度のどんなやりたい事の複合物であるのか。やりたい事を実現する為に処理を変えなければならない場合、処理方法を決定する要因は何であるのか。
こういった事を、漫然とプログラムを書き始める前に、頭の中に明示的に思い浮かべられると、出来上がるプログラムは読み易いものとなる。そして、そういった思考を養うのに、普段とは違う言語で書くというのは、絶好の訓練になるのだ。