15 min/d

ぼうずやのにっき

bouzuya/rfc6570-expand をつくった && TDD の良さを再認識した

bouzuya/rfc6570-expand 0.1.0 を npm に公開した。

bouzuya/rfc6570-expandRFC 6570 URI Template の展開を実装したもの。npm install rfc6570-expand で利用できる。詳細は bouzuya/rfc6570-expand を参照してほしい。ちなみに以前 2016-06-01 で実装の進捗を報告している。

目的は yosuke-furukawa/eater の簡単な検証と uri-templates/uritemplate-test を pass する実装の提供。実装を活用する意図はないので、軽い運動のようなもの。

実装については 2016-06-01 を参照してほしい。2016-06-01 からの差分としては、仕様通りに実装したとは言わないが、ひとまず uri-templates/uritemplate-test の spec はすべて通るようになっている。RFC 3986 ではなく URL Standard に変更する option は未実装。 RFC 6570 についても前述のとおり仕様通りとは断言できない状況。

今回の経験は TDD : Test-Driven Development の良さの再認識だ。まず TDD / Test-first が常に良い・正しいとは思わない。しかし今回はその良さを改めて感じた。また「 TDD は設計だ」と主張する人にとっては主語が大きすぎるかもしれない。言い直すなら「テストにより開発を進めたくなった」あるいは「テスト駆動を実感した」あたりだろうか。

今回は uri-templates/uritemplate-test により test がすべて提供されていた。Test-first を自然に実現できていた。あとはこれを pass するように実装していくだけだ。既にある test を pass するように実装するのは楽しい。ちょうど game の quest や mission のようなもので明確な目標を達成する状態だ。目標がはっきりしていたおかげで投げ出さなかった。これが「テスト駆動を実感した」と書いた意味だ。

また 4Clojure をはじめとする Koan も今回の Test-Driven な要素を持つように感じる。Koan (公案) は次のように説明されている。

こうあん【公案】の意味 - goo国語辞書

1 官庁の文書。公文書。 2 禅宗で、参禅者に考える対象や手がかりにさせるために示す、祖師の言葉・行動。 3 工夫。

公案 - Wikipedia

  1. 中国で、古代から近世までの役所が発行した文書。調書・裁判記録・判例など。
  2. 上記の意味から派生して、禅宗において修行者が悟りを開くための課題として与えられる問題のこと。

Rx で Koan した - steps to phantasien

Koans を解くのはちょっと楽しい。Rx に限らず入門目的のちょっとしたコーディング問題集を Koan とよぶのはある種のならわしらしい。Code Koans などを検索すると色々みつかる。語源はたぶん「公案」なのだろう。本来の意味とは外れている気もするけれど気にしないでおこう。Koan だの Kata だのの Zen terminology を好む Kamikaze Ninjas はなぜか一定数いるからね。

Programming での Koan は初学者向けの問題集だ。ぼくの知る範囲では Test code が用意されており、それを pass するように書き換えるものが多い。これはぼくが今回経験した Test-Driven な要素に近い。

前述のとおり、ぼくは以前 4Clojure で遊んでいた。

2012-05-06 には次のようにある。

やる気を高める仕組みも良い。問題を解くのはゴールが明らかで、あと何問を解こうといった風にやる気が高まる。問題を解くとグリーンのチェックが付くし、ユーザーページのグラフも進む。達成感が得られる。

4Clojure はほかにもいろいろな工夫を含むのだけど、 Test-Driven な要素があるのは確かだ。

脱線して TDD / Koan のことを書いてしまったのだけど、Test-first にするとそれに引っ張られて開発が進む、Test-Driven な要素はあるということが言いたかった。

bouzuya/rfc6570-expand に戻って残りの課題だけど、可能なら先にも書いた URL Standard 対応や、仕様通りに実装する必要がある。余裕があれば extract (URI から template を基に variables を取り出す) 操作もつくってみたい。