0061 号 巻頭言

コンピュータサイエンスが気になるプログラマに勧める書籍リスト

Rubyist Magazine 第 61 号をお届けします。

(今回は内容に合わせて文体を変えております。ご了承ください。)


さて、コンピュータサイエンス(以下「CS」)は知らないけど日々プログラミングしている、というプログラマの方はたくさんいらっしゃるかと思います。

そんな方でも、ふとCSを知ってる方がいいのかなとか、CSも知らないとまずいのかな……などと思い、改めて勉強してみたいけどとっつきが悪いとか、うっかり手にとったCSの教科書が何を言ってるかさっぱりで10秒で閉じた、という方もいらっしゃるかと思います。

それでもCSが気になるので、「本腰を入れて勉強をする前に、どういうことをやってるのか眺めてみたい」くらいの温度感の方向けに、CSに隣接するジャンルで、職業プログラマや趣味プログラマの人なら読めそうな書籍のリストを作ってみました。どれも2020年1月現在は新刊で入手できる本のつもりです。個人的な好みも反映されているため、万人におすすめというわけではありませんが、気になったものがあれば読んでみていただけるといいんではないかと思います。

この記事の想定読者

CSが気になるプログラマであると同時に、おおむね以下のような人を想定しています。

  • コードを書ける人
  • 手を動かすことに苦のない人

なお、媒体の性質と筆者の背景により、コードはRubyが多めになっています。ご了承ください。

追記: プログラマはCSを勉強しておくべきか否か

念のため書いておくと、CSの真価のざっくり半分は実装というか実際のプログラミング・コンピュータに関わることだとして、残りの半分は「理論」や「証明」、あるいは「統制された実験(の実施)」だと思います。

CSを知らなくても効率的なプログラムを書いたりすることはできます。しかし、「なんで? ほんとに? それはいつでも正しいの? それとも条件によるの? どの程度効果があるの?」といった疑問を持ったとき、それを解決してくれるのは理論や証明、もしくは実験と考察です。そしてこの辺りについては、まっとうな教科書や論文を読まないと理解もできないし、作法も身につかないんではないかと思います。

(ちなみにその他のCSで学べる・学ぶべき技能としては、「論文を読み書きできるようになる」というのがあります。これはこれで重要なのですが、職業研究者になるならともかく、職業プログラマをやっていく上では身につけなくてもいいかもしれません。コードや仕様書が書ける方が優先されるでしょう。というか私もそこまで論文を書く能力が身についてないのでよくわかりません。)

その意味で、この記事で勧める本を読んでも、CSの真価の半分(あるいはそれ以下)しか理解できないかもしれない、というのはあらかじめ断っておきます。

アルゴリズムとデータ構造

  • Pat Morin『みんなのデータ構造』(ラムダノート)

この手の本はアルゴリズム寄りのものが多いのですが、本書はデータ構造寄りの本になっています。 そして財布にやさしいお値段になっているのも魅力的です。それでも買うのはちょっと…という方は、本書の元になった日本語訳プロジェクトからどうぞ。

  • 秋葉拓哉,岩田陽一,北川宜稔『プログラミングコンテストチャレンジブック [第2版]』(マイナビ出版)

いわゆる蟻本です。 競技プログラミング方面の本ですが、アルゴリズムの勉強にもなります。漫然とコルメン本やセジウィック本を読むよりは実践的に読めるんではないかと思います。 同じく競技プログラミング方面では『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』の方が若干やさしめな気がするので、蟻本は難しかった人はこちらをどうぞ。 どっちもよくわからん、という人は、『アルゴリズム図鑑 絵で見てわかる26のアルゴリズム』あたりの図を眺めるところから初めてみた方がよいかもしれません。

計算理論

  • Tom Stuart『アンダースタンディング コンピュテーション』(オライリー・ジャパン)

計算理論については教科書的な本がほとんどで、なかなか初心者におすすめできるものがないのですが、本書はオートマトン・チューリングマシンからラムダ計算、停止性問題まで触れているので(しかもRubyだし)、とっつきやすいんではないかと思います。

もっとがっつりした本、となるとMichael Sipser 『計算理論の基礎[原著第2版]』(共立出版)があるのですが、ちょっと(とても)難しいのでおすすめには躊躇する本です。

プログラミング意味論

  • 横内寛文『プログラム意味論 (情報数学講座)』(共立出版)

すみません、プログラマ向けとは言い難い普通の教科書本なのですが、さすがに意味論の本は本書以外思いつきません……。

表示的意味論とか領域理論(domain theory)について日本語でしっかり解説してる本って他にあるんでしょうかね? あったらぜひご一報いただけるとうれしいです。まあ、本書は一度入手困難になったところからせっかく復刊されたことですし、せっかくなので今のうちに買っておいていただければ。

プログラミング言語処理系

  • 遠藤侑介『RubyでつくるRuby』(ラムダノート)

Rubyの処理系に興味があるRubyistには本書があります。Ruby処理系をRubyを利用して実装する本です。

この本、何がすごいかというと、構文解析の詳しい解説をすっ飛ばす(ライブラリに任せる)ところです。 ドラゴンブックにしろ何にしろ、この手の本はたいてい字句解析・構文解析のところで(たいして面白くない)構文解析アルゴリズムを延々説明しないといけないため、読者はそこで力尽きてしまうパターンが少なからずあるかと思います。本書はそこを「アリモノを使う」という技で華麗に回避しており、なんとか意味解析までは辿り着けるという親切設計になっています。

Rubyそのものの実装が気になる人は、Pat Shaughnessy『Rubyのしくみ』(オーム社)か、ちょっと古いですがRHGこと『Rubyソースコード完全解説』をどうぞ。

  • Thorsten Ball『Go言語でつくるインタプリタ』(オライリー・ジャパン)

ある程度実用言語(利用者は一人とか数名程度)くらいは作れそうで、スクリプト言語で書くよりも高速に動作するやつが書きたい、という場合、最近なら本書がいいかと思います。

GoじゃなくてRustがいいという人は、κeen, 河野達也, 小松礼人『実践Rust入門』(技術評論社)にパーサの書き方が載っているので、こちらも参考になるかと思います。

ソフトウェア工学

具体的な開発プロセスとかツールとかの本は、みなさん普通に読まれているかと思うので、ここでは省略します。

  • Andy Oram, Greg Wilson編『Making Software――エビデンスが変えるソフトウェア開発』(オライリー・ジャパン)

研究寄りのソフトウェア工学と現場との接点としては、本書辺りがわかりやすいというか、納得しやすいんではないかと思います。研究者の人はこういう風に考えるのか、こんな感じでデータを取るのか、というのも興味深いところです。

本書は論文集みたいな本で、章ごとにトピックが分かれれているので、興味のある章をつまみ食いしていくと良いでしょう。最後の日本版独自の鼎談も面白かったです。

  • Noam Nisan, Shimon Schocken『コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方』(オライリー・ジャパン)

この本はどのジャンルに入れるか迷ったんですが、どこに入れてもしっくりこなかったんで、あえてここに入れておきます。いちおうまえがきの「本書の扱う範囲」にソフトウェアエンジニアリングも入ってましたし。

デジタル回路の基本からCPU・コンピュータ・プログラミング言語・OSと積み上げていって、最終的にはアプリケーションを作ろう、という本です。ジャンルとしては「コンピュータアーキテクチャ」や「プログラミング言語処理系」と「アプリケーションプログラミング」等の合わせ技になりそうです。ソフトウェア開発をめぐる全体を体験的に概観する、という特別な経験として、読んでみると良いんではないかと思います。

OS

「プログラマなら自分で作ってみた方が早い理論」にのっとると、OSを勉強するならOSを実装してみることになりそうです。

  • 川合秀実『30日でできる! OS自作入門』(マイナビ出版)

定番ですね。日本語でのOS自作の本というと本書を避けらないほど広く読まれている本です。

もうちょっとモダンなx86系のOSの本というと、本書の著者が監修をされている林高勲『作って理解するOS x86系コンピュータを動かす理論と実装』(技術評論社)があります。

  • 坂井弘亮『12ステップで作る組込みOS自作入門』(カットシステム)

単純にOSを作りたいだけなら、組込みOSの方がずっと簡単だったりします。 もちろん本番に使いたいやつは大変かと思いますが(それを言ったら本番に使うPC向けOSもめちゃめちゃ大変だし)、 基本的なタスク管理・メモリ管理・デバイス制御といった辺りが理解できるとうれしいんではないでしょうか。

  • 武内覚『試して理解 Linuxのしくみ 実験と図解で学ぶOSとハードウェアの基礎知識』(技術評論社)

そうは言ってもいきなりゼロから作るのは大変なので、既存のOSの挙動から理解したい、というのであれば本書があります。 プロセススケジューリング、メモリ管理、ファイルシステムなど、基本的な部分の挙動が確認できます。

  • Jesse Storimer『なるほどUnixプロセス』(達人出版会)

手前味噌ですが、Unixのプロセス周りについてRubyで理解できる本といえば本書になります。Cの本ならそれなりにあるんですが、そうじゃないのはめずらしいですよね。 RubyじゃなくてGoがいい、という人には、渋川よしき『Goならわかるシステムプログラミング』(ラムダノート)をどうぞ。

コンピュータアーキテクチャ

  • 渡波郁『CPUの創りかた』(マイナビ出版)

こちらも定番ですね。出た当初は萌え本というかイロモノ的な評判の方が強かったような気がしますが、最近では普通にデジタル回路とCPUアーキテクチャの基本的なところを理解するための本へと評価が変わってきた気がします。 なお本書の一番の衝撃は、本書のイラストレーターと著者が同一人物だったことです。

もうちょっとふつうに自作CPUに興味のある方は、井澤裕司 『動かしてわかる CPUの作り方10講』(技術評論社)があります。こちらはVHDLで実装するものです。

  • 有野和真『Androidを支える技術〈I〉』『Androidを支える技術〈II〉』(技術評論社)

Android方面以外ではあんまり話題になってない気がするのですが、Androidアプリ開発にまったく縁がなくても読むべき、とても良い本なので、事あるごとに推している本です。

21世紀に広く使われているコンピュータとしてはスマートフォンは欠かせないわけで、そのアーキテクチャについて、アプリ開発用APIからカーネルまで全体をソースコードつきで解説してくれるのは本書しかないんではないでしょうか。IはGUIをハードウェアからAPIまで理解する本、IIはActivityというか、Linux・Unixとモバイルとの相性の悪さをどのようなアーキテクチャで解決しているかを理解する本になります。

なお、本書のもっとも感動的な部分はIIの最後の「おまけ」なので、絶対そこまで読みましょう(要はII巻全部、になりますが)。

  • Abelson and Sussmans『計算機プログラムの構造と解釈 第2版』(翔泳社)

本書もどこに入れようかと迷いましたが、とりあえずここに入れてみます(最後にレジスタ計算機を作りますし)。プログラマ向けのCSの本と言えば本書を外すことはないでしょう。とはいえ、偏っているところはあるかと思うので、難しいところは飛ばしたり斜め読みしたりしつつ、とにかく第5章まで読み進めれば、計算機とプログラムの基本が分かるんではないかと思います。

ちなみに本書もネットで読めます

数学

  • 平岡和幸, 堀玄『プログラミングのための線形代数』『プログラミングのための確率統計』(オーム社)

プログラマが読みやすい数学の本というと、やっぱこの辺りでしょうか。CSの数学というと、以前はいわゆる離散数学から入っていくのが定番というか(そうでもない?)、解析・線形代数とか確率統計とかはCS関係なく普通に数学として勉強してるでしょ、という雰囲気もありそうです。 が、そこをすっ飛ばしてしまった人にも勉強して(し直して)欲しいわけで、であればおすすめはこの辺りかと思います。最近は機械学習方面もにぎやかで、そこをちゃんと追いかけるには必要な数学分野かと思うので。

  • 結城浩『プログラマの数学 第2版』(SBクリエイティブ)

こちらは従来からのCSぽい、離散数学的な数学の本です。

個人的に結城さんの技術書は信頼してるし好みなので本書を取り上げてみました。客観的な評価はよく知らないというか、そこまでたくさんの数学関連書を読んでるわけではないので他にも良い本がいっぱいあるかと思いますが、それはさておき本書は読むのをおすすめできるかと思います。

  • 長沼伸一郎『経済数学の直観的方法 確率・統計編』(講談社)

ブルーバックスです。入門書というより奇書という趣もある本です。正規分布は数式が難しいのでイメージしづらいけど、仮に二等辺三角形であるとすれば理解しやすいのでは? という何を言ってるかよく分からない話を強引に進めていくと、確かに分かりやすい気がしてくるのは本当にすごいの一言。

本書の著者はもともと『物理数学の直観的方法』で20年以上前に革命を起こした人で、この本は比較的ふつうの理工系大学生(数学科除く)にもおすすめできる内容になっています。『物理数学〜』ファンなので(無形化世界とかはそうでもないです)、本書も載せておきます。

暗号理論

  • 結城浩『暗号技術入門 第3版』(SBクリエイティブ)

こちらも安心の結城さん本です。基礎の基礎を、数学知らない人向けに説明している本です。

ちなみに、「『暗号技術入門』(結城浩)を読んで最先端暗号理論はどうなってるのだろうと興味を持った方」向けの本として、光成滋生『クラウドを支えるこれからの暗号技術』があるのですが、こちらはだいぶ難しいというか、教科書っぽい書き方になっています。興味のある方はどうぞ。

  • IPUSIRON『暗号技術のすべて』(翔泳社)

前述の本と似た本になります。私見では結城さんの方が間口が広く、IPUSIRONさんの方が深掘りしているような気もしますが、そうでもないかも。書籍というか著者のテイストでお好きな方を選べば良いかと思います。

データベース

データベースというと、実務的にはSQLの書き方やデータモデリングの話になるのですが、CS的にはリレーショナルモデルの話になるわけです。

ちなみにデータベース関連では、ジム・グレイ&アンドレアス・ロイター『トランザクション処理 上・下』(日経BP)という定番本があったのですが、現在は入手困難です。残念。

  • 増永良文『リレーショナルデータベース入門 データモデル・SQL・管理システム・NoSQL』(サイエンス社)

すごい、今はNoSQLも触れてるんですね……と言いたくなるくらい、昔から定評のある本です。関係(リレーショナル)代数から入る一般向けの本は貴重です。

  • C.J.Date『データベース実践講義 エンジニアのためのリレーショナル理論』(オライリー・ジャパン)

『データベースシステム概論』という分厚い教科書本で有名な著者の書いた、もうちょっとカジュアルな解説本です。

  • 奥野幹也『理論から学ぶデータベース実践入門』(技術評論社)

上記C.J.Date本をもうちょっと現場との架橋を試みた、野心的な本です。 述語論理の扱いには批判もあるようですが、リレーショナルモデルの理論と実践を両方やろうとした貴重な本なので、一読の価値はあるかと思います。

機械学習

機械学習は素人なのですが(講談社サイエンティフィクの青い本はだいたい途中で力尽きました)、定評のあるものを紹介してみます。

  • 久保拓弥『データ解析のための統計モデリング入門』(岩波書店)

データサイエンス方面では「緑本」と呼ばれている(らしい)本です。外野からすると、機械学習以前の話として「結局のところ『統計モデル』ってなんなの???」というところの理解が一番むずかしかった(ここが分かると「完全に理解した」という気分になります)のですが、その意味では本書(の最初の方)が予備知識なし読めてわかりやすかったのでした。数年前なので、今では他に良書があるかもしれませんが、今でも定番の本ではあるみたいですし、本書の読解のための資料もWebに多数あるようなので紹介しておきます。

  • 斎藤康毅『ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装』(オライリー・ジャパン)

ちょっと前に大ブームだった本です。「ゼロから」と言いつつNumPyの立場は……というのはさておき、素のPythonとNumPyだけでDeep Learningを実装して理解していきます。続刊の『ゼロから作るDeep Learning 自然言語処理編』も合わせてどうぞ。そろそろ第3段も出るようでたのしみですね。

  • 加藤公一『機械学習のエッセンス』(SBクリエイティブ)

こちらもやっぱり実装していくやつです。『ゼロから〜』よりも本書を先に読んだ方がいいかもしれません。 とはいえ第3章はふつうに数学の話が続くので、そこは頑張って読み進めて4章までなんとかたどり着いてください。

セキュリティ

(実践的な)コンピュータセキュリティがどこまでCSなのかよくわからないのですが、まったく関係ないということはないかと思うので紹介しておきます。

  • 徳丸浩『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版』(SBクリエイティブ)

いわゆる徳丸本です。こういう鉄板の本がある分野は紹介しやすくていいですよね。改訂されて最近の話題にも対応されています。 網羅的に知識を得たいのであれば、まず本書を読むことになるかと思います。

  • IPUSIRON『ハッキング・ラボのつくりかた 仮想環境におけるハッカー体験学習』(翔泳社)

Linuxの仮想環境の中で動かしているアプリケーションを攻撃してみて理解するという本です。Web以外のセキュリティについてはこちらをどうぞ。