もみあげは如何にしてF# を学んだか

現実逃避の一環として、私(私をもみあげと呼ぶ人もいる)がどうやってF#を学んだか書き下してみる。

ダイジェスト

  1. その言語に詳しい方からおすすめ書籍を教えてもらって学ぶ
  2. 挫折する
  3. 気が向いたときに1時間弱でできるコードを書いては晒す(ブログ、gistにかいてtwitter放流)
  4. 興味のあるコンテンツを見つけたらとりあえず触ってみる
  5. 気が向いたときにF#ライブラリのコードを読む(当時の私に読めそうなものはFSharpxしか知らなかった。今は選択肢が増えている)
  6. 気が向いたら他言語のライブラリを移植する(他言語について学べる、車輪の再発明にならない、当該ライブラリの知識が増える、などなど)
  7. 気になる勉強会の情報は拾っておく(他言語からヒントを得られることもあるので)
  8. F#言語仕様を読む
  9. コンパイラのコードを眺める

当時のスペック

  • オブジェクト指向プログラミングよくわからん
  • JUnitで簡単なテストは書ける(講義で習った)
  • Mockは存在自体知らなかった
  • 学科内の同期の中ではプログラミング書籍を読むほうではあったが、やさしめの本を数打てば当たる方式で"読んでいた"
  • つまり手を動かすことをおろそかにしていた
  • 講義でJavaを書いた程度 + 休みの時にちょっとしたトイプログラミング
  • C++は大学の講義でSTLまでは学んだ。しかし講義でC++を使わなくなったタイミングで逃亡。
  • OSS???

いろいろひどい…

前置き

私がプログラミング言語のF# *1 を初めて見たのは2010年4月。 つまり、研究室に配属されてPCの環境構築をしていた時だ。

インストール一覧にそっと存在する"F#"。 調べてみるとMSなんとかが開発した関数型言語であるとかなんとか。

「うーん、関数型言語…こわいから近寄らないでおこう」

この頃の私は、講義で触ったLISPにすっかり恐怖してしまい、ちょっと関数型的な何かは避けたい心境だったのだ。 今にして思えば、なんと勿体ないことだろうか!

しかし事実は変えられないので、ここはこれで終わり。

2010年8月~2011年3月

7月にTDDBC名古屋に参加した時、"関数型怖い"から"関数型使ってる人たちの笑顔素敵!なぜにWhy?"とか、"あのレベルでないとプログラマになれないの…?"という別の恐怖に襲われた。

プログラミングF#

プログラミングF#

最初に用いた道具はこの本。 F#を選んだのは偶然だ。 Twitterで(当時フォロワーが30人未満だった)「関数型言語で何か良い本はないだろうか」とつぶやいたとき、一番最初にお勧めされたのがこの本だったから、ただそれだけ。

この本を読むのには2か月以上かかった気がする。 一番理解に苦しんだのはfoldだ。 「なんだよ畳み込みって…フーリエ変換のアレか!?」と、よくわからないことを叫びながらfoldだけで一週間ほど悩んだ記憶がある。 ちなみにコンピュテーション式は挫折した。

その後、F# Advent Calendarに勢いで参加したことも含め、少しコードを書いたりしていた。

ああ、実践F#が発売されたのもこの時期だ。

実践 F# 関数型プログラミング入門

実践 F# 関数型プログラミング入門

この本にも色々とお世話になったが、やはりコンピュテーション式は読んでもよくわからなさそうだったので飛ばした記憶がある。

2011年4月~2011年7月

この空白期間は、大学院の課題でJavaを触ることになったとき、どうせならとGroovyを触っていたことが主な要因である。

2011年8月~2012年3月

講義が終わったあたりから、F#をもうちょっと書かなければと思いトイ・プログラミングを実装していた。 残念ながら私は作りたいものが思いつかないタイプだったので、たまにTwitterで流れてきたお題を試すのが限界だった。 また、講義が再開してからは、いくつかの講義の課題をF#で書いて提出したりもした。

そうそう、年末年始にかけてはKinect SDKで遊んでいた。 わりとミーハーなので、こういうデバイスにはほいほいされてしまうのである。 この時は、C#勉強するのが面倒だし、F#でも動かせるだろうとか言ってた気がする。

年明けのJaSST東京では、bleisさんとセッション中にペアプロ(?)したりもした。 その前の週の大阪の勉強会翌日に、irofさんを二人で取り囲んでF#のコードを強制的に読んでもらったのは懐かしい思い出*2

就職活動の際にコード提出を求められたのでF#のコードを送ったのも良い思い出である。 今見るとひどいコードだけど!


この時期に一度FParsecを学んでみたものの、まだよくわからないしライブラリのコードはカオスで読めない、と叫んでいた。

2012年4月~2012年7月

また空白期間だ。 一体何が起こった?

"すごいHaskell楽しく学ぼう"と積読だったコップ本を読んでいた気がしている。 あと遊んでいた 旅にでていた。

2012年8月~2013年3月

F#に本格的に戻ったのは、FSharpxリポジトリ内にIterateeを見つけた時だ。 HaskellのIterateeを見てもいまいちわからなかっため、F#に同じ概念のものを見つけた私は「読める!読めるぞ!」と言いながら嬉々として遊び始めた。 おそらく、Scalazを知ったのもこの頃だ。

その後は内定した会社からだされていた研修課題にF#+Erlangで挑んでみたり、BKTreeやIntMapを実装したり。
あと、3月の3連休にFsMachinesの大半を実装している*3。 おそらく、Ekmett勉強会のつぶやきを拾っていた時に知って実装したという流れだろう。

2013年4月~2013年10月

就職してからは転職するまでの期間は、実はそんなにF#F#していない。 仕事で使わないというのもあったし忙しくもあったが、それ以上にC++に再チャレンジしたかったのだ。 触り始めた6年前と異なり、C++11もリリースされていたのも大きい。

2013年11月以降

仕事でF#を使う機会が増えたこと、周りのメンバーがF#に詳しいこともあって、F#に触れることが多くなった。

懺悔しておくと、言語仕様をきちんと最初から読んだのはこの時が初である(まだ読みかけだ…)。 少し眺めることはあったが、かいつまんでしか読んでいなかった。

で、結局何をしたのか

抽象化すると

  • 本読んだ
  • コード晒した
  • コード読んだ
  • コード書いた

のローテーションが結論が気がする。

追記: よく読むブログ

たくさん紹介したいのですが、量が多くなるので一部のみ紹介。

余談: なぜFSharpを続けるのか

F#は好きかもしれないが、愛憎入り交じっている。 ちなみにプログラミングが好きなわけでもない(本当は理論専攻したかったが、残念ながら生来の怠け癖と発想力のなさがその道を私に否定させた)。

ではなぜF#か?

  • CLIと呼ばれる基盤は、一部世間曰く『実用的 or 現実的である』
  • 実用的な話をしている場所で理論理論してもいいじゃない。現実舞台で理想を追い求めて何が悪いのか。
  • 車輪の再発明に該当しない可能性が高い
    • 多言語では既に実装されていても、F#にはない可能性が高い
    • "選択の自由"。ライブラリは競い合うほうが良い。

「F#には○○がない」というと、「なら他の言語に変えればいいじゃない」と言われるかもしれない。 しかしだ、そこには"既存"という現実がある。 この現実とバトルすることは、私にはできない。

*1:音楽でのそれは、幼い頃クラシックギターを習っていた際に知った

*2:新世界でシュークリーム串カツを食べたのもこの時か

*3:実際にリリースしたのは今年に入ってからだが…