OCamlに入門しようと思ったらプログラミングに入門していた。「プログラミングの基礎」の進めかた。
なにげにこういう本をちゃんとやったのははじめてで、進めていくうちに(この本に限らず)このやり方だとやりやすいみたいなのが出てきたのでメモっておきます。つぎは多分Cの本とかやると思う。
ぼくの場合丸1週間かかってしまいましたが、ちゃんとやればシルバーウィークで十分やりとおせると思います。
「プログラミングの基礎」でやれること
- 「デザインレシピ」をもちいた実践的なプログラミング作法を実践する。
- mapやfold_rightなどといった代表的な関数を1から実装する。
- 実装を通して再帰関数の考え方を手に入れる。
- 挿入ソート、クイックソートを実装する。
- 二分探索木、赤黒木、ヒープなどを実装する。
- ダイクストラ法を実装する。
- その他。
なおこれらはでてきません
モナドとか圏論とかファンクタとかそういうワード。
環境
好きなエディタ+インタプリンタがお手軽です。
動作を確認するための手間はなるべく省くと、何回失敗しても何度やり直してもとくに苦しくない。たとえば gulpでファイルを監視してocamlのインタプリタで走らせる - Qiita
ぼくはAtom+gulpでやりました。
進めかた
章ごとにやる
260ページ前後が24章に分割されています。章はさらにいくつかの節でわかれています。
1章あたりに1つの関心事を扱っているので、章ごとにわけてやっていくと息切れしなくてよい。
写経する
文章をよみ、文章中のコードを実際に書いて挙動を確認します。
節の最後に演習問題がある場合、その節で扱った関心事やコード例などを用いればとけるようになっています。
問題をとく
演習問題ごとにファイルをわけておく
演習問題は、あとの章の演習問題でリファクタリングの種として出てくる場合があります。演習問題の番号でファイルを保存しておくと、再参照が楽なので便利です。
この本の目標である「メトロネットワーク最短路問題を解くプログラム」は、演習問題の一部として徐々に進めます。メトロネットワーク用のコードにかんしては専用のファイルを用意します。
「デザインレシピ」に従う
かんたんに言うと、関数定義ごとに「目的」「型」「テスト」を書くという、プログラミング上の約束事です。
目的、型、仮の値を返すだけの関数、テストを書いてから、関数の中身を実装します。
前述のように、演習問題のコードはあとの章の演習問題で再利用される場合があります。テストはそのまま流用でき、まちがいにもすぐに気づけるので、ぜひ、デザインレシピには従いましょう。
わからない場合
つまった場合、一発でうまくやろうと手をとめるよりも、思いついたコードをどんどん書いて失敗すると型推論最高みたいな気分になって最高です。
万策がつき、15分手がとまってしまったら、すみやかに解答をみましょう。
あったらいいもの
ノート
再帰の問題や解説は、慣れないうちは脳内のみで展開するのが大変です。
簡単な図を書いて遷移を1つずつ書くとわかりやすい。
ブックスタンド
本は画面の近くに、画面と同じ角度でおいておくと読みやすくて首も痛くならず、よい。
ぼくはELECOM EDH-004 ブックスタンドを使っています(廃盤で高騰しているので、買うなら類似品を)
これは「オブジェクト指向入門」でもしっかりと支えて開いておけます。プログラミング関係の本は鈍器が多いので、ある程度しっかりしたブックスタンドを入手することをおすすめします。
ブックダーツ
ブックダーツ シルバー(ステンレス)をブックマークとして使用しました。
ただし読みかえし用ではなく、前もって章のはじまりのページにセットしておきました。
こうしておくと演習問題でつらくなってきても区切りが見えるため、ツイッターなどに逃避せず集中力が維持できます。(個人差があります)
感想
プログラミングの基礎を扱う本を、最初から最後までやり通したのはこれがはじめてでした。
最初は読みおえた後には「再入門した」などと述べようと思っていました。基本的なアルゴリズムや、再帰関数の考えかたを学ぶ上で自分の素養のなさを再認識し、「これは再じゃない入門だ」だと思うようになりました。
また、関数型言語がうんたらかんたらと述べたいといういやらしい気持ちがきっかけで購入したのですが、これは関数型言語うんぬんの本ではなく、プログラミングの本であるという感想になりました。
同時に、写経と演習問題をちゃんと解いていく効果を実感しました。最初は考えるごとに脳が停止していた再帰関数も、書いて解いていくうちに、なめらかに考えられるようになりました(簡単にとけるようになったわけではない)。
とにかく勉強をすすめるための感覚みたいなものがわかったので、今後も続けていこうと思います。