与开发人员打交道,不断忽略其工作中的极端情况


25

我猜想我团队中的一位开发人员有一个有趣的,相当普遍的问题。这个家伙是一个伟大的开发人员,工作迅速且富有成效,产生相当高质量的代码。好工程师 但是他有一个问题-他经常无法在代码中解决边缘情况。

我们多次和他谈过这件事,他正在努力,但我想他只是不这么认为。所以最终发生的事情是,QA会发现他的代码有很多问题,然后一次又一次地将其返回给开发人员,最终导致错过最后期限,并且团队中的每个人都不满意。

我不知道该如何对待他以及如何帮助他克服这个问题。也许有更多经验的人可以建议?


11
让某人用单元测试覆盖他的代码。
Job

8
测试代码的最佳合格人员是其作者。

16
@Developer Art:完全不同意。进行代码测试的最糟糕的人是开发该代码的人。每个人都有盲点,但是进行创建的人相对于他的代码有最大的盲点。
James P. Wright

2
@Developer Art:我相信编写自动化测试实际上是一个相当普遍的角色。通常,如果您还没有准备好在公司工作的黄金时间,则需要进行一两年的检查。这是一段炼狱时期。
Morgan Herlocker 2011年

19
您将他描述为“伟大的开发人员”,“富有成效的”,“优秀的工程师”,并生产出“高质量的代码”。但是质量检查人员一直在发现他的工作存在问题。 -在他们的代码中注入缺陷吗?我想知道这个故事是否还有其他内容,因为对个人的描述与他们所做的工作根本不匹配
Thomas Owens

Answers:


29

要求他为其代码编写自动化的单元测试。编写单元测试会迫使人们仔细思考一些案例。

一些细节:

  1. 为了确保他不会被选拔,应该为整个团队建立这种做法。要求所有人针对新代码或他们修改的代码编写自动化的单元测试。
  2. 要求单元测试名称必须描述所测试的情况。
  3. 在代码审查中全面介绍自动化的单元测试。让审稿人寻找遗漏的测试用例(即他常年遗漏的那些边缘案例)。在他的团队对遗漏的边缘案例提供了一些反馈之后,他可能会学会在审阅之前考虑这些案例。
  4. 对整个团队强制执行此规则:如果QA发现错误,则负责开发的人员应归功于自动测试,该测试确认了故障,然后证明他们已解决了问题。(在他们做任何其他工作之前)

阿们,甚至更好,要求每个人都首先编写测试代码。使用BDD框架通常可以减轻这种
麻烦

@乔治好主意。TDD将在这里提供更多帮助。
马修·罗达图斯

3
单元测试是不是发现错误- blog.stevensanderson.com/2009/08/24/...
纽斯

1
@Dainius,我同意。单元测试有助于开发人员仔细思考可能会排除(但无法识别)错误的情况。
马修·罗达图斯

After some amount of feedback from his team about missed edge cases, he will probably learn to consider those习惯不良的开发人员通常会争论良好习惯所需的额外工作无关紧要(因为他们看不到这样做的好处)。尽管开发人员可能会默认添加其他边缘案例,但这并不意味着他认为这很重要,也并不意味着他是否会自己添加它们。
更加平坦

23

给他一张清单,例如

  • 空输入
  • 输入范围很大
  • 输入范围极小
  • 组合
  • 输入违反假设不变性(例如,如果x = y)

质量检查人员可以帮助设计清单

将清单提供给所有开发人员,而不仅仅是这份清单。


1
所有开发人员都应使用清单的好处是,挑出一名开发人员可能会造成不良的感觉。它可以帮助提高每个人的代码质量。
FrustratedWithFormsDesigner

好主意,尽管我很好奇如何从开发人员的角度来看。在我作为开发人员的职业生涯中,我从未真正遇到过这种做法,因此很难评估这种反应。有什么见解吗?
亚历克斯N.

@Alex:清单是某些开发人员的常规做法,对其他开发人员则是一种可怕的侮辱。尝试一下,看看会发生什么。如果他辞职,那么您的代码质量将会提高;-)
Steven A. Lowe11年

4
您的开发人员不会使用清单吗?如果清单可以挽救生命,他们会使用它们吗?许多医生不这样做,患者会受苦。读这本书:newyorker.com/reporting/2007/12/10/071210fa_fact_gawande
Barry Brown

1
@Barry,我没有说他们不会。清单在这种情况下听起来不错,恕我直言,就像是对问题症状的一种补救措施,而不是问题本身。在这种情况下,问题在于纪律和勤奋。如果问题是系统的复杂性,需要紧急维护,高度的责任感和压力,导致对细节的关注程度下降,那么,是的,清单ftw(飞行员,医生等),但是更多我猜想是在这个问题的范围之外进行的哲学辩论。
亚历克斯N.11年

17

好工程师

好的。

但是他有一个问题-他经常无法在代码中解决边缘情况。

优秀的工程师所无法比拟的品质。


注意边缘情况是人中是否存在的一个特征。它与成为工程师或程序员无关。这一特征的发展受文化背景,生活环境,童年事件和生活经历的影响。然后,将态度简单地应用于个人所做的任何工作。

您需要的是找出您的人是否属于这种尚未发展到某种意义上的人(也许还没有)。他也很可能出于某种原因不在乎。您需要分析整个情况,他的工作是否愉快。如果不是这样,也许您应该先做些帮助他的事情。

如果他的工作还不错,但还没有经历过边缘案件的危险,那么您可以开始对他进行教育。如果他认真对待,他可能会随着时间的推移改变自己的方式。尽管我对此表示怀疑,但您仍然可以尝试一下。

但是,如果他变成那种在边缘情况下不擅长的人,那么您可能别无选择,只能将他从团队中删除。该特性对于实际编程至关重要。可悲的是,没有它,即使一个伟大的人也无法创造出出色的工作。


6
+1这是一种技巧,有些人有一些人必须要学会一个优秀的程序员。但是,我注意到有两种类型的边际案例:业务需求边际案例(“如果我们订购27位左培训员和28位右培训员,那么订购可能是错误的”),这应在项目需求中处理,而实际情况对边缘情况进行编码(处理无效输入,当哈希集变得比x大时,在散列集更明智的速度下不断地遍历列表等),这是您还需要了解的更多内容。
Ed James

感谢您的见解。真的很感激。您在这里的所有方面都很正确,尽管我很好奇,但如果他是一个伟大的人,却缺乏使伟大的工程师变得伟大的东西,那么我如何仍可以让他从事其他工作并将他留在公司中,也许转移到另一支球队或其他东西...虽然我猜只有我能回答这个问题:)
Alex N.

我一直在考虑,但是不确定。对于这类人来说,另一个可以接受的角色不需要关注细节,并且软件公司中没有很多细节。

世界并没有您的第一句话所暗示的那么黑与白。我认为有一些开发人员可以识别某些极端情况,但不是全部。
Mike Partridge 2012年

5

您能否在此过程的早期进行代码审查或设计审查?


4

教他编程测试优先。与他配对。您将编写测试用例,他将编写代码以通过测试。


3

是否可以让QA尽早参与功能开发,从而帮助他提供一开始就要涵盖的边缘案例列表?尽管有些人可能不希望开发人员涵盖所有内容,但如果开发人员倾向于错过测试人员最初可能会抓住的那些边界情况,则这可能是解决此问题的一种方法。

我在这里遇到的另一个想法是他如何看待这个问题。他真的为这种模式感到烦恼并tick之以鼻吗?还是他只是认为这是正常现象,而不是让他担心解决的问题?当然,这确实需要很大的信任,并且要让他保持开放的态度,但是我认为,如果您能从他的角度看到事情,这里会有一定程度的同理心可能会有所帮助。


3

边缘案例的数量是无限的,将它们全部覆盖都是不可行的。如果有人这样做#define TRUE FALSE怎么办?它增加了边缘情况,您也会检查它们吗?

另外,我不会考虑对私有类或内部函数的每个函数进行安全验证。

我为必须非常扎实和稳定的代码选择的方法是:

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

这样,您就可以在质量检查中获得可靠的应用程序转储,并且在发布之前,该应用程序是可靠且安全的。

解决错误是不好的。好的,如果文件句柄为null并返回null,则可以保存一个函数,但是在大多数情况下,某处存在设计错误,而应用程序崩溃是强制您查找原因的更好方法。大多数边缘情况只是通过隐藏问题来掩盖错误,例如-按钮停止工作。崩溃告诉您有关产品的某些假设是错误的,因此您必须修改导致崩溃的逻辑。


#define TRUE FALSE不是极端情况,而是解雇罪。
gnasher729

1

如果是极端情况,是否甚至需要考虑?如果边缘案例很重要,则需要将边缘案例输入到需求/功能/用户案例中。

如果边缘盒被认为是一件工作的一部分,并且要求将设备放在适当的位置,那么它们应该是工作项目的一部分,并且根据定义,直到处理边缘盒的机制得以完成,工作项目才是完整的到位。

这给您作为团队负责人在工作后讨论期间完成工作后需要检查的东西,并且为开发人员在完成工作时需要检查的东西提供了检查。


总是有边缘情况。如果有人声称永远不会遇到极端情况,那不是正确的情况。
巴里·布朗

1
@Barry Brown我同意总会有一些极端情况,但是利益相关者认为很重要的重要案例(我们可以将它们称为场景)与开发人员认为重要的极端案例之间是有区别的。如果利益相关者认为重要的事情,那么应该在计划会议上进行讨论,并将其作为用户案例中的一个场景包括在内,而不是让开发人员去思考,这应该是完成任务的适当要求。这是非常耗时的,不需要对每个非公共方法上的参数进行空检查。
Bronumski 2011年

1

赶上前沿案例是为什么存在质量检查的原因。程序员有责任及时进行工作。将所有时间都花在寻找极端情况上是非常低效的。如果您有一个相当快的迭代周期,那么这应该完全没有问题。边缘案例的数量接近无限。如果“核心”案件有问题,那么我会有点担心。正如开发人员是开发专家一样,测试人员也应该是测试专家。当测试人员发现问题时,他们将其发送回开发。开发人员解决了该问题。问题解决了。开发人员追踪所有极端情况的时间比迭代测试周期所需的时间长得多。还要注意,当我谈论测试时,我并不是指白盒单元测试,而是严格的黑盒测试。


1
这确实不是正确的答案。因输出半质量的工作而被奖励是不好的做法。开发团队应整体上负责高质量的工作。
大卫,

体面的开发人员不必寻找极端情况。编写了一些代码,使其没有极端情况,在其他情况下,极端情况是显而易见的。不处理极端情况的代码是不完整的代码。
gnasher729

0

我认为测试驱动的开发可以解救这种情况之一,因为它有助于从边缘情况和任何可能破坏代码的方面进行思考。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.