インチキひらメソッド*1

去年勤務先でDelphiで書かれたクライアントのソースコードを渡されて、「資料は無いけどこれを読んで修正箇所を調べて」と言われて、何週間か放置されたことがありました。それまで、ここまで厳しい条件で改修をしたことがなく、数日迷いました。その結果、ソースコードを全部読むしかないという考えに至り、ネットでソースコードを読む方法を探し、見つけたのが、ひらメソッドでした。ひらメソッド自体はC言語向けで、オブジェクト指向向けに書いたものではないようです。しかし、基本的な考え方が明快かつ深いので、応用が利きました(説明が親切なのも、ありがたかった)。
ページをパラパラとめくれば一動作ですべてのページを眺めることができるので、wikiでなくノートにボールペンで書くことにしました。関数1つにつき、ノートを1ページ割り当て、ノートの見出しの行に関数名を書きました。本文には、そこで使われているクラスや関数のうち、このソースで定義していそうなものを、いいかげんに抜き出していきました。ソースコードに書いてある順に、そのままノートに書いたため、ひらメソッドの基本のボトムアップアプローチですら守れませんでした。とにかく、ノートの1ページの見出しに関数名を書いて、本文にそこで使われている関数や変数をあてずっぽうで書いていきました。Delphiオブジェクト指向ということで、クラスらしきものがあったら、それも書きました。ノートの1ページをはみ出しそうになったら、いい加減にはしょって、とにかく1ページしか書かないようにしました。もはや、ひらメソッドではなく、インチキひらメソッドでした。
関数の数はプログラム全体で700〜800くらいありました。最初の50関数くらいは、でたらめながら、ソースを読んで思うことを書いてました。しかし、その内、繰り返し使われているクラスや関数や変数やSQL文字列をただ抜き出すだけになっていきました(たぶんそれすら不完全)。途中は、ほとんど理解せずに、なんとなく書いていきました。
しかし、600関数くらいを読んだ辺りから、そのシステムの構造やコーディング方針などが、急に理解できるようになりました。その後、1関数ごとに読み込むようになり、内容が理解できる代わりに読解に時間がかかるようになりました。結局、650関数くらいで、別の方法で修正箇所を調べることになり、読解は中止してしまいました。しかし、その後の改修の際に、その時に理解した全体の構造やコーディングルールが大変役に立ちました。この関数はよく使われているなあとか、そういう見当もつくようになりました。ソースコードの情報だけでなく、関数はなるべく細かくしたほうが読みやすいとか、自分はアルゴリズムが弱いとかということもわかりました。
書いたノートは、後で読んでみると意外に役に立ちました。ソース自体はあるので、不足や間違いは、ソースを読んで補足修正すればそれでよかったのです。むしろその時はじめて、ボトムアップアプローチの利点を享受できました(このへんにインチキぶりがにじみ出ておりますが…)。
Delphiの勉強で、以前理解できなくて断念したサンプルソースがありますので、今度はこれをインチキひらメソッドで読んでみたいと思います。