It's okay to be weird

レールの無い道を行くプログラマーのブログ

『プログラミングの基礎』を読んだ

本書は関数型プログラミング言語OCamlを使用した、プログラミングの基礎を身につけるための本です。

今年の2月に読み始めた後、しばらく積読になっていましたが、6月中旬ごろからまた読み始めて無事読了しました。タイトルとは裏腹に練習問題もたっぷりで個人的にはなかなか骨が折れる本でしたが、良い体験となりました。

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

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

読もうと思ったきっかけ

関数型プログラミングパラダイムが多くの言語に取り入れられたり、ScalaやElixirなどの関数型言語が実戦に投入されたりするなど、関数型プログラミングが注目を上げている中、前々から関数型言語を何か触ってみたいという気持ちがありました。

そんな中、@bleisさんの以下の記事の中で「関数型言語を何でもいいからやってみたい!という人」にオススメされていたことから、いつかこの本を読もうと思っていました。

bleis-tift.hatenablog.com

最近になって読み始めたはいいものの積読になっていた折に、同じ30代前半でWebの世界に飛び込んだという共通点で勝手に親近感を抱いている@numb_86さんが最近読み終わったということに刺激を受け、再開しました。

numb86-tech.hatenablog.com

どういう本か

本書の目的として以下の3つが挙げられています。

  • デザインレシピの習得
  • アルゴリズムとデータ構造の習得
  • メトロネットワーク最短路問題を解くプログラム

最後のプログラムは実践的な課題なので、実質的にはデザインレシピの習得、アルゴリズムとデータ構造の習得の2つが目的と言えると思います。

では、1つ目のデザインレシピとは何かと言うと、基本的には以下の4つで構成されるものです。

  • 目的: 作成する関数が「何を」するものか
  • 例: 望まれる入出力の例
  • 本体: 「どうやって」実現するかの本体
  • テスト: 望む動作をしているか確認

目的に関数の型などを書き、例でテストプログラムを書き、それを実現するための本体を書き、テストを行い、望む動作をしたら完成、しなかったら原因を考え誤りを正す、という流れでプログラムを作成します。

最近、業務でユニットテストを書く機会があったり、『テスト駆動開発』を読んだこともあり、テストの重要性を理解できていたので、まずテストを書くこの流れはとても腑に落ちましたし、理にかなっていると思いました。

2つ目のアルゴリズムとデータ構造の習得についてですが、リスト、グラフ、ツリー、クイックソートなどは出てくるものの、ひととおり網羅しているとは言えず、本格的な習得は他の本に譲ったほうがいいと感じました。

関数型スタイルを学べる

冒頭で骨が折れる本だったと書きましたが、文を1つずつ書いていく命令型プログラミングに慣れきっている身には、本書で提示されているような、セミコロンでの文の区切りを一切挟まず、入力が与えられたらそのまま出力を返すというスタイルで書くのに苦労したためです。

例えば未確定の駅のリスト v を必要に応じて更新したリストを返す関数はこんな感じです。

let koushin p v ekikan_tree = match p with 
  {namae = pn; saitan_kyori = ps; temae_list = pt} -> 
    List.map (fun q -> match q with 
           {namae = qn; saitan_kyori = qs; temae_list = qt} -> 
         try 
           let kyori = get_ekikan_kyori pn qn ekikan_tree in 
           if ps +. kyori < qs 
           then {namae = qn; saitan_kyori = ps +. kyori; 
                     temae_list = qn :: pt} 
           else q 
         with Not_found -> q) 
v 

関数型プログラミングに馴染みのない方には普段見慣れているプログラムとは違ったものに映るのではないでしょうか。

OCamlの公式サイトには

OCaml is an industrial strength programming language supporting functional, imperative and object-oriented styles

とあるので、命令型的に書くこともできる言語なのでしょうが、本書のようなスタイルに制限されることで、関数型のスタイルで書くことを学ぶことができて良かったです。

特にforループやwhileループを使わず再帰で書くスタイルを繰り返し練習できたのは再帰が苦手な身としては良かったです。データ構造に基づいたパターンマッチを基本とすることで、ベースケースとそうでないケースを明確に区別して考えることができました。

目的としては書かれていませんが、関数型プログラミングを習得できるということが本書の大きな特徴だと思います。

自分なら…

余談ですが、『プログラミングの基礎』というタイトルは、僕だったら『OCamlによる関数型プログラミングの基礎』といった感じにするかなぁと思いました。というのも、この本でプログラミング自体に入門しようとするには少し難易度が高いんじゃないかと思いますし、関数型プログラミングが注目されている中、そのキーワードを入れることで手に取る人が増えるのではないかと思うからです。

まとめ

読み始める前の僕のように、関数型プログラミングに触れてみたいという方がいたら、手に取ってみてはいかがでしょうか。おすすめです。

リンク

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

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