大規模ソフトウェアの効率的な理解(その5)
動的理解、静的理解
ソフトウェアの理解のもう一つの視点は、ソフトウェアの動的な理解と静的な理解というのがある。
動的というのはソフトウェアを実行した時の挙動のことをさし、静的というのはソフトウェア(プログラム)の字面をさす。
静的な側面からの理解はソフトウェアのコードを読み、そこから何らかの形でプログラムの挙動を理解していくというアプローチになる。字面からの理解ということで、ディレクトリ構造やファイル名や変数の命名規則、コードリファレンスなどが静的な理解の対象になる。
動的な理解は、デバッガによる実行、プロファイラ、トレーサー、ベンチマーク、リグレッションテスト等々実行結果による理解となる。各種ツールが理解を支援してくれる。
ソフトウェアというものは、単純化すれば、ある入力に対して何らかの出力をする機械ととらえれば、ソフトウェアを理解するという事は、その入出力の組を知ることに他ならない。動的な理解というのはまさにそのソフトウェアを動作させ、その入力と出力の組を確認することになる。マクロでとらえればそのようになるが、実際は、その入力と出力の変換方式を詳細におっていくという作業になる。
動作をどんどん微分していけば最終的にはソースコードの一行になる。何百万行の大規模ソフトウェアも最終的には一つ一つの命令に帰着する。そうするとその動作はプログラムの静的な側面になる。机上デバッグというソースコードを机上で一行一行読み理解するプロセスというのはその一行一行の静的な意味を積み重ねて動的な意味に脳内で変換する作業といえる。
動的な理解と静的な理解をいったりきたりしながらソフトウェアの挙動を徐々にとらえていくというプロセスになる。
このソフトウェアを理解するプロセスというのは、あまり明文化されていないし、各人のスタイルに依存するが、あえてそのプロセスを明記する事を試みる。それが成功(?)すればデバッグやトラブルシューティング、性能チューニングの手法の一助になるかもしれない。(ならないかもしれないが、やってみない事にはわからない)




コメント