-6

(これは TDD のメリットを調査するための質問ではありません。そのような議論の場は他にもあります。事前に感謝します。)

私は、テスト駆動開発や NUnit に対する不満を報告している、この手法の初心者である開発者が多すぎるのを経験してきました。

次のような否定的な意見を耳にします。

  • NUnitは苦手です。 1年前に試してみましたが、使い方を忘れてしまいました。代わりに、テスト ハーネスとしてアドホックに書いたばかりのこの Windows フォーム アプリを使用してみましょう。テスト コードはとにかく使い捨てのコードです。違いは?とにかく、私のやり方は過去に十分に機能しました。」

  • 私は TDD について懸念があります。私たちの最後のプロジェクト (ちなみに、TDDを使用した最初で唯一のプロジェクト経験でした) では、もはや設計が何であるかさえ知りません。」

  • 「これ以上のコード コメントは悪いことですか? 気が狂っていますか? 差し支えなければ、本当にやるべきことがいくつかあります。」(昔から、コメントが多いほど良いコメントであり、コメントが多すぎることはありません。)

初心者が、TDD を使用した初めてのプロジェクトで TDD がおそらく満足のいくように「機能しなかった」と不平を言った場合、それは本当に彼らを失敗させた TDDなのか、それとも開発者自身のスキルがまだ良い結果を得るのに十分ではないのか?

そして、彼らがそれを言って私を嫌うことなく、どうすればそれを伝えることができますか?

問題の核心は、私たちの重要な仕事上の関係を危険にさらすことなく、開発者が新しい開発技術で自分たちの初期の不十分な能力をより正直に評価することを奨励するために、開発者に外交的に何を伝えることができるかということです.

通常、多くの開発者は、最初のプロジェクトの段階で、TDD の多くの重要な要素を十分に活用するための実用的な知識をまだ備えていません。

たとえば、私が話した開発コミュニティの不満を言う人は、次のような典型的なものです。

  • コードのにおいのリストを見たり覚えたりしようとしたことさえありません。

  • リファクタリングのカタログを調べようとさえしたことがなく、実際のプロジェクトや学習用のおもちゃのプロジェクトでそれらを実践したこともありません。一部の人々にとっては、リファクタリングを非常にうまく行うために、もっと多くの OOP を学ぶ必要があるかもしれません。リファクタリングには、Visual Studio 2005 の [リファクタリング] メニューに項目として表示される「メソッドの名前変更」と「変数の名前変更」だけではありません。

  • (リファクタリングを介して) 創発的な設計を使用して実装された実際のプロジェクトを調査したり参加したりしたことはありません。事前に設計を使用してプロジェクト全体を実行することと、コードが書かれた後にのみ単体テストを作成するプロジェクト全体を実行することとの違いを知り、それらのいずれかの間のトレードオフと適用性。

彼らは皆、かつてNUnit を使用していたようで、それを使って何をしたとしても、それは TDD だった、と彼らは考えているようです。NUnit または単体テストの存在は、単純に TDD を意味するものではありませんが、それを知るにはまだ十分に理解していません。

これらは賢い人々です。開発者は賢い人です。なぜなら、それが職業全体への入り口だからです。そうしないと、長時間占領できません。もちろん、彼らがこれらの資料を勉強するためにしばらく努力すれば、それを理解することができました。

方法論やその結果を評価するには、経験と知識の合計が明らかに弱すぎるのに、どうやって方法論が弱いと自分に言い聞かせることができるでしょうか?

それは自己防衛的な行動だと私は信じています。またはそれは怠惰です。Fowler's Refactoring book のカタログからリファクタリングを 3 つ挙げることさえできない場合、またはコードのにおいをいくつか挙げることができない場合、あなたはリファクタリングのランク初心者であり、おそらく TDD 方法論全体と、いわゆる 1または 2 プロジェクトの経験は明らかに十分ではありません。

TDD での成功が決定的に依存しているスキルについてもっと学ぶために必要なことを人々にさせるために、人々に何を言うことができるか、または人々の注意をどの資料に向けることができますか?

  • 単体テスト、
  • リファクタリング、
  • デザインパターン、
  • オブジェクト指向の設計と分析?

これらの各トピックに関する本が丸ごとあり、中には非常に優れたものもあります。飲み込みやすい学習テクニックもあるかもしれません。私は模範を示して人々に教えることができますが、私自身が彼らに与える時間は限られています。

さらに、彼らは一緒に行きます。彼らはお互いなしではうまく機能しません。単体テストとリファクタリングは、ピーナッツ バターとゼリーのように連携します。単体テストを grep できない場合は、リファクタリングでまったく良い結果が得られないでしょう!! (まだわからない場合は、理由を尋ねてください。新しい人に喜んで説明します。)

また、私が何を言おうと、それが裏目に出ないようにすることも重要です。

同僚をTDD の概念から遠ざけてはなりません。さらに、同僚を私から遠ざけてはなりません。 私はこれから何年もの間、毎週彼らと一緒に働かなければなりません。

プログラミングの他の面で非常に熟練していることをすでに確立している他の長年の上級開発者を動揺させないことは特に困難です。彼らは過去の業績を当然誇りに思っていますが、彼らのエゴやプログラミングのすべてを熟知しているという自己概念は、感情を傷つけることなく対処することはほとんど不可能です. 一部の上級開発者は、他の人から学ぶべきいくつかの新しいテクニックを知らないことに直面する準備ができていません。上級開発者は、プログラミングに関しては専門家であることに慣れていて快適です。また、TDD や関連する手法やテクノロジに関しては完全に非現実的であっても、専門家として見なされることを要求することがあります。

構造化された自動ユニット テストの記述に関して常駐の「抵抗者」の 1 人を好転させるのにかなりの成功を収めた 1 つの方法は、彼らと 1 対 1 でペア プログラミングを使用することです。ペアプログラミングは、より経験豊富で知識のある実践者の直接的な指導とともに、訓練生にいくつかの実際の例と経験を与えると思います.

しかし、ペアプログラミングだけでは不十分です。彼らが学ぶ必要のあるリファクタリング、コードの匂い、OOP の概念、および OOD&A の概念は他にもたくさんあります。

4

12 に答える 12

17

自分の考えを他人に押し付けて、受け入れてもらうことはほぼ不可能です。独自の方法を使用することもできます。他の人は、良い結果が得られたときに学びたいと思うでしょう。TDD やペア プログラミングなどのようなものが魔法のように利益を得ると期待しているだけですか?

また、あなたは自分の役割を指摘していません。(または、少なくとも私はそれを見つけられませんでした)

別の方法を試すこともできます:

TDDor nunit に関するランチタイム セミナーを提供します。メリットをそのまま表示します。開発者/会社に実際の例と実際のメリットを提供します。それらがなければ、受容的な聴衆はいません。

少なくとも、独自のテスト ハーネスを作成した人がいます。これは良いことです。私はそれを賞賛し、それをもっと見るように頼みます.

開発者に、問題について何を見ているか、どのようなテストが必要か、または会社がどのように改善できるかを尋ねます。自分のアイデアを押し付けるのをやめて、そこから出てくるようにしなければなりません。

編集 - 経験から

何年も前に、私は似たような経験をしました。私はプロセスと The Right Way To Development Software (tm) に関する本をたくさん読んでいて、物事を行う正しい方法について会ったすべての人に話し始めました... 誰もそれを聞きたがりませんでした。疎外されるリスクを冒すことは、実際には何の役にも立たないことに気づきました。それで、私はただ黙って、私がリーダーシップを与えられたばかりのグループでいくつかの良い慣行を実行しました. 約 4 か月後、提供している結果をどのように得ているかについて人々から尋ねられるようになりました。

他の人を探す代わりに、人々は私たちを見つけるようになりました。(それは私の計画ではありませんでしたが、振り返ってみると理にかなっています。人々は熱気ではなく結果を求めています)

于 2008-11-19T23:01:07.833 に答える
10

質問を 1 行にまとめるには:

And how can I communicate that without them hating me for saying it?

優れた開発者になることで、彼らの尊敬を得ることができ、彼らは耳を傾けてくれます。ここには本当に近道はありません。私のアドバイスは、より良い開発者およびより良いエバンジェリストになることです。あなたが教えようとしている人から学べば、彼らはあなたから学び始めるかもしれません。

そして、当然のことながら、TDD に対するあなたの態度は、どちらかというと敬虔な印象を与えます。それも役に立ちません。これを TDD に伴う大きな文化の変化と組み合わせると、伝道が成功する可能性は劇的に縮小し始めます。

于 2008-11-19T23:17:42.153 に答える
9

TDD の最大の問題は、人々がこれらのテストに集中してしまうことだと思います。

テストは、ある程度、重要ではありません。すべてのテストに合格しても、すべてのテストに合格したことを証明するだけです。さらに、すべてのテストに合格し、完全にカバーされていても、誰も望んでいない不良で使用できないアプリケーションを作成できます。

テストに 100% 合格することと優れた製品を作ることの間のギャップは、クラフトとして知られる職業の一部です。

さらに、TDD は設計を指定するもう 1 つの方法です。これが TDD の重要な部分であり、設計をある程度ロックダウンします。

于 2008-11-19T23:02:52.323 に答える
7

TDD が問題であるということではないかもしれませんが、あなたが作業している環境や、作業しているプロジェクトのタイプにTDD が本当に適しているかどうかを考えたことはありますか? 現在抱えている問題 (または現在使用している方法論や慣行) について、また TDD を採用することでこれらの問題が解決される理由については何も言及していません。あなたが見ている抵抗は、変化に対する抵抗の結果ではなく、存在しない問題を解決しようとしているからだと確信していますか?

TDD はすべての環境に適しているわけではありません。私が働いている場所は適切ではありません。なぜなら私たちは作業が速すぎるためです。仕様は通常、開始時に大まかに書かれ、反復ごとに改良/変更/書き直されます。時間。さらに、メソッドは静的な型チェックが機能することを保証するワンライナーであるため、多くの場合コードをテストする必要がないことを意味するプラクティスを開発しました。

あなたの投稿には、あなたが比較的経験の浅い人物であり、すべての問題を解決できる特効薬であるとあなたが信じている方法論に固執している人物であることを示す多くのコメントがあり、同僚が維持する場合は学ばなければなりません。あなたと一緒に。残念ながら、ソフトウェア開発に特効薬はありません。彼らが豊富な経験を持つ上級開発者で、TDD が適切であると信じていない場合は、彼ら意見を聞く価値があります。

また、TDD はリファクタリングの前提条件ではないことにも注意してください。「レッド グリーン リファクタリング」のマントラを愛する人々はそう考えたいと思っています。小さな領域をリファクタリングしていて、それが何に影響するかを知っていて、手動で簡単にテストできる場合は、リファクタリング中およびリファクタリング後にその領域を手動でテストできます。

于 2008-11-19T23:15:08.990 に答える
4

悪魔の擁護者を演じるために、TDDが本当に効果的であると確信しているのはなぜですか? 個人的体験?実証研究?

TDD の肯定的な結果を報告した 2 つの研究を次に示します。

そして2つ決定的ではありません:

方法論を完璧であるかのように提示するのが良い考えかどうかはわかりません。効果が期待できるアプローチの一つです。私たちが知る限り、より良いアプローチはまだあります。おそらく、すべての開発者に、組織に適した混合方法論を設計するように勧めてください。

于 2008-11-19T23:07:56.697 に答える
4
  • 自分の専門分野の専門家ではないと言われるのが好きな人はいません。年配者ほど、初心者のように感じる新しい方法論を採用することに抵抗があります。

  • 私がテストの推進で最も成功したのは、テスト カバレッジのグラフィカルなレポートを作成し、それをチームに公開したことです (または、チーム内の Web ページを継続的インテグレーション テスト レポートに接続しました)。はい、テスト カバレッジは品質の総合的な尺度ではありませんが、誰がテストを書いていて誰が書いていないかを示す非常に簡単な方法です。

  • 誰がコード カバレッジを最高の割合で維持できるかを競うようにしましょう。人は競争が好きです。彼らが遅れをとったり、テストできない「コード ポケット」を含むコードを書いたりした場合、テストでコード カバレッジが示されるようにリファクタリングする方法を考えるかもしれません。彼らが「教育を受ける」ことを好まない場合は、リファクタリング手法を自分で発見させてください。そうすれば、彼らは賢く感じ続けることができます。

  • または、より優れたテスト容易性を達成するために行った巧妙なリファクタリングを人々が自慢できるブラウンバッグ ランチを用意することもできます。人々は誇示するのが好きです!彼らは無知を見せられるのが好きなだけではありません。

  • これは TDD からは程遠いですが、少なくともより良い QC に向けたある程度の進歩です。ツールといくつかの簡単なリファクタリング方法に慣れてきたら、ペア プログラミング、コード レビュー、コードの匂いの検出、要件のテストへのトレースなど、より高度な機能を徐々に導入できます。 その後、TDD に取り掛かることができます。

スティーブン・ロウがこのスレッドで言ったように、ローマは一日にして成らず。

于 2008-11-19T23:17:20.513 に答える
3

あなたの本当の質問は、「同僚に新しいことに挑戦するよう説得するにはどうすればよいですか?」ということです。

それは本当に良い質問です。申し訳ありませんが、本当に難しいです。数年前に Alistair Cockburn とこのテーマについて話し、スライドを投稿しましたが、本文はまだ書き上げていませんが、ここで短いバージョンを提供できます。

テクノロジー導入のライフサイクルやキャズムを越えることについてご存知ですか? これらは、人口のセグメントと変化への動機を扱います。あなたの状況に関連する重要なアイデアは、キャズムの左側にいる人々 (イノベーターとアーリー アダプター) だけが物事をより良くしようとする変化に関心があるということです。キャズムの右側にいる人々 - 大多数の人々 - は変化に対してより抵抗力があり、彼らが変化するとき、それは左側の人々と同じ理由ではありません. その結果、この 2 つのグループはお互いに話し合う傾向があります。

あなたはキャズムの左側です。あなたの大学は右側にあります。変化する理由を彼らに与え続けても、彼らを説得することはできません。

彼らが何か新しいことに挑戦するよう説得するのは、それが彼らが感じている現在の痛みを和らげるという信頼できる約束を提供する場合です.

TDD がどのように優れているか、何をすべきかについて話してください。

TDD が現在の痛みをどのように解決できるかについて話せば、彼らの注意を引くことができます。

そしてキラー部分?現在の痛みがない場合、それらを変更する可能性は低いです.

そういうわけで、オプションは「組織を変更するか、組織を変更するか」です。

幸運を!

于 2008-11-20T00:14:41.477 に答える
1

ローマは一日にしてならず

ペアリングを続けて良い手本を示すと、他の人が光を見てあなたのリードに従います

馬を水に導くことはできますが、水を飲ませることはできません。そして、彼を水中に押し込むと、彼は溺れるか逃げるでしょう. ;-)

于 2008-11-19T22:57:35.827 に答える
1

おそらく、TDD のスタイルに慣れ、TDD に必要な文化を作成している間に生産性が低下するかどうかという問題が、私が間違っていると思うところです。

これらの上級開発者の生産性が大幅に低下した場合、これは誰にとっても許容できるものでしょうか? 誰もがコードの開発方法を再学習することに問題がないという感覚をつかむことができれば、何かが得られるかもしれませんが、ほとんどの開発者はコードを書くための独自の最適化を行っていることを忘れないでください。そして、バグを解決することは、TDD の厳密な形式を使用する場合、完全に解決されない一般的なアプローチである可能性があります。

于 2008-11-19T23:10:17.613 に答える
1

時間がかかり、(より良い言葉がないため) マーケティングが必要です。チーム メンバーが尊敬する人物によって提唱されるまで、TDD (または単体テスト全般) は受け入れられません。

あなたがまだチームの中で最も尊敬されているメンバーの 1 人ではない場合は、(卓越性を示すことによって) 1 人になるか、1 人または複数の技術リーダーに焦点を合わせて、彼らを味方につけなければなりません。

もちろん、人はそれぞれ異なります。さまざまな部族の指導者に TDD を提示して、彼らができるだけオープンに考えられるようにする方法を考え出す必要があります。

絶対に実現しなければならないことの 1 つは、テストの作成と実行を非常に簡単にする必要があるということです。人々が TDD の利点に懐疑的な立場から始めた場合、TDD を試すまでの道のりに少しでも問題があると、非常に意欲を失うことになります。

于 2009-10-29T03:53:55.197 に答える
1

最初に目に留まったのは、「テストコードはとにかく使い捨てコードだ」ということでした。つまり、うわー。

もちろん、TDD の場合は逆です。テストはリグレッション ファイアウォールとなり、自信を持ってリファクタリングと機能の追加を行うことができます。

私の経験では、このような慣行を抵抗する (しかし完全に反抗的ではない) 企業文化に導入するために必要なことが 2 つあります。以前にそれを機能させたチーム。このエンジニアの時間は、実際のプロジェクト作業とメンタリングに分割する必要があります。メンタリングは、グループ プレゼンテーション、コード レビュー、および (念のため) 練習がどのように適用されるかを人々に直接示すためのペア プログラミングの形式を取ります。彼らが解決しようとしている問題。

過去にそれを機能させたことに加えて、このエンジニアは熟練した教師である必要があり、(ほとんどの人は個人的な攻撃と見なされる変更を求めているため) 脅迫的でない性格と教育へのアプローチを備えている必要があります。

頑張ってください。

于 2008-11-23T20:09:12.047 に答える