TDDの勘所とTDD支援超簡易Emacs Lisp
日本PostgreSQLユーザ会北海道支部 / Ruby札幌 合同セミナーに行ってきました。濃い話がいろいろ聴けましたが、今回一番の目的は角谷さんによるRSpecの実演。
人が目の前でコーディングしているのを見るのは勉強になりますね。注目すべきは結果的に入力されたコード以外の部分にあって、キータイプ速度の緩急や、コピペ操作、バックスペースでの修正等を見ていると、そのとき考えていること(考えるべきこと)が浮かび上がってくるような感じがします。
TDD(テスト駆動開発)については、「実際のところ、どこを厳密にやって、どこで手を抜くべきなのか」についてちょっと指針が見えたように思います。
今回一番厳密に守っていたのは「Think」「Red」「Green」「Refactoring」のモード切り替え。今どこのモードで作業をしているのかを意識して、例えばテストNGが残っている状態(Red)では絶対にリファクタリングをしない、というような進め方をしていました。このとき4つのモードを明示するために、コーディングしている横でそのときのモードを示すカラーボードを掲げていたのはちょっと面白かった。
このカラーボードみたいなことが個人レベルでもできないかなあ、と考えて下のプログラムを作ってみました。C-c mキーを押すとエディタの背景色が次々と変わるEmacs Lispです。モードラインにも[Think]などのモード名を表示します。
tdd-bgcolor.el
;; C-c m でTDDのモード切替え (defvar tdd-bgcolor-alist '(("Think" ."snow") ("Red" ."#ff4444") ("Green" ."#44dd44") ("Refactoring"."#ffaa44"))) (defvar tdd-bgcolor-mode 3) (defvar tdd-bgcolor-mode-name "") (let ( (cell (or (memq 'mode-line-position mode-line-format) (memq 'mode-line-buffer-identification mode-line-format))) (newcdr 'tdd-bgcolor-mode-name)) (unless (member newcdr mode-line-format) (setcdr cell (cons newcdr (cdr cell))))) (defun tdd-bgcolor-rotate () (interactive) (let (pair) (if (>= tdd-bgcolor-mode 3) (setq tdd-bgcolor-mode 0) (setq tdd-bgcolor-mode (+ tdd-bgcolor-mode 1))) (setq pair (nth tdd-bgcolor-mode tdd-bgcolor-alist)) (setq tdd-bgcolor-mode-name (format "[%s]" (car pair))) (message tdd-bgcolor-mode-name) (set-background-color (cdr pair)))) (global-set-key "\C-cm" 'tdd-bgcolor-rotate)