2012年度・お勧め書籍 12冊

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

選出の対象となる本は、当サイトで現在までに公開している内容に合わせたものとなっています。 具体的には、以下のようにジャンル分けし、各ジャンルから最低1冊ずつ選定しています。

できる限り、当サイトで扱っていないジャンルの知識を必要としない本を選出しています。 例えば、「Java でアルゴリズムとデータ構造を解説している良書」があったとしても、当サイトは Java を扱っていないので除外されていますし、 「Windowsプログラミング」に .NET関係の本は含まれていません。

1.C言語入門

書名 C言語入門 改訂第3版
レベル 初級
ジャンル C言語
出版日 1992年9月
ISBN 978-4756102706

長年支持され続けているC言語入門の名著。

標準的な教科書タイプの入門書です。 古い本ですが、長年支持されている定評のある良書です。 (C89 規格には準拠しています)。

ページ数は多いものの、サンプルプログラムも十分な量があり、初心者にも易しい丁寧な解説が魅力です。 古い本である割には、同じような時代に書かれたC言語のバイブル 「プログラミング言語C」 よりもずっと読みやすいプログラムになっており、まずは本書の方をお勧めします。
本書が理解できれば、「プログラミング言語C」にも挑戦できるでしょう。 とはいえ、本書はC言語の全体像をほぼ網羅していますから、本書の内容だけでも十分な知識は得られます。

書かれた時代の影響もありますが、基本的に UNIXベースで解説されています。 Windows上で、Visual C++ 等を使って勉強している人は、そういう部分をあまり気にせずに、 サンプルプログラムをそのまま入力して試してみればいいです。

最後に C++ の章がありますが、いかにも古臭い感じなので、ここは別にお勧めはしません。 C++ に興味があるなら、現代の C++ の良書を探す方が良いです。

2.EffectiveC++

書名 Effective C++ 原著第3版
レベル 入門書レベルのプログラムを書けるようになったら
ジャンル C++
出版日 2006年4月
ISBN 978-4894714519

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

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

本書を読んだかどうか、そして実践できているかどうかで、C++プログラムの質は大幅に向上するでしょう。 同じことを繰り返しますが、C++ を使っている限り、本書の理解は必須事項だと考えていいです。

去年、正式に標準規格となった C++11 には対応していませんが、 本書の内容は C++11世代でも基本事項として抑えておくべきものだと思います。

去年のお勧め書籍では、同シリーズの 「More Effective C++」 「Effective STL」 も加えていました。
「More Effective C++」の原著が書かれてから、既に 10年以上経過しており、 少々内容が古くなってしまっていることから、今年は外しました。 例えば、至る所で auto_ptr を使う例が挙げられていますが、C++11 では auto_ptr自体が非推奨です。
「Effective STL」についても、C++11 の登場によって、事情が変わってきている箇所も多いので、 こちらも今年は外しました。
ただしどちらも、C++98 世代のみに限って言えば良書であることは確かです。

3.C++ のための APIデザイン

書名 C++ のための APIデザイン
レベル 中級者〜
ジャンル C++
出版日 2012年11月
ISBN 978-4797369151

API設計を扱った数少ない本。

本書はタイトル通り、C++ による API設計を扱う本です。 つまり、他人に使ってもらうクラス群、関数群をどのように作っていけば良いかを解説しています。 このテーマに絞られた本はほとんど存在しないので、貴重な本と言えるでしょう。

API設計には考慮しなければならないことが数多くあります。 API使用者とのインタフェース部分の設計、分かりやすいドキュメントの作成、バージョンの管理(前後のバージョンとの互換性)、性能、テストの仕方など。 これらの話題が網羅されています。
1つ1つの話題に割かれているページ数は、それほど多い訳でもありませんが、 参考文献が豊富に紹介されているので、興味のある部分はそれらの文献にも当たってみると良いと思います。

実は、API設計に限らず、どんな種類のプログラミング作業においても有益な内容が多く、 どの立場からでもお勧めできる内容になっています。

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

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

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

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

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プログラミングならば、Win32API を直接使うよりも、.NET Framework を使用することが多くなっており、 最新の Windows 8 では、WinRT という新たな API も登場してきていますから、 Win32API のみを使ってアプリケーションを作る必要性自体が薄らいでいます。
しかし、Windows の動作原理を知るには、やはり Windows API のレベルで触ってみることは有効です。 Win32API のレベルで解説された本は、Windows2000 辺りの時代以降は(.NET の登場以降)、 ほとんど出版されていないので、この2冊は現代に近い視点で解説してくれている貴重な資料です。

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

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

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

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

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

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

本書を読むにあたって、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 のメンバーは、改めてパターンをまとめ直そうとしているようです。
それでも、多くのプログラマにとって共通理解となっていることもあるほど、GoF のパターンは広く浸透しているので、 やはり、知らないでは済まないでしょう。

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

8.プログラミング作法

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

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

コーディングスタイルから、設計、テスト、デバッグ、パフォーマンス、移植性といったように、 プログラミングに関するノウハウが集められています(ただし、オブジェクト指向周りはあまり記述がありません)。
それぞれの話題は、30ページ程度の分量にコンパクトにまとめられています。

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

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

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

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

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

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

本書の内容は、全体的に言えば、少ないメモリで最高のパフォーマンスを上げるアルゴリズムとデータ構造を探り出すことに集中しています。 ちょっとした発想の転換で、少ないメモリで最高のパフォーマンスを上げることが可能であることを教えてくれます。 これまで効率のことを考える習慣の無かった人は、新たな気付きを得られることでしょう。

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

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

何度でも読み返して欲しい一冊です。

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

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

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

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

本書は、ソフトウェア開発者とハードウェア設計者の両方にとって、有用な内容となるように書かれています。 上巻の冒頭に、各話題がソフト・ハードのどちら向けの話題かの一覧表があります(なんだか見辛い表ですが)。 これを参考に自分にとって必要な情報が書かれているかどうか判断できます。

レベルは低くはありませんが、とても高難度だと言う訳でもありません。 大学の教科書として採用されることが多いようなので、その辺りのレベルだと考えて良いでしょう。

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

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

11.プログラマの数学

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

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

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

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

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

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

12.プログラマが知るべき97のこと

書名 プログラマが知るべき97のこと
レベル 初級
ジャンル プログラマ読み物
出版日 2010年12月
ISBN 978-4873114798

世界で活躍するプログラマ達による、プログラマのためのエッセイ集。

本書はエッセイ集であり、何らかの技術や知識が体系的にまとめられたものではありません。 ほとんどが見開き2ページに収められており、ちょっとした隙間の時間にでも適当なページを開いて読んでみるのもいいでしょう。

プログラマとしてあるべき姿、勉強法、ツールの使い方やテクニックなどなど。 世界の現場で、あるいは個人のプロジェクトで活躍してきた先人達のノウハウが詰まっています。
特に、職業プログラマでない方、これからプロの現場に進もうとしている方、個人での活動が多い方など、 他のプログラマの思考法、実践術などに触れられる良書です。 もちろん、そうでない方々にとっても、大いに参考になるでしょう。

本書は翻訳版ですが、この日本語版では新たに、日本人プログラマの記事10本が追加されています。

なお、同シリーズに 「ソフトウェアアーキテクトが知るべき97のこと」「プロジェクト・マネジャーが知るべき97のこと」「ゲームクリエイターが知るべき97のこと」 があります。 それぞれ、ご自分と関わりがあれば一読をお勧めできます。

総括

いかがでしたでしょうか?

前年と比べて、 「プログラミング言語C」「C++ の設計と進化」 を外し、Effective C++ シリーズを 「Effective C++」のみに置き換えました。
また、新規で「C言語入門」「C++ のための APIデザイン」「プログラマが知るべき97のこと」 を追加しました。

C言語入門」は随分と古い本ですが、読み辛いバイブル「プログラミング言語C」よりも こちらの方がお勧め書籍のコーナーの選定ルールには合っているかと思い、こちらに置き換えました。
C++ のための APIデザイン」は今年の新刊です(原著は去年ですが)。 C++関係は色々と入れ替えを試みた結果、本書と「Effective C++」の2冊に落ち着きました。 C++98 から C++11 への移行期となっている現在、できるだけどちらにも通用する基盤となる知識を得られる本を選定しました。
プログラマが知るべき97のこと」とそのシリーズ本は、本職の人たちの考え方を学べる良書達です。 1人で独学しているだけだと視野が狭くなりがちです。気軽に読める分量なので、暇なときに眺めてみると良いと思います。


今年の当サイトは、アルゴリズムとデータ構造編を中心に進めてきました。 当初予定では、今年中に旧サイトの内容を網羅するつもりでしたが、後半に失速して間に合いませんでした。 来年も引き続き作業を続けて、4月ぐらいには次のコンテンツの公開を開始できればと考えています(次は C++ かな?)。


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

最新の Windows OS である、Windows 8 が発売されました。 何といっても、タブレット端末への対応がポイントとなっており、ディスプレイを直接タッチして操作できる機能が搭載されています。 (勿論、対応ディスプレイでなければタッチは受け付けません。そんなニュースが話題になりました)

Visual Studio 2012 が公開されました。 残念ながら、去年正式規格となった C++11 への対応は不完全ですが、 前述の Windows 8 向けのアプリケーションが開発できるようになっています。
(C に関しては C11 はおろか C99 もサポートしていません。これはどうやらそういう方針のようですが)。

Perl は、5.16系が公開されました。 これに伴って、5.12系が早くもサポート対象外となっています。

最新の状況と比べ、当サイトの情報は全体的に古くなってきています。 特に、Windowsアプリを作る手段が Win32API しかないように思い込んでおられるような質問メールをよく頂戴します。 既にもっと手軽に開発が楽しめる環境は存在していますよ。

項目 最新 当サイトの状況
C言語 C11 C95
C++ C++11 C++98
Perl 5.16系、または Perl 6 5.10系
Windows APIなど WinRT (Windows 8以降)、.NET Framework 4.5、Win32(64)API Win32API
Windows系開発言語 C# 5.0、VB.NET 5.0、C++/CLI、標準C/C++、JavaScript 等 標準C/C++

更新履歴

'2012/12/22 新規作成。



昨年のお勧め書籍へ

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

Programming Place Plus のトップページへ