これはPerl入学式 Advent Calendar 2015の8日目の記事です。昨日は@papixさんの、「なぜGaiaxは新人研修の資料を全部Perl入学式に譲渡して「Perl入学式の教科書」として公開したのか?」と言う記事でした。いい感じに頑張っている企業の研修素材が公開され、自由に使えるのは本当に素晴らしいことだと思います。

こんばんは、東京でサポーターをしております、@tsucchiです。

先日、仕事で(多分)古いコードをリファクタリングしていたところ、こんな感じのコードを目にしました。

my @tmp = split '/', $filename;
my $file = $tmp[-1];

これは何をするコードでしょうか?

$filename に入ってくるのはファイル名のフルパスのようでした。つまりこれは、ファイル名のフルパスから一番末尾の部分をとってくるコードです。

例えば、ファイル名のフルパスが、/usr/bin/perl だったら $file には perl が入ります。

さてさて、実はこの処理をするには、タイトルにもある、File::Basename と言うモジュールの basename() という関数を使うのが鉄板です。すなわち、さっきのコードは

use File::Basename;
my $file = basename($filename);

と、書くことができます。

個人的な主観かもしれないですが、 basename() を使った方が分かりやすく、綺麗なコードになるんじゃないかなぁ、と僕は思います。少なくとも、最初のコードを見た時は、「ん?これ何だ?」と数十秒考えてしまったので、少なくとも僕にとっては最初のコードは分かりにくいし、思考が止まるので、こういうのやめてほしいな、と思いました。(なので、当該のコードは basename() を使うように修正しました。あとは細かいこと言うと、$file とか $filename と言う変数名はこれだと意味分からなくて最悪ですね…。それも直さないと…)

一方で、Perl入学式で学んでいる初心者の方にとっては、これは大きな違いではないし、重要ではない、とも僕は思っています。

昔、Perl Beginnersというところで LT した時にも触れたのですが(正解はひとつ!じゃない!!)、その言語のビギナーであれば、「赤ちゃん言葉」であってもぜんぜん良くて、やりたいことがちゃんと実現できていることの方がよほど大事です。

こういうの、多分どんなにプログラム沢山書いていてもあると思っていて、僕らみたいに普通に仕事で Perl のプログラムを書いていれば basename() の話は割と常識的で、知っているべきものだと思います。ですが、例えば、「自然言語処理の最新の論文で紹介されているアルゴリズムで使うべき変数名や関数名」とかだったら、たぶん僕がやったらめちゃくちゃな命名をしたり、使うべきライブラリや関数を使わずにコードを書いてしまう可能性は普通にあります。あるいは、僕がぜんぜん知らないビジネスのドメインの用語とかでも同じかな。マイナーであまり使われてないモジュールとか、自分が慣れてないモジュールの場合も思考が止まりそうですね。。。こういうの本当に微妙ですね。。。

と、いうわけで、この出来事の教訓は何でしょうか?

「ライブラリを使えば簡単に書けるものはそうすべき」そうですね。あるいは、「ライブラリを知らなくても、とりあえず問題を解決すべきコードは、それはそれで正しい」それもそうです。「コードを書く人、読む人はどこまで対象のドメインに対する知識を持っているべきか?」うーん、難しいですね。。。

結論なんて多分ないです。学ぶべきことは、誰にだって沢山あるのだと思います。

以上、ふと見かけたちょっとヘンなコードとそれにまつわるお話でした。

明日は@note103さんの砂場の話です。使い捨てみたいなスクリプトをどんな感じで管理しているのでしょうか。わたし、気になります。