esm アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

プログラミング多言語主義

ちかごろプライベートではElixirばかり書いているe.mattsanです。

かつてはC/C++で仕事をしていました。 Object Pascalを使ったこともありますし、わずかですがLuaプラグインを書いたこともありました。 アセンブリ言語と格闘したこともあります。

みなさんは、何種類ぐらいのプログラミング言語を使っていますか?


わたしたちは、業務ではRuby on Railsを中心に開発を行っています。 Railsで開発をしていると、少なくともRuby, JavaScript, SQL の三つの言語を扱うことになります。

DSLをひとつの言語として含めると、Railsのルーティングも専用の言語で記述しているので、日頃から多数の言語を使いこなしていることになります。

今回は複数の言語を使うことの意味について考えてみたいと思います。


プラットフォームや環境の制限で、特定の言語を使用しなければならないことは多々あります。 そういった制約がなかったとしたら、複数の言語を使用する必要はあるのでしょうか。

例えばRubyを「プログラミングの母語」とする人にとって、データベースの問い合わせにもRubyを使えたら。 Active Recordは一つの解答です。 Active Recordのおかげでデータベース上のデータをRubyのオブジェクトとして扱えるようになりました。 それでも背後にあるデータベースを意識しないと、非効率な操作をしてしまったり、余計なオブジェクトを作ってしまったりすることがあります。

データベースのデータを扱うには、オブジェクトを扱う視点だけでなく、データの集まりを扱う視点がどうしても必要になってきます。 そんなときSQLを使うときの視点が役に立ってくれるはずです。

そんな視点をもたらしてくれることが、たとえ普段はほとんど書くことがなくても、SQLを使えることの意味の一つなのだと思います。


複数の視点を持つことの意味について考えるとき、「金槌の法則」を思い出します。 プログラミングに限らず、わたしがいつも気に留めるように心掛けている法則の一つです。

「金槌の法則」

クリスマスプレゼントに金槌をもらった子どもは、何でも叩きたがる。

ただ一つの道具しかもたない専門家は、ねじ釘を叩きかねない。

G.M.ワインバーグコンサルタントの秘密」

使い慣れた道具ばかりを使っていると、問題に合った解法を選択する代わりに、解法に問題を当てはめようとしてしまいかねません。

プログラミング言語は、それぞれ得意とする領域を持っています。 ある分野の問題を解決するために開発されたものであったり、解法を言語仕様に反映したものであったりします。 たとえばオブジェクト指向プログラミングを実践するためのオブジェクト指向言語があります。

ときおり引き合いに出されるように、オプジェクト指向プログラミングはオブジェクト指向言語でなくても可能です。 よほど特殊な事例と思われるかもしれませんが、プラットフォームや環境に制限がある中では、そのような状況が発生します。

個人的な経験では、電子機器の組み込みソフトウェアの開発がそのケースでした。 設計はオブジェクト指向でなされていますが、その環境で使用できる言語はC言語に限られるというケースです。 ありがたいことにその開発では、オブジェクト指向設計を念頭に開発されたライブラリを利用したため、そのライブラリにそった使い方をしていればオブジェクト指向を促されるようになっていました。

しかし、オブジェクト指向プログラミングそのものを知らなければ「何か勝手が違う」と文句を言いながら、ライブラリを使うだけになっていたかもしれません。 開発そのものではオブジェクト指向言語を使う機会がなくても、オブジェクト指向言語を使えるということが役に立ってくれたケースです。

では、新しい言語を使おうと思い立ち、READMEやドキュメントのtutorialを消化したら、次はどこに進むとよいでしょう。


わたしは、同じ問題を様々な言語で解いてみることをお勧めします。

そのとき、一つの言語でいくつもの書き方を試してみます。 他の言語の書き方を再現できないか。 他の言語ではまねできないような書き方ができないか。 今まで使うことのなかった関数や演算子を使うとどうなるか。 いろいろな方法で書いてみると、それぞれの言語の特徴を知ることができます。

あえて何度でも車輪を再発明する。

ときには、こんな解法があったのか、という驚きに出会えます。 今までにない解法を見つけたら、今度は普段使っている言語でその解法を使うとどうなるか探ってみます。

それを繰り返していくことで、言語によって得意な領域があること、今まで気付かなかった問題の捉え方があることを体験できるでしょう。 それが複数のプログラミング言語を学ぶ意義の一つだと考えています。


複数のプログラミング言語を学ぶとき、たとえそれぞれは自由に使いこなせるようにはなれなくても、思考の道具として役立てることができると信じています。

…と、ここまで、御託を並べましたが。 様々な問題を様々な方法で解けるようになることは、単純に楽しい行為です。 使えるプログラミング言語を増やして、そのような楽しみも増やしてください。