What is it, naokirin?

他の人におすすめしたい、私の蔵書(プログラミング)

id:pocketberserkerさんとお話している時に

「ブログで良書まとめ的なものをやってみたい」

といった話が出たので、さっそくやってみることに。


とはいえ、良書くらいならそのあたりにいくらでもあるし、私の百数十冊の本のうち読んだもののほとんどは私の知識として直接ではなくとも役立っているものは数多くあります。

そういう面では良書なんていくらでもあるので、ここではプログラミング初級者〜中級者に特にお勧めしたい10冊をセレクトすることにしました。

ちなみに初級者はプログラミングで100行程度のコードなら楽に書ける人、中級者は実際に個人で500〜3000行程度のコードを持つ実用的なアプリケーションを作成する能力がある人を指して使っています。私は中級者一歩手前ですかねw(そんな人間が偉そうにこんな記事書くなよ、とか言わないでね)
私の経験的にはそれ以前の初心者の方はこれらの本よりはもう少し基礎的な部分を学ぶのがよいと思います。

ちなみにあくまでも、私の蔵書からのセレクトなので内容の偏りは気にしないでくださいね。

あと番号は順位ではなく、単なるナンバリングです。


No.1 「Write Great Code vol.1 & vol.2」

Write Great Code〈Vol.1〉ハードウェアを知り、ソフトウェアを書く

Write Great Code〈Vol.1〉ハードウェアを知り、ソフトウェアを書く

Write Great Code〈Vol.2〉低いレベルで考え高いレベルで書く

Write Great Code〈Vol.2〉低いレベルで考え高いレベルで書く

これは初心者向けではないのですし、知らないとプログラマとして失格と言うものでもないのですが、知っていたほうがいいと言った「コンピュータがどのようにプログラムを実行しているか」や「『型』は実際にはどのようなものなのか」と言ったことがしっかり書かれている本です。
はっきり言います。昨今話題に上る高級言語でこれほど低レイヤーを意識する必要はないかもしれません。
ですが、こういう知識があった方が良い時もあります。

No.2 「Code Reading」

Code Reading―オープンソースから学ぶソフトウェア開発技法

Code Reading―オープンソースから学ぶソフトウェア開発技法

これは、「他人の書いたコードをいかにして読むか」が焦点です。実際に大規模な開発を行う際には他人の書いたコードを読むと言うことは頻繁にあると思います。その中で「人のコードを読む」ことに焦点が当てられた本と言うのは少ないのですが、その少ないうちの1冊です。
オープンソースのコードを題材に、いかにしてコードを読むかが書かれている貴重な1冊です。

No.3 「Code Complete(上) & (下)」

CODE COMPLETE 第2版 上 完全なプログラミングを目指して

CODE COMPLETE 第2版 上 完全なプログラミングを目指して

CODE COMPLETE 第2版 下 完全なプログラミングを目指して

CODE COMPLETE 第2版 下 完全なプログラミングを目指して

「Code Reading」が読むための本なら、この本は書くための本です。
どのようにコードを書くべきか、どのような点に気をつけるべきかが書かれています。
こういう本を読んでいることでコードを書く際に意識できることが変わってくるので、読んでみてほしい1冊です。

No.4 「プログラマが知るべき97のこと」

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

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

この本は実際にプログラミングをやっている人が自分が本当にちゃんと開発を「できてるか」を確認し、復習、そしてその先の勉強を行う足がかりとして役に立つ本だと思います。2ページ1エッセイという形なので気楽に読めるのもよいところですね。

No.5 「Exceptional C++

Exceptional C++―47のクイズ形式によるプログラム問題と解法 (C++ in‐Depth Series)

Exceptional C++―47のクイズ形式によるプログラム問題と解法 (C++ in‐Depth Series)

  • 作者: ハーブサッター,浜田光之,Harb Sutter,浜田真理
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/11
  • メディア: 単行本
  • 購入: 9人 クリック: 134回
  • この商品を含むブログ (63件) を見る
ちょっと言語特化している感はありますが、C++以外の人でも役に立つと思える1冊です。特にC++をやっている人は必須ですよ!
私がよく言われる「In Depth シリーズ」の中でも特にこの本をお勧めする理由は、内容が特に初心者〜中級者が気が付きくい、見落としている部分(例外について)が書かれている本だからです。
「例外を考えた設計をしていますか?」
こう問われて「していないかも」と思った人は一度読んでみてほしいです。

No.6 「メタプログラミングRuby

メタプログラミングRuby

メタプログラミングRuby

コレに関しては、使いこなせるまで鍛錬する必要はないと思っているのですが、動的型付け言語をやっている人は読んでみるとよいと思います。
実際に動的型付け言語は多くがこの本に書いてあるような「メタプログラミング」ができる場合が多く、実際にオープンソースなどのコードでは多用されていたりします。それを読み解くために読んでおいて欲しい1冊です。
もっと言えば、Rubyistになりたいなら書けるようになるべし。
ただし、やり過ぎは禁物ですよ!

No.7 「デザインパターンと共に学ぶオブジェクト指向のこころ」

デザインパターンとともに学ぶオブジェクト指向のこころ (Software patterns series)

デザインパターンとともに学ぶオブジェクト指向のこころ (Software patterns series)

これはいい本です。オブジェクト指向についての部分から、現在のプログラミングに際して必須知識ともいえる「デザインパターン」までが書かれた本です。

これよりさらにもう少ししっかりと「デザインパターン」について触れたい人のための本として、「オブジェクト指向における再利用のためのデザインパターン」や「Java言語で学ぶデザインパターン入門」はお勧めです。この辺りは自分のレベルや肌に合いそうな方を選ぶことをお勧めします。挫折しては元も子もないので。

No.8 「ソフトウェア・テスト PRESS 総集編」

ソフトウェア・テスト PRESS 総集編

ソフトウェア・テスト PRESS 総集編

雑誌です。
この本は名前の通り「ソフトウェアのテスト」のことが書かれています。総集編で過去10回の雑誌の記事がPDF形式でCDにすべて収められています。これはぜひ買うべきです。
テストは現場で軽視されやすいと言われていますが、実際にはとても重要なものです。

私としてはテスト初心者にはまずCDに収録されている「ソフトウェア・テスト PRESS Vol.1」の特集1の記事でテストがなぜ必要か、というものを見た後に、同じくVol.1の特集3でどのようにテストを行うのかをJavaJUnitの例で学んでもらうのがよいかと思います。
ただし、特集3で学ぶのも敷居が高いので、JavaJUnitの学習には「プログラミング現場の単体テスト」と言う本がありますので、そちらを参考にしたりするのもよいかと思います。

実際にxUnitに触れたことがある人は総集編で紙の記事に書いてある「ソフトウェアテスト技法道場」という記事を見て、その後CDに収録されている中にある「ソフトウェアテスト技法道場」の連載記事をみて、どのようなにテストすべきかを学ぶとよいと思います。

No.9 「ユースケース駆動開発実践ガイド」

ユースケース駆動開発実践ガイド (OOP Foundations)

ユースケース駆動開発実践ガイド (OOP Foundations)

これは設計の実際のプロセスである「ICONIX」プロセスの解説、そして具体例を記述している本です。

この本の通りに設計をする必要は私は無いと思っていますが、実際に設計で注意すべき点と言うのはどのような場合においても同じです。
なのでこの本を読むことで一体どのようなことに注意して設計を行うべきかが見えてくるのではないかと思います。

特にICONIXプロセスにある、最初にドメインモデリングをするというのは結構重要だと思いますね。チーム開発を経て、実感してきましたよ。

No.10 「コンピュータプログラミングの概念・技法・モデル」

コンピュータプログラミングの概念・技法・モデル (IT Architects' Archiveクラシックモダン・コンピューティング)

コンピュータプログラミングの概念・技法・モデル (IT Architects' Archiveクラシックモダン・コンピューティング)

この本は重いです。デカイです。

ただ最近のマルチパラダイムの流れに惑わされない、しっかりとパラダイムを意識することができる人になるために読んでほしい本です。
ただし、これを読むにはそこそこ気合いがいります。なにせ本がデカくて高いですから。さらに実際の開発では使いにくい「Oz」というプログラミング言語が使われているため、実践で即座に役に立つわけではないです。
でも知識はきっと役に立ちます。そういう本です。

この本だけでいろんなパラダイムの言語を学ぶことに満足せずにもっといろんな言語学んでみましょう。この本に書いてあるパラダイムの言語を探して学習してみるのもいいですよ。


他にも良書はたくさんあるのですが、今回はこの10冊を選んでみました。
あまり言語に依らない本をチョイスしました。言語それぞれの学習よりはもっとスキルや開発の知識などに役に立つ本が多くなるようにしています。

実際に私自身が特に影響を受けた本が並んでいると思います。
動的型付け言語をやらない人にとってはNo.6の「メタプログラミングRuby」はあまり必要ではないかもしれませんが、動的型付けの言語を触る人は読んでみるとまた違った形で進歩できるかもしれません。

No.1〜3に関しては、実際にコードを書くと言う本ではなく、「こういう風にした方がいい」とか「こうなってる」と言った部分が多く実践にどのように役に立つか見えにくいと思うので、一度に読むのは大変だと思います。でも、「こうすることで自分のコードの質が上がるんだなー」とか「この前書いたあの部分、こう直した方がいいかも」とか「あの内部ではこうなっていたのか!」と思ったりしながら楽しんで読んでほしいですね。

No.8〜10に関しては中級者向けかもしれません。初級者には少々大変かもしれませんので、プログラミングに慣れた時にはぜひ挑戦してほしいですね。


今回は10冊の中に書きませんでしたが、開発手法として「アジャイル開発」の本は読んでみてほしいです。ただし、これに関してはいろいろなアジャイル関連の本を読まなければならないため除外しました。
興味がある方は私が持ってる本でお勧めとしては「アジャイル開発の本質とスケールアップ」と言う本です。アジャイルの基本的な話から本来、小規模開発用であるアジャイル開発手法をどのように大規模開発に適用するかという話が書いてある本です。他にもアジャイルに関しての良書はたくさんあります。

あとはお勧めしたい本として、No.1の「Write Great Code」に通じるものがありますが、「Hacking:美しき策謀」と言う本があります。この本を私自身は「ハッキングのための本」ととらえてほしくなく、どのようにハッキングと言うのは行われるのか、実際にどのような点に気をつけるべきなのかが非常に低レイヤーに掘り下げて解説してあります。この本も面白い本です。


さて、実際にここまで書いてみて改めて思ったのは「実践も重要だけれど、本や先人からの知識もやっぱり重要」だと言うことです。私の中にこれらの本から受けた知識と言うのは大きなものだと思います。


あとで思ったけど、上下巻を1冊としてカウントしてるから、これって10冊に収まってないんじゃ…