モチベーションとか背景とか
始める前にどんな事を考えているのかを書いておく。
モチベーション
理論から入った機械学習屋のプログラム能力に関して。
初期の段階の、自分がやりたい事をどうするか、というところに関しては必要性から調べていく事で、割と勝手に学習していき、 とりあえず似たようなコードがあればそれを参考に目的のコードを書けるレベルにはなる。
だが目先の必要性が満たせるようになったあとにより大きなシステムを構築する段になると、 「動きはするがコードの品質が良く無い気がする」という状態に陥りがちに思う。 こうした問題意識というのは、単純に調べて学んでいくという形で上達するのが難しいため、 何をどう学んだらいいのかがわかりづらい。
普通のプログラマは初期の段階ではそんなに重要な仕事をする訳ではなく、 周りにも自分より良いプログラマが居て、 一緒に働く過程で経験から徐々にコードの品質を高める事を学んでいける(事が多い)。
だが機械学習の理論から入ると、 プログラムの経験の浅い状態で突然高い専門性のある人間となってしまう為、 あまりプログラムを書く機会が無い状態で重要度の高い仕事をする事になり、 周りにも自分のやっている事を理解できてなおかつプログラムの経験が豊富な人というのはなかなか居ない傾向にあり、 教えてもらう相手もいない、という状態になりがちに思う。
そうした「仕事は出来るくらいには立ち上がったがプログラムの実力が足をひっぱりがちなので、次はもうちょっと本腰を入れてプログラムを学びたい」というような人向けに、 ちょっと規模のあるものを実際に作りつつ、自分で「構造」を作る経験を実際に出来るような練習の場を提供する事を目指す。
目指すもの
- そこそこの規模と複雑さを持つプログラムを実装してレビューを受ける機会を得る
- そこそこの規模のシステムの型を設計する事を通して、モジュールの構成の良し悪しを体験する
- 型が強力な言語のメリットを体験する
- 機械学習のシステムを作るのに参考になりそうなシステムの構成を体験する
- 機械学習のシステムで出てくる非機械学習的なソフトウェアの仕組みに詳しくなる(インデクサ、RDBなど)
- F# の勉強(ただしF# の全体を学ぶ事は目的としない)
c-lessonに比べると対象は機械学習のシステムを意識した物にする予定です。でも機械学習自体はやりません。 構成とか構造を学ぶのを主体とする為、c-lessonよりは雛形的なものはなくて自由に書いてもらってレビューする感じになりそう。
機械学習のシステム的なものを意識しているので、ファイルとかをどう使うかみいたいなUnix的な要素を入れたい(リレーションをファイルとして保存したりインデクサのbigramをファイルとして実現したり)。
なぜF#なのか?
別にF#でなくてもいいのだが、たまたま依頼してきた相手がF#に興味があってF#でやってくれよ、と言ってきたのと、Domain Modeling Made Functionalを読み始めたとか言っていたのでちょうど良いか、と思ったのが直接の理由。F#が選ばれているのは自分が推していたからだとは思うけれど、 一方で現場で仕事をしていく上でDDD的な問題意識があったというのも興味を持った理由にはある模様。
Pythonにある程度なれてきてプログラムのスキルを次の段階に進めたい、と思った時に、他の言語を学ぶのは良い事に思うし、 その時の候補としてはF#は悪くないと思う。
- 型システムが強力で、それはPythonと違うので学習して得るものが多い
- 大企業(MS)が頑張ってメンテしているので良くメンテされているから環境設定等でつまずく事も少ない
- 言語が割とモダンで言語自体は学びやすい
- ライブラリが豊富で機械学習の周辺の問題を題材にいろいろ書いて見る事が容易
- 関数型言語は機械学習の理論屋とは相性が良いかもしれないし、関心も湧きやすいかもしれない(数学好きな人たちだから)
- 関数型言語の経験はPythonに応用しやすいかもしれない
- 実行速度が地味に早いのでPythonを補完するものとしてアリかもしれない
- 私が好きな言語でそれなりに詳しいのでfsharp-lessonとかやる気になる
- DDDにまつわる良さそうな本(まだ自分は読んでないが)がある言語
一方で欠点もある
- 使ってる人が少なく、情報が少ない
- .NETのクラスライブラリを覚えるのが今更感があってやる気出ない
- ランタイムの取り回しが微妙(普通にaptとかで入る他の言語と比べて)
機械学習のシステムを作る人間という前提をおけば、まぁ悪くない選択肢とは思う。
おまけ: podcastでこの話をした
別段聞かなくてもこのコースをやるのには支障は無いですが、自分のpodcast、プログラム雑談でこの話をしました。