質問

私はチームメイトに TDD を採用するよう説得しようとしています (以前のチームで TDD が機能するのを確認しており、セットアップも同様です)。また、私の個人的な信念は、少なくとも最初は、TDD とペア プログラミングの両方を組み合わせて実行すると非常に役立つということです。そうすれば、(TDD の)経験の浅い 2 人の開発者が互いに助け合って、どのような種類のテストを作成するかを話し合って、うまく進めることができます。

一方、私のマネージャーは、チームに 2 つの新しい開発手法を同時に導入すると、どちらも失敗する可能性が高いと感じています。それで、彼はもう少し保守的になって、どれでも導入したいと考えています。

これらは両方とも相補的であり、直交ではないことを彼にどのように説得すればよいでしょうか。それとも私が間違っているのでしょうか?

役に立ちましたか?

解決

私は、彼らがTDDでやっているかわからない多くの人々を持つことを助けるために起こっていることはよく分かりません。それはすぐに対象をグーグルであなたの両方に降ります、またはあなたの両方がTDDは/ではありませんまさにオーバー主張します。

私はあなたが与えられた技術(誰かが行くと、TDD上に読み込んで誰かが行くとペアプログラミング上に読み込む)のための伝道師になるためにチームの誰かを得ることの方が良いと思うし、それらの人々は、その後促進し、裁判持ってそれらの事。はい、両方が同時に起こることができるが、それらは、プロジェクトチーム全体で使用する必要はありません。あなたは、あなたのチームの小さなグループがプログラミングをペアリングして、彼らの経験に戻って報告しない可能性があります。

他のヒント

ペアプログラミングは、新しい実践、特に TDD を学ぶときに効果的です

したがって、妥協すれば両方を実現できます。これをアジャイルな方法で段階的に実行します。まずはペアプログラミングに挑戦してみましょう。2 つのうちの方が簡単です。ペア プログラミング後のすべてのプラクティスは習得がはるかに簡単になり、より迅速に、より一貫性をもってチームに採用されるようになります。ペア プログラミングは、最初ではないにしても、最初に採用すべきエンジニアリング手法の 1 つです。効果的に行われるようにしてください。以下にペアプログラミングのやり方を説明します。

ペア プログラミングは、ソフトウェア開発時に開発チームが使用できる最も有効な手法の 1 つです。ペアリングは、2 人の開発者が 1 台のコンピュータとキーボードを使用してストーリー カードを積極的に開発することで行われます。管理者は、ペア プログラミングを使用するとプログラミング コストが 2 倍になることを懸念しています。一見すると、結局のところ、2 人の開発者が同じタスクで協力するように求められていると彼らが考える理由は理解できます。しかし、実際には、この開発手法を使用するアジャイル チームは、初期開発コストのわずかな増加 (ユタ大学の調査によると 15%) は、欠陥の減少、テストの短縮と低コスト化によって十分に相殺されることがわかりました。サイクルが短縮され、実稼働サポートの必要性が軽減されます。

プログラマーがペアになって協力して作業することで生産性が向上するというのは直観に反するように思えるかもしれませんが、この手法が実際に機能する理由はいくつかあります (「頭は 2 つある方が 1 つよりも優れている」という古いことわざを思い出してください)。その理由は次のとおりです。

  • 品質の向上 -- ペアリングによりコード レビューが促進されます。多くの間違いは、入力中に発見されます。ペア プログラミングとは、コードの品質に専念し、常に協力してバグを特定して修正する 2 人によって行われる継続的なコード レビューを意味します。ユタ大学が行った研究では、ペアで書かれたコードでは、コード内で発見される最終的な欠陥の数が平均 15% 減少することがわかりました。
  • 「スタック」に費やす時間を削減 -- プログラミングは難しいです。多くの場合、開発者は解決策を見つけるのに苦労し、必要以上に時間を費やして「行き詰まって」しまいます。アイデアをブレインストーミングし、必要に応じて助けを求めることに同意するパートナーがいると、解決策を見つけるために行き詰まって費やす非生産的な時間が削減されます。
  • 気を散らすことに費やす時間が減る -- 開発者は、パートナーと仕事をしているときは、個人的な電話をかけたり、Web サーフィンをしたり、休暇のメールを送ったりすることに時間を費やす可能性が低くなります。
  • 問題には 2 つの視点が適用されます -- 経験レベルの違い、問題解決スタイルの違い、補助スキルの違いはすべて、問題をより速く解決できる可能性を高めます。ユタ大学が行った研究では、ペアで書かれたソフトウェアの全体的な設計が改善され、コード長が短くなったことが判明しました。
  • 未知への恐怖が減る -- 他の開発者と協力すると、単独で作業する場合よりも問題に取り組んだり、新しいテクノロジーを理解しようとしたりするのが簡単になります。また、時間の経過とともに、アプリケーション全体に対する理解も深まります。最終的に、プロジェクトはペアリングの結果、複数の人々がシステムの各部分を理解することになります。
  • 範囲内でビルドする可能性は低い -- 開発者は、要件で取り上げられていない機能を進んで追加することがよくあります。ペアで作業する場合、2 人目の開発者はパートナーの仕事を続ける可能性が高くなります。
  • チームダイナミクスの改善 -- ペアアプローチのおかげで、人々は一緒に働くことを学びます。彼らはより頻繁に話すようになり、より良い情報の流れを経験します。その結果、チームのダイナミクスが向上します。実際、私たちは、顧客が興奮するソフトウェアを共同で作成することが、最高のチームビルディング体験であることを発見しました。誰もが成功したチームの一員になることを望んでいます。
  • 知識のサイロの排除 – ドメインの知識、コードや実践の知識は、ローテーションベースでチームと開発者ペアを通じて迅速に伝達されます。

チームがペアリングに慣れたら、TDD に挑戦します。剥奪は次のとおりです。

テスト駆動開発 (TDD) は、短期間の開発で構成されるソフトウェア開発エンジニアリング手法です。最初に、目的の改善または新機能をカバーする新しいテスト ケースが作成され、次に、テストに合格するために必要な製品コードが実装され、最後に、ソフトウェアは変更に対応するためにリファクタリングされます。実際の開発前にテストを利用できるため、変更後の迅速なフィードバックが保証されます。実務家は、テスト駆動開発は単なるテストの方法ではなく、ソフトウェアの設計方法であることを強調しています。テスト駆動開発は強力な実践であり、ライフサイクルの後半で見つかる欠陥の削減に大きく貢献します。新しいチームは、経験豊富な TDD 実践者とペアになるか、そうでない場合は TDD コーチングを受けることを強くお勧めします。

テスト駆動開発では、コード自体の各側面の前に、コードの要件を定義する自動化された単体テストを記述する必要があります。これらのテストには、true または false のいずれかのアサーションが含まれます。テストを実行すると、コードが進化してリファクタリングされるときに、正しい動作が迅速に確認されます。xUnit の概念に基づくテスト フレームワークは、自動化されたテスト ケースのセットを作成および実行するためのメカニズムを提供します。テスト駆動開発サイクル:次のシーケンスは、書籍『Test-Driven Development by Example』に基づいています。この書籍は、多くの人がこの概念の現代的な形式における標準的なソース テキストであると考えられています。

  1. テストを書きます。テスト駆動開発では、新しいストーリー カードはそれぞれテストを書くことから始まります。このテストは機能が実装される前に記述されているため、失敗します。テストを作成するには、開発者は機能の仕様と要件を明確に理解する必要があります。これは、要件がいつ満たされたかを指定する受け入れ基準を備えたストーリー カードを通じて実現できます。これは、不変条件または既存のテストの変更を意味する場合もあります。これは、コードの作成後に単体テストを作成する場合と比較して、テスト駆動開発を区別する機能です。これにより、開発者はコードを記述する前に要件に集中することができます。これは微妙ですが重要な違いです。
  2. すべてのテストを実行し、新しいテストが失敗するかどうかを確認します。これにより、テスト ハーネスが正しく動作していること、および新しいコードを必要とせずに新しいテストが誤って合格しないことが検証されます。新しいテストも予想される理由で失敗するはずです。このステップでは、テスト自体を否定的にテストします。新しいテストが常に合格する可能性が排除されるため、価値がありません。
  3. コードを書きます。次のステップは、テストに合格するコードを作成することです。この段階で書かれた新しいコードは完璧ではなく、たとえば、不適切な方法でテストに合格する可能性があります。後のステップで改善され、磨きがかかるため、これは許容できます。書かれたコードはテストに合格することのみを目的として設計されていることが重要です。これ以上の (したがってテストされていない) 機能は、いかなる段階でも予測および「許可」されるべきではありません。
  4. 自動テストを実行し、成功することを確認します。すべてのテスト ケースが合格した場合、プログラマはコードがテストされたすべての要件を満たしていると確信できます。これは、サイクルの最終ステップを開始するのに適したポイントです。
  5. コードをリファクタリングします。これで、必要に応じてコードをクリーンアップできるようになりました。テスト ケースを再実行することで、開発者は、リファクタリングによって既存の機能が損なわれていないことを確信できます。重複を削除するという概念は、あらゆるソフトウェア設計の重要な側面です。ただし、この場合、ステップ 3 でテストを合格させるために、テスト コードと製品コードの間の重複を削除することにも適用されます。たとえば、両方で繰り返されるマジック ナンバーや文字列などです。

繰り返す

別の新しいテストから始めて、このサイクルが繰り返されて機能が前進します。ステップのサイズは、開発者の好みに応じて小さくすることも、自信がある場合は大きくすることもできます。テストを満たすために書かれたコードがすぐにテストを満たさない場合は、ステップ サイズが大きすぎる可能性があり、代わりにテスト可能な小さいステップを使用する必要があるかもしれません。外部ライブラリを使用する場合、ライブラリにバグがあるか、ライブラリのニーズすべてを満たすのに十分な機能が揃っていないと思われる何らかの理由がない限り、実質的にライブラリ自体をテストするだけになるような小さな増分を行わないことが重要です。メインプログラムを書いています。

開発スタイル テスト駆動開発の使用には、"Keep It Simple, Stupid" (KISS) や "You Ain't Gonna Need It" (YAGNI) の原則など、さまざまな側面があります。テストに合格するために必要なコードのみを記述することに重点を置くことで、他の方法で実現される場合よりも、よりクリーンで明確な設計を実現できます。テスト駆動開発では、プログラマはまずテスト ケースに失敗する必要があります。目的は、テストが実際に機能し、エラーを検出できることを確認することです。これが表示されると、通常のサイクルが始まります。これは「テスト駆動開発マントラ」と呼ばれ、赤/緑/リファクタリングとして知られています。赤は失敗、緑は合格を意味します。テスト駆動開発では、失敗したテスト ケースを追加し、合格し、リファクタリングするという手順を常に繰り返します。各段階で期待されるテスト結果を受け取ると、プログラマーのコードのメンタル モデルが強化され、自信が高まり、生産性が向上します。

あなたは新しい何かを学習するときにペアプログラミングが非常に役立つことが絶対に正しいです。私はあなたが両方を行うためのハードにプッシュする必要があることあなたに同意します。

おそらく、あなたのマネージャーのためにそれをレイアウトするための最良の方法は、あなたが、同時にこれら二つの新しいものを導入するために求めていることを示唆するものではありません。代わりに、あなたはまだ仕事が終らながら、あるTDDの実装を開始するために最も効率的な方法を感じることを示唆し、学び、「TDD調査チーム」としてのちょうど2つの開発者を取り、それらを設定し、適切なツールを入手するために協力することです技術は、それらをテストし、ご使用の環境にそれらを適用するために何をする必要があるかを見つけ出します。あなたがその作業を持って、そしてそれを経験のビットを持っている二人を持っていたら、その後、彼らは解散し、それぞれが新しい技術上のスピードまで、他の開発者をもたらすために数日のために他の開発者と座っています。すべての開発者がTDDを学んだまで繰り返します。

あなたは納得しません。多分これを確認していくつかのデータを提示し、彼は決めてみましょう、あなたは両方が一緒に働くと思う理由から彼を教えてください。あなたは、それは良いアイデアだと皆を説得する必要がある場合、私は、誰もがあまりにもそれに連れて行くされていないことを賭けています。 Natual反対ます。

個人的に私が見つけたペアプログラミングは、経験豊富な1つずつ未経験のに最適です。

すなわち、私はむしろ均等に熟練一致しようとするよりも、プログラマーのスキル/ EXPの差を目指すます。

より多くの経験を積んでの説明から、それからより多くを取得し、経験の浅いが、アイデアをバウンスと「ベストプラクティス」をピックアップする機会を得るながら思考を構造化することを余儀なくされます。

TDD用として、私は大ファンです。それは本当に、試験のポイントを引き出すのに役立ちますので、再度、expが未経験のに役立ちます。つまり、あなたは絶対にすべてのものをテストする必要はありません...それは焦点を当てて追加します。多くの場合、私は、人々は、彼らが達成しようとしているかに焦点を当てずにテストを書いている見つけます。

単体テストはやっぱ、一部のスタッフは文句を言わない2年後には存在し...芋不可欠です。その機能を検証するものがない場合はどのように既存のコードを変更することができますか?

まあ、マネージャーに応じて、あなたはこれらのプラクティスは相互に依存していることをXPの文献では、いくつかの引数を指すことができます。あなたが固体のユニットテストを持っていない場合、例えば、容赦なくリファクタリングはありません。

私はあなたがペアリングだけではないことを、新しい困難な問題上の任意の共同の努力のように、TDDを考え出すの目的のためになることで、インクリメンタルそれに近づくことをお勧めし「すべての製造開発がペアで行われます。」

1回の練習が他を必要としませんが、少しずつ両方を紹介する「卑劣な」方法があります。

利用できるのxUnitフレームワークの1つを使用してTDDを実装することを目標に開始します。互換性のある同僚を検索し、約時間の日のために、彼らはあなたと一緒に働くことをいとわないかどうか尋ねます。 「ショーンは、私はこの新しいツールをしようとしています、あなたは私がそれを右にやっていることを確認するために私を助けるだろう?」本当によく働くます。

ショーンとの数日後、スーザンと繰り返し...

とにかくそれを実行してください。管理者があなたのペアリングをキャッチした場合は、魔法の言葉を言う「コードレビュー」
の仮定:明らかペアは十分に焦点を当て/規律とセッションの終わりに動作するコードを生成する必要があります。

のコードベースに既存のバグに注意をもたらすいくつかのテストを書く - そして、あなたの上司にそれらを示して、私は彼が突然、TDDは良いアイデアであることに同意かもしれないと思う。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top