ルーズリーフ

公私におよぶ経験値獲得履歴的ななにか。

気がつけば関数型ネイティブ

もしかしたら新人さんの教育方針にお悩みの方の役に立つかもしれないので、ひとつの例として私の場合を示します。
特に、「プログラミング経験はないけど割と数学が好きな理系脳」という新人さんにはオススメかもしれません。
いや、私も数学は好きですが出来るわけではないので、そこはどうぞ突っ込まないでください。

以下時系列に沿って書きますが、最後にポイントだけまとめますのでお忙しい方はざっと文末のまとめへ。

いまのわたしができるまで

就職した時点で、私のプログラミング経験は0でした。
医学系大学院出身とはいえ、さすがに自身が取得したデータの解析時にもPCは必須です。
しかも中〜高校の間、趣味でホームページも持っていたヲタなので一日中画面前でごにょごにょするのは苦にならない、って点はありますが。
所詮そんな程度の新人を雇ってくださって本当によかったと思いますし、今一緒にお仕事出来ていることをとても嬉しく思います。

さて就職後、会社の勉強会にてLinuxで最低限覚えるべきコマンドについてと「C言語」を習いました。
いろはのいから、という感じです。
何か1つでも言語の基礎を知っていると、大体プログラム書けるというのは本当で、4~5月の1ヶ月間、毎日みっちりお勉強させていただいた効果はGW明けのお仕事から発揮されたように思います。
(ちなみに4年目の現在、C言語は完全に忘れてしま...おっと誰か来たようだ)

しばらくのお仕事はテスト仕様書の作成やテスト。
チームメンバーとして数えられるようになった初案件は「Ruby on Rails」を使ったものでした。
担当はView回りだったので書いたのはHTMLくらいなものですが、MVCモデルとは、Rubyとは、の基礎を少しだけ取り込む形になりました。

その後は別件のテストをしつつ、Rubyの資格をとりつつ、Javaの入門書(かんたんJava/著:今川美保/発行:技術評論社)を1冊眺め、すぐJavaScalaで作られたサービスのための環境構築、ドキュメント作成およびScala側のテストコード作成作業にアサインされました。
(実は持ってるRuby Silver、これもScalaの理解には役立ったのかもしれない)

Scalaのテストコード作成に関しては、まずコードレビューに参加して、ざっくり全体の流れを説明してもらいました。
ついでに空いた時間にテストコードとはなんぞや、などは事前に自分で調査。

ただ、Scalaという言語については特に踏み込んだ説明はなく、開発担当の先輩が必要なsbtコマンドをくださる感じで、後は独学。
オススメしてもらったバク本(プログラミング言語Scala/O'REILLY)を片手にScalaとSpecs2を勉強しながら、Akkaも使っていたのでAkkaについても調べながら、とにかくコードを読んで読んで考えて読んで・・・なんとかできあがりました。なんとか。笑

このテストコード作成が2ヶ月くらいだったと思います。
1ヶ月くらいでScalaで書かれた本体コードが朧ろげにわかるようになり、2ヶ月経つころにはバグの原因箇所調査とか指摘までは出来るようになっていました。
私にとっては、最初のコードレビューが効果的だったのだと思います。

という具合に、初のコーディング作業はScalaのSpecs2。
テストコード自体はアサーションが書ければあとは本体コードから該当箇所を真似てみたり、本体コードを読みながらわからないものを調べることで少しずつ言語についても理解することが出来ます。
TDDで漏れるような範囲のテストコードをこんな感じの新人さんに任せてみる。
とても実戦的ですし、ちゃんと役に立ってる実感も得られ、非常によかったと思います。

(そうそう、この辺りの時期にScalaConference2013があって、先輩にくっついてスタッフやらせていただいてました)

結局この後、私はこのサービスのメンテ役となりました。
Java側もScala側もひたすら読んでいたので、機能拡張とバグFixくらいは出来る状態に。
というか2年目にしてぼっちで作業するしかない環境になってしまったので、やるしかなかった感もありますがやりきりました。
「いまや社内で自分しか出来ないScala」という状況を楽しんでいたので、上司も任せてくれたのでしょう。

ここから先は、その人のハマリ具合にもよるかもしれません。

よくわからないままにScalaのコード(テストコード)を書き、なんとなくわかるようになってきたので今度は自分でScala書きたい!と思っていた矢先、社内システムのWebアプリ化の話が舞い込み、Scala書きたいしPlayFrameworkを提案。
通ってしまったので当時1年目の新人さんを巻き添えに、2人でせっせと開発を開始。
認証認可(プラグイン利用)、CRUDありの15画面、全3KS程度、2ヶ月くらいでリリース。

こうして初プロダクトもScalaとなり、次もPlayFramework Scalaでやってよいというお仕事をいただいたのでしばらくScala三昧。
(ちなみに巻き添えになった1年目の新人さんは研修でJavaは勉強していたので、JavaからScalaへ書き換えるポイントを伝えた程度)

こんな流れだったせいか、「関数型は発想の出発点が違うから書きにくい」なんて印象もなく、「関数型は簡潔に、バグの混入しにくい素敵なコードが書けるもの」と認識しています。

ただ、そのせいかJavaを書くとやたらとメソッド細切れにしてしまうし、staticを量産するし、すごくうざい子になりますすみません反省していますがんばります。

まとめ

要するにプログラミング経験0の新人育成時、関数型要員に育てたい場合、私の経験から顧みると

  • まず最低限1つの言語は基礎からきっちり勉強させる(JavaでもいいしCでもOK)
  • 関数型言語でテストコードを書かせる
  • テストコードを書く・書いた時点で嫌がらなければ、関数型言語で作らせる

こんな感じで関数型要員がたぶん育ちます!

現在4年目の私は、もっとちゃんと関数型らしく書くために独自でHaskellやったりScalaz調べたりしています。
ここまでくれば好き勝手に知識を深めていきますので、きっかけとしてはこんな流れもオススメですよ。