$30 off During Our Annual Pro Sale. View Details »

テスト駆動開発でダイエットに挑戦して失敗した話

terahide
September 30, 2023

 テスト駆動開発でダイエットに挑戦して失敗した話

XP祭り2023 で発表した内容です

terahide

September 30, 2023
Tweet

More Decks by terahide

Other Decks in Technology

Transcript

  1. テスト駆動開発でダイエット
    に挑戦して失敗した話
    てらひで
    2023.9.30 XP祭り 2023
    TrackB 14:25-14:45

    View Slide

  2. だれ?
    てらひで @terahide27
    • SIorを中心にアジャイルを叫んでいる
    • ふりかえりの人
    • テスト駆動開発の人
    • 着物ぐらし
    • 深夜アニメのカバレッジ90%
    • 初音ミク
    • 酒・ラーメン

    View Slide

  3. はじめに
    • テスト駆動開発というものが
    あって大変すばらしいものだ
    • TDDBCなどテスト駆動開発を学
    ぶコミュニティもたくさんある
    • 自分もテスト駆動飲み会という
    コミュニティの幹事の1人である

    View Slide

  4. テスト駆動開発とは?
    • Red → Green → Refactor を繰り替えすサイクルで開発する
    1. まずはテストを書く
    (失敗させる)
    2. テストが通るように
    プロダクションコードを直す
    3.重複を排除する
    上記のサイクルをくり返す

    View Slide

  5. テスト駆動開発を行う利点
    • プログラムの内部品質が高くなる
    • 凝集度があがって結合度がさがる
    • 開発を行う対象の理解が進む
    • 設計判断に迷うことが少なくなる
    • 安全にリファクタリングが可能
    SQuaRE
    (ISO25000シリーズ)
    における品質特性
    つながる世界のソフトウェア品質ガイド

    View Slide

  6. こんなに素晴らしいものを
    開発だけに
    留めておいていいのか?
    • 生活の中で使えないか?

    View Slide

  7. 何があったか?
    • 健康診断で血圧が170
    • その場で降圧剤を処方される
    • 医者に行ったところBMI値を
    標準にせよ(10kg痩せろ)
    • コロナが始まって半年で5kg増加
    • ダイエットに応用しよう!

    View Slide

  8. と、その前に

    View Slide

  9. テスト駆動開発のイロハ
    • TODOリストを作成する
    • テストを書く
    • Red テストを失敗させる
    • Green 最速でテストを通す
    • Refactor 重複を排除する
    • Red→Green→Refactor のサイクルを繰り返す
    1. まずはテストを書く
    (失敗させる)
    2. テストが通るように
    プロダクションコードを直す
    3.重複を排除する

    View Slide

  10. TODOリストを作成する
    • 書くべきテストをTODOリストへ追加する
    • [ ] 四則演算
    • [ ] クリア
    • [ ] 平方根
    • [ ] べき乗
    • [ ] メモリー

    View Slide

  11. テストを書く
    • 足し算(四則演算の一部)の簡単な例
    def testAdd1to1 {
    sut = Calculator.new()
    actual = sut.add(1, 1)
    assert 2 == actual
    }
    テストコード

    View Slide

  12. Red テストを失敗させる
    • 書いたテストを実行する
    • Calculatorが存在しないためシンタックスエラー
    def testAdd1to1 {
    sut = Calculator.new()
    actual = sut.add(1, 1)
    assert 2 == actual
    }
    テストコード

    View Slide

  13. Red コンパイルを通す
    • プロダクションコードを追加してコンパイルをとおす
    def testAdd1to1 {
    sut = Calculator.new()
    actual = sut.add(1, 1)
    assert 2 == actual
    }
    テストコード
    class Calculator {
    def add(i, j){
    }
    }
    プロダクションコード
    • 再び実行
    • テスト失敗
    • 2 を期待しているが null

    View Slide

  14. Green 最速でテストを通す
    • 仮実装でテストを通す
    def testAdd1to1 {
    sut = Calculator.new()
    actual = sut.add(1, 1)
    assert 2 == actual
    }
    テストコード
    class Calculator {
    def add(i, j){
    return 2
    }
    }
    プロダクションコード
    • 再び実行
    • テスト成功!

    View Slide

  15. Refactor 重複を排除する
    • ここでは変更の余地なし
    def testAdd1to1 {
    sut = Calculator.new()
    actual = sut.add(1, 1)
    assert 2 == actual
    }
    テストコード
    class Calculator {
    def add(i, j){
    return 2
    }
    }
    プロダクションコード

    View Slide

  16. Red テストを追加する
    • 三角測量のテストを追加
    def testAdd1to1 {
    sut = Calculator.new()
    actual = sut.add(1, 1)
    assert2 == actual
    }
    def testAdd2to1 {
    sut = Calculator.new()
    actual = sut.add(2, 1)
    assert 3 == actual
    }
    テストコード
    class Calculator {
    def add(i, j){
    return 2
    }
    }
    プロダクションコード
    • 再び実行
    • 1件成功, 1件失敗
    • testAdd2to1: 3 を期待しているが 2

    View Slide

  17. Green 最速でテストを通す
    • 明白な実装でテストを通す
    class Calculator {
    def add(i, j){
    return i+j
    }
    }
    プロダクションコード
    • 再び実行
    • テスト成功!
    def testAdd1to1 {
    sut = Calculator.new()
    actual = sut.add(1, 1)
    assert 2 == actual
    }
    def testAdd2to1 {
    sut = Calculator.new()
    actual = sut.add(2, 1)
    assert 3 == actual
    }
    テストコード

    View Slide

  18. Refactor 重複を排除する
    • テストコードのフィクスチャを共通化
    class Calculator {
    def add(i, j){
    return i+j
    }
    }
    プロダクションコード
    def sut
    def setup{
    sut = Calculator.new()
    }
    def testAdd1to1 {
    assert 2 == sut.add(1, 1)
    }
    def testAdd2to1 {
    assert 3 == sut.add(2, 1)
    }
    テストコード
    • 再び実行
    • テスト成功!

    View Slide

  19. Red→Green→Refactor のサイクルを繰り返す
    1. まずはテストを書く
    (失敗させる)
    2. テストが通るように
    プロダクションコードを直す
    3.重複を排除する

    View Slide

  20. ところで
    テストってなんだっけ?
    なんのためにするの?

    View Slide

  21. 計測

    View Slide

  22. ダイエットではどうなる?
    1. Red:
    小さな目標を決める
    (-1kgとか)
    2. 最速でGreenに:
    絶食してでも目標体重に
    3. Refactor:
    食生活やその他
    の生活を見直す

    View Slide

  23. 結果どうなったか?

    View Slide

  24. 絶食とかムリ!
    サイクルを1回も廻せませんでした。。。

    View Slide

  25. その後のはなし

    View Slide

  26. 地道な活動が重要と気がついた
    変えなかったこと 変えたこと
    筋トレみたいな運動しない ビールを低糖質に
    酒を止めない 週末は1食
    毎日のウォーキング(DQウォーク万歳!) 日本酒は減らした
    ちょっとしたストレッチ
    ちょっとした糖質の制限
    https://products.suntory.co.jp/d/4901777374270/

    View Slide

  27. 日々の食生活
    豆腐、鶏むね
    あとちょっとの野菜

    View Slide

  28. eXtreme
    Programming
    • Extreme
    • 極端な、過激な

    View Slide

  29. ラーメンとか
    普通に食べてます
    • 最近、近所がラーメン新店のラッシュでw

    View Slide

  30. 気が付いたこと
    • インプットとアウトプットのバランス
    • PFCバランス
    • 1kgくらいはすぐに減ったり増えたりする
    • 逆に食べても増えないときとかある
    • 夏の暑い日は食べられない

    View Slide

  31. そしたら
    • 7月のある日目標へ!

    View Slide

  32. その後
    • 2-3kgの増減はありつつも
    リバウンドは今のところなし

    View Slide

  33. まとめ
    ダイエットは
    • ちゃんと記録をして
    • 地道な活動が重要!

    View Slide

  34. Be Happy

    View Slide