REPL駆動開発と完成形のギャップの理解
REPL駆動開発、それは開発の過程で起こるフィードバックループをとっても短くして、すぐに確認を行える開発戦略です!とてもおもしろい。私たちは、ギャップを即座に発見して、すぐに変えてみて結果を見ることができる、何より楽しい開発戦略だと思います。
初めてREPLで開発してみたときは、全然その真価がわかりませんでした。REPLで確認することより、先々起こりうるような不具合を型で制限する、先回りの開発手法ばかりに傾倒していたからです。
生き物としてのプロダクトに目を凝らすこと。池の中に息づく小さな生命や、微細な動きをじっくりと見つめること。
開発フローの中で、大まかなものからスタートして、それを徐々に磨き上げるアプローチを取ることができます。まるで、デッサンをするみたいに大まかなあたりを付けて徐々に磨き上げるアプローチ。プログラミングは変更が効きます、というより頻繁に変更するような無形のものです。
大雑把な場所から、徐々に近づいていくようなアプローチが、きっと好ましい。REPL駆動開発はアジャイル開発の極地みたいなものでしょう。
私たちは、頭の中で仮想的にロジックを組み合わせたりします。このロジックをこれに適用して、あの関数はここで使って……。それには限界がある。
大雑把にまず動くものを作る。 そして、その都度確認しながら完成形にアプローチをしていく。そういう開発戦略が大切です。
大雑把なものからスタートする理由は、ギャップは見てわかりやすいから。頭で想像したものを考えるのではなく、目で見て「あ、これが足りない!」って見てわかる。そういう、目で見てわかるというのは大きな事です。
じっと微生物を観察するみたいなことでも、目で見たらどのぐらいなのか一目でわかってしまう。想像だけじゃない強さが、REPL駆動開発にある。
次に何をすればいいかの手がかりが、目の前にあるのは大きい。
REPL駆動開発の真髄に触れて、効率的で楽しい開発を進めることができます。
まず、そもそも初心者のときに何をやったか思い出すと、「Hello, world!」でしょう。ってことは、目で見える開発って一番わかり易いということ。それを、開発の最初から最後までできるようにしたよ、っていうのがREPL駆動開発。
つまり、REPL駆動開発は「Hello, world!」の延長だ、と言って良いと思う。
初心者でも、階段をのぼるように開発できる!一緒に、clojureでREPL駆動開発に一歩踏み出してみましょ。REPL駆動開発は、常に途上です。だから、どのようにスタートしたって構わない。最初は、データを見ることだけできればよい。
ギャップの感じ取り方と、解釈
こういうインクリメンタルな開発をするとき、ギャップを感じることは必須になる。どうやって解釈するか?がとても重要だ。
思考や見たものをどうやって行動に移すか。
カエルがどうやって筋肉を使っているかを観察し、考えるみたいに今のシステムを見てみる。
人は五感を用いて世界を理解するけれど、プログラミングに於いてはもっぱら資格を使う。見るという行為を徹底するのがREPL駆動開発だ。
REPL駆動開発=見るということを、ちょっとしっかり考えてみるんだ。
どうすればいいか
そもそも、プログラムはデータの変換である。どんなものも、入力と出力の関数である。プログラミングや科学の世界においては。いかに不要な複雑性を排除し、シンプルに関数として捉えるかが大切なんだ。
ここで問題がある。関数は目に見えづらいということ。なぜなら、関数は動き・関係だからだ。
たとえば関数内部で2つに分かれる条件分岐が3つあるだけで、全てのシナリオケースは8つになってしまう。全てを直感的に見ることって、人間にとってとても難しいんだ。
また、関数は加えて状態も存在する。不用意に複雑さを追加してしまいがちな、あの悪しき状態。歴史的には仕方なかったのかもしれないけれど。
関数を理解するためには入力・状態・エッジケースの確認がとても重要になる。
- 状態の確認: データの状態や変数の現在の値を確認することは、何が起こっているのかを直感的に理解するために不可欠
- 関数の評価: 関数の動作を確認するためには、その関数をREPL上で評価してみることが最も効率的
- エラーのトレース: エラーが発生した際には、REPLが詳細なトレース情報を、しっかりと確認する。動作の中でも、最も特異でわかりやすいもの
そもそも、物事を理解するために、特別なケースを見るのはとても重要。これは当たり前だよね、て言うものより、こういう場合はちょっとどうなんだろう?と言うもののほうがわかりやすい。