最近、あまり Ruby を使っていないことに気がついた。
自分の中でのポジションとしては、いちばんの軸足は C# に置いてある。
言語だけでなく .NET Framework という環境を含めての判断、自分の経験や経歴も含めての判断だ。
その上での補佐的な役割として(たとえばテストデータの生成や、集計、Windowsのバッチファイルでは書きづらいちょっと高度なスクリプト作成など) Ruby を使ってきたのだが、C# 3.0 になってあまり使わなくなってしまった。
というのも、"自分にとっての Ruby" としての魅力的な点のいくつかが、C# 3.0 でも使えるようになってきたからだ。
構文が簡略化されているのが私的にけっこうポイントだったりする。自動プロパティやコレクション初期化子、オブジェクト初期化子などがそれだ。
またラムダ式も、デリゲートを Ruby のブロック並に簡単に記述できるようになり、重宝している(ラムダ式は単なるシンタックスシュガーではないのは承知しているがそれはさておき)。
既存クラスにメソッドを追加できる(ように見える)"アブナイ"機能、拡張メソッドも私好みだ(Ruby だと、追加のみならずオーバーライドまでできて何でもありだが)。
Ruby にある、each や each_with_index を、IEnumerale
に追加して、Ruby で好きだったこれらのメソッドを C# でも使えるようになるのだ。そして先述のラムダ式の利用と相まって、ますます Ruby のブロック構文に酷似していく。
そしてなにより、LINQ の存在がとても大きい。
LINQ に慣れると、LINQ のほうがより直感的に、可読性高く、集合操作が書けるようになる。
Ruby でもかなり LINQ に似た書き方ができるのだが、個人的には僅差で LINQ のほうが肌に合う。
こうなると、Visual Studio というちょっと重めの IDE を立ち上げてさえ、軽快なテキストエディタ + Ruby よりも、C# を使うようになってきた。
そうそう、別に C# でも、テキストエディタ + csc.exe という組み合わせはありなのだが、インテリセンスという魅力があるため Visual Studio を立ち上げてしまう。
別に Ruby が C# より劣っているというような話ではないし、個人的には Ruby に心惹かれる点が多いので、まだまだ今後も Ruby にはフォーカスしてくが、ただ、実務的には、少なくとも今は C# それに LINQ に揺り戻した感じである。
そのいっぽうで気になる存在は関数型言語だ。
ただし、Haskell をちょっとかじったりはしているが、まだまだ関数型言語の神髄というか、そのメリットを強く感じるまでには至っていない。
再代入がないことによる堅牢性や、マルチコアCPU時代における重要テーマとなる並列実行性など、関数型言語の多くにみられる能書きはわかるのだが、まだその能書きが自分のものになっていない段階だ。
また、自分的には、最終的に自分の仕事とどう結びつくかが大変気になるところである。
関数型言語を学ぶということは、必ずしもその関数型言語を使ったプログラムを仕事で書く、ということには直結しない。
関数型言語の考え方やエッセンスを身につけることが、プログラマとしての自分のスキルアップにつながると思う。
とはいえ、それでもやっぱり、実務でも関数型言語そのものを実務に応用できて、かつ、それが生産性や品質に寄与するならば、それは魅力的だ。
ということで最近の注目株は F#。
再代入や参照透明性云々の観点から"純粋"関数型言語とは言えないのだそうだが、.NET 言語の一員ということでもあり、むしろ "実務への応用" という見方では、Haskell よりも F# のほうがとっつきやすそうだ。
なんと言っても、必要に応じて、C# で使い慣れた .NET Framework のクラス群が使えるのだ。このメリットは、実務応用の点では馬鹿にできない。