わたしがプログラミングの楽しさにはじめて目覚めたTopic.

テスト駆動開発(TDD)とは

TDD, test-driven development. ソフトウェア開発手法のひとつ.

最初に失敗するテストを書き, それをパスする最低限の実装をして, 最後にリファクタリングする3つのステップを何度も繰り返す.

TDD Basics

🔃テスト駆動サイクル

レッド/グリーン/ファクタリングと呼ばれる, TDDにおけるテスト開発サイクル.

  • 失敗するテストを書く(Red).
  • できる限り早く, テストに通るような最小限のコードを書く(Grean).
  • 重複を排除する(Refactor).

俗に, 黄金の回転.

仮実装

ベタ書きの固定値を返すような実装.

これは, テストのテスト的な意味合いもある. 実装は間違いようがないような単純な実装なので, これでテストが通ればテストはうまくかけたということ.

三角測量(Triangulation)

一つの振る舞いを異なる2つ(以上)のシナリオでテストすること. テストケースを追加すること.

とくに, 仮実装(固定値を返すようなチンパン実装)を複数のテストから検証すること.

明確な実装(Obvious Implementation)

仮実装の対義語に当たるような, 本格的な実装. 頭のなかにある実装を仮実装や三角測量なしに, いきなりコードに落とす. うまく動作すると思う実装をいきなりかく.

グリーンバー/All Grean

TDDのこころ

TDDにおける用語.

📝テストファースト

ソフトウェア開発における手法の一つ. 実践的には, コードを書く前にテストケースを書く.

しかし, 思想的には📝Fail First, 生産的失敗に近い. まず失敗する, そして

TDDはテストファーストを発展させた考え(TDD = テストファーストではない).


スコープクリープとリズム

プログラミングに夢中になって我を忘れてしまうと, 念のために余計なコードを追加しがちになる. プログラムのあるべき姿を明確に記述すれば, 本来のコーディングに集中できる.

💡TDDでのTODOリストも用いればさらによい.

コーディングをすると何時間もハマルことがある. テストファーストは次になにをするべきかが明確になる.

📜動作するきれいなコード(Clean code that works) - ロン・ジェフリーズ

テスト駆動開発の目標. 📚テスト駆動開発入門 - Kent Beck(2003)の冒頭はこの言葉からはじまる.

素早いフィードバック

TDD Topics

🆎TDD with GTD

TDDと🔖GTDの関係. みんな似ていることはうすうす気づいてる.

ストレスフリーの境地、だからGTDとTDDが好きだ | Futurismo(2013)

  • [リスト化]TODOリストにしたがってタスクをこなしていく。
  • [最小化]大きな問題を最小単位のタスクまで分解して取り組む。
  • [ボトムアップ]タスクを確実に積み上げて大きなことを成し遂げる。
  • [NextAction]具体的で着手可能なNextActionのタスクを常に意識する。
  • [フロー状態]目の前のタスクに集中する。
  • [規律]規律(Kata)を遵守することでプロジェクトを推進する。

🆎TDD with TODOリスト

TDDは小さなサイクルを回すため, 必然的にやることが増える. 感覚的には30分程度の粒度に分割する. それらの小さなタスクを管理するのがTODOリスト.

さらに, 思いついたタスクを素早く追加する機能性もTODOリストとは相性がいい.

これは地図とコンパスのような役割を持つ.

🔖TODOリスト

📜テスト駆動開発とはプログラミング中の不安を管理する方法である - ケント・ベック

📚テスト駆動開発入門 - Kent Beck(2003)のまえがきより.

  • 不安はためらいがちにさせる.
  • 不安はコミュニケーションを減らす.
  • 不安はフィードバックを敬遠させる.
  • 不安はイライラさせる.

プログラミング中のメンタルとはこのようなものである. そしてテスト駆動開発は,

  • ためらいがちになるのではなく, できるだけはやく学習する.
  • 黙り込むのではなく, はっきりとコミュニケーションする.
  • フィードバックを避けるのではなく, 具体的で便利なフィードバックを探す.

🔖不安


さらに, 見出しは📝勇気となっている. いいかえると, テスト駆動開発とは勇気をもってプログラミングをする方法. 勇気とはなにか?

💡勇気の役割は困難に立ち向かう能動的な想像力.

TDDとプログラマのメンタル

  • グリーン状態は長時間続き, レッドはほんの少ししか現れない.
  • グリーンとリファクタリングが, 手順として分離されている.
  • リズム感が前に進んでいる感覚を作り出す(スモールゴール)

💡テスト駆動開発で用いられるテストは品質のためのテストではなく設計のためのテスト

テストは設計のための副産物であり, 使い終わったら捨ててもいい.

型付けがテストを置き換える

型付けを活用してテストを減らす:静的型を使ったTDD Part 1 | POSTD

📜TDD is Dead, Long live testing - DHH

https://dhh.dk/2014/tdd-is-dead-long-live-testing.html

Railsの開発者, DHHが書いたブログ記事がいろいろ話題.

Insights

✨TDDにおけるTODOリストとはイシューツリーでありそのキモは大局をみること

やることリストとは, 戦略コンサルの文脈でいうイシューツリーにあたる. そしてその役割は, 少ない情報から仮説を元に大局的なストーリーラインを構築して全体をみることにある.

💡少ない情報から大局的な全体を構築し枝葉末節ではなくストーリーラインの幹を描く

TDDにおいてあまり表には話題にならないものの, TODOリストは大局をみるための役割をもつ. TDDサイクルとは, サイクルとは枝葉と幹をテンポよくいったりきたりするといいかえることもできる. ここから, 💡TDDとは設計であるという主張にもつながる.

✨開発の中でリファクタリングの時間を強制的にタイムブロッキングできる

きれいに書こうとすると時間が無限に溶ける. かと言って, ずっと汚いコードを我慢し続けるとメンタル崩壊して会社を休職する. ここで必要となるのは, 規律なんだ.

たとえば5分なり10分なり, リファクタの時間を取る. しかしそれ以上は取らない, など. 大事なのは, 私にとってTDDはメンタルを管理する方法がとても魅力的であること.

📝タイムブロッキング

✨TODOリストのタスク名は明確に具体的に記述すると集中できる

これはGTDとTDDの両方からの気づき. タスク名が曖昧だとなにをやればいいのかわからないが, 明確に指定することで着手しやすくなり, スコープも限定できてより力を集中できる.

これがタスク具体化の力.

🌳GTD

✨テストはタスクの拡張にすぎずやることを列挙して作業をすることの延長にすぎないと構える

テストを書くというとめんどくさいかもしれないが, テストをTODOリストにならぶ一つ一つのやることと見立てれば, これは単なるタスクリストを列挙してそれを実行していると解釈できる.

なにか作業をしようとした時, たとえば旅行に行こうとした時, やることをとりあえず列挙して細かいタスクに分けて計画を立ててから作業をするだろう. そのノリと同じようにして, なにか機能追加をしようとしたら, まずはやることを小さなタスクにわけて, その延長でテストを書く. このノリで気軽に, また当然のようにテストを書きたい.

💡TDDとは設計であるとは, やることを考えること, 計画作業とも言える.

📜テスト駆動のサイクルに火を入れる

実践テスト駆動開発の第4章のタイトル.

<2024-08-17 Sat 09:12> どういうわけかこの言葉を毎日の習慣や生活のなかで未だによく思い出す. 社会人になって新しいことに触れてきたときに印象深く価値観として刻みつけられたのだろうか.

References

📚テスト駆動開発入門 - Kent Beck(2003)

  • 👴🏼ケント・ベック
  • notes
    • なぜか英語版と日本語版の両方をもっていて, ミニマリストになっても捨てずに押し入れにある.
    • 日本語版を2011/08/20, Amazonで書籍を購入.
    • 英語版は2010/12に購入した気がする.

👨和田卓人

📜複数を相手にしない、ひとりずつ対処する - 和田卓人

発表スライドより. t8.

宮本武蔵の画像引用されている. おそらく吉岡一門との戦いで100人対1人の戦いの戦法より. 大勢を相手にする時まず広場から森に逃げる。そして一対一にして一人ずつ対処する.

ただこれに対応する名言が見つからないので探している.


誰が為のテスト - DevLOVE(2009)

  • 1つずつ, 少しずつ.
  • 一度に一人の相手を倒す.
  • 不安をテストに落とす. どこをテストするかは, どこが不安かということで決める.

グリーンベルト

TDDのこころを忘れないようなアンカリングのためのグリーンベルト.

Posts

tags: 🔖ソフトウェア開発手法 💫Arts