20120512 アジャイルサムライ読書会第8回
TRANSCRIPT
アジャイルサムライ第五部 アジャイルなプログラミング
2012.5.12 株式会社コネクトスター
サービス開発者の読書会
これはなに
• アジャイルサムライ読書会
• 第5部を読んだ前提で議論する資料
第五部
• 12.ユニットテスト:動くことが分かる
• 13.リファクタリング:技術的負債の返済
• 14.テスト駆動開発
• 15.継続的インテグレーション:リリースに備える
今回は12と13をやります。
問答無用で実践すべきプラクティス
• ユニットテスト
• リファクタリング
• テスト駆動開発(TDD)
• 継続的インテグレーション
12.ユニットテスト:動くことが分かる
デグレードの例
デグレードとは、ソフトウェア開発において、プログラムを手直しした際に修正部分以外の個所で不整合・不具合が発生したり、バージョン管理の手抜かりなどによって以前の状態に戻ってしまい、修正済みだったバグが再発したりすること
デグレードの例• 「バグだ と勘違い」したのが問題
• なんでそう思ったんだろう?testがない!
• 修正されたバグが二度とコードに現れないようにするためには?testを書こう!
テストを書く
• テストとは何かブラウザで検証するアレexcelシートに◯、×
• どんなイメージがあるか辛い、面倒くさい、コツコツ
テストを書く
• 今までどうやってきた?みんなでがんばった!、アルバイト?
だめだね
本来のテスト
• バグを修正する前に、失敗するテストを書く
• 自動化して簡単に実行できる
• とはいえブラウザでのテストは必要だよね!
• 見た目はむしろ目で見たほうがイイ!
テストコードをたくさん書くと?
• 素早いフィードバックが得られる
• 極めて低コストにリグレッションテストを実行できる
• デバッグ時間を大幅に削減できる
• 自信を持ってデプロイできる(サーバへ上げる時に祈ってませんか?)
どこまで書けばいいの?
• ソフトウェアがちゃんと動いていると確信を持つに足るだけのテストを書き、労力に見合ったテストになっていることを判断する基準が「危なっかしい所をすべてテストする」だ
• カバレッジは100%を目指すべきか
カバレッジは100%を目指すべきか
• 程よいところまでやろう!
• リーンにやるには?
• MVPなところは必ず書く
• 改修の生産性が一番よいところまで!
• エンジニアの精神衛生を保つ
testで実感したこと
• 機能を足した時に、古い機能のtestが落ちた!
• めっちゃいいな、と思った。
• 新しいエンジニアが加わった時!
危なっかしい箇所とは?
• 決済周り
• 複雑な処理
みんなで考えよう
レガシーコード
• なにそれ
• レガシーコード改善ガイドを読もう
引用:レガシーコード改善ガイド
• レガシーコードとは、単にテストのないコードである
引用:レガシーコード改善ガイド
• テストのないコードは悪いコードである。 どれだけうまく書かれているかは関係ない。 どれだけ美しいか、 オブジェクト指向か、 きちんとカプセル化されているかは関係ない。 テストがあれば、 検証しながらコードの動きを素早く変更できる。 テストがなければ、 コードが良くなっているのか悪くなっているのかが本当には分からない。
13.リファクタリング:技術的負債の返済
技術的負債• コードのコピーアンドペースト
• 手抜き、ハック、重複により技術的負債はたまってく
• 組織で共有されない知識や、複雑すぎて変更が難しいコードも
リファクタリングで技術的負債を返済する
リファクタリング• 外部からみたソフトウェア全体の振る舞いを変えることなく、少しずつ継続的に設計を改善していく手順
• 振る舞いを変えることないことを担保する = テスト
• テストがない状態ではリファクタリングは不可能
技術的負債の影響• もし君が変更しづらく、仕事として楽しめないソフ トウェアを書いてしまったとしよう。もし、後になってその機能を更新したり、 新機能を追加したりといったせっかくの機会がめぐってきたとする。その時にどんな気分になるだろうか? ちっともわくわくしないんじゃないだろうか。そんな ことじゃだめなんだ
リファクタリングの仕方
• 一日を通じてたゆまず、継続的にリファクタリングする
• 技術的負債の返済は後になればなるほど難しくなる
リファクタリングのポイント
• 変数やメソッド に適切な名前がついているかを確かめる
• 似ている箇所をメソッドに抽出してみ
たらどうだろう?
大掛かりなリファクタリング
• 外部要因によって変更が発生して、自分たちでも対処が必要だと判断したなら、そのリファクタリングを他のユーザーストーリーと同様に扱おう
• プロジェクトの終了は近いか?
• 少しずつやれないか?
テスト駆動開発の実例
• C#の例、普段見慣れない
• rubyのコードで実感したい
• sinatraみんな書いたことあるよね
• というわけで以下の実例を見せますhttps://github.com/ppworks/rspec_sample
KPT
http://kpt-it.herokuapp.com/9fdaa76993f04b532d3d8604baaefcb5