技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

ソースコードを解析する時のコツ

大規模なJavaプログラムのソース(内部仕様書なし)を解析することが多いので、その際に身に付けたソース解析テクニックについて纏めてみる。

 

マニュアルなどでプログラムの外部仕様を把握しておく

これが分かっていないと、ソースを見ても???となってしまうと思う。仕様がちゃんと分かっていれば、ソースを読んだときに、その部分がどのように動くのかイメージしやすい。

 

最初から細部には拘らない

最初に概要を抑えるとその後のソース解析がスムーズに進むので、まずはメソッドの中身にはあまり踏み込まず、メソッド名から何をするものなのかを推測して、ソースを浅く読み進めていく。その後、必要に応じて、メソッドの内容をちゃんと見ていく。

 

クラスの役割を意識する

Javaのようなオブジェクト指向の言語では、クラスAがクラスBのメソッドを呼び出して、さらにクラスBがクラスCのメソッドを呼び出して・・・といった感じで、どんどん見るべきソースファイルが切り替わっていく。この流れをただ漫然と追っていると、全体の構造が頭に入らず、一通り読んでも何だかしっくりこないことがある。そんな時は各クラスの役割と関係性を意識すると良い。例えば、クラスのフィールド変数や、publicメソッドなど外部に公開しているメソッドに着目すると、そのクラスの役割が分かることがある。

 

まずは正常処理を中心に追う

例外処理のためのコード (catch節) がソースの多くの部分を占めていることがある。概要を把握するには、そういった例外処理は一旦気にしないことにして、正常系の処理の内容把握に集中する。そうすると、最初に見る範囲が減って精神的にも楽になる。例外系の処理は、その後に必要に応じて追えば良い。

 

処理の起点を把握する

解析対象のソースの箇所が何を起点として実行されるものなのかを把握しておくと、全体の理解が進むことがある。逆にこれを押さえていないと、解析対象のソースがプログラム全体のどこ辺に位置するのか分からず、もっと上位まで追わないと機能理解に見落としがありそうでモヤモヤする。(精神的に良くない。) ちなみに、処理の起点としては、例えば、Mainから実行される、プログラム内のタイマーから実行される、ユーザ操作に起因して実行される、(監視キューにタスクが到着した等を契機に)コールバックとして実行される、などがある。

 

ソース中のコメントやログ出力の内容に着目

コメントを参考にするのは常套手段だが、ソース中に書かれているログ出力用のコードも参考になることが多い。人間なので、プログラムのコードよりは自然言語の方が理解が速いので、こういったものも有効活用したい。

 

実際に動かしてみる

実際にプログラムを動かして細かい挙動を把握しておくと、ソースコードの理解が進みやすい。その際、もし詳細にログが出るように設定できるならそうしておく。そうしておくと、ログからソースコードのどこの処理を通っているのかを知ることができ、調査対象範囲を絞ることができる。

 

メモを取る

ソース解析した内容は簡単にメモに残しておくと、あとあと見直した時の理解がだいぶ速い。解析した時はその内容を鮮明に覚えているが、しばらくすると忘れてしまうことも多いし、メモに残すとちゃんとやっている感(?)も出る。あと、メモを書くと、自分の頭の中が整理できるという利点もある。

 

 

この他、普段からやっておくこととして、Javaデザインパターンやイディオムに慣れておく、自分に合ったエディタや統合開発環境を探して慣れておく、といったことも重要である。特に、イディオムに慣れておくと、ちょっとソースを見ただけで、「ここでDBからxxxテーブルの情報を取ってきているな」とか「ここで外部プロセスと通信しているな」とかがすぐに分かるようになるので、解析スピードがだいぶ上がる。