一般教養
(基礎知識や作法)を学ぶ

プログラムはなぜ動くのか
知っておきたい
プログラミングの基礎知識

矢沢 久雄 著
日経BP社 発行
2001年10月
293ページ
2520円(税込)
OSの基礎と応用
設計から実装、
DOSから分散OS Amoebaまで

Andrew S. Tanenbaum 著
引地 信之,引地 美恵子 訳
ピアソン・エデュケーション
発行
1995年11月,828ページ
6932円(税込)
オペレーティングシステム 第2版
設計と理論およびMINIXによる実装

Andrew S. Tanenbaum,Albert S. Woodhull 著
千輝 順子 訳
今泉 貴史 監修
ピアソン・エデュケーション 発行
1998年5月
1033ページ+CD-ROM
9240円(税込)
コンピュータの構成と設計
第2版 上/下
——ハードウエアとソフトウエアの
インタフェース——

John L. Hennessy,David A. Patterson 著
成田 光彰 訳
日経BP社 発行
合計852ページ
1999年5月
4,620円(上,税込),5040円(下,税込)
プログラミング作法
Brian W. Kernighan,Rob Pike 著
福崎 俊博 訳
アスキー 発行
2000年11月
355ページ
2940円(税込)
コードコンプリート
Steve McConnell 著
石川 勝 訳
アスキー 発行
1994年8月
950ページ
7952円(税込)

 最後に,ソフトウエア開発者が一般教養として身に付けておきたい知識を得るための本を紹介しておきましょう。最初にご紹介するのは,矢沢 久雄著「プログラムはなぜ動くのか」です。本書は,2000年5月から1年間にわたって本誌に連載した内容を加筆/修正したものです。内容は,レジスタや演算器などのCPU内部の構成と動作の仕組み,OSとアプリケーションの関係,アセンブリ言語のレベルで見たプログラムの動作,ハードウエアを制御する方法など。ともすれば難しくなりがちなトピックをさらっとわかりやすく解説してしまうあたりは,さすが矢沢氏といった感じです。ソフトウエア開発者にとって必要とされるCPU,OS,ハードウエアについての知識をこれ一冊で身に付けることができる大変お得な本と言えます。自分の基礎知識に不安を感じる方は,まずはこの本で全体をカバーするのがいいでしょう。

 OSについてもう少し詳しく学びたい,と言う人には,「OSの基礎と応用」 がお薦めです。本書は,プロセス管理,メモリー管理,ファイル・システムといったOSの基本的な機能および分散システムに特有の事項と,MS-DOSやUNIXなどの具体的なOSにおける実装を平易に解説しています。著者のAndrew S. Tanenbaumは,パソコン上で動作するUNIX互換OSであるMINIXをはじめ,いくつかのOSの設計に携わった人。プロセスのスケジューリングやページングにおける様々なポリシーの優劣を,OS設計者としての視点から学べます。米IBMのOS/360やUNIXなどの各種OSの歴史を紹介している点も,興味深く読めるでしょう。Windowsのような特定のOSの機能を学ぶことも重要ですが,もう少し広い視点でOSを理解しておくことも大切です。長い目で見れば,そうした知識の方が役に立つことが多いでしょう。

 OSの具体的な実装についても知りたいなら,TanenbaumとAlbert S. Woodhullによる「オペレーティングシステム第2版」に挑戦してみましょう。この本は,先に触れたOSの主要な機能がMINIXにおいてどのように実装されているかを詳しく解説しています。巻末にある27646(!)まで行番号が振られたMINIXのソースコードを追うのは大変ですが,それだけの価値はあります。じっくり時間をかけて読んでみてください。

 一方,ハードウエア,特にプロセサ(CPU)についてもっと詳しい知識を得たいという人には,John L. HennessyとDavid A. Pattersonによる「コンピュータの構成と設計第2版」をお薦めします。著者のHennessyはMIPSプロセッサの開発者の一人,PattersonはRISCアーキテクチャの提唱者の一人,といずれもプロセサの世界では著名な人です。

 本書の上巻では,最初の2章でハードウエア全体の構成とプロセサの性能評価について触れたあと,レジスタなどのプロセサの構成とアセンブリ言語,プロセサが論理ゲートを使って四則演算を実行する方法,データパスを介してメモリーの読み書きをする方法などを解説していきます。下巻では,パイプラインによる高速化,キャッシュ,仮想記憶,周辺装置とのやりとりなども取り上げています。内容は比較的高度ですが,大学生向けの教科書として書かれただけあって説明は明解です。それでも難しく感じるようなら,先に矢沢氏の「プログラムはなぜ動くのか」やその続編である「コンピュータはなぜ動くのか」を読んでからもう一度挑戦してみるといいでしょう。

言語に依存しない作法を学ぼう

 このほか,プログラミングにおける「作法」も開発者が身に付けておくべき教養の一つと言えるでしょう。作法の中には言語に依存するものもある一方,そうでないものもあります。Brian W. KernighanとRob Pikeが著した「プログラミング作法」は,後者の作法を取り上げた本です。第1章では,スコープが広い変数ほど長い名前を付ける,命名規則に一貫性を持たせる,なるべくイディオム(慣用的なコード)を使うことでミスを減らす,明快なコメントを付けるコーディング上の様々な作法を紹介しており,この章だけでも読む価値があります。第2章と第3章ではデータ構造とアルゴリズムについて簡単に解説したうえで,その応用として簡単なプログラムを設計し,C,C++,Java,Awk,Perlの五つの言語で実装して見せます。後半では,プログラムのインタフェースの作法,デバッグやテストの手法なども紹介しています。掲載しているコードのほとんどはCなので,Cに特有の事柄もある程度含んでいますが,ほかの言語の開発者が読んでも十分に得るものがあるはずです。

 コーディング作法について学ぶなら,「コードコンプリート」も読んでみることをお勧めします。本書は,バグのないソフトを作るための方法を仕様策定からデバッグ/テストまで全工程に渡って解説した本です。コーディングに関する部分では,変数名の付け方,「一つの目的に一つの変数を使用する」といったガイドライン,コードのレイアウトなど,300ページ以上にわたってあらゆる観点から多様な作法やテクニックを紹介しています。設計の部分で述べている凝集・結合の分類やプロシジャを切り分ける際の指針なども参考になるでしょう。

 内容の多くは構造化プログラミングの視点で書かれているため,今となっては時代遅れな部分があることは否めません。ただ,アサーションなどを利用した防衛的プログラミングなど,コード・レベルのテクニックや設計哲学については現在でも有効です。書店で見つけたら手にとってみてください。