はじめに

ソースコードを読めると何が良いか

この演習/講義を選択した時点で、みなさんは何がしかソースコードを読めることに価値を見出しているはずです。この演習/講義を作るにあたり筆者が想定した「ソースコード」を読めると役に立つ状況を典型的な状況を延べます。

研究活動において

修了/就職する先輩から引き継いで研究を行うことを考えます。3月に引き継いだ内容には、提案内容の実装や、それを検証、実験するためのプログラムが含まれているとします。自身の研究を進めるにあたって、それらのプログラムに機能を追加したり、あるいは不具合を直すといった改変が必要になったとします。単純明快なプログラムであれば改変も簡単かもしれません。

複雑難解な場合、そうは行きません。自身の研究が本格化してくる頃に講座を離れた先輩に、そのプログラムについて質問してみて下さい。先輩自身も自分の書いたプログラムの詳細についてすっかり忘れてしまっているかもしれません。先輩が修論提出直前に仕上げた実験のプログラムであれば文章化も十分では無いでしょう。このときソースコードが、そのプログラムを説明する主要な情報源となります。

改変する代りに論文を読み直して一から再実装することもできるでしょう。しかし研究の過程で改変の対象となるのは先輩から引き継いたプログラムとは限りません。gccコンパイラ、linuxカーネル、 netbsdカーネル、apacheウェブサーバ、firefoxウェブブラウザといった大規模なフリー/オープンソースソフトウェアを研究の材料、基盤としている場合、もはや自身で代替を短期間に再実装するというのは現実的ではありません。研究を進めるには改変するしかありません。

ソースコードを読んで理解するという作業は、このような改変の前提となります。改変の種類によっては、改変のほとんどの大部分が読解作業に費されることになります。

業務として

大学院を離れてからもソフトウェアに携っている限り、ソースコードを読んで理解するということが多くの場面で役に立ったり、必要となったりします。

自社開発したソフトウェアについて不具合の修正や脆弱性へ対応する保守業務、十分にはドキュメント化されていないサードパーティ製のライブラリやフレームワークを活用したソフトウェア開発業務はその例です。十分にドキュメント化されていても、そのドキュメントとソフトウェアの実際の動作とが一致しなかった場合、その動作についてより詳細に理解したくなることでしょう。

サードパーティ製のソフトウェアについて保守契約があれば調査を依頼できますが、重大な疑問に関しては調査結果を開発担当者自身で確認したくなるでしょう。保守契約を結んでいない場合や、どこも保守サービスを提供していないソフトウェアを使う場合、どんな疑問であれ開発担当者自身で調べる必要があります。自分の目ではっきりと確認できます。

日常的にコードリーディングを実施している人にとって、それはあたり前のことすぎて、あまり多く語られることが無いように見えます。

演習の前提

演習はC言語で記述されたソースコードを対象としています。C言語についてある程度知っていることを前提とします。C言語の文法と意味を一から説明することはしません。具体的に以下のような基準を設定しました。

  • 300行程度のプログラムを書いたことがある。
  • 構造体、ポインタについて知っている。
  • 分割コンパイルしたことがある。
  • malloc/freeしたことがあり、その意味を知っている。

演習の作業に用いるプラットフォームをFedoraとしました。できるだけ環境に依存しない技法を説明したかったのですが、実際にソースコードを読んでもらうには作業環境が必要です。コマンドラインインターフェイスに抵抗が無くまた、GNU/Linuxの基本的なコマンドを知っていることを前提とします。

  • コマンドラインインターフェイス
    • プログラムを起動できる。
    • プロセスを停止させる方法としてcontrol-cを知っている。
    • パイプラインを組んだことがある。
  • ページャー(less)
    • ファイルのオープン、終了の方法を知っている。
    • 前方、後方スクロールができる。
    • 前方、後方文字列サーチができる。
  • エディタ
    • ファイルのオープン、編集、保存の方法を知っている。
    • 前方、後方文字列サーチができる。

演習の目標

  • オープンソースソフトウェアについてソースコードを入手できるようになる。
  • 500行程度、複数ファイルからなるプログラムについて、制御フロー、データフローを追跡することで、そのソフトウェアの動作を説明できるようになる。
  • より大きな規模のプログラムについても、混乱することなく計画立てて読めるようにコードリーディングの作業モデルを持つ。

心構え

  1. 読まずに済めば幸い。
  2. どうしても読まないといけないことが確実となったら諦めて読む。
  3. 綺麗、汚ないについて考えない。
  4. これは演習なのでとにかく読む。