2011年度・お勧め書籍 11冊

昨年に続いて、今年のお勧め書籍を紹介します(※今年の新刊ということではなく、過去に発売されたもの全てが対象です)
今回は 1冊増えて、11冊です。 同一シリーズのものは 1冊とカウントしているので、本当はもう少し多いですが。
なお、選考した 11冊は、1位〜11位というように順位付けしている訳ではありません。

昨年同様、紹介するのは当サイトとの関連性があるジャンルだけです。 具体的には、以下のようにジャンル分けし、各ジャンルから最低1冊ずつ選定しています。

前年で扱ったジャンルに加えて、「数学」を増やしました。 これは、それほど高度なものではなく、プログラマにとって必要と思われる最低限の知識という観点で扱っています。

当然ながら、私が読んだことのある本からの選考ですから、もっと良い本もあることでしょう。 特に、当サイトが現状で扱っていない題材の本は最初から選考外としているため、 例えば「Java でアルゴリズムとデータ構造を解説している良書」があったとしても、当サイトは Java を扱っていないので除外されています。
しかし少なくとも、選考された 11冊について、「選ぶものが無いから無理やり」のように選ばれたものは1つもありません。 すべて、間違いなくお勧めできる良書ばかりであると確信しています。

1.プログラミング言語C

書名 プログラミング言語C 第2版 ANSI規格準拠
レベル 中級者〜
ジャンル C言語
出版日 1989年6月
ISBN 978-4320026926

C言語のバイブル。

C言語の生みの親である、Kernighan と Ritchie によって書かれており、2人の名前を取って「K&R」と呼ばれています。

最初の章は、入門レベルから始まっていますが、わずか数ページで相当に高難度な内容に進んでいきます。 本当は、最初の章は分からなくなった時点で読み飛ばしてしまえばいいのですが、 それを知らずに読もうとすると、恐らく大半の人は挫折してしまうでしょう。
ただ、いずれにしても、入門書1冊は確実に理解できているくらいの力量がないと、読み進めることは困難でしょう。

全体を通して、扱う題材は難易度が高めですが、その割りに説明はあっさりしているので、 相当に注意深く、じっくりと読み進めないと理解が追いつかないかも知れません。
それでも、最高レベルのプログラマであり、言語の生みの親でもある著者の書くプログラムに触れることには、確実な価値があります。 何度も読み返すべき本だと言えます。

古くなってもバイブルであることは確かですし、是非読んでおきたい本ですが、 一方で、現代的な「読みやすいプログラム」という視点からは外れ気味であることも確かです。 これは、当時における「効率的なプログラム」という視点で書かれているためでしょう。
現代的な良いプログラミングスタイルは、「プログラミング作法」などで学ぶことをお勧めします。

なお、幾つか副読本が存在していますが、それらについては個人的には特にお勧めしません。 それよりも、自分の気に入った入門書をしっかり理解し、小さめのプログラムを自力で書けるようになってから、本書へ進むべきだと思います。

2.EffectiveC++ シリーズ3冊

書名 Effective C++ 原著第3版
レベル 入門書レベルのプログラムを書けるようになったら
ジャンル C++
出版日 2006年4月
ISBN 978-4894714519
書名 新訂版 More Effective C++
レベル 中級者〜
ジャンル C++
出版日 2007年6月
ISBN 978-4894714762
書名 Effective STL
レベル 中級者〜 (STL の基礎知識は必要)
ジャンル C++
出版日 2002年1月
ISBN 978-4894714106

正しい C++プログラミングを理解するための必読書。

「Effective C++」に書かれているガイドラインは、C++ を使っている限り、確実に理解しておかなければならない内容になっており、間違いなく必読と言えます。
本書を読む前に、まずは好みの入門書で C++ の概要を掴み、実際にプログラムを書いて動作を確認しておきましょう。
その後、本書を読み始めましょう。 オブジェクト指向プログラミングの考え方などで躓くでしょうが、それでも構わないので、本書で C++ の正しい書き方を学びましょう。 個人的な感覚では、本書の理解だけでも1〜2年は掛かると思います。 何度でも読み返し、とにかく真似をしながら、小規模のプログラムをたくさん書きましょう。
オブジェクト指向プログラミング自体の考え方は、本書よりも更に後で学習した方が良いと思います。 そうでないと、現実に即して考えられないはずです。

「More Effective C++」は、前の版の「Effective C++」に対する続編です。
こちらは、原著は 10年以上前に書かれているということもあって、新しい話題には触れていませんが、やはり良い内容です。 ただ、これを無理に読むよりは、「Effective C++」を熟読することを薦めたいと思います。
なお、初版の日本語版は、新訂版の前書きで訳者も認めるほど、翻訳の悪さが目立っていました。 新訂版は、まだ多少気になる箇所もありますが、随分良くなっています。

「Effective STL」は、C++ の標準ライブラリである STL だけに焦点を絞り、 「Effective C++」と同様のスタイルで解説しています。
STL の各クラスや関数が、どういうものかは解説していません。 あくまで、正しい使い方を解説している本ですから、別途リファレンスマニュアルのようなものがあると良いでしょう。
STL は、リファレンスを眺めるだけでも使えてしまうかも知れませんが、知らず知らずのうちに効率を落としていたり、 厄介なバグを作りこんでしまったりするかも知れません。 本書で、適切な使い方を学ぶことによって、STL をより良く使いこなせるようになるでしょう。

3.C++ の設計と進化

書名 C++ の設計と進化
レベル 中級者〜
ジャンル C++
出版日 2005年1月
ISBN 978-4797328547

C++ の歴史書。

著者は、C++ の生みの親である Bjarne Stroustrup であり、C++ の歴史、設計思想が詰まっています。
原著は、1994年出版であり、C++ の最初の標準規格は 1998年に制定されているので、規格化される以前に書かれたものではありますが、 この日本語版では特別に、2005年現在を踏まえた書き下ろしが追加されています。

C++ が誕生する手前には、C言語にクラス等の機能を追加した C with Classes という言語が存在しました。 このような言語を必要とした理由、C言語との互換性を堅持した理由、C++ という言語として世界へ広まっていく過程、 その後の進化の歴史が詳細に記述されています。 これほど詳細な経緯が、記録や記憶に残っていることに驚かされる程です。
C++ の仕様が気に入らない、好きになれない人は多いかと思いますが、決して思いつきや、適当な考えで作られた訳ではありません。 設計者の一貫した思想と、多くの関係者の意見を取り入れ、膨大な議論と実験の末に作られたものです。

この本は、C++ のリファレンスマニュアルや、テクニック集、ガイドラインという類のものではありません。 本書を読むに当たっては、C++ のことを、実用できる程度には理解していることが望ましいと思います。

今年(2011年) 、C++ の最新の標準規格 C++11 が決定しました。 C++ は再び高い注目を浴びることとなるでしょう。 本書で1度、これまでの進化の歴史を振り返ってみてはいかがでしょうか。

4.Perlベストプラクティス

書名 Perlベストプラクティス
レベル 中級者〜
ジャンル Perl
出版日 2006年8月
ISBN 978-4873113005

Perl で良いコードを書くためのガイドライン。

本書の内容は、C++プログラマであれば、 Effective C++C++ Coding Standards の Perl版といえば分かりやすいでしょう。 ( Effective Perl は別にありますが、ちょっと古いです。 洋書 なら新しいものがありますが)
Perl において、バグを生みにくく、効率的で、保守性の高いコードを書くためのガイドラインです。 なお、本書が扱う Perl のバージョンは 5.8世代で、より良くなる状況下では CPAN のモジュールも積極的に使われています。

Perl である程度の規模の大きいプログラムを書くことがあるのなら、本書の中から幾つもヒントを得られるでしょう。

Perl は、ちょっとした数行のコードのために使うことも多い言語だと思いますが、 その程度の規模では、本書の内容を必要としないかも知れません。
しかし、今後数年以上に渡って使われ続けるツールの作成などに Perl を利用するのなら、 将来、保守・改造を行うことになる人のためにも、良いコードを書きましょう。 特に、Perl4 世代のような古い形式のままコードを書き続けている人は、是非、より堅牢な新しい手法を学ぶべきです。

この手の本はどれでもそうですが、それぞれのプラクティスに対して、「なぜそうすると良いのか」を理解することが重要です。 この本には、それもしっかり書かれていますから、自分の状況に合わないものを無理に受け入れる必要はありません。 複数人での開発に使うのなら、コーディングルールを議論する叩き台として使うのが適切かと思います。

Perl 以外の言語を使う人であっても、Perl が分かる人であれば、本書は良い内容です。 ただし、Perl初心者には難しいと思います。

5.APIで学ぶ Windows徹底理解 / APIで学ぶWindowsプログラミング

書名 APIで学ぶ Windows徹底理解
レベル 初級〜中級
ジャンル Windowsプログラミング
出版日 2004年4月
ISBN 978-4822228262
書名 APIで学ぶWindowsプログラミング
レベル 初級〜
ジャンル Windowsプログラミング
出版日 2010年6月
ISBN 978-4822228491

Windows の動作の仕組みを理解するための本。

「APIで学ぶWindowsプログラミング」は、「APIで学ぶ Windows徹底理解」の続編という位置付けです。
2冊とも、元々は雑誌の連載記事だったものを再編集したものです。 丁寧で詳細であり、その印象から入門レベル程度の記事に見えますが、実際には結構深いところまで扱われています。 図表も豊富で分かりやすいです。

Windowsプログラミングならば .NET を使用することが一般的となっていますが、動作原理を知るにはやはり Windows API のレベルで触ってみることは重要です。 また、ゲームプログラミングで DirectX を使う場合等、Windows API を直接使わざるを得ないことはまだあります。
Windows API のレベルで解説された本は、近年ではほとんど出版されていないので、この2冊は現代視点で解説してくれている貴重な資料です。

「APIで学ぶ Windows徹底理解」の方は、API を通して、Windows の動作の仕組みを理解することが目的となっています。
描画周りを扱っていない点が気になるところでしたが、「APIで学ぶWindowsプログラミング」の方で、簡単ではあるものの扱われています。

「APIで学ぶWindowsプログラミング」の方は、実際に Windows の API を使って、簡単なゲーム(15パズル) と、バイナリエディタを作る流れを解説しています。 いずれも結構なページを割いて丁寧に解説されており、Windowsプログラミングの感覚をつかむのに十分な内容だと思います。
Windowsプログラミングの経験が少ないのなら、こちらから読んだ方が入りやすいかも知れません。

6.定本 Cプログラマのためのアルゴリズムとデータ構造

書名 定本 Cプログラマのためのアルゴリズムとデータ構造
レベル 初級〜
ジャンル アルゴリズムとデータ構造
出版日 1998年3月
ISBN 978-4797304954

アルゴリズムとデータ構造の基礎を学ぶベストセラー。

ソートやサーチ、スタックやリスト構造、木構造といった、アルゴリズムとデータ構造の基礎をC言語を使って解説しています。 また、後半では正規表現やメモリ管理のアルゴリズムのような高度な内容も取り上げています。

サンプルプログラムでは、ポインタを頻繁に使っているので、C言語の基礎は理解できていたほうがいいでしょう。 C言語でプログラムが書けるようになった後、本書に進むのが順当な流れだと思います。
C言語に馴染みの無い人には、同著者による Java版 もあるので、こちらを当たってみるのも良いでしょう。

最近は、多くのプログラミング言語に、標準ライブラリや言語仕様の一部として、アルゴリズムとデータ構造を簡単に使える環境が整備されているため、 あまり、この分野を勉強しない人も多いと思います。
しかし、アルゴリズムとデータ構造の学習の有無は、プログラミング能力そのものに影響を与えます。 ほとんどの場合、新しいアルゴリズムを考案する必要がある訳ではありません。 本書が扱っているような基礎的な部分をしっかり学習しておくことが重要です。

文章量は多いですが丁寧で、図解も多用されており、 実際のプログラムコードも小さい単位で(今説明している箇所だけを実装した関数のような単位)掲載されています。 総じて分かりやすく、初心者であってもお勧めできます。

アルゴリズムとデータ構造の性能を評価するのに重要な、計算量についても、詳細に説明されており、 入門書と言えども、ごまかしの無い良書です。

7.オブジェクト指向における再利用のためのデザインパターン

書名 オブジェクト指向における再利用のためのデザインパターン 改訂版
レベル 中級〜
ジャンル オブジェクト指向プログラミング
出版日 1999年10月
ISBN 978-4797311129

GoF によるデザインパターンのバイブル。

GoF (Gang of Four) とは、オブジェクト指向プログラミングにおける設計手法を、23 のパターンとしてまとめあげた4人の人物の総称のことです。 このパターンのことをデザインパターンと呼びます。
本書は、この GoF のデザインパターンを本人達が記したバイブルです。

説明には C++ が使われおり、部分的に Smalltalk が登場します。 また、付属の CD-ROM には、紙面にあるサンプルコードを Java に直したものが収録されていますが、これは GoF の手によるものではありません。
本書のデザインパターンのカタログの部分は、付属CD-ROM に HTML形式で収められていて、Webブラウザ上で見られるようになっています。 むしろ、こちらの方が見やすいかも知れないので、1度確認してみると良いと思います。

最早、オブジェクト指向によるプログラミングは常識化している現在にあって、GoF のデザインパターンは古典の域に達しているかも知れません。 現代的には、これらのパターンだけでは足りないとか、分類の仕方が古いなどとも言われていますが、 現場の開発者にとって、GoF のパターンが共通理解となっていることもあるほど、よく知られたものです。 やはり、知らないでは済まないものではあるでしょう。

記述は決して易しくはありませんが、 各パターンが必要となる動機、パターンが適用できる箇所やできない箇所、適用する場合の問題点などを完全に網羅しており、 やはり価値ある文献でしょう。
しかし、読みにくく理解しづらいのも事実です。 もっと噛み砕いて分かりやすく書かれている本もたくさん出ていますから、自分に合った副読本を先に当たった方がいいかも知れません。 (圧倒的に Java を使ったものが多いので、C++プログラマはほとんど選択肢がありませんが、いい機会だと思って Java を触ってみるのもいいでしょう)

8.プログラミング作法

書名 プログラミング作法
レベル 適当な言語でプログラムが書けるようになったら
ジャンル プログラミング全般
出版日 2000年11月
ISBN 978-4756136497

正しいプログラミングを学ぶ良書。

コーディングスタイルから、設計、テスト、デバッグ、パフォーマンス、移植性といったように、 プログラミングに関するノウハウが集められています。
それぞれの話題は、30ページ程度の分量にコンパクトにまとめられています。 本書全体を読み通すのが大変なら、少しずつ、つまみ食いするのでも良いと思います。

C言語、C++、Java、Perl、Awk といったように幾つかのプログラミング言語でのサンプルコードが登場しますが、 特定の言語に固有の知識はそれほど必要になりません。 実例を示すために特定の言語が使われているという程度であり、本質はどの言語でも同一です。 何か1つの言語に関して、入門レベルを卒業している程度の素養があれば、読み進めることは可能でしょう。 ただ、C言語を知っていると、なお読みやすいと思います。

本書の2人の著者は、どちらも偉人と呼ぶにふさわしい存在でしょう。
Kernighan は、C言語の生みの親の1人ですし(「プログラミング言語C」の著者でもあります)、 Pike は、UNIX の開発に関わり、テキストエディタ、プログラミング言語、ウィンドウシステムなど様々な実績を持っています。 (参考:Wikipedia
そんな2人の経験と考察を、コンパクトにまとめた本書の価値は、ほとんどの類書と比較にならないほどでしょう。 幸い、日本語訳も最高の出来です。

新人プログラマに特にお勧めします。 良いプログラムを考える癖、良いコードを書く癖を、早いうちに身につけておきましょう。
また、毎年毎年読み返してみるだけの価値がある本です。

ちなみに、本書は3部作の3冊目というような位置付けになっていますが、 1冊目のプログラム書法、 2冊目のソフトウェア作法 ともに、かなり古い本であり、今読むのなら3冊目にあたる本書だけで十分でしょう。

9.珠玉のプログラミング

書名 珠玉のプログラミング
レベル アルゴリズムとデータ構造の入門書レベルを終えてから
ジャンル プログラミング全般
出版日 2000年10月
ISBN 978-4894712362

問題の本質を見抜き、適切な解決方法を選び出す力を養う本。

本書の内容は、全体的に言えば、少ないメモリで最高のパフォーマンスを上げるアルゴリズムとデータ構造を探り出すことに集中しています。
本書は、入門書に載っているようなアルゴリズムとデータ構造の説明だけでなく、 ちょっとした発想の転換で、少ないメモリで最高のパフォーマンスを上げることが可能であることを教えてくれます。

これまで効率のことを考える習慣の無かった人は、新たな気付きを得られることでしょう。
いきなりプログラムを書き始めるのではなく、まず問題は何なのか定義することから始めましょう。 本書には、その思考過程も含めて、しっかり記述されています。 練習問題も豊富にあるので、自分でも同じようにやってみると良いでしょう。

難しい数学の話題が出てくる訳でもありませんし、登場するアルゴリズムとデータ構造の種類も入門書レベルのものばかりです。
コード例のほとんどは擬似コードで表記されていますが、 難しくはないので、自分の知っている具体的なプログラミング言語に置き換えることは容易だと思います。

これからプロの現場に進もうとしている人に、是非お勧めします。 何度でも読み返して欲しい一冊です。

10.コンピュータの構成と設計

書名 コンピュータの構成と設計 第4版 (上)
レベル 中級〜(素養がある分野についてはすぐにでも)
ジャンル コンピュータ知識
出版日 2011年11月
ISBN 978-4822284787
書名 コンピュータの構成と設計 第4版 (下)
レベル 中級〜(素養がある分野についてはすぐにでも)
ジャンル コンピュータ知識
出版日 2011年11月
ISBN 978-4822284794

ハードとソフトの両面から、コンピュータの構成を理解するための良書。

2人の著者の名前を取って、「パタヘネ」の愛称で呼ばれている本で、この分野における最高の良書です。 (今回は、Hennessy氏は関わっていないようですが…)
ちなみに「ヘネパタ」と呼ぶと「コンピュータアーキテクチャ」 という別の本のことを指すので、気をつけて下さい。

本書は、ソフトウェア開発者とハードウェア設計者の両方にとって、有用な内容となるように書かれています。 部分的に一方に片寄った部分もありますから、急に難しくなったように感じる箇所もありますが、 そういう部分は読み飛ばして先へ進んでしまっても良いでしょう。 (上巻の冒頭に、各話題がソフト・ハードのどちら向けの話題かの一覧表があります。 なんだか見辛い表ですが、これを参考に判断すると良いと思います)

解説は、MIPS というアーキテクチャ(基本的な設計思想)を元に行われていますが、 コンピュータの構成の本質を突く内容ですから、他のアーキテクチャを理解するためにも使える知識です。 幾つかの章では、他のアーキテクチャでの実例にも触れています。

数年ごとに改訂を重ね、本書は 2008年出版の第4版を翻訳したものです。
去年紹介した第3版と比べて、並列アーキテクチャ、グラフィックス (GPUコンピューティング) の話題が大幅に増加しています。 これらの話題は、近年(そして今後の)トレンドであり、これだけのためにでも買い直す価値があると思います。
そのほかの部分も全体的に徹底した見直しが図られ、整理されています。 実例を取り上げる箇所でも、より新しい題材に差し替えられています。

上下巻構成になっており、さらに付属の CD-ROM にも記事が入っています。 ただ、CD-ROM には他にも記事が入っているので、余すところなく読みたければ、CD-ROM を確認した方が良いでしょう。

11.プログラマの数学

書名 プログラマの数学
レベル 初級
ジャンル 数学
出版日 2005年3月
ISBN 978-4797329735

全プログラマに必須の数学的思考を身に付ける本。

数学のジャンルとしては、離散数学に当たるでしょうか。 コンピュータサイエンスの根幹を成す、重要な分野です。
何だか難しそうに聞こえますが、本書は、数学が苦手でも敬遠する必要はありません。 非常に易しく丁寧な説明になっており、ほとんど前提知識を必要としません。

本書は「数学」を勉強するための本ではなく、「(プログラマに必要な)数学的思考法」を勉強する本です。 本書を「数学」の参考書のようなつもりで読んで、低い評価を下す人を見かけますが、そういう本では無いと思います。

タイトルに「プログラマの」とありますが、実際のプログラムコードはほとんど登場しません。 また、数式も最小限しか登場しません。 思考の過程が詳細に書かれていますから、じっくり読み進めて下さい。

多分、数学が得意な人や、離散数学(あるいは情報工学、計算機科学のようなもの)の教育をきちんと受けた人には物足りないレベルだと思います。 そうでなくとも、分かっているつもりになって読み飛ばしてしまう人もたくさんいると思います。
しかし、前述したように、本書で重要なのは「思考法」ですから、 本当に自分が「思考」できているかどうか振り返ってみるといいでしょう。

総括

いかがでしたでしょうか?
結果、2010年度に選定した 10冊のうち 9冊が生き残りました。やはり良書は良書。 そう簡単に入れ替わりは起こらないようです。

昨年から引き継いだ 9冊のうち、 「コンピュータの構成と設計」は、第4版が出版されたので、そちらに変更しました。 また、「APIで学ぶWindowsプログラミング」は、 昨年の時点では、読了していなかったので取り上げませんでしたが、今回は追加しておきました。

本サイトは今年、アルゴリズムとデータ構造編を開始し、サイト更新の多くがこのカテゴリのものでした。
珠玉のプログラミング」や「プログラマの数学」を加えたのは、この辺りに関連してのことです。
文字コード超研究」が外れてしまったのは、むしろこの2冊に押し出されてしまったからであって、 変わらず良書であると思います。 ちなみに「文字コード超研究」は、この1年の間に 第2版 が出版されています。


最後に、今年1年に起きた関連のある出来事について触れて終わりにします。

今年、「プログラミング言語C」の著者であり、C言語や UNIX の生みの親である Ritchie氏が病死されました。 C言語は、C++ 以外にも様々な言語へ影響を与え、C言語自身も現役で使われ続けています。 UNIX も、Linux や MacOS 等へと引き継がれています。 偉大な方を亡くしました。

C++ の世界では、新たな標準規格である C++11 が正式に制定されるという大きな進展がありました。
これまでも、Boost という非標準のライブラリを利用したり、あるいは各コンパイラメーカの独自拡張によって、 一部の機能の先取りは行えていましたが、今後は正式な機能として利用できるようになっていきます。 C++プログラマは、改めて学習の機会を設ける必要があるでしょう。

Perl は、Perl5 と Perl6 がほぼ別言語として発展していく方向性が示されています(互換性がありません)。 Perl5系列では、今年 5月14日に Perl5.14 がリリースされました。 まだまだ元気な言語であるようです。

Windows の次期バージョンとなる Windows 8 について、度々発表が行われています。 発売時期は未定ですし、技術解説などにも不明確な点は多いですが、WinRT と呼ばれる新しい API の登場が発表されています。 これは Win32API と同列に並ぶ存在のようで、C++ で書かれたオブジェクト指向な API になるようです。 まだ Win32API が無くなるという話ではないようですが、移行していく可能性はありそうです。

更新履歴

'2011/12/24 新規作成。



昨年のお勧め書籍へ

参考書籍のトップページへ

Programming Place Plus のトップページへ