最終更新日: 2007-11-15
WEB+DB PRESS Vol. 42 に向けて書いた記事の元の原稿です。
「プログラミングに関する雑多な事柄」がテーマの本連載、第5回今回はソースコードを読むこと「コードリーディング」について取り上げてみたいと思います。
他人のコードを読む場面には、いくつかのパターンがあると考えられます。以下に例を挙げてみます。
上の3つは、コードを読んで理解しよう、勉強しよう、参考にしようといった、積極的なコードリーディングであるのに対し、下の2 つは、どちらかというと仕方なしに、という消極的なコードリーディングといえそうです。個人的には下の2つのような場面を「強制コードリーディングモード」と呼んでいます。
コードリーディングには、さまざまなメリットがあります。優れたコードから、テクニックやベストプラクティスを学んだり、といったことは代表的なメリットです。
たとえば、ある種のお約束的な事柄は他のプロジェクトを真似するのが一番の早道です。Perl モジュールのパッケージングや GNU autoconf の使い方などは文書を読むより、実際の例をみた方が参考になります。
すべてのコードがよく書かれているわけではないので、たくさんのコードを目にすることにより、いいコードと悪いコードの違いがだんだん見分けられるようになってきます。これによって、自分のコードのレベルが世の中のレベルと比べてどうなのか、なんとなく感覚がつかめます。
実際のところ、普及しているオープンソースのプログラムの中には、「こ、これは」と首をかしげたくなるようなコードなものも割と多く、広く使われるためには必ずしもきれいなコードである必要はない、などということも発見できます。
他人のコードを読むには、ちょっとした意気込みが必要です。まず第一に、ソースコードをとってきて読む、というのは手間ですし、「読んでも難しくて理解できないんじゃないか」という不安もあります。
私の見るところ、この辺は慣れの問題です。いきなり手ごわいコードに挑戦すれば挫折してしまうかもしれませんが、自分がある程度詳しい分野のコードであれば、読んで理解するのはそう難しくありません。身近なところから始めてだんだん慣れてくると、コードを読むことへの抵抗感は減っていきます。
コードリーディングの方法については、本誌の Vol. 35 に特集があります。また、そのものずばり「Code Reading」*1という本が出版されています。青木峰郎さんによるサイト「ソースコードを読むための技術」 *2 には、コードを読む際の戦略やツールについての情報が充実しています。
上のところで敷居の高さについて触れましたが、実はこの辺の感覚は、スクリプト言語とコンパイル言語ではずいぶん違いそうです。
スクリプト言語の場合、その言語で書かれたライブラリは /usr/lib/ruby などの特定のディレクトリにテキストファイルのまま保存されているため、いつでも読める状態になっています。
一方、コンパイル言語、たとえば C 言語では、ライブラリは /usr/lib などのディレクトリにバイナリ形式で保存されています。ソースを読むには別途、ソースコードを取ってこないといけません。
個人的には、スクリプト言語でプログラミングを始めた方が、コンパイル言語で始めるより上達が速いと考えているのですが、ライブラリのコードへのアクセスのしやすさも、その理由のひとつかもしれません。
man 読め…
*3
今回はコードリーディングについて書きました。コードリーディングはプログラミングを学ぶ上で、あるいは、問題解決を行う上で欠かせないプラクティスのひとつです。
*1Diomidis
Spinellis, 『Code Reading』, 毎日コミュニケーションズ,
2004
*2<http://i.loveruby.net/ja/misc/readingcode.html>
*3雲のような吹き出しでお願いいたします