書評「Code Reading」

コードリーディング Advent Calendar 2022の最後の記事は、「[Code Reading](https://book.mynavi.jp/ec/products/detail/id=54062)」の書評で締めたいと思います。

「Code Reading」はオリジナルが2003年に、日本語版は2004年に出版されており、すでに初版発行から20年近くが経過しています。プログラミング関連の技術書としては古典の部類でしょう。コードリーディングに特化した内容の書籍としてはほぼ唯一の存在ですので気になっている方もいると思いますが、いかんせん税込み7,000円を超える価格と出版年の古さから躊躇しているのではないでしょうか。私もその一人でしたが、今回購入して読んでみましたので、感想を含めた書評としてまとめてみます。

### 「Code Reading」の目次と構成
まず目次は以下のようになっております。（これに加えて付録等が100ページもあります）

>第1章　序論
第2章　プログラミングの基本要素
第3章　Cのデータ型（上級編）
第4章　Cのデータ構造
第5章　制御フロー（上級編）
第6章　大きなプロジェクトへの取り組み
第7章　コーディング標準と規約
第8章　ドキュメント
第9章　アーキテクチャ
第10章　コードを読むためのツール
第11章　総合的な例

本書はJavaやC++にも言及していますが、基本的にC言語のコード例を示しながら解説が進んでいきます。第2章から第5章までが文法に関する解説に割かれており、**コードリーディングにおいて、プログラミング言語の基本文法を理解することの重要性がよくわかります**。後半の第6章からは規模の大きなコードベースを想定した内容へと移っていきます。[ミクロなコードリーティング、マクロなコードリーディング](https://qiita.com/YY-EN40P/items/459d1bfcd7ddc43abfa3)に書いた分類になぞらえると、前半がミクロなコードリーティング、後半がマクロなコードリーディングという構成になっています。

コードリーディングはソフトウェア開発のあらゆる場面で必要となるため、本書全体がソフトウェア開発の全容をカバーするような網羅的な内容になっていました。タイトルは「Code Reading」となっていますが、ただ目の前のコードの読み方を解説しているだけにとどまらず、ソフトウェア開発のために必要な背景知識、コーディングスタイルのような作法など幅広いテーマについて紹介されています。これらの知識が土台となって日々のコードリーディングを円滑に進められるようになるので、本書は**コードリーディングの上達を目的としてソフトウェア開発の素養を身につけるためのガイドブック**であるという印象を受けました。

### コードリーディングへのアドバイス
コードリーディング時の実戦的な心得についても随所にアドバイスが散りばめられており、例えば「第2章　プログラミングの基本要素」では、関数の機能を理解するためのコードリーディング戦略として以下の内容を頭に入れて読み進めるようにアドバイスされています。

>- 関数の名前から機能を推測する
>- 関数の冒頭に書かれているコメントを読む
>- 関数の使われ方を調べる
>- 関数本体のコードを読む
>- 関連ドキュメントを調べてみる

「第4章　Cのデータ構造」にあったグラフデータ構造を読み解くための以下のアドバイスもコードリーディング時の思考過程をうまく言語化してありました。

>- ノードをどのように格納するか
>- エッジをどのように表現するか
>- エッジをどのように格納するか
>- グラフの性質は何か
>- どんな構造が「グラフ」を本当に表現しているか

確かにデータ構造にも理解しにくいケースがあるという視点は指摘されれば納得の内容ですが、私自身はデータ構造の理解もコードリーディングの一部なのだと認識できていませんでした。上記アドバイスのようなグラフデータ構造を理解するための指針があれば、グラフデータの処理に関するコードも格段に理解しやすくなると思います。また、ここは私の弱点かもしれないとも気付かされたので、改めてアルゴリズムとデータ構造の復習をしたほうがいいと感じました。

「第8章　ドキュメント」では、

> ドキュメントがあるなら、どんなものでも利用すべきです。図書館の利用を主張する格言によれば、ドキュメントを1分間読むことはコードを1時間読むことに相当します。

と冒頭からドキュメントの活用に前のめりな姿勢となっており、強く共感しました。[コードリーディングの補助としてドキュメントを読む](https://qiita.com/YY-EN40P/items/31274a8ca475c8dc2a91)に述べた内容との答え合わせ的な意味合いでも非常に面白かったです。

### 「Code Reading」発行から20年のうちに起こった変化
一方で20年という歳月のあいだにソフトウェア開発の世界の進歩によって陳腐化している箇所も散見されました。「第6章　大きなプロジェクトへの取り組み」は、現在のようなOSSが大きな存在となっているソフトウェア開発の世界では、すでに通常業務のプロセスの中に組み込まれて当たり前になっている考え方や習慣も多かったです。またここで取り上げられているリビジョン管理システムはGit登場以前のものであり、時代の変化を感じました。また「第10章　コードを読むためのツール」の半分近くが正規表現やgrepによるコード検索についての解説になっており、コードリーディングにおけるコード検索機能の重要性は伝わってくるのですが、Visual Studio Codeの登場によって開発環境はかなり進化していますので、コード検索以外のツールや機能の解説が少なく感じました。個人的には[テキストエディタに搭載されているコードリーディング関連機能を使いこなそう](https://qiita.com/YY-EN40P/items/d3abb0044b4b62d5f087)にて、コードリーディングのための代表的な機能として紹介したシンタックスハイライト機能が紹介されていないことに驚きました。

### 「Code Reading」にはいつの間にか身に付けていることが書いてある
実用面について述べると、C言語以外の言語については実戦的とは言えないため、ソフトウェア開発業務への即効性を求めるのではなく、前述の通りソフトウェア開発の素養を身につけるためのガイドブックという読み物として捉えるべきでしょう。「Code Reading」の価値やありがたみは、巻末に特別付録として掲載された監訳者座談会の以下の部分に凝縮されていると思います。

> 武藤氏：すでに実践している内容が多かったりしましたか。
> 平林氏：そうですね、仕事上で経験する内容と共通する点が多かったことに随分共感いたしました。
> （中略）
> 武藤氏：逆に、ここはどうも賛同しかねる、というところはありました？
> まつもと氏：あんまり覚えがないなあ。よく文書化してくれたって感じですよね。
> 鵜飼氏：そうですねー。
> まつもと氏：長いことプログラマーをしていると、たいていはいつの間にか身に付けてるけど、ほかの人に伝えるのは面倒ですからね。

Rubyの生みの親である、まつもとゆきひろさんのコメントにある「**長いことプログラマーをしていると、たいていはいつの間にか身に付けてるけど、ほかの人に伝えるのは面倒**」なことが一冊の本としてまとまっているのが「Code Reading」だと言えるでしょう。

全体として良書であったという感想を持ちました。年末年始のようなまとまった時間が取れて、目先の情報収集や勉強とは別の視点でソフトウェア開発について俯瞰してみようという方には是非おすすめいたします。