コードを読むな理解しろ。http://blog.miraclelinux.com/yume/2006/10/post_e3d6.html というわけでもないが、どのようにコードを読むかということはプログラマにとって大変重要な関心事の一つだと思う。誰もが良き読み手になりたいと願うが、誰もそのことについて系統的に教えてはくれない。それこそ一子相伝の謎めいた読み方がハッカーコミュニティの中で受けつがれていたりする。昨今でこそコードリーディングだなんだとその重要性を喧伝する人々が出てきたが、かつてはやはり黒魔術の世界であったりした。そもそも、良き読み手になるであろう脂の乗りきったプログラマを使いすてにするような社会では、良き読み手になる前に35歳定年だなんだで継承すべき技術を獲得するまえに一線を退いてしまう。人材の使いすての極みであるが、そのような事をここで嘆いてもしょうがない。

例えば、セキュリティ＆プログラミングキャンプキャラバンなどでわたしなりにプログラムを読む技術について伝道を試みているわけである。もちろんわたしの技術など笑止千万なのは百も承知であるが、公開することによって、批判にさらされ、多くの叡智からの検証により、自分の技術の限界、問題点、課題などを知ることができ、それがさらなるノウハウの蓄積に繋ることを期待し、恥をしのんで、たとえ未熟であろうとも、その方法を公開している。

プログラムの理解の観点の二軸として、1) 静的理解、動的理解、2) 微視的理解、巨視的理解、というのをあげている。静的な構造というのは、文字どおりソースコードを字面の上で理解することで、コードのそのものであったり、ディレクトリ構造、名前付規約などなどである。動的な構造というのは、実際の動きをベースにしたもので、入力と出力(結果)の対であったり、デバッガによる動作の追跡であったりする。それに対し、微視的、巨視的という観点は主に規模の観点から、コードをどのように眺めるかということである。コードの一行一行に注目するのは微視的な理解であるし、全体像を把握するのは巨視的な理解である。

さて、この二軸を組合せると、四象限、即ち静的で微視的理解、静的で巨視的理解、動的で微視的理解、動的で巨視的理解という4つの方法がうかびあがってくる。

静的で微視的理解の典型はコードを一行一行読んでいくことだし、動的で微視的な理解の典型は、それこそデバッガーで一行一行実行(ステップ実行)して理解することだ。静的で巨視的な理解は、ディレクトリ構造を調べたり、全体の行数を調べたりすることである。では、動的で巨視的な理解とはどんなものがあるのだろうか。(先日のセキュリティ＆プログラミングキャンプキャラバン金沢でそのような質問を受けた)

実行結果(動的性質そのものである)を巨視的にながめるということはどのようなことなのか？

例えば、ベンチマーク結果などは、その典型である。ある実装ＡとＡ’の実装の差異をベンチマーク結果によって比較するなどというのは微視的な差異に着目するのではなく、巨視的な観点からなんらかの尺度にそって評価することである。

あるいはリグレッションテストなども、その一つと言える。リグレッションテストというのは、あるソフトウェアの期待する動作(入力と実行結果の組)を、実際に実行させた結果と比較し、従来の結果との差分(リグレッション、退行)がないか検証するテストプログラムである。プログラムを何らかの理由で変更した時に(バグ修正であるとか機能追加であるとか)、リグレッションテストを流し、従来の機能に非互換がないかを確認するために使う。リグレッションテストも動作の巨視的な理解を助ける方法の一つと言える。大雑把に言えば、リグレッションテストの結果が等しければ、その2つのバージョンの互換性は保たれているわけで、その意味で、2つのソフトウェアの動作は巨視的には等しいと言える。

ソフトウェアを理解する方法は人の数ほどある。それぞれの方法をパターン化し、様々な観点から分類理解することは、コードを読む方法論をエンジニアリングの手法として確立するために、誰もが再現可能な技術として伝承することができるようにするために重要だと考える。

黒魔術からエンジニアリングにしたいと強く願う次第である。

参考：

セキュリティ＆プログラミングキャンプキャラバン2008高松、プログラミング基礎、インターネットが変えた社会

ソースコードの読み方/ユメのチカラ http://blog.miraclelinux.com/yume/2007/08/post_d6bd.html