4月にプログラム始めた人がゴールデンウィークに積んでおく本

大きく挙げたのは7冊なので、7日の休みで1日1冊ですね!
連休の間に読んでおいて、友達に差をつけよう!
うっかり、先輩にも差をつけちゃえばいいと思います。

プログラムを組むとはどういうことか

本を挙げる前に、まずプログラムを組むとはどういうことかということを考えておきます。
ざっくりとした説明なので、だいたいこういう感じ、だと考えてください。
その上で、どのような本が必要かを考えて、本を選んでいきます。


以前描いたものですが、プログラムを作るということと各分野の関係はこのようにあらわせます。

まず、プログラムは最終的にユーザーに使ってもらうためのものです。
ただ、ユーザーはプログラムを直接使うことはできません。プログラムはハードウェアで動かす必要があります。そして、ユーザーインタフェースを介してユーザーが使います。
(ハードウェアからプログラムへの矢印は逆のほうがいいですね)


このような、ユーザーが使うためのプログラムを作るわけなので、開発者はユーザーがどのようなものを欲しがっているか、推定する必要があります。これを「要求分析」などといいます。
そうやって、ユーザーが欲しがってるものにアタリをつけて、作るものを決めたら、プログラム言語を使ってプログラムを作るわけですね。
その、プログラムを作る作業には紆余曲折があるので、いかに紆余曲折しないかを工夫しながら開発作業を進めます。この開発作業を進める工夫を「開発プロセス」といいます。開発プロセスは要求分析から含まれていて、「アジャイル」などの技法があります。


そして、がんばって開発プロセスに従ったり従わなかったり怒られたりしながら、プログラム言語を使って、ライブラリやフレームワークなどを組み合わせながらプログラムを書いていくわけです。


こうやって作ったプログラムは前述のとおりハードウェアで動くので、物理的な制約をうけます。具体的には、すごく遅いってこととあんまり容量がないってこととつながらないってことと壊れるってことです。
ただ、プログラムを組んでる最中のプログラマの脳みそでは、どんな巨大なデータも一瞬で確実に検索できてたりするので、実際に動かすまではそういう制約とは無縁です。
プログラムを組んでる最中に頭を悩ませられるのは、物理的な制約ではなく、理論的・数学的な制約のほうです。どのような制約があるかというのが「計算理論」で、その制約の中でいかに効率のよい処理を書くかというのが「アルゴリズム」です。また、プログラム言語のもつ本質的な制約は「ラムダ計算」という理論をベースに整理されています。
こういう制約の中でプログラムを書いていくわけです。
まあ、なんだかんだで一番頭を悩ませるのは使ってるプロダクトの機能とか人間関係とか組織の問題みたいですけど。

今回の方針

ともかく、プログラム組むには、「ユーザーの要求をプログラムとして実現する」「ハードウェアをうまく動かす」「理論的な制約を手なずける」、そして「プログラム言語自体をうまく操る」ということが必要になるわけです。
ここで、プログラム自体をよくするには、後者の3点が重要になります。また、後者の3点ができていなければ、「ユーザーの要求をプログラムとして実現する」ということをがんばっても、結局動くプログラムはできません。
また、「ユーザーの要求をプログラムとして実現する」ということを考えるには、ある程度プログラム開発の経験が必要になります。ここは経験豊富な先輩方がうまくやってくれるはずなので、任せてしまいましょう。


ということで、まずは後者の3点、上の図で言えば右側から攻めて、よいプログラムが組めるようになりましょうというのが今回の方針です。
大きく挙げた本のほかに、さらに勉強する場合の本も挙げているのですけど、当面は広く勉強するほうがいいと思います。


また、実際にプログラムを組むには、なにか特定の言語やライブラリ、実行環境など個別の製品について知る必要はあるわけですけど、そういう直接的に必要なことは日常的に勉強しておくものなので、せっかく連休に勉強するなら、連休明けの仕事には使えないけど10年後の自分に必要ということを勉強しましょう。そうしましょう。
なので、今回は特定のプロダクトに関する本はとりあげてません。

理論的な制約を手なずける

まずはいきなりですが理論的な制約の勉強をしましょう。
アルゴリズムと計算理論の勉強です。とはいえ読みやすく非常に丁寧に書かれた本なので、落ち着いて読めば読み進めれると思います。

数学ガール/乱択アルゴリズム (数学ガールシリーズ 4)

数学ガール/乱択アルゴリズム (数学ガールシリーズ 4)

また、アルゴリズムの勉強というのは既存のアルゴリズムをいかに使うかというのが目的ではなく、自分の目的に合わせた小さな独自のアルゴリズムをいかに考えれるようになるかというのが目的です。
そういった、アルゴリズム作成の考え方がまとまった本がこれです。

プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?


そして、現在において高度なアルゴリズムの集大成といえるソフトウェアのひとつが日本語入力です。この本は、ソフトウェアの開発にどのようにアルゴリズムや計算論の知識が必要かを示す本でもあるので、読んでみるといいと思います。

日本語入力を支える技術 ?変わり続けるコンピュータと言葉の世界 (WEB+DB PRESS plus)


以前にアルゴリズムの本をまとめたエントリも参考に。
アルゴリズムの勉強のしかた - きしだのはてな

プログラム言語自体をうまく操る

さて、次にプログラム言語自体をうまく操るための本です。

プログラミングの基礎 ((Computer Science Library))

プログラミングの基礎 ((Computer Science Library))

OCamlという言語で、いくつかのアルゴリズムを実装しながら、プログラム言語のさまざまな要素について解説されています。
多くの人にとって、日ごろ使う言語とは違うと思いますが、だからこそプログラムを組むことについて勉強できると思います。一番いい点は、「いつも使ってるのとは全然違う言語がある」ということを知れるということです。


いろいろな言語について興味が出たなら、この本あたりいいんじゃないでしょうか。7つの言語について、基本的な構文とその考え方などが紹介されています。

7つの言語 7つの世界

出版社のサイトでPDF版も購入できます。
http://estore.ohmsha.co.jp/titles/978427406857P


あと、自分でプログラム言語を実装できることは、プログラマのたしなみのひとつなので、気が向いたときにこういった本で勉強しておきましょう。

2週間でできる! スクリプト言語の作り方 (Software Design plus)


プログラム言語の各要素や機能についての意味づけをちゃんと勉強したいならこの本です。

プログラミング言語の基礎概念 ((ライブラリ情報学コア・テキスト))

この本をベースにプログラム言語を実装する過程は、こちらにまとめてます。
Scalaでパーサーを作ってみる 〜目次〜 - きしだのはてな

ハードウェアをうまく動かす

プログラムはハードウェアで動きますが、より実際的にいうと、プログラムはCPUで動きます。そこで、よいプログラムというのは、CPUを遊ばせないプログラムという一面もあります。
CPUを遊ばせないためには、CPUがどのように動いているか知っている必要があります。

プロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)

プロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)

この本を読むと、CPUというのは、大きなコンピュータシステムの縮図でもあることがわかります。CPUで起こっている問題は大きなシステムでも起こり、その対策にCPUで行われている対策がヒントになることもあります。

ハードウェアを連携させるネットワーク

いま、ほとんどのコンピュータはネットワークでほかのコンピュータに接続することが前提になっています。そして、性能の制約もネットワークによるものであることが多くあります。
先ほどは、CPUを遊ばせないのがよいプログラムと書きましたが、CPUよりもネットワークを遊ばせないのがよいプログラムというのが実際のところです。
そして、ネットワークを遊ばせないためには、ネットワークについて知っておく必要があります。

ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識

ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識


また、いまはネットワークといえばWebという時代になっています。こちらも押さえておきましょう。
Webの基本になるHTTPプロトコルを中心に、どのような考えでWebが設計されているかが解説されています。

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

理論、ハードウェア、プログラム言語の狭間にデータベース

さて、実際にプログラムを作る場合には、データが消えないように保存しておく必要があります。
その際にはデータベースを使うことになりますが、多くのプログラムでは、データベースにデータを格納・検索するのが主な処理というような、データベースが主役という状況になります。
プログラムで一番大事なのは、入力・生成されるデータです。
そして、データを理論的にどのように効率的に扱うか、壊れたり落ちたりするハードウェアでどのようにデータを守るか、そのようなデータをプログラムからいかに操作するか、ということを扱うのがデータベースです。
そのデータベースの中でも、リレーショナルデータベースは基本になります。この本は、リレーショナルデータベースについて広く扱った本です。どのような理論に基づいて、MySQLPostgreSQLOracleなどのリレーショナルデータベースが作られているかざっと見ておきましょう。

データベース入門 (Computer Science Library)

データベース入門 (Computer Science Library)


実際にリレーショナルデータベースを扱う際には、SQLという言語を使いますが、SQLに不慣れならこの本で練習するといいと思います。

改訂新版 反復学習ソフト付き SQL書き方ドリル (WEB+DB PRESS plusシリーズ)


もっと突っこんでSQLを勉強したくなったらこの本で。

プログラマのためのSQL 第2版

気分転換にユーザーインタフェース

さて、最後に毛色の違ったところを。技術的な本ばかり取り上げたので、気分転換もかねて。
「デザイン」の本ですが、配色やフォントサイズなどの話ではなく、道具を人間中心で考えるにはどうあるべきかということが書かれた本です。

誰のためのデザイン?―認知科学者のデザイン原論 (新曜社認知科学選書)

誰のためのデザイン?―認知科学者のデザイン原論 (新曜社認知科学選書)

プログラムもユーザーにとっての道具になります。ただ、物理的な道具では機能から形状が決まる部分があり、その形状からユーザーインタフェースも決まりますが、プログラムの場合はどのようなユーザーインタフェースにもすることができます。そこで、使いやすいインタフェースになればいいのですが、とんでもなく使いにくいインタフェースになってしまうこともあります。
そこで、自分のつくるプログラムが道具としてどうあるべきか、考えることも大事だと思います。


実際の作業としてはこの本がいいんじゃないかと思います。

ユーザビリティエンジニアリング原論―ユーザーのためのインタフェースデザイン (情報デザインシリーズ)

この本の著者は、上記のノーマンさんと一緒に、ユーザビリティの会社をたちあげています。

まとめ

プログラムを組むときに直接行う作業はプログラムを書くという作業です。そのため、よいプログラムを書くという場合に、どうしてもプログラムを書く作業をいかにうまくやるか、プログラムを表面的によくするにはどうするかということに偏りがちです。
けれども、プログラムというのは、それに関わるさまざまな理論や制約、その回避法などがあるので、そういったことまで含めて広く勉強することが大切です。
ここに挙げた本ではなくても、自分が一番興味がある本を読めばいいと思いますが、自分がどこを勉強していてどこを勉強していないか把握しておくことが大事だと思います。


一日一冊積んでおいて、3年くらいかけて消化すればいいんじゃないでしょうか。