-6

(这不是一个调查 TDD 优点的问题。还有其他地方可以进行此类讨论。提前致谢。)

我遇到过太多不熟悉该技术的开发人员,他们也报告对测试驱动开发和 NUnit 不满意。

我听到一些负面评论,例如:

  • 我不喜欢 NUnit。 我在一年前尝试过,但我忘记了如何使用它。让我们使用我刚刚编写的这个 Windows 窗体应用程序作为测试工具。无论如何,测试代码都是一次性代码,什么是有什么区别?反正我过去的方法还不错。

  • 我对 TDD 持保留意见。在我们的最后一个项目中(顺便说一句,这是我第一次也是唯一一次使用 TDD 的项目经验),我们甚至不知道设计是什么。”

  • “更多的代码注释很糟糕?你疯了吗?如果你不介意的话,我真的有一些工作要做。” (来自老派的更多评论是更好的评论,你永远不会有太多评论。)

当一个新手抱怨说 TDD 在他们的第一个使用 TDD 的项目中“没有工作”令他们满意时,是 TDD 真的让他们失望了,还是开发人员自己的技能还不足以获得好的结果

如果他们不恨我这么说,我怎么能沟通呢?

问题的关键是,可以通过哪些外交手段与开发人员进行沟通,以鼓励他们更诚实地评估自己在新开发技术方面的新生和不足的能力,而不会危及我们重要的工作关系?

通常,许多开发人员显然还没有掌握 TDD 的许多重要元素,以便在他们的第一个项目中很好地完成它。

例如,与我交谈过的开发社区中的抱怨者很典型:

  • 甚至从未尝试查看或记住代码异味列表。

  • 甚至从未尝试研究重构目录,也从未在实际项目或玩具项目中实践过重构目录。对于某些人来说,可能需要学习更多的 OOP,以便能够很好地进行重构。重构不仅仅是“重命名方法”和“重命名变量”,它们显示为 Visual Studio 2005 重构菜单上的项目。

  • 甚至从未尝试过研究或参与使用紧急设计(通过重构)实现的实际项目,与预先使用设计完成整个项目相比,与仅在编写代码后才编写单元测试的整个项目相比,并且知道差异和它们之间的权衡和适用性。

他们似乎都曾经使用过 NUnit,所以无论他们用它做什么,都是 TDD,天哪,他们似乎认为。NUnit 或单元测试的存在并不意味着 TDD,但他们还不够了解,甚至不知道这一点。

这些都是聪明人。开发人员是聪明人,因为这是进入整个职业的门槛。否则你不能在这个职业中呆太久。当然,如果他们花时间研究这些材料,他们就可以理解。

当他们的经验和知识的总和显然太弱以至于无法对方法或其结果进行评估时,人们怎么能诚实地告诉自己方法论很弱呢?

然而他们确实……我相信这是一种自我保护的行为。或者是懒惰。如果你甚至无法从 Fowler 的重构书目录中说出三个重构,或者如果你无法说出几个代码异味,那么你就是重构的新手,并且可能也是整个 TDD 方法论,以及你所谓的 1或者2个项目经验显然是不够的。

我可以对人们说些什么,或者我可以引导人们关注哪些材料,以让他们做必要的事情来更多地了解 TDD 成功所依赖的技能,例如:

  • 单元测试,
  • 重构,
  • 设计模式,
  • OO设计和分析?

关于这些主题中的每一个都有整本书,有些非常好。也许也有一些更容易接受的学习技巧?我可以以身作则,但我自己给他们的时间是有限的,而且我还不是所有这些技术的黑带。

此外,他们一起去。没有彼此,它们就不能很好地工作。单元测试和重构就像花生酱和果冻一样。如果你不能 grep 单元测试,那么你的重构肯定不会有很好的结果!(问我为什么如果你还不知道,我很乐意向新人解释。)

同样重要的是,无论我做什么或说什么,都不会适得其反:

不能让我的同事疏远 TDD 概念;此外,我绝不能疏远我的同事 在接下来的许多年里,我将不得不每周与他们一起工作。

很难不让其他长期资深的开发人员感到不安,他们已经证明自己在编程的其他方面非常精通。他们理所当然地为自己过去的成就感到自豪,但是他们的自尊心或他们对编程中所有事情的掌握的自我概念几乎是无法克服的,而不会伤害他们的感情。一些高级开发人员还没有准备好面对他们不知道应该向其他人学习的一些新技术。在编程方面,高级开发人员可以更习惯和更自在地成为房间里的专家,有时他们要求被视为专家,即使在涉及 TDD 和相关技术和技术时这完全不现实。

我很高兴地报告说,在编写结构化自动化单元测试方面,我在扭转我们的常驻“反对者”之一方面取得了相当大的成功,一种方法是与他们一对一地使用结对编程。我猜,结对编程为学员提供了一些现实生活中的例子和经验,以及更有经验和知识渊博的从业者的直接指导。

但是结对编程是不够的。他们需要学习更多的重构、代码异味、OOP 概念和 OOD&A 概念,而我无法在一个项目中教授所有这些,甚至不能接近。

4

12 回答 12

17

把你的想法强加给别人并让他们接受几乎是不可能的。您可以使用自己的方法,也许其他人看到好的结果时会想学习。您是否只是期望像 TDD、结对编程等这些东西能够神奇地获得收益?

你也没有指出你的角色。(或者至少我没找到)

您可以尝试不同的策略:

提供关于 TDD 或 nunit 的午餐时间研讨会。展示你看到的好处。为开发人员/公司提供真实的例子和真正的好处。没有这些,您将不会有乐于接受的听众。

至少你有编写自己的测试工具的人——这是一件好事。我会赞扬这一点,并要求看到更多。

询问开发人员他们对这个问题的看法,他们想要什么样的测试,或者公司可以如何改进。你必须停止强加你的想法,让它来自他们。

编辑 - 从经验

多年前,我也有过类似的经历。我已经阅读了许多关于流程和开发软件的正确方法 (tm) 的书籍,并开始告诉我看到的每个人关于做事的正确方法......没有人想听到它。我意识到我冒着被边缘化的风险并没有真正完成任何有用的事情。所以我只是闭嘴,并在我刚刚获得领导权的小组中实施了一些好的做法。大约 4 个月后,人们开始问我们如何获得我们所交付的结果。

不是去找别人,而是来找我们。(那不是我的计划,但回想起来这是有道理的。人们想要结果,而不是热空气)

于 2008-11-19T23:01:07.833 回答
10

将您的问题浓缩为一行:

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 只是指定设计的另一种方式。这是 TDD 的重要部分,可以在一定程度上锁定设计。

于 2008-11-19T23:02:52.323 回答
7

也许 TDD 不是问题,但您是否考虑过它是否真的适合您工作的环境以及您正在从事的项目类型?您没有提及您当前遇到的问题(甚至您当前使用的方法和实践)以及为什么采用 TDD 会解决这些问题。你确定你看到的阻力不是因为改变阻力,而是因为你试图解决一个不存在的问题吗?

TDD 并不适用于所有环境。它确实不适合我工作的地方,因为我们工作得太快了,规范通常是粗略地编写以开始并在每次迭代中改进/更改/重写,所以我们没有任何定义的行为来测试大多数时间。此外,我们开发了一些实践,这意味着代码在许多情况下根本不需要测试,因为该方法是静态类型检查确保必须工作的单行代码。

您的帖子中有很多评论将您标记为可能相对缺乏经验的人,并且已经锁定了您认为可以解决所有问题的灵丹妙药的方法,如果您的同事要保持这种方法,他们必须学习和你在一起。不幸的是,软件开发没有灵丹妙药,如果他们是有丰富经验的高级开发人员,并且他们不认为 TDD 是合适的,那么也许,只是也许,值得听听他们的意见。

您还应该知道,TDD 并不是重构的先决条件,正如那些喜欢“红绿重构”口头禅的人所希望的那样。如果您正在重构一个小区域并且您知道它会影响什么,并且可以轻松地手动测试它,那么您可以在重构期间和重构之后手动测试该区域。

于 2008-11-19T23:15:08.990 回答
4

只是为了装逼,你为什么这么肯定TDD真的有效?个人经验?实证研究?

这里有两项研究报告了 TDD 的积极结果:

还有两个没有定论:

我不确定将方法论呈现为完美无缺是一个好主意。这是一种可能有效的方法。据我们所知,还有更好的方法。也许邀请所有开发人员设计一种适合您组织的混合方法。

于 2008-11-19T23:07:56.697 回答
4
  • 没有人愿意被告知他们在自己的专业领域不够专家。年纪越大的人,他们就越不愿意采用一种让他们感觉自己像个新手的新方法。

  • 我在推广测试方面取得的最大成功是创建测试覆盖率的图形报告,并将它们发布给团队(或者让内部团队网页与持续集成测试报告挂钩)。是的,测试覆盖率并不是质量的全面衡量标准,但它是一种非常简单的方式来显示谁在编写测试,谁不是。

  • 让我们进行大学竞争,看看谁能将他们的代码覆盖率保持在最高百分比。人们喜欢竞争。当他们落后,或者如果他们用不可测试的“代码口袋”编写代码,也许他们会考虑重构它的方法,以便他们的测试确实显示代码覆盖率。如果他们不喜欢被“教育”,那就让他们自己发现重构技术。这样他们就可以继续感到聪明。

  • 或者有一些棕色袋子午餐,人们可以在其中展示他们为实现更高的可测试性所做的一些巧妙的重构。人们喜欢炫耀!他们比他们更喜欢被展示他们的无知。

  • 这与 TDD 相距甚远,但至少在更好的 QC 方面取得了一些进展。一旦他们对工具和一些简单的重构方法更加熟悉,那么您就可以逐渐引入一些更高级的东西:结对编程...代码审查...检测代码异味...跟踪需求到测试。 然后你可以绕过 TDD。

正如 Steven Lowe 在这篇文章中所说,罗马不是一天建成的。

于 2008-11-19T23:17:20.513 回答
3

您真正的问题是“我如何说服我的同事尝试新事物?”

这是一个非常好的问题,很抱歉这真的很难。几年前,我与 Alistair Cockburn 就这个主题进行了一次谈话,我已经发布了幻灯片,但还没有写出文字,但我可以在这里给出一个简短的版本。

您是否熟悉技术采用生命周期跨越鸿沟?这些涉及人口的各个部分及其改变的动机。与您的情况相关的关键思想是,只有位于鸿沟左侧的人——创新者和早期采用者——有兴趣改变以尝试让事情变得更好。鸿沟右侧的人——大多数人——更抗拒改变,而当他们改变时,原因与左侧的人不同。结果,这两组人往往会互相交谈。

你在鸿沟的左边。你的大学在右边。如果你一直给他们改变的理由,你就不会说服他们。

说服他们尝试新事物的是,如果它提供了减轻他们目前感受到的一些痛苦的可靠承诺。

谈论 TDD 如何变得更好以及您应该做什么,而您正在谈论它们。

谈论TDD如何解决当前的一些痛苦,你会引起他们的注意。

还有杀手锏?如果没有当前的疼痛,你就不可能让他们改变,时期。

这就是为什么选项是“更改您的组织或更改您的组织”。

祝你好运!

于 2008-11-20T00:14:41.477 回答
1

引起我注意的第一件事是:“无论如何,测试代码都是一次性代码”。我的意思是,哇。

当然,TDD 的情况正好相反。您的测试成为您的回归防火墙,并允许您自信地重构和添加功能。

以我的经验,将这样的做法引入抗拒(但不是完全顽固)的公司文化中必须有两件事:你必须有一个得到它的经理授权的做法,你必须有一个工程师在以前使它工作的团队。该工程师的时间必须在实际项目工作和指导之间分配,指导采取小组演示、代码审查和(准备好)结对编程的形式,以直接向人们展示如何将实践应用于他们试图解决的问题。

除了过去成功之外,这位工程师还必须是一位熟练的教师,并且(因为您要求人们做出改变,大多数人会认为这是人身攻击)具有不具威胁性的个性和教学方法。

祝你好运。

于 2008-11-23T20:09:12.047 回答
1

这需要时间,并且需要(因为没有更好的词)营销。TDD(或一般的单元测试)在团队成员尊重的人提倡之前不会被接受。

如果您还不是团队中最受尊敬的成员之一,那么您要么必须成为其中一员(通过展示卓越),要么专注于一个或多个技术领导者,让他们站在你这边。

当然,每个人都是不同的,您必须弄清楚如何向各个部落首领展示 TDD,以便他们尽可能地接受这个想法。

绝对必须发生的一件事是必须使创建测试和运行测试变得超级容易。如果您是从人们对 TDD 的优势持怀疑态度的位置开始的,那么尝试它的道路上的任何小颠簸都会非常缺乏动力。

于 2009-10-29T03:53:55.197 回答
1

罗马不是一天建成的+其他陈词滥调的耐心

继续结对并树立好榜样,其他人会看到光明并效仿你

你可以把马牵到水边,但你不能让他喝水。如果你把他推到水里,他要么淹死,要么逃跑。;-)

于 2008-11-19T22:57:35.827 回答
1

更有可能的问题是,在习惯 TDD 风格和创建 TDD 所需的文化的同时降低生产力是否是我认为事情出错的地方。

那些高级开发人员的生产力是否会大幅下降,这是每个人都可以接受的吗?如果您能感觉到每个人都可以重新学习如何开发代码,那么您可能会有所收获,但请记住,大多数开发人员都有自己的个人优化来编写我认为 TDD 会取消的代码,例如猜测然后解决错误可能是一种常见的方法,如果您使用严格的 TDD 形式,它并不能完全消除它。

于 2008-11-19T23:10:17.613 回答
0

有关使用 TDD 解决 hello world 问题的示例方法,请参见下面的链接

https://stackoverflow.com/a/15163004/2124293

你可以看看 hello world 的简单性,但看看你可以从思考过程中得到什么

于 2013-03-01T17:10:41.437 回答