(今回は内容に合わせて文体を変えております。)さて、コンピュータサイエンス(以下「CS」)は知らないけど日々プログラミングしている、というプログラマの方はたくさんいらっしゃるかと思います。そんな方でも、ふとCSを知ってる方がいいのかなとか、CSも知らないとまずいのかな......などと思い、改めて勉強してみたいけどとっつきが悪いとか、うっかり手にとったCSの教科書が何を言ってるかさっぱりで10秒で閉じた、という方もいらっしゃるかと思います。それでもCSが気になるので、「本腰を入れて勉強をする前に、どういうことをやってるのか眺めてみたい」くらいの温度感の方向けに、CSに隣接するジャンルで、職業プログラマや趣味プログラマの人なら読めそうな書籍のリストを作ってみました。どれも2020年1月現在は新刊で入手できる本のつもりです。個人的な好みも反映されているため、万人におすすめというわけではありませんが、気になったものがあれば読んでみていただけるといいんではないかと思います。この記事の想定読者CSが気になるプログラマであると同時に、おおむね以下のような人を想定しています。手を動かすことに苦のない人なお、媒体の性質と筆者の背景により、コードはRubyが多めになっています。プログラマはCSを勉強しておくべきか否か念のため書いておくと、CSの真価のざっくり半分は実装というか実際のプログラミング・コンピュータに関わることだとして、残りの半分は「理論」や「証明」、あるいは「統制された実験(の実施)」だと思います。CSを知らなくても効率的なプログラムを書いたりすることはできます。どの程度効果があるの?」といった疑問を持ったとき、それを解決してくれるのは理論や証明、もしくは実験と考察です。この辺りについては、まっとうな教科書や論文を読まないと理解もできないし、作法も身につかないんではないかと思います。(ちなみにその他のCSで学べる・学ぶべき技能としては、「論文を読み書きできるようになる」というのがあります。これはこれで重要なのですが、職業研究者になるならともかく、職業プログラマをやっていく上では身につけなくてもいいかもしれません。コードや仕様書が書ける方が優先されるでしょう。いうか私もそこまで論文を書く能力が身についてないのでよくわかりません。)その意味で、この記事で勧める本を読んでも、CSの真価の半分(あるいはそれ以下)しか理解できないかもしれない、というのはあらかじめ断っておきます。Morin『みんなのデータ構造』(ラムダノート)この手の本はアルゴリズム寄りのものが多いのですが、本書はデータ構造寄りの本になっています。財布にやさしいお値段になっているのも魅力的です。それでも買うのはちょっと...という方は、本書の元になった日本語訳プロジェクトからどうぞ。[第2版]』(マイナビ出版)いわゆる蟻本です。競技プログラミング方面の本ですが、アルゴリズムの勉強にもなります。漫然とコルメン本やセジウィック本を読むよりは実践的に読めるんではないかと思います。競技プログラミング方面では『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』の方が若干やさしめな気がするので、蟻本は難しかった人はこちらをどうぞ。絵で見てわかる26のアルゴリズム』あたりの図を眺めるところから初めてみた方がよいかもしれません。コンピュテーション』(オライリー・ジャパン)計算理論については教科書的な本がほとんどで、なかなか初心者におすすめできるものがないのですが、本書はオートマトン・チューリングマシンからラムダ計算、停止性問題まで触れているので(しかもRubyだし)、とっつきやすいんではないかと思います。『計算理論の基礎[原著第2版]』(共立出版)があるのですが、ちょっと(とても)難しいのでおすすめには躊躇する本です。(情報数学講座)』(共立出版)すみません、プログラマ向けとは言い難い普通の教科書本なのですが、さすがに意味論の本は本書以外思いつきません......。あったらぜひご一報いただけるとうれしいです。本書は一度入手困難になったところからせっかく復刊されたことですし、せっかくなので今のうちに買っておいていただければ。RubyでつくるRuby』(ラムダノート)Rubyの処理系に興味があるRubyistには本書があります。Ruby処理系をRubyを利用して実装する本です。この本、何がすごいかというと、構文解析の詳しい解説をすっ飛ばす(ライブラリに任せる)ところです。ところで(たいして面白くない)構文解析アルゴリズムを延々説明しないといけないため、読者はそこで力尽きてしまうパターンが少なからずあるかと思います。本書はそこを「アリモノを使う」という技で華麗に回避しており、なんとか意味解析までは辿り着けるという親切設計になっています。Shaughnessy『Rubyのしくみ』(オーム社)か、ちょっと古いですがRHGこと『Rubyソースコード完全解説』をどうぞ。Ball『Go言語でつくるインタプリタ』(オライリー・ジャパン)ある程度実用言語(利用者は一人とか数名程度)くらいは作れそうで、スクリプト言語で書くよりも高速に動作するやつが書きたい、という場合、最近なら本書がいいかと思います。小松礼人『実践Rust入門』(技術評論社)にパーサの書き方が載っているので、こちらも参考になるかと思います。具体的な開発プロセスとかツールとかの本は、みなさん普通に読まれているかと思うので、ここでは省略します。Software――エビデンスが変えるソフトウェア開発』(オライリー・ジャパン)研究寄りのソフトウェア工学と現場との接点としては、本書辺りがわかりやすいというか、納得しやすいんではないかと思います。研究者の人はこういう風に考えるのか、こんな感じでデータを取るのか、というのも興味深いところです。本書は論文集みたいな本で、章ごとにトピックが分かれれているので、興味のある章をつまみ食いしていくと良いでしょう。最後の日本版独自の鼎談も面白かったです。―モダンなコンピュータの作り方』(オライリー・ジャパン)この本はどのジャンルに入れるか迷ったんですが、どこに入れてもしっくりこなかったんで、あえてここに入れておきます。いちおうまえがきの「本書の扱う範囲」にソフトウェアエンジニアリングも入ってましたし。デジタル回路の基本からCPU・コンピュータ・プログラミング言語・OSと積み上げていって、最終的にはアプリケーションを作ろう、という本です。ジャンルとしては「コンピュータアーキテクチャ」や「プログラミング言語処理系」と「アプリケーションプログラミング」等の合わせ技になりそうです。ソフトウェア開発をめぐる全体を体験的に概観する、という特別な経験として、読んでみると良いんではないかと思います。OS「プログラマなら自分で作ってみた方が早い理論」にのっとると、OSを勉強するならOSを実装してみることになりそうです。OS自作入門』(マイナビ出版)定番ですね。日本語でのOS自作の本というと本書を避けらないほど広く読まれている本です。x86系コンピュータを動かす理論と実装』(技術評論社)があります。坂井弘亮『12ステップで作る組込みOS自作入門』(カットシステム)単純にOSを作りたいだけなら、組込みOSの方がずっと簡単だったりします。基本的なタスク管理・メモリ管理・デバイス制御といった辺りが理解できるとうれしいんではないでしょうか。実験と図解で学ぶOSとハードウェアの基礎知識』(技術評論社)そうは言ってもいきなりゼロから作るのは大変なので、既存のOSの挙動から理解したい、というのであれば本書があります。プロセススケジューリング、メモリ管理、ファイルシステムなど、基本的な部分の挙動が確認できます。Storimer『なるほどUnixプロセス』(達人出版会)手前味噌ですが、Unixのプロセス周りについてRubyで理解できる本といえば本書になります。Cの本ならそれなりにあるんですが、そうじゃないのはめずらしいですよね。RubyじゃなくてGoがいい、という人には、渋川よしき『Goならわかるシステムプログラミング』(ラムダノート)をどうぞ。コンピュータアーキテクチャ渡波郁『CPUの創りかた』(マイナビ出版)こちらも定番ですね。出た当初は萌え本というかイロモノ的な評判の方が強かったような気がしますが、最近では普通にデジタル回路とCPUアーキテクチャの基本的なところを理解するための本へと評価が変わってきた気がします。本書の一番の衝撃は、本書のイラストレーターと著者が同一人物だったことです。CPUの作り方10講』(技術評論社)があります。こちらはVHDLで実装するものです。有野和真『Androidを支える技術〈I〉』『Androidを支える技術〈II〉』(技術評論社)Android方面以外ではあんまり話題になってない気がするのですが、Androidアプリ開発にまったく縁がなくても読むべき、とても良い本なので、事あるごとに推している本です。21世紀に広く使われているコンピュータとしてはスマートフォンは欠かせないわけで、そのアーキテクチャについて、アプリ開発用APIからカーネルまで全体をソースコードつきで解説してくれるのは本書しかないんではないでしょうか。IはGUIをハードウェアからAPIまで理解する本、IIはActivityというか、Linux・Unixとモバイルとの相性の悪さをどのようなアーキテクチャで解決しているかを理解する本になります。本書のもっとも感動的な部分はIIの最後の「おまけ」なので、絶対そこまで読みましょう(要はII巻全部、になりますが)。第2版』(翔泳社)本書もどこに入れようかと迷いましたが、とりあえずここに入れてみます(最後にレジスタ計算機を作りますし)。プログラマ向けのCSの本と言えば本書を外すことはないでしょう。いえ、偏っているところはあるかと思うので、難しいところは飛ばしたり斜め読みしたりしつつ、とにかく第5章まで読み進めれば、計算機とプログラムの基本が分かるんではないかと思います。ちなみに本書もネットで読めます。堀玄『プログラミングのための線形代数』『プログラミングのための確率統計』(オーム社)プログラマが読みやすい数学の本というと、やっぱこの辺りでしょうか。CSの数学というと、以前はいわゆる離散数学から入っていくのが定番というか(そうでもない?)、解析・線形代数とか確率統計とかはCS関係なく普通に数学として勉強してるでしょ、という雰囲気もありそうです。そこをすっ飛ばしてしまった人にも勉強して(し直して)欲しいわけで、であればおすすめはこの辺りかと思います。最近は機械学習方面もにぎやかで、そこをちゃんと追いかけるには必要な数学分野かと思うので。第2版』(SBクリエイティブ)こちらは従来からのCSぽい、離散数学的な数学の本です。個人的に結城さんの技術書は信頼してるし好みなので本書を取り上げてみました。確率・統計編』(講談社)ブルーバックスです。入門書というより奇書という趣もある本です。いう何を言ってるかよく分からない話を強引に進めていくと、確かに分かりやすい気がしてくるのは本当にすごいの一言。本書の著者はもともと『物理数学の直観的方法』で20年以上前に革命を起こした人で、この本は比較的ふつうの理工系大学生(数学科除く)にもおすすめできる内容になっています。第3版』(SBクリエイティブ)こちらも安心の結城さん本です。基礎の基礎を、数学知らない人向けに説明している本です。(結城浩)を読んで最先端暗号理論はどうなってるのだろうと興味を持った方」向けの本として、光成滋生『クラウドを支えるこれからの暗号技術』があるのですが、こちらはだいぶ難しいというか、教科書っぽい書き方になっています。興味のある方はどうぞ。IPUSIRON『暗号技術のすべて』(翔泳社)前述の本と似た本になります。私見では結城さんの方が間口が広く、IPUSIRONさんの方が深掘りしているような気もしますが、そうでもないかも。書籍というか著者のテイストでお好きな方を選べば良いかと思います。データベースデータベースというと、実務的にはSQLの書き方やデータモデリングの話になるのですが、CS的にはリレーショナルモデルの話になるわけです。データモデル・SQL・管理システム・NoSQL』(サイエンス社)すごい、今はNoSQLも触れてるんですね......と言いたくなるくらい、昔から定評のある本です。関係(リレーショナル)代数から入る一般向けの本は貴重です。エンジニアのためのリレーショナル理論』(オライリー・ジャパン)『データベースシステム概論』という分厚い教科書本で有名な著者の書いた、もうちょっとカジュアルな解説本です。奥野幹也『理論から学ぶデータベース実践入門』(技術評論社)上記C.J.Date本をもうちょっと現場との架橋を試みた、野心的な本です。素人なのですが(講談社サイエンティフィクの青い本はだいたい途中で力尽きました)、定評のあるものを紹介してみます。久保拓弥『データ解析のための統計モデリング入門』(岩波書店)データサイエンス方面では「緑本」と呼ばれている(らしい)本です。外野からすると、機械学習以前の話として「結局のところ『統計モデル』ってなんなの???」というところの理解が一番むずかしかった(ここが分かると「完全に理解した」という気分になります)のですが、その意味では本書(の最初の方)が予備知識なし読めてわかりやすかったのでした。数年前なので、今では他に良書があるかもしれませんが、今でも定番の本ではあるみたいですし、本書の読解のための資料もWebに多数あるようなので紹介しておきます。―Pythonで学ぶディープラーニングの理論と実装』(オライリー・ジャパン)ちょっと前に大ブームだった本です。Learningを実装して理解していきます。自然言語処理編』も合わせてどうぞ。エッセンス』(SBクリエイティブ)こちらもやっぱり実装していくやつです。『ゼロから〜』よりも本書を先に読んだ方がいいかもしれません。いえ第3章はふつうに数学の話が続くので、そこは頑張って読み進めて4章までなんとかたどり着いてください。セキュリティ(実践的な)コンピュータセキュリティがどこまでCSなのかよくわからないのですが、まったく関係ないということはないかと思うので紹介しておきます。第2版』(SBクリエイティブ)いわゆる徳丸本です。いう鉄板の本がある分野は紹介しやすくていいですよね。改訂されて最近の話題にも対応されています。網羅的に知識を得たいのであれば、まず本書を読むことになるかと思います。仮想環境におけるハッカー体験学習』(翔泳社)Linuxの仮想環境の中で動かしているアプリケーションを攻撃してみて理解するという本です。Web以外のセキュリティについてはこちらをどうぞ。