@kyanny's blog

My thoughts, my life. Views/opinions are my own.

多くのプログラミング言語を学ぶ意味はあるか

特定のプログラミング言語を持ち上げたり、おとしめたりする意図はありません。

LISP が実務で(少し)役に立った話 - 刺身☆ブーメランのはてなダイアリー というエントリを書いたあと、社内の Rubyist 氏から Array#- を使えば良いと教えてもらった。

最初は Perl でこんな風に書けばいいなと思った。

use strict;
use List::MoreUtils qw(none);
my @foo = (1..20);
my @bar = (5..12);
my @diff;
for my $i (@foo) {
    push @diff, $i if none { $i == $_ } @bar;
}
print join ', ', @diff;

実際これは今書いて10分くらいで書けた*1。しかしすぐ思いついてたぶん苦労せず書けるのじゃつまらないなと思って再帰で書くのを思いつき、間違ってたりよりエレガントな解を教えてもらったりして、 Array#- があるじゃん、というオチがついたわけだ。

その後しばらくひっかかったのは、「繰り返しで一要素ずつ比較するよりも Array の差をとるほうが考え方としてはシンプルだし自然じゃね?なのになんで俺はそう考えもしなかったのか?」という点で、たぶん俺はそれが簡単にはできない言語でプログラミングを習得していったから「こういう問題はこう解くものだ」と思い込んでいたんじゃないかと。つまり、ポール・グレアムがBeating the Averagesプログラミング言語は単なる技術ではなく、プログラマーがそれを道具として思考するものと指摘した、それのことじゃないか!と。

「それ CPAN の○○モジュールでできるよ」とか、そういう話ではなくて、つまり新しい言語を学ぶと今までの自分が考えなかったような考え方で考えるようになる場合もあるというか、同じ言語を使ってても考え方そのものは学べるだろと言われればそうだろうけど、それをやるのは意識して努力する必要がある。だって今までのやり方でできるのになんで違うやり方を覚える必要があるの?という気分になるので。ところが全然流儀が違うものを使い出すとその流儀に従いつつ学ぶのでもう少し抵抗なく新しいやり方を身につけられるような気がするのだ。

あと普通に仕事とかでプログラムを書いてる上ではほとんど学ぶ機会がなさそうな概念とか、特にこの言語で学ぶとよくわかる!みたいな特定の概念とか、まぁ Scheme における継続の話とか最近書いたけど、ああいうのは call/cc をサポートしてない言語で学ぼうとするのは辛いんじゃないかと思うのだ。継続の概念がわかったからって何の意味があるの?ときかれると今の俺には答えるのがつらいけど*2、仮に将来どうしてもやりたい仕事があって「継続を理解していること」が条件だったときに諦めずに済むとか、そういう知識を要するような仕事は割とレアだと思われるので、レアな仕事がこなせるならレアな人材で希少価値が高まって生き残りに有利かも、とか。まぁ説得力ないのでやっぱり「趣味です」と答えることにします。

つまり、多くのプログラミング言語を学ぶ意味は大いにあると思う。例えそれら新しく学んだ言語を仕事で使わなかったり、それらの言語で役に立つプログラムを書いたりしなかったとしても。

*1:List::MoreUtils にもっとズバリのがあるかなと思って perldoc 読んでた時間も含む。それにしたって遅いけど。。

*2:なにしろまだわかってないからね