ClojureでREPL駆動開発
Clojureや他のLispは、REPLが最大の強みの一つとして言われることが多いが、そのREPLとはいったい何なのかもピンと来ない人がいると思う。そこから始めて、REPL駆動開発で何がどう変わったかをざっくりとまとめたい。
REPLとは
REPLはread-eval-print-loopの略語であって、Lisp固有のコード実行環境である。固有とはいえ、インタプリタ型言語でそれを真似るようなコンソールがある:ルビーのIRBやパイソンとかJSのコンソールは馴染みあるだろう。
強力なペアプロツール
REPLのいいところは、Cみたいに長い長いコンパイル待ってから何とか実行して書いたコードを試せるのではなく、さくさくと瞬時のフィードバックループで開発が進めることだ。もちろんファイル編集からの環境のホットリロードや、コンソールからの関数の上書きなどもできる。
REPL使わないClojureのウェブ開発
ClojureはJVMのバイトコードにコンパイルされる言語であり、コンパイル自体も、そこからのJVMの起動も、時間は要する。REPLを使わないでウェブ開発を進めるなら、ファイルをかたっぱしから編集して、一定の「もう動くだろう」完成度まで持っていったら、例えば lein run
でコンパイル・実行する。それともいっそjarを生成して、 java -jar hoge.jar
で手間かけてやる。
タイポ直すだけで分単位でかかる
どっちにせよ、起動はかなり遅い。jarからやると、その生成だけでうん十秒がかかり、起動はそこからで。もしかしてコードに実行時に始めてぶつかるようなタイポ(ぬるぽやマップのキーの打ち間違いとか)があれば1分ぐらい待ってから始めてそれに気づく。
最近流行りのスピード感のある開発プロジェクトに対して、一つのタイポ直すだけで分単位でかかるのはスピードとは言い難い遅さは論外。
REPLを使ったClojureのウェブ開発
ちょっとした準備が必要ではあるが、REPLを使えば開発スピードが圧倒的に速くなる。そのちょっとした準備はリモートのREPLに接続するときに自動で読み込まれる user
の名前空間を作っておくところぐらい。そこにREPL用の便利関数などを詰めて :dev
でしか使われないパスに置くと、本番に影響なく作業効率が上がる。
user
名前空間を作成して、 :headless
のREPLにリモート(Dockerの外や同僚のマシーン)からつなぐと、ホットリロードなど便利関数がすぐ手元に揃っているのでスピードあがる。
Party REPLというあれ
Clojure Conjで話があったClojure Party REPLはAtomのTeletypeを活かしたペアプロ用のREPL拡張。通常のREPLは一人用のものになるが、Teletypeを混ぜると瞬時フィードバックの強力なペアプロツールになる。
ローカルのファイルから定義をREPLで実行したり、説明する時にさくっとサンプルを書いたりできる。例えば言葉で伝わらなくても、コードを見て触って実行してでは伝わる。
式実行だけで名前空間が自動で変わってくれる、同時編集ができる、ハイライト付きのREPLなんて、Emacsの気高き民でも嬉しいと思う。
難易度は?
現状弊社でClojureでの新機能開発を進めている中で、言語自体にこれで始めて触れた一人と、REPL駆動開発を始めてやってみた一人がいるが、これでもほとんどの支障なく業務に活かせている。
Clojureはマニュアル作成・共有ツールのTeachme Bizの一部の機能の土台になって、これからもREPL駆動でスピード感のある開発を進める。そういう環境やチームにご興味があれば、気軽話かけてください!ビールの上でClojureの話するのもいいし、オフィスを見てみたいという方も対応する!ぜひ!