Chapter 01無料公開

はじめに ~なぜ関数型脳へシフトが必要か?~

ABAB↑↓BA
ABAB↑↓BA
2020.12.13に更新

この本を手にとっていただきありがとうございます。この節では、なぜ私がこのような本を書いたか理由を説明していきたいと思います。

安全なシステムの土壌を増やしていきたい

手続き型言語と関数型言語の大きな違いは、手続き型はメモリ領域やCPU、プラットフォームに指令を下すことで構築していくスタイルで、関数型言語は値と関数を主体として定義群を記述していくスタイルになります。この2つのスタイルはどちらが良い・悪いというわけではなく、作りたいものやプラットフォームのスペックなどに応じて切り替えて行くのがあるべき姿だと考えています。本書を進めていくにつれて関数型の制約主体の書き方によってテストが書きやすかったり、危険なコードをコンパイル時点で食い止めたりする安全性の向上を感じていただけると思います。

しかし、多くの現場では、そういった思想ではなく、ヒトや集団が書き慣れているか資産が既にあるかを重要視し道具を選んでるシーンが多く見受けられるように感じます。もちろん大事な要素であることには変わりありませんが、サービスを運用するという長期的な視点で考えたときにはモノをベースに考える思考でなければ結局ヒトが苦しむことになり、そのような辛い現状をなるべく無くしたいと思い本書を執筆しています。

既に関数型へのシフトは始まっている

幸運なことに、関数型のエッセンスをドンドン取り入れていこうと言う試みは多く進んでいます。Javaはバージョン8からラムダ式やFunctionインターフェースという関数型プログラミングを利用し、並列処理が行いやすいような仕組みを取り入れていますし、JavaScriptもImmutable.js, Lodashのような関数型ライブラリを利用していた時代から、なるべく標準機能で関数型の機能をまかなえるようになってそのようなライブラリの必要性が減っていったりするような動きが見えます。また、これらとは別に後発の言語である、ScalaはJVMで動く関数型オブジェクト指向言語ということをコンセプトとしており明確に関数型を意識しています。Rustのような低レイヤをサポートする言語でも関数型パラダイムの影響を受けており、同じように部分的に関数型のエッセンスをサポートすることは当たり前のような世の中になってきました。今回紹介するElmやPureScript, Ocamlをベースに作られているReasonMLなどのウェブフロントで動く関数型のエッセンスを含んだ言語ではなく、純粋関数型も増えています。つまり関数型の概念を抑えて脳をシフトすることは、かなり当たり前となって来ています。

本書ではどのように脳をシフトしていくか

先述したように、手続き型の言語と関数型言語の境界線も曖昧になってきており、ありがたい事に手続き型言語を利用した関数型プログラミングの入門情報も多くなってきてります。慣れ親しんだ言語で関数型を学べることはとても嬉しいなと思う一方で、やはり気を抜くと手続き型スタイルの書き方になってしまっていたり、それを独力で気づくことは脳が手続き型に固定されてしまっていると困難です。そこで、思い切って純粋関数型言語であるElmを利用して強制的に関数型スタイルを身に着けていただこうと思っています。しかし、知らない言語をいきなり学ぼうとしてもとてもつらく今までとの比較もできなくなることが懸念されます。そこで、TODO MVCというTODOアプリのサンプルをあらゆる言語で実装しているプロジェクトのサンプルを利用して説明をしていこうと思います。小さなプログラムの説明群ではなく、ある程度実践的で動いており、変更も可能なプログラムを題材にすることで脳のシフトを促進しようと考えています。