TDDBC横浜に参加してきました

TDDBC横浜に参加してきました。

プログラミング経験も浅く、勉強会的なものも初参加で緊張していたのですが、ペアの方やスタッフの方々に恵まれ楽しく参加することができました。ありがとうございました。

ブログを書くのが個人の責務ということでブログにも挑戦してみました。今回は、和田さんの基調講演のまとめ、ペアプロを通して学んだこと、KPTの3つのことを簡単に書いてみました。

基調講演

  • ソフトウェア開発の三本柱
    • バージョン管理     →セーブポイントのようなもので一番大事。
    • テスティング      →今回のTDDBC横浜で学びにきたもの。
    • 自動化         →さらに一歩踏み込んだ形として、おかしいときだけ人間に教えるとうのもある。
  • TDDのこころ
    • 一つずつ、少しずつ   →小さいタスクに割るというのは技術で、練習がいる。
    • ひとりずつ仕留める   →複数の敵を一つずつ仕留めていく。
    • すばやくまわす     
    • 自分が最初のユーザ   →まず利用者の視点でテストを書く。どういうのが欲しいのかを考える。(WHAT,WHY)
    • 道具にこだわる     →開発者として大事なこと。
    • 不安をテストに     →不安を克服できるように書く。
    • 祈るのではダメ     →テストがないとやってみないとわからないという状態になってしまう。
    • テストが命綱      →義務感ではなく、不安のない状態を維持するためにテストする。
    • TDDの真の目的は不安の克服と健康の維持
  • TDDBC導入の効果
    • 実際の事例から実装時間は二割増え、バグが半分減る。
    • 実装時間は増えるがデバッグ工数は減るので、結果として開発工数は減る。
  • サイクル
    • テストを書く    → 実行させ失敗させる(Red)
    • 目的のコードを書く → テストを成功させる(Green)
    • リファクタリング(Refactoring)


ペアプロ演習

ペアプログラミングの課題は野球の打率計算に関するものでした。ペアの方と話し合い、まずは動かしてから、Refactoringをするということに決めたので、3つの引数をただ代入し計算していくというメソッドを作りました。最初の流れを簡単に書いていきます。

  • テストを作ったらまずRedになることを確認。(メソッドがないので)

  it "打席数、打数、安打数を受け取り打率を計算できること" do
      BaseBall.batting_average(515, 455, 135).should  == 0.297
  end

  • 戻り値のみのメソッドを作成しGreenになることを確認。(テストのテスト、仮実装)

  def self.batting_average(box, bat, hit)
      0.297
  end

  • 実装を始める。Greenの状態を維持しながらRefactoring。RedのときはRefactoringしてはいけない。

  def self.batting_average(box, bat, hit)
      (hit.to_f / bat.to_f).round(3)
  end

その後、ある程度進めていくと複数の選手の打率が必要になり、メソッド自体を変更しようということになりました。しかし、メソッドやクラスの変更をすると、テスト自体の実装を変更しなくては全てRedになってしまいます。ここで、パラレルチェンジというものに挑戦しました。パラレルチェンジとは古いテスト、コードを残したまま新しいテスト、コードを作成し、両方Greenになってから古い方を消すというものです。パラレルチェンジの流れを簡単に書いていきます。

  • 最初に古いメソッドの名前を変更。

  it "打席数、打数、安打数を受け取り打率を計算できること" do
      BaseBall.old_batting_average(515, 455, 135).should == 0.297
  end

  def self.old_batting_average(box, bat, hit)
      (hit.to_f / bat.to_f).round(3)
  end

  • 新しいテストを作成。

  before do
    @aoki = BaseBall.new(643, 583, 170)
  end

  it "打席数、打数、安打数を受け取り打率を計算できること" do
      @aoki.batting_average.should == 0.297
  end

  • 新しいメソッドを作成。Greenになることを確認してから実装しRefactoring。

  def initialize(box, bat, hit)
      @box = box
      @bat = bat
      @hit = hit
  end

  def batting_average
      (@hit.to_f / @bat.to_f).round(3)
  end

  • この段階で古いテストと新しいテストがGreenになっていることを確認してから古いテストとコードを消します。このようにパラレルチェンジをすると安全に変更することができます。

演習を通して大きな修正を含めて一連の流れを体験することができました。これから何回も繰り返すことで自分のモノにしていきたいと思います。あと課題は演習中に全て終わらなかったので、空いている時間でチャレンジしたいと思います。

KPT

TDDBC横浜を通して感じたKPTを書いていきます。

  • Keep
    • 勉強会に参加すること。
    • 参加した内容をブログに書くこと。
  • Problem
    • 最初の机に座っていた方たちとペアの方、スタッフの方としか話せなかった。
  • Try
    • 懇親会に参加する。
    • 開発環境にこだわる。
    • もっと本を読む。

最後に

最後にスタッフの皆様、参加者の皆様、ありがとうございました。たくさんの学び、気づきがありとても有意義な一日でした。今後も、勉強会など積極的に参加していこうと思います。