すぐに使えるソースコードの読み方を指南ソースコードリーディングワークショップ2010を開催

» 2010年02月02日 00時00分 公開
[内野宏信,@IT]

 奈良先端科学技術大学院大学は1月30日、東京・三田のキャンパスイノベーションセンターで「ソースコードリーディングワークショップ2010」を開催した。バージョン1.0と2.0のソースコードを用意し、その差分(パッチ)を適用して問題がないか否かを参加者全員に判断してもらうハンズオンのほか、楽天の吉岡弘隆氏、電通国際情報サービスのひがやすを氏、日本IBMの細川宣啓氏らを招き、講演やパネルディスカッションを実施した。当日は定員の60人全員が参加し、スキルアップに対する強い意欲がうかがえた。

コードレビューのベンチマークを作成し、工数の見積もり精度を向上

 今回のワークショップの目的は、「開発関係者同士で同じソースコードを読み、その感想を述べ合うことで交流の機会を作ること」(森崎氏)。当日は簡単な趣旨説明の後、2時間強に及ぶハンズオンが行われたが、その後の参加者同士によるグループディスカッションではどのグループも話が弾んでおり、目的は達成されたようだ。

写真 奈良先端科学技術大学院大学の森崎修司氏

 ハンズオンの結果は同大学 助教の森崎修司氏の研究グループが分析し、後日、論文などで結果のフィードバックを行う。具体的には、各差分のソースコードの特徴を明らかにするとともに、それらを判断した人のスキル属性を調べることで、「判断を誤りやすい、あるいは、判断に時間がかかるタイプの差分のソースコードの特徴」や、「差分のタイプごとに、それを早く読解・判断できた人のスキル・経験の傾向」などを明らかにする。

 これによって、変更されるソースコードのソースコードメトリクスの明確化や、変更を判断する際に“あると有利なスキル・知識”の分析、誰にとっても時間がかかるタイプの変更の分類などが行える。森崎氏は「これを1つのベンチマークとすることで、派生開発、保守開発の見積もり精度を向上させることが狙いだ。現在は変更箇所やテストの“規模”を見積もる方法が主流だが、こうしたデータが把握できれば、現実的な工数を、もっと効率的に導出できるようになる」と解説した。

コードは読むものではなく、理解するもの

 一方、楽天の吉岡氏は「ソースコード理解と勉強会」と題して、コードを効率的に読む際のテクニックを紹介した。氏は「コードは読むものではなく、理解するもの――単に文字を追うだけではなく、それが意味する内容を理解するスタンスが大切だ」と指摘した。

 そうした前提に立ったうえで、吉岡氏はコードを読む際、4つの視点を基準にしているという。細部から内容を理解する「ミクロの視点」と、規模や仕組みから理解する「マクロの視点」、文字列を読み込んで理解する「スタティックな視点」と、ソースコードによって生じる動作で理解する「ダイナミックな視点」の4つだ。特に、「コードが大規模化している近年、まずマクロの視点でコードの全体像を理解すると効率的だ」という。

写真 楽天の吉岡弘隆氏

 「例えば、オープンソースの場合、『READ ME』フォルダの中にドキュメントが入っているなど、どこに何があるのか、ソースツリーの中の論理的な構造をまずしっかりと把握する。そのうえで細部に目を通す。例えば、チェンジログやリリースノートに加え、Subversionなどのバージョン管理システムにも目を通す。バグを探すときも、まずチェンジログに目を通し、なぜこのバグが直されたのか、その理由や傾向を把握しておくと発見しやすくなる。また、開発関係者のブログや関連のメーリングリストなどにも普段から目を通しておくと、ソースコードの理解を深めるうえで役立つ」(吉岡氏)

 また、吉岡氏は普段、テキストエディタのGNU Emacs、ソースコードを閲覧するGUIツールのCscope、GNUデバッガ(GDB)を併用しており、「ダイナミックな視点」――動的理解については、これらを有効に使っているという。

 「例えば、まずコードをメイクして実際に動かしてみる。そのうえでGDBを使ってブレイクポイントを設定し、その前後を読み込むという方法を採っている。特に、デバッガはデバッグするためというよりも、コードを理解するために使うというのが私の方法論。プロファイラでプログラム実行のボトルネックをつかんだり、まずブラックボックステストを書いてみたりするのも“コードを読まずに理解する”有効な方法だ」(吉岡氏)

 数々のヒントに、受講者からも積極的に質問の手が挙がったが、吉岡氏はそれらに応えつつ、「“コードを理解する”うえでは、技術論だけではなく、開発関係者同士で交流を持つことも重要」と指摘。特に、オープンソースの場合は開発者に会える機会も多く、勉強会などには積極的に参加すべきだという。

 「私自身もカーネル読書会を主宰しているが、そうした場で語り合うと、さまざまな発見がある。例えばRubyについて、なぜまつもと氏はこの言語をこのように開発したのか、みんなで議論していると、それがだんだん浮き彫りになってくる。何よりさまざまな可能性を考えながら議論していく過程が楽しい」(吉岡氏)

 吉岡氏はそう述べたうえで、「みんなでディスカッションすれば、必ず新たな視点、新たな発見が得られる。それがコードの深い理解や、プログラマとしてのスキル向上、付加価値向上につながっていくはずだ」と締めくくった。

コードリーディングの引き出しを豊富に持とう

 日本IBMの細川宣啓氏も、「明日から使えるコードリーディングの技術とその真価」と題し、非常に実践的な講義を行った。細川氏はコードリーディングの技術を「早く読むための技術」と「全体を俯瞰するための技術」に分け、それぞれ4つずつ、計8つのテクニックを紹介した。ここではその中から、1つずつ紹介しよう。

 まず「早く読むための技術」として「コードはお尻から読む」ことを挙げた。コードが修正される際、関数やメソッドの追加は、ファイルの末尾に追加される場合が多い。そのため、末尾に追加された関数だけ、それまでのコードとは異なる書式になっている場合がある。

 これについて細川氏は、「これはそのコードの元々の担当者とは違う人が、過去の経緯や、元のコードの意図を十分に理解せずに関数を追加したことに起因する例が多い。そして、得てしてそうした個所には、拙速なコード修正が入り込みやすい。よってコードを読む際は、まず“お尻”に注目することで、あらゆる問題を発見しやすくなる」のだという。

 「全体を俯瞰するための技術」としては、「コードをズームアウトする」方法を挙げた。例えば、Microsoft Wordなどにソースコードを貼り付け、ズームアウト表示をする。これによって「全体の制御構造を俯瞰できるため、どこからコードを読むべきか把握しやすい」という。ポイントはコードを俯瞰したときの“見え方”から、さまざまな可能性を把握できることにある。

写真 日本IBMの細川宣啓氏

 「例えば、コードが集積している“黒い所”なら、処理が複雑で動作が重たい可能性が高い。コードの文字列が全体的に右側にへこんでいる、寄っているように見える部分は、ネストが深い構造となっており、複雑な分岐やループが含まれていることが多い。メソッドのかたまりに着目すれぱ、メソッドコメントの存在、コメントの統一を観察することもできる」(細川氏)

 細川氏は、このほかにも実践の敷居は低いが効果は高い、さまざまな方法を紹介したうえで「スキル・能力を高め続けることが、プログラマとして生きていく前提条件。今回紹介したようなテクニックも、できるだけ多く身に付けていくことが、プログラマとしての付加価値を高めることにつながっていく」と、あらゆる状況、ケースに対応できる引き出しを増やすことの重要性を指摘した。

「こうなのではないか」という仮説とイメージを大切に

 プログラムの最後は、Publickey主宰の新野淳一氏をモデレータに招き、サン・マイクロシステムズの戸島義徳氏、電通国際情報サービスのひがやすを氏、吉岡氏、細川氏、森崎氏らによるパネルディスカッションを行った。

 新野氏のリードによって、ここでも実践的なヒントが多数飛び出した。例えば「コードを読む際の留意点」として、戸島氏は「そのコードの全体像や、コードが実現する機能のイメージをつかむことを目的に、丹念に読み込んでいる」という。

写真 パネルディカッションでも数々の質問がなされ、受講者らも話に参加していた。左から新野氏、吉岡氏、ひが氏、戸島氏、細川氏、森崎氏。

 「大きな構造をつかむ際にはツールを使うが、細部についてはフローを絵で書いたり、『変数が多い』『条件分岐が複雑すぎる』など気付いたことを随時メモしていく。コードの印象を書きとめたり、同じモジュールを担当している人がいれば、コードの理解を確認し合ったりする」(戸島氏)

 森崎氏も「まず全体のイメージをつかむ」というが、そのうえで「こういう問題があるのではないか、といった仮説を立ててレビューする視点を設定する。その中でのみ不備を考えるようにすると効率的だ」と、観点を設定することの重要性を指摘した。

 一方、ひが氏は「システムの機能を理解したいとき、マニュアルなどを読むのではなく、それがどういう仕組みになっているのか、コードを読み込むことで、システムを深く理解できる。特に、各分野で評価の高いシステムのコードを読むと、プログラマとして学べる部分が大きい」と、別の視点からコードを読むことの意義を述べた。

写真 当日は土曜日だったが定員の60人全員が参加。スキルアップに対する高い意識がうかがえた

 効率よくコード全体のイメージをつかむ方法についても、「ブラックボックステストを書く」(吉岡氏)、「ソースコード冒頭から3つ目くらいまでのメソッドに注目し、その機能の目的を考える」(細川氏)、「コードから仕様書を書き起こしてみる」(戸島氏)など数々の方法論が紹介された。

 ただ、その内容はさまざまながら、全員の意見に共通しているのは、「こうなのではないか」という自分なりの仮説や予測を立てながら読んでいることだろう。事実、そうして主体的かつ意識的に得た理解が、「次のモチベーションにつながる」(戸島氏)ほか、「良いコードを書くための基礎体力向上につながる」(細川氏、ひが氏)という。

開発者と研究者間のエコシステム構築を目指す

 今回のワークショップも非常に盛り上がり、終了後もすぐに会場を出ることなく、ハンズオンを行った人同士で会話したり、講師に質問したりする参加者らの姿が目立った。森崎氏によると、受講者にアンケートを取ったところ「満足度が非常に高かった」という。

 森崎氏の研究グループでは、ソフトウェア開発者からフィールドデータを受け取り、研究者はその分析結果や技法などを提供、再びそのフィードバックを受けて開発や技法の継続的発展を狙う“開発者と研究者間のエコシステム”の構築を目指している。森崎氏はその意味でも「今回のような貴重な交流の機会を、今後も積極的に設けていきたい」と述べている。

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ