他人の書いたソースコードを読むことはプログラミング能力の向上に役立つ、と聞いたことがある人は多いだろう。例えば、Rubyの開発者として有名なまつもとゆきひろ氏は、自らが監訳者の一人である書籍「Code Reading -- オープンソースから学ぶソフトウェア開発技法」(毎日コミュニケーションズ発行)の序文で、「ソースコードこそソフトウェアのすべての知識の源」であり、「効率よくソースコードを読むことは、効率よく自分の能力を向上させることにつながります」と書いている。

 一方で、ソースコードを読むための環境も整った。オープンソースが一般化することで、入手できるソースコードは質、量ともに、一昔前とは比べ物にならないほど充実した。

 しかし、自らのスキルアップを目指して、実際にオープンソースなどのコードを読んでいる人は、さほど多くないだろう。他人の書いたソースコードを読むのは、既存プログラムの保守や追加開発を行うために、やむを得ない場合が多いのではないだろうか。

 スキルアップのためにソースコードを読んでいる人が少ない理由は単純だ。他人のソースコードを読むのは大変手間がかかる作業だからである。また、オープンソースなどで入手できるソースコードが増えたと言っても、今度は逆にどこから手をつければよいのか、とっかかりがわからないこともあるだろう。

 ここでは、2010年1月30日に開催された「ソースコードリーディングワークショップ2010」の講演やパネルディスカッションにおける、ひがやすを氏とよしおかひろたか氏の発言を基に、ソースコードを読むことの動機付けや意義について改めて考えてみたい。

書籍では得られない知識を得る

 オープンソース・プロジェクトSeasarで知られるひがやすを氏はパネルディスカッションの壇上で、「基本的に他人の書いたコードは読みたくない。疲れるから」と発言し、会場を沸かせた。とはいえ、ひが氏は、アプリケーション・サーバーのソースコードを「乱読」に近い状態で読んでいた時期があったと言う。

 ひが氏は、「ある分野の技術に興味があって勉強したいときには、その分野のトップレベルのオープンソースの実装を読むのが一番だ」と言い切る。そして、「技術の深いところまで知りたいときには、ソースコードを読むしかない。書籍は情報が古かったり、細かいことまで書いていないことが多い」と指摘する。ひが氏は、技術の書籍は1年に2冊程度しか買わないと言う。

 もちろん同氏の最終的な目的は、書籍では得られない知識を得ることではない。その知識に基づいて、ソースコードを書くことである。「良いコードを書くためには、良いコードを自分の中にたくさん取り込んでおく必要がある。無から有は生まれない」という考えである。また、悪いコードを読むことも、良いコードの良さをわかるようになるためには有効だという。

 さらに、ソースコードを読むことに関してひが氏は「インプットとアウトプットのバランスが大事」と語る。ただソースコードを読んでいる(インプット)だけではモチベーションを維持することは難しい。いろいろな人の評価に堪えるソースコードを書くこと(アウトプット)が、疲れる作業であるソースコードを読むことの強い動機付けになっているのだろう。

読む力は陳腐化しにくい

 オープンソース・プロジェクトなどでコードをバンバン書いているようなプログラマではない人は、動機付けについてどのように考えればよいのだろうか。Linuxの「カーネル読書会」を主催するよしおかひろたか氏は、「ソースコードを読む力は技術者にとって、陳腐化しにくい付加価値になる」(同)と指摘する。

 特定の製品や技術に対するスキルは、時間が経つにつれて陳腐化していくのを免れることはできない。しかしソースコードを読む力があれば、新しいスキルをいち早く習得することが可能になる。いわば、スキルを習得するためのスキルという位置づけである。しかも、「現在、ソフトウエア開発に伴う作業の大部分は保守・修正が占めている」(同)。既存のコードを読んで理解する力は、どの現場に行っても必要になる。

 よしおか氏は、「読む力は学校で教えてくれるものではない。経験から学ぶしかない」としたうえで、いきなり現場に入ることは「救命胴衣を着けずに海に放り込まれるようなもの」と語る。そこで同氏は、読む力を鍛える手段の一つとして、勉強会への参加を勧める。「勉強会でプログラマ同士が情報を交換し、コードの細部まで議論することは非常に有意義だし、何よりも楽しい」(同)。

 「読むスキルは今後、ますます重要性を増していく」と、ソースコードリーディングワークショップ2010を主催した奈良先端科学技術大学院大学の森崎修司助教は指摘する。スキルを陳腐化させない意味でも、自分なりの目的を定めて、ソースコード・リーディングについて考えてみてはいかがだろうか。