TDD Boot Camp 名古屋

TDD Boot Camp 名古屋 に参加してきました!

初日 (7/10)

id:youku_s に朝起こしてもらうなど。
豊橋組5人で金山へ。
電車の中で id:youku_sC++ で TDD の練習 (FizzBuzz) など。C++ 楽しい。

午前

ますは、id:bleis-tift の挨拶。
それから、id:t-wada さんの TDD 解説。

  • TDDBC 3回目にして男子校になってしまった
  • ニコ動に和田さんのTDD解説が
  • 黄金の回転 : Red → Green → Refactoring
                        ↓− Red
  「きれいなコードしてるだろ、動かないんだぜ、これ」|「きれいなコードしてるだろ、動くんだぜ、これ」
  --------------------------------------------------+---------------- ↑Refactoring --------------
  「きたねぇコードしてるだろ、動かないんだぜ、これ」|「きたねぇコードしてるだろ、動くんだぜ、これ」
                         Green →
  • 一つずつ、少しずつ
    • 複数(大きいもの)を相手にしない 一つずつ対処する
  • すばやくまわす
    • すばやいフィードバック
  • 自分が最初のユーザ
    • まず、利用者の視点でテストを書く
    • →使用しやすいコードが書ける
  • 不安をテストに
    • 不安があるものに対してテストする
    • 一律にテストするのではなく、自分が不安と思うところを
      • 自分の心理とコードとのギャップを整理していく
  • 祈るのではダメ
    • 最初から、テスト資産を整備していく
    • 安心して飛び込む
      • 胸張って「動く」といえる
        • 少なくとも自分の考えたとおりには
      • テストが支えてくれる
  • TDDにおいて、テストは目的ではなく手段
    • TDDはテスト技法ではなく設計技法
  • TDDを導入する最大の理由は心理的なもの
    • 即座にフィードバックを得られる
    • 書いたコードに自信が持てる
      • 自分の意図した通りには動く
    • これから書くコードに自信が持てる
  • TDDの真の目的は「健康」
    • 変化に対応するのは健康体のコード
      • 健康体:無駄がない・不安がない
    • 変化に対応するのは健康体のチーム
  • ペアプロ
    • ナビとドライバー
    • 意思疎通が密に取れる
      • スキル・設計・仕様等の伝達
    • 宗教戦争を楽しもう
  • ペアプロデモ
    • テストは下(結果(assert))から書いていく
      • アサートファースト
    • 仮実装のテストは、テストのテストになる
      • 疑いようもなく明らかにテストが通るはずの実装で、テストが通らない → テストにバグがある
    • 仮実装のテストが通ったら、テストを追加していく (三角測量)
      • 実装に不安がない場合、仮実装を飛ばして実装しても良い (明白な実装)
  • 間合いを計る
    • 何が対象か、何が不安か
  • 呼吸をするようにリファクタリング
    • *ただしGreenに限る
  • TDDのざっくりとした導入効果
    • 実装時間が約2割増え、バグが約半分に
  • 「一番の近道は遠回りだった」「遠回りこそが最短の道だった」
午後

ペアプロセッション。


最初は C#Scala でやろうと思っていたけど、
id:yoshihiro503 さんや id:mzp さんから OCaml 組に勧誘があったので、
OCaml でやってみることに。


最初は id:yoshihiro503 さんと。
自分の PC の VitrualBox 上の Ubuntu でやることに。
エディタは emacs に挑戦。
OCaml は入ってたけど、emacs とか oUnit とか入っていなかったので、その辺の環境構築から。
TDD環境は id:mzp さんのところ (ここ) から頂くことに。
出来たコードはここに


2番目は id:mzp さんと。
OCamlは Maybe の List を 標準関数の結合では List に展開できない (できるかも?) ので、それ用の関数を自作した。
出来たコードはここに
途中でemacsに挫折・・・

TDDの研究に協力することに。
内容は、Java で TDD。
git使いながらやってみた。


そのあと、クラス等について議論した。

自分がちょっと気になっていた、
「クラスは、そのインスタンス全てからなる集合として考えることが出来る」
というのを主張してみたら、真っ向から否定されて議論に。

自分の主張は、「クラスはその要素の特徴を表す」としていたので、議論時の文脈ではうまくいかないと、終わってから気付く。
インスタンスの集合だけではそれら特徴(適用できる関数や不変条件などの制約)を表せない。(集合をなんとするかによって表せる場合もある)
これを自分でさっさと見つけれなかったのが痛かった。
まぁ、それ以前に上手いこと前提を突き合わせれなかったのが大きいかったかな。


この辺の議論に長いこと付き合って頂いた、id:katzchang さん、id:Akineko さん、id:youku_s、ありがとうございました!

二日目 (7/11)

午前

レガシーコード対策について、id:t-wada さんの解説。

  • レガシーコード改善
    • 今ある現実と戦う
    • レガシーコード
    • レガシーコード対策
      • テスト出来るところを探す/作る
        • 継ぎ目を作る
      • 何が正しいか/どう動いているか
        • まずは、今の動きをテスト可能にする (仕様化テスト)
      • コンパイラを味方に付ける (コンパイラまかせ) (*ただし静的型付言語に限る)
        • 動的言語では使えないが、動的言語では継ぎ目を作りやすい
      • カプセル化よりテストが大事
    • デモ
      • 仕様化テストにはそれと分かる名前を付けておく
        • 〜CharacterizationTest 等
      • まずはインスタンス化の方法を調べる (インスタンス化する(だけの)テストを作る)
        • テストが通った所と通ってない所を可視化するeclipseプラグインがある
午後

レガシーコード対策実践。

自分は Scala 組に参加。
二分木構造のコードを提供してもらって、テスト作ってリファクタリング
やっぱり emacs に苦戦・・・

豊橋組と豊橋駅で夕食。
帰ってから、id:youku_s の部屋で git と vim と fold の勉強とかしてた。

感想等

関数型言語で TDD したり、Ocamlemacs 等の新しい環境に挑戦したり、いろいろ議論したりと、非常に楽しい2日間でした!
id:bleis-tiftid:t-wada さん、スタッフの皆さん、参加者の皆さん、ありがとうございました!