golden-luckyの日記

ツイッターより長くなるやつ

独学でプログラミングを勉強した自分がこれは役に立ったなと思っている本

今ではプログラミングできないわけではないけど、そういえばプログラミングは完全に独学と言っていい。 いや、大学では数学をやっていたので、FortranとかLispはちょっとやった。 なので「完全に独学」といったら嘘になる。

それでも、いま仕事で使っているコンピューターの知識は、基本的にすべて書籍を通して独学したものだ。 そこで、自分が何の本を読んでプログラミングを実務で使えるくらいにはなれたのか、アフィリエイトと宣伝を込めつつちょっと振り返ってみてもいいかなと思って走り書きしてみる。

テキストフィルターを書きまくるとこから始めるといいと思う

プログラミングぜんぜんやったことない人が「プログラミング完全に理解した(ダニング・クルーガー的な意味で)」という実感の端緒を得るまでには、まず「テキストフィルタを書きまくる」のがわりと近道だと信じている。

コンピューターを使うことがインターネットを使うことと激しく重なっている現代、ブラウザで動く何かを作るところから始めたくなる気持ちはわかる。 しかし、とにかくテキストフィルタをたくさん書く、という経験には、プログラミングの独習者にとって次のようなメリットがあると思う。

  • テキストデータのありがたみを思い知れ
  • コンピューターとのやり取りの仕方(標準入出力)に慣れろ

これほどブラウザで動く何かが全盛でなかったころのプログラミング初心者本にも、「デスクトップのアイコンをクリックして実行できる何かを作れると初学者のモチベーションにつながるよね」みたいな空気があった(要出典)。 これは現代においてはブラウザ上で動くプログラムとかスマホのアプリになるように思う。 しかし、「プログラミング未経験者にとって身近なプログラム」というのは、プログラムを書けるようになれば誰もが気づくように、コンピューターからユーザーを遠ざけるようにうまく抽象化されてるものなんだよな。 そういうのからスタートしてしまうのは、(アプリケーションを通してでなく)コンピューターを操るための手法としてのプログラミング(プログラミングスクールに行く人が知りたいのはこれだと信じている)を学ぶには、実はそれほど適さないんじゃないだろうか。

で、思い返すと、自分は 『Rubyで極める正規表現』 という本を通してテキストフィルタの書き方みたいなものを学び、そして書きまくっていた。

この本、正規表現の本というより「楽しいテキストフィルタを書けて楽しい!」というノリの本で、筆致もよく好きなんだけど、いかんせん古くて環境が合わないと思うので、あまり初心者におすすめできる感じではないのだよな…。

今でもテキストフィルタいっぱい書く本はプログラミング入門にはいいと思う。でも現代において該当する本といったら何があるだろう。いまいち面白みのない例題かつページ数が多いけど、 『退屈なことはPythonにやらせよう』 とかだろうか。

プログラミング言語そのものを勉強すると手っ取り早い

テキストフィルタを書きまくって、コンピューター上のデータをプログラミング言語でいじることが空気を吸うみたいな作業に感じられるようになったころ(誇張があります)、“Structure and Interpretation of Computer Programs” という本を読んだ。一部を除いて練習問題もほぼ全部解いた。この本に書いてあったことは、その後いろんなプログラミングの概念を知るうえでの強固な足場になっていると今でも実感している。

この本、その名前だけはあまりにもよく知られてるので、「はいはい、すごい人がよくお勧めしてる、あのSICPっていう難しい本ね」とか「Schemeとかいうマイナー言語の本」という印象を持っている人もいるかもしれない。 実際、おれはアプリを作りたいんだとかゲームを作りたいんだとかで、自分には関係ない本に思っている人も少なくないと思う。

でも自分は、この本は「読んでおくと学習をショートカットできる」たぐいのチートだと思っている。 なぜなら、「プログラミング言語でプログラムを書くというのがどういう行為なのか」をずばり(再帰という言葉を使って)説明している本だからだ。 さらにその説明がそのままプログラミング言語インタプリターという「プログラム」にも適用される。 つまり、「プログラミング言語もまたプログラミング言語によって書かれるプログラムである」みたいなカラクリを、自分で暗中模索することなく全部きれいに教えてくれる。

こういうノリ、つまり「再帰的な発想が問題解決にとってめちゃくちゃ効くぞ」みたいなノリって、たぶん実世界ではそれほど頻出しない。 だから、それこそゼロからプログラミングを学ぼうと思っているような人であれば、それまで想像もしたことがない話だと思う。 ことわざの「屋上屋を架す」は「無駄なことをする」の意味なんだけど、にもかかわらずプログラミングでは常套手段で、そのための知見がこの本をまじめに読むだけで手に入るのだから、これほどお得なことはないと思っている。

自分は未読だけど翻訳もある。ぱっとみの印象ほどややこしいことは書いてないし、なによりコードを書いて実行すれば答え合わせもできるんだから、プログラミングを独習しようとする人なら読んでみて損はないはず。

とはいえページ数もあるし古い本だし、もっと気軽で現代的な教材がほしいという方もいるだろうから、まずは 『RubyでつくるRuby ゼロから学びなおすプログラミング言語入門』 を読むというさらなるチートを紹介します。

コンピューターのことをもう少し詳しく知る

SICPを読んだ自分は、これでもうどんなプログラムでも無限の時間と無限のやる気があれば書けるような気がした。 もちろん書けないんだけど、その理由のひとつは「コンピューターのことを知らなすぎる」からだ。 操る道具の使い方を知っていても、操る対象であるところのコンピューターがどういう仕掛けで動作しているのか知らなければ、できることは限られる。 ついでに言うと、「そのコンピューターでプログラムを動かすことによって解決したい問題をどうやってプログラミング言語で表現するか」っていうのもまた重要な話になるんだけど、それは次のセクションで触れる。

で、コンピューターである。 これについてはいろんな視点からの理解というのがあるだろうけれど、「プログラムを学ぶんだ」という視点から言うと、この 『コンピュータ・システム』 という本によって得られた理解が自分のなかで大きい。

この本は、ぶっちゃけていうと「おまえの書いたプログラムがどんなふうにメモリを使うのか」を教えてくれる。 自分はむかし原書の旧版を途中までしか読めずに挫折してたけど、いまは翻訳があるのでありがたいですね。 翻訳は事情により一通り目を通して、やっぱり名著だったと改めて思った。

ただ、一通り目は通したけれど到底身につけたというレベルでは読めていない。 それどころか、「これを全部意識せずにプログラムを書けるのありがたいな」と心底おもっている。 それでも、そういう部分も含めてとりあえずは押さえておかないと不安っていうのが独習者の心情であり、そういうニーズにこの本はぴったりな本だと思う。 だから、目を通したという経験があること自体がとても役に立っている。

一方、 『コンピュータ・システム』 だと低層すぎて、「じゃあ自分のプログラムをそういうコンピューターの上で動かすにはどういう仕掛けを使えばいいんだ」という点はいまいち見えずらい。 実際にアプリケーションをプログラムで書くときは、ファイルシステムとかシェルとかWebサーバーとかの「わかりやすい」層まで抽象化された道具を使うわけだけど、そのへんについて自分がはじめて理解した(ような気がした)のは “Understanding UNIX/LINUX Programming: A Guide to Theory and Practice ” という一冊の本を通してだった。

これも今は 翻訳 が出てるようなので、興味がある人は翻訳のほうがいいかもしれない、と思ったけど旧アスキーで今は入手困難なのかな。

で、まあ、このへんはC言語の世界なわけで、「独学でWebでアプリを作りたいんだ」という人にとっては重たすぎるという異論は認める。 そういう方には、Go言語のランタイムの世界を通じて上記のノリをすべて解説してしまったこちらの 『Goならわかるシステムプログラミング』 がおすすめです。

解決したい問題とコンピュータープログラムとの橋渡しができるようになる

このへんまできたら、どんな分野でどんな問題を解決したいかに応じて、具体的に特定の言語でプログラミングの仕方を学んでいける段階になると思う。 そのため、「ある言語のちゃんとした解説書」がありがたくなる。

自分の場合は構造化文書をごにょごにょするというのが大きな関心領域のひとつで、その分野ではパーザを書くというのが仕事のひとつになる。 そのため、その分野に対する強い仕組みが備わっていたHaskellという言語を使うことにして、教科書としては “Programming in Haskell” (の旧版)をがんばって読んだ。

改訂版も 『プログラミングHaskell 第2版』 として翻訳書が出ています。

ぼくの場合はたまたまHaskellだったけど、それぞれのプログラミング言語に定番の教科書がある。 ここまでくれば、そういう定番を読むのが最短の独習法になるはず。

他人が読んだ本をそれほど当てにするな

結局のところ相性みたいなのがあったりするし、これ一冊で十分という自明な名著があったらこんなにいろいろな本が出ていないので、図書館とかも利用しつついろいろ読んでみるのが近道だと思うんだけど、自分の独学経験を書いておくのもアフィリエイト的にいいかなと思って書いてみた。