ミクシィには、探究心溢れるエンジニアがたくさん在籍しています。
その探究心は業務で扱う技術にとどまらず、趣味で書いているプログラムだったり、個人的に研究している言語だったりと、自身の気になった技術への追求も留まることを知りません。
そこで、社内のエンジニアに“好きな技術”について、思う存分に語ってもらうシリーズを始めました。
ルールはこの通り。
・業務で使っている技術でも、使われていない技術でもOK
・あくまでも個人的な見解で
・その技術のどこが面白いのか
・愛を込めて語り尽くしてもらう
第1回目は、「モンスターストライク(以下モンスト)」のサーバーエンジニアの松原に、関数型プログラミング言語「Haskell」についていったい何が面白いのか、どういうものなのか、好きなだけ語ってもらいました。
━━今日は好きな技術について好きなだけ語ってもらいます!何について語ってくれるのでしょうか?
「Haskell」というプログラミング言語について話したいと思います。
━━どういうプログラミング言語ですか。
Haskellは1980年後半に研究目的でできたプログラミング言語です。なので、コンピューターサイエンス分野のプログラミング言語研究で、よく使われています。
━━難しそうですね…。率直な話し、どの辺りが“アツい”のでしょうか?
何か言語を初めて触ると、いくつかは新しい発見があったり、考え方を学んだりできるんですが、一通り理解すると大きなアップデートがない限りはだんだんと新鮮さを味わえなくなってしまいます。ところがHaskellは、使っても、使っても、何段階にも深さがあるんです!
━━興味深いです。「Haskell」は、どういう場面で使われている言語なのでしょうか。
プログラミング言語には、実際に実行せずにプログラムを検証できる「静的型検査」というのがあります。型検査はプログラミング言語によってその検査で保証できる範囲というか強さがあるんですけど、Haskell はかなり強力な方ですね。
なので、すでにリリースして動いているシステムのプログラムを整えたり、大きく変えたりする場合に、Haskellは有効です。プログラムを一箇所直したら、どこまで影響が及ぶのか、実際に動かしてみないとわからないのでは困るじゃないですか。Haskellは試しに型検査で確認して、エラーが出たところを対応すれば良いのでやりやすいです。
━━ミクシィ社内では、Haskellは使われていますか。
プログラミング言語の中でも、Haskellの難しさはトップクラス…。Haskellが使えるエンジニアも少ないですし、今のところミクシィでは使っていません。どう難しいのかと言うと、一般的な言語は、上から順に「何をして欲しいのか」プログラムで書いていくスタイルなのに対して、Haskellは基本的に、まるで数式のようなシンプルな関数を書いて、それらを合成していくスタイルなんです。考え方を変えなければいけないので、GoやRuby、Javaなど、いわゆるメジャーな言語でプログラミングをしてきたエンジニアほど、とっつきにくいのではないかと思います。
━━エンジニアとしての経験よりも、関数を理解している人の方が学習が早いんですね。
そうですね。数学のバックグラウンドがある人は習得が早い印象です。さらに、Haskellの独特な機能に、「遅延評価」というものがあります。例えば、「X=1+2」という数式を書くと、一般的な言語はすかさずに計算するんですが、Haskellは必要なタイミングになるまで計算しません。場合によってはパフォーマンス改善につながるんですが、実行にかかる時間がまちまちで、パフォーマンスを測定するのにほかの言語での経験を活かせず難しいと言う人もいます。
━━癖が強いことはわかってきました。
それから、多彩な機能があるのもHaskellの特徴です。一般的な言語は、他の言語にはないオリジナルの機能がだいだい1〜2つあって、他の言語の経験がある人ならそれさえマスターしてしまえばいいんですが、Haskellのオリジナル機能は1〜2つどころじゃなく…とにかく沢山あって、しかも他の言語と似ている要素もほとんどない。Haskellを学習しようとすると、どんなエンジニアでも0からプログラミング言語を学ぶのに近い状態になるのかもしれません。
━━プログラミング経験があるほど、とっつきにくいというHaskell。松原さんが使うようになったきっかけは何だったんでしょうか。
大学の学部生の頃に講義で使ったのが最初です。僕は、コンピューターサイエンスが専門で、型システムを拡張することでバグの発生を防げるかどうか証明する研究をしていました。それとは別で、趣味で色々なプログラミング言語を触っていて、特にHaskellは面白く感じられたことを覚えています。ある時、プログラミングを活かせるアルバイトを探していると、中古の高級腕時計を扱うお店でHaskellのプログラマが募集されているのを見つけました。
━━時計屋でHaskellを使うって、あまりイメージが湧きませんが…。
そのお店のエンジニアはHaskellが大好きな人で、オークションで卸した時計の情報管理やお店のブログの運用にHaskellを使っていたんです(笑)。僕はバラバラだった時計の情報を管理するデータフォーマットを、構文解析して、時計の状態やステータスごとに分けて、見やすくする作業を担当していました。業務でHaskellを使ったのは、このときが最初で、今のところはないですね。ミクシィに来てからは、学生向けのワークショップ「git challenge」のシステムをHaskellに書き直して使っているくらいですね。Haskellに慣れすぎてしまって、他の言語で書くよりも速いので。
━━そうなんですか!
はい(笑)。git challengeの管理画面には、学生の回答状況を確認できるスコアボードがあります。フロントエンドには Elm というプログラミング言語を使っており、バックエンドの Haskell とデータをやり取りする部分は、Haskell のコードから Elm のコードを自動生成して作りました。
━━つまり、Elmを書かずにスコアボードを編集したということですか。
書いていないは言い過ぎですが(笑)。Haskellは、Haskell自身のプログラムを要素ごとに分解して構文木にできるので、他の言語に自動で変換できるライブラリが豊富にあるんです。
━━Haskellには多彩な機能があるとおっしゃっていましたが、松原さんが今気になっている機能はありますか。
実は、ちょうど今日も、Haskellの新しいバージョンがリリースされています! そのバージョンで追加された機能が早速気になってますね。プログラミングは、動かしているとメモリを使ってしまうので、昔は使わないデータは手動で捨てる必要がありました。Javaあたりからは、使っていないデータを自動で削除する「ガベージコレクタ」と呼ばれるプログラムが走るようになったんですが、これが動いていると、メインの処理に時間がかかってしまうことがわかりました。そこで、Rustというプログラミング言語では型システムを利用して賢くメモリ管理をする方法を導入して、ここ数年話題になっています。新しいバージョンの Haskell にも、ガベージコレクションの代わりではないですが、似たようなリソース管理の仕組みが導入されたんです。早く触ってみたいですね! もとはRustで実装されているプログラムだったのですが、Haskellは今回のように他の言語のアプローチも研究して取り込んでいて、面白いんです。
━━Haskellの「奥深さ」が少しわかってきたような気がします!
逆に、Haskellの概念や思想が、ほかの言語に取り込まれることもあるんですよ。例えば、ScalaというHaskellとJavaを足したような言語があって、これはHaskellを触っている人には、使いやすいと聞きますね。Haskellは難しいですが、一度使ってみると、ほかのプログラミングで活きてくる場面があるのではないでしょうか。
━━松原さん自身、Haskellの知見が役立ったことはありますか。
知見が役に立ったという話ではないですが、『モンスターストライク』で使っている、ビルドツールの「Bazel」をもう少し飼い慣らしたくて、Haskellで作った趣味のプログラムを Bazel を利用してビルドしています。。一般的にビルドツールは、プログラミング言語ごとに固有のものが存在しているんですが、Bazelは言語に囚われずに使えるツールです。便利ですが、珍しいので、とっつきにくいツールだと言われています(苦笑)。
━━得意なHaskellを使って、ツールを使いこなそうとしているんですね。今後、挑戦してみたいことはありますか。
Haskellで作った Web アプリケーションの効率化してみたいです。本業で得た知見を、趣味のHaskellにも還元していきたいですね!
▼松原が語る「Haskell」をもっと知りたい方はコチラ!