開発者が自分の作品のエッジケースを継続的に無視することに対処する


25

私のチームの開発者の1人に、興味深い、かなり一般的な問題があります。この男は優れた開発者であり、高速かつ生産的であり、かなり良い品質のコードなどを生成します。良いエンジニア。しかし、彼には問題があります-非常に多くの場合、彼はコードのエッジケースに対処できません。

私たちは彼と何度も話しましたが、彼は試みていますが、彼はこのように考えていないようです。そのため、最終的にQAがコードに関する多くの問題を発見し、何度も何度も開発に戻して、最終的に納期を逃し、チームの全員が不満に陥ることになります。

私は彼に何をすべきか、そして彼がこの問題を克服するのをどのように助けるかを知りません。おそらく、より多くの経験を持つ人がアドバイスできますか?


11
単体テストで自分のコードをカバーするように誰かに依頼します。
ジョブ

8
コードをテストでカバーするのに最も適した人は、その作者です。

16
@Developer Art:完全にそうではありません。コードのテストを行う最悪の人は、そのコードを開発した人です。誰もが死角を持っていますが、作成を行う人は、自分のコードに関して最大​​の死角を持っています。
ジェームズP.ライト

2
@Developer Art:自動テストの作成は実際にはかなり一般的な役割だと思います。通常、あなたがいる会社でプライムタイムの準備が十分に整っていない場合は、1〜2年の間やることです。それは一種の煉獄の期間です。
モーガンハーロッカー

19
彼は「優れた開発者」、「生産的」、「優れたエンジニア」、「優れた品質のコード」を生み出していると説明しますが、QAは彼の仕事に問題を見つけ続けています。 ?。自分のコードに挿入した欠陥は、私はプロ、彼らはまったく一致していないことをやっている仕事など、個々の記述から、よりこの物語にあるかどう思ったんだけど
トーマス・オーウェンズ

回答:


29

彼は自分のコードの自動化された単体テストを書くことを要求します。単体テストを書くと、エッジケースを考えるように強制されます。

いくつかの詳細:

  1. 彼が選ばれたと感じないようにするために、これはあなたのチーム全体に対して始められるべきです。新しいコードまたは変更するコードの自動化された単体テストの作成を全員に要求します。
  2. 単体テストの名前には、テストするケースを説明する名前を付ける必要があります。
  3. コードレビューで自動化された単体テストを高レベルでカバーします。レビュー担当者に、逃したテストケース(つまり、彼が頻繁に見逃しているエッジケース)を探してもらいます。彼のチームから見逃されたエッジケースについてのフィードバックがある程度あれば、レビュー前にそれらを検討することをおそらく学ぶでしょう。
  4. チーム全体にこのルールを適用します。QAがバグを見つけた場合、責任のある開発者は、障害を確認し、修正したことを証明する自動テストを負います。(他の作業を行う前)

アーメンはさらに良いことに、誰もがコードをテストファーストで書くことを要求します。BDDフレームワークを使用して、通常はこの痛みを軽減
ジョージマウアー

@ジョージ良いアイデア。ここではTDDがさらに役立ちます。
マシューロダトゥス

3
-ユニットテストでは発見のバグに関するものではありませんblog.stevensanderson.com/2009/08/24/...
Dainius

1
@Dainius同意します。ユニットテストは、バグを排除する(ただし特定しない)可能性のあるエッジケースを通して開発者が考えるのを容易にします。
マシューロダトゥス

After some amount of feedback from his team about missed edge cases, he will probably learn to consider those悪い慣行をしている開発者は、良い慣行に必要な追加の労力とは無関係であると主張することがよくあります(そうすることの利点が分からないため)。開発者は、追加のエッジケースを追加する際に黙認する場合がありますが、それが関連性があると考えたり、自分で追加するかどうかを意味するわけではありません。
フラット

23

彼にチェックリストを与えます、例えば

  • ヌル入力
  • 範囲の極端に大きい入力
  • 範囲の極小端での入力
  • 組み合わせ
  • 想定される不変条件に違反する入力(x = yの場合など)

QA担当者はチェックリストの作成を支援できます

これだけでなく、すべての開発者にチェックリストを提供します。


1
すべての開発者がチェックリストを使用する必要があるのは良い点です。1人の開発者を抜き出すと、気持ちが悪くなります。そして、それはすべての人のコード品質を改善するのに役立ちます。
FrustratedWithFormsDesigner

良いアイデアですが、開発者の観点からそれをどのように見ることができるのか興味があります。開発者としての私のキャリアで実際にこのプラクティスに出くわしたことはないので、反応を測定するのはちょっと難しいです。そこに洞察はありますか?
アレックスN.

@Alex:チェックリストは、一部の開発者にとっては日常業務であり、他の開発者にとっては恐ろしいin辱です。それを試して、何が起こるか見てください。彼が辞めると、コードの品質が向上します;-)
スティーブンA.ロウ

4
開発者はチェックリストを使用しませんか?チェックリストが命を救うことができるなら、彼らはそれらを使うでしょうか?多くの医師はそうではなく、患者は苦しんでいます。これを読んでください:newyorker.com/reporting/2007/12/10/071210fa_fact_gawande
バリーブラウン

1
@バリー、彼らがそうしないとは言わなかった。この場合のチェックリストは、問題そのものではなく、問題の症状の治療薬のように聞こえます。この場合の問題は、規律と勤勉さです。問題が、高度な責任とストレスを伴う緊急メンテナンスを必要とするシステムの複雑さである場合、詳細への注意のレベルが低下し、はい、チェックリストftw(パイロット、医師など)しかし、それだけではありませんこの質問の範囲外の哲学的論議について。
アレックスN.

17

良いエンジニア。

はい。

しかし、彼には問題があります-非常に多くの場合、彼はコードのエッジケースに対処できません。

優れたエンジニアが共有しない品質です。


エッジケースを監視することは、人に存在するかどうかの特徴です。エンジニアやプログラマーとは関係ありません。この特性の発達は、文化的背景、生活環境、子供時代の出来事、および人生経験に影響されます。それから、態度は単に個人がしている仕事に適用されます。

あなたが必要なのは、あなたの男が、この特定の感覚が(おそらくまだ)発展していないタイプかどうかを調べることです。また、何らかの理由で彼が気にかけない可能性も非常に高いです。彼が仕事に満足しているかどうか、状況全体を分析する必要があります。そうでない場合は、おそらく彼を助けるために何かをする必要があります。

彼は仕事に満足しているが、まだエッジケースの危険性を経験していない場合は、彼を教育し始めることができます。彼がそれを真剣に受け止めれば、彼は時間の経過とともに彼のやり方を変えるかもしれません。これには懐疑的ですが、試してみることもできます。

しかし、彼がエッジケースが苦手なタイプの人であることが判明した場合、チームから彼を取り除く以外に何も残っていない可能性があります。この特性は、実用的なプログラミングに不可欠です。悲しいことに、それなしでは偉大な人でさえ良い仕事をすることができません。


6
+1これは、優れたプログラマーになるために学ばなければならない人がいるスキルです。ただし、2つのタイプのエッジケースがあることに注意してください。ビジネス要件のエッジケース(「27人の左トレーナーと28人の右トレーナーを注文した場合、その順序はおそらく間違っている」)とプロジェクト要件で対処する必要がある、エッジケースのコーディング(無効な入力への対処、ハッシュセットがxより大きくなったときにハッシュセットがより賢明な場合は常にリストを反復処理するなど)
エドジェームズ

ご意見ありがとうございます。心から感謝する。私は興味がありますが、彼は素晴らしい人ですが、優れたエンジニアを素晴らしいものにするこの何かを欠いているなら、どうすれば彼を他の仕事をして組織に留めることができますか?別のチームまたは何かに移動する...私はその質問に答えることができると思いますが:)
アレックスN.

私はそれについて考えてきましたが、よくわかりません。そのような人に受け入れられるようになる別の役割は、細部への注意を必要とするべきではなく、ソフトウェア会社にはそれらの多くはありません。

あなたの最初の文が示すように、世界はそれほど白黒ではありません。私は、すべてではないがいくつかのエッジケースを特定できる開発者がいると考えています。
マイクパートリッジ

5

プロセスの早い段階でコードレビューやデザインレビューを行うことはできますか?


4

テストファーストをプログラムするように彼に教えてください。彼とペアリング。テストケースを作成し、テストに合格するためのコードを作成します。


3

QAを機能開発の早い段階で関与させることで、カバーする最初に近いエッジケースのリストを提供できますか?開発者がすべてをカバーすることを期待していないと考える人もいるかもしれませんが、テスターが最初にキャッチする可能性のある境界ケースを見逃す傾向がある場合、これはこの問題を回避する方法かもしれません。

私がここで持っている他のアイデアは、彼がこの問題をどのように見ているかということです。彼は本当にこのパターンに腹を立てて自分自身をカチカチさせたのでしょうか、それとも彼はこれを通常のように見ているだけで、解決するために心配するものではありませんか?確かにこれには大きな信頼が必要であり、彼の視点で彼をオープンにする必要がありますが、彼の視点から物事を見ることができるなら、ここにある程度の共感があると思います。


3

エッジケースは無限にあり、それらをすべてカバーすることは不可能です。誰かがどうしたら#define TRUE FALSE?それはエッジケースを追加します、あなたもそれらをチェックしますか?

また、プライベートクラスまたは内部関数のすべての関数をだますことを検討しません。

非常に堅実で安定している必要があるコードに私が選択するアプローチは次のとおりです。

if(conditions_met)
{
DoStuff();
}
else
{
CrashAppAndDumpMemory();
}

このようにして、QAで確実なアプリケーションダンプを取得し、リリースに到達するまでに、アプリは確実で安全になります。

エラーの回避は悪いです。ファイルハンドルがnullでnullを返す場合、関数を保存できますが、ほとんどの場合、どこかにデザインエラーがあり、アプリのクラッシュは原因を見つけることを強制するより良い方法です。ほとんどのエッジケースは、問題を隠すことでエラーをマスクするだけです。たとえば、ボタンは機能しなくなりました。クラッシュは、製品に関するいくつかの仮定が間違っていることを伝え、クラッシュの原因となったロジックを修正する必要があります。


#define TRUE FALSEはエッジケースではなく、略奪行為です。
gnasher729

1

それがエッジケースである場合、それを考慮する必要さえありますか?エッジケースが重要な場合、エッジケースを要件/機能/ユーザーストーリーにフィードする必要があります。

エッジケースが作業の一部と見なされ、デバイスを所定の場所に配置する必要がある場合、それらはワークアイテムの一部である必要があり、定義により、エッジケースを処理するメカニズムが完了するまでワークアイテムは完全ではありません所定の位置に。

これにより、チームリーダーとして、作業後の議論で作業が完了した後にチェックオフするものが得られ、開発者が作業を完了するときにチェックオフすることができます。


常にエッジケースがあります。エッジケースが発生しないと誰かが主張する場合、それらは正しいエッジケースではありません。
バリーブラウン

1
@Barry Brown私は常にエッジケースがあることに同意しますが、利害関係者が重要と考える重要なエッジケースと、私たちがシナリオと呼ぶことができる重要なエッジケースと、開発者が重要と考えるエッジケースには違いがあります。利害関係者が何かが重要であると考える場合、計画セッションで議論し、ユーザーストーリーのシナリオとして含める必要があります。開発者が考える必要はありません。タスクに対する適切な要件である必要があります。非常に時間がかかり、すべての非パブリックメソッドのパラメーターに対してnullチェックを行う必要はありません。
-Bronumski

1

エッジケースをキャッチすることがQAの存在理由です。プログラマには、タイムリーに作業をプッシュする責任があります。エッジケースを探すためにすべての時間を費やすことは非常に非効率的です。適度に速い反復サイクルがある場合、これはまったく問題ないはずです。エッジケースの数は無限に近いです。「コア」のケースに問題がある場合、少し心配になるでしょう。開発者が開発の専門家であるように、テスターはテストの専門家でなければなりません。テスターが問題を見つけると、開発者に送り返します。開発者が問題を修正します。問題が解決しました。開発者がすべてのエッジケースを追跡する時間は、反復テストサイクルに要するよりもはるかに長くなります。また、テストについて説明するとき、ホワイトボックスユニットテストではなく、厳密にブラックボックステストを意味します。


1
これは本当に正しい答えではありません。品質の半分の仕事を出力することで報われるのは悪い習慣です。開発チームは、全体として高品質の作業を担当する必要があります。
デビッド

まともな開発者は、エッジケースを探す必要はありません。一部のコードは、エッジケースがないように記述されていますが、他のケースではエッジケースが明らかです。エッジケースを処理しないコードは不完全なコードです。
gnasher729

0

これは、テストドリブン開発が救助に役立つと考えているケースの1つです。これは、エッジケースやコードを破壊する可能性のあるものについて考えるのに役立つためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.