调试是一种难闻的气味 - 如何说服他们?

时间:2008-11-01 20:13:12

标签: debugging tdd

我一直致力于一个不能再被描述为“小”的项目(40多个月),一个团队不再被定义为“小”(约30人)。我们一直在使用敏捷/ Scrum(1)实践,以及健康的TDD剂量。

我不确定我是从Agile还是TDD中选择了这个,更可能是两者的组合,但我现在显然是在那些将调试视为难闻气味的人群中。通过'调试',我不是指更复杂的概念,即弄清楚系统可能出现什么问题,而是指在调试模式下运行系统的具体活动,逐步完成代码以找出其他难以理解的细节。

由于我相信,这个问题并不是关于调试是否是一种难闻的气味。相反,我想知道如何说服我的队友。

认为调试模式是'标准'模式的人倾向于编写只能通过调试才能理解的代码,因为每次你在某个人开发的代码之上处理项目时会浪费很多时间否则,你首先要花费相当多的时间来调试它(而且,因为没有涉及到错误......这个词变得越来越荒谬) - 然后就会出现孤岛。所以我很想说服我的一些队友避免调试模式是一件好事(2)。但是,由于它们习惯于处于调试模式,因此它们似乎没有看到问题。对他们来说,花费数小时调试别人的代码,然后他们甚至开始做与他们的新项目相关的任何事情是常态;他们没有看到任何错误。此外,由于他们花时间'搞清楚',他们最终知道工作该区域的开发人员将可用,并且该项目将被传递给他们(导致另一个孤岛)。

帮助我想出一个让他们脱离黑暗面的计划!

提前致谢。

(1)也称为SCRUM(全部大写)。抛开资本化论点,我认为必须使用术语后的星号,因为 - 毫不奇怪 - 我们的组织“调整”敏捷和Scrum流程以适应所有利益相关者的感知需求。所以,老实说,根据理论,我不会假装这是100%,但这与我的问题无关。

(2)是的,总会有时候我们 进入调试模式,我不是绝对避免它,只是...试图最小化数量我们必须深入研究它。

13 个答案:

答案 0 :(得分:17)

如果你想说服你的同事你的编程实践更好,首先要证明你​​的生产力比你更有效,至少对某些任务来说是这样。然后他们会在你解释你如何完成这些工作时相信你。

有时也更容易专注于具体的事情。您的同事甚至会谈论“代码味道”吗?也许你可以专注于诸如“当ABC模块失败时,需要永远调试它;使用XYZ技术要快得多。这里,让我演示一下。”然后你可以提到你的基本原理,这是调试器是一个有用的工具,但通常还有其他更有用的工具。

答案 1 :(得分:8)

答案 2 :(得分:5)

  

由于我非常确信,这个问题并不是关于调试是否是一种难闻的气味。

那么,你当地的教会可能更适合你的问题。

除此之外,通过争论说服他们。然而,你可能想重新考虑一下你的原教旨主义立场,因为这与说服力完全相反。您可能想要做的一件事是在整个讨论中删除“调试”一词,并通过“单步执行代码”或类似内容来替换它,强调您反对无意识的猜测/拼凑练习探究您谴责而不是知情反思代码。

(我仍然不同意你的看法,但除此之外,你不想讨论这个问题。)

答案 3 :(得分:5)

这里有些不对劲,但很难把手指放在上面。也许真正的问题是代码有其他气味使其难以理解。我同意使用TDD时,应该使用较少而不是更多的调试器,因为您将以较小的增量开发代码。但是,如果您无法查看代码并理解它,也许是因为设计过于耦合 - 需要太多相互关联的类才能使事情发挥作用。

如果代码真的需要如此复杂以至于观察不够,那么也许你需要投入一些好的评论,解释发生了什么 - 尽管我更愿意看到重构的东西到评论的地步不需要。我怀疑调试器可能是一个症状,而不是问题。

我知道,对于我来说,从传统的代码优先开发转换为测试优先开发已经减少了调试时间......而且这不是我想念的。通常情况下,我只会涉及调试器时,为什么我刚刚编写的代码通过测试并不明显,为什么没有。

答案 4 :(得分:5)

我认为这里的真正问题是

  

相信调试模式的人是   '标准'模式倾向于编写代码   只有通过才能理解   踩到它

如果这是真的,应该是显而易见的错误,不应该讨论它。如果它不明显,那是因为他们没有看到如何改进编写得很糟糕的代码。展示它们,进行代码审查,在那里展示如何以一种明确的方式重构代码,而无需单步执行。

一旦编写了更好的代码,代码步进将自动消失它只是无法正常工作。人们仍然会编写错误的代码,如果他们避免单步执行它只会导致更多浪费的时间(该死的我希望我可以通过这个意大利面条乱七八糟),而不是更好的代码。

答案 5 :(得分:3)

这听起来像你说你不想拥有的论点,但我想如果你想说服你的队友,你将不得不做出更强有力的案例。我不明白你的反对意见。我经常单步执行我试图用调试器理解的代码。这是一个了解正在发生的事情的好方法。您尚未确定以这种方式使用调试器的人倾向于编写难以理解的代码。唯一令人信服的方法是通过某种案例/控制研究,试图测量和比较人们用不同的调试方法编写的代码的可读性。而你甚至没有讲过一个似是而非的故事,解释为什么你认为使用工具来理解代码执行往往会导致代码构造更加笨拙。对我来说,这是一个完整的 non sequitur

答案 6 :(得分:1)

让他们相信另一种方法的优势的“计划”是建立 metrics 链接到调试的时间不同错误的相同功能。

通过分析该指标的趋势,您可以说服他们 非回归 测试对于花时间写作更有用,并且将帮助他们更有效地调试。

这样,你就不会完全脱离“调试”习惯,但是你说服他们建立一套可靠的测试,如果需要,他们可以专注于真正有用的调试会话。

如果您考虑这种行动方案(指标),您应该知道其实施涉及所有层次结构(利益相关者,项目经理,架构师,开发人员)。他们都需要参与这些指标,以便采取行动。

关于开发人员,您可以尝试建议:

  • 关闭bug案例的一些新方法(只关闭它以重现该bug的测试场景,意味着他们需要一个独立的测试,以便在需要时启动他们的调试会话)
  • 这些指标与管理层评估之间存在明确的关系(在同一个功能上进行调试将是一种不好的做法)
  • 更多地参与架构决策:有时,了解一些功能或应用功能而不仅仅是类和代码可以促使开发人员在黑盒测试而不是白盒子方面进行更多思考(这可以更容易导致调试会话)
  • 参与“运营架构”流程(您需要部署应用程序,并进行完整的前端到后集成测试)。同样,所有系统的更大图片可以帮助开发人员对功能感兴趣而不是“代码行”

答案 7 :(得分:1)

我认为这个问题的一个更好的措辞是“非TDD代码味道吗?”由于花费更多时间编写/失败/通过测试,TDD似乎可以减少在调试器中花费的时间。如果没有TDD,您更有可能在调试器中花时间来诊断错误。

至少在Visual Studio中,使用调试器并不是那么痛苦,因此您面临的挑战是向您的队友解释TDD如何使他们的开发更加愉快,高效和成功。仅仅避免使用调试器可能不足以让团队切换他们的开发方法。

答案 8 :(得分:1)

正确的路上战士。 调试不是问题,它的评论很差,或者记录的代码和糟糕的结构。我在一个较小的团队工作但是当一个bug出现时,我会逐步完成代码。经常这是一个非常小的工作,因为应用程序计划周密,代码上的文档清晰。

那说让我们明白我的观点。希望团队不要调试...评论,评论评论。没有什么比调整更快的冲动更好了。当然他们仍然会这样做,但他们更有可能跨过记录良好的代码。

哦,虽然不言而喻,但无论如何我都会这样做。你的代码中没有bug。 :)

答案 9 :(得分:1)

我同意上述那些表达了这种“调试器问题”相对无关的内容。

IMO,开发者的两个最重要的目标是:

1)让软件做它应该做的事情。

2)编写代码,以便维护开发人员在未来2年享受改变现有或添加新功能的经验。

答案 10 :(得分:1)

在制定计划之前,您应该决定这一变化对您的重要性。虽然我同意调试是一种气味,但对于开发人员而言,它也是一种非常被接受和根深蒂固的做法,所以说服他们应该停止这样做并不容易或快速 - 并且有充分的理由。你想在这个主题中投入多少精力?

第二,你为什么要首先说服他们?如果你的动机是帮助他们,那真的是他们的首要问题吗?当您以他们希望得到帮助的方式帮助人们时,change becomes easy

一旦你决定继续你的改变计划,你需要考虑到不同的人被不同的事情所说服。有些人已经通过尝试新的和令人兴奋的东西而深信不疑。有些人会被数字(指标)所说服。有些人在吃他们最喜欢的饼干时被告知(严肃地说!),有些是从他们最喜欢的大师那里听到的。一些人在杂志上阅读它。有些人看到“其他人也在这样做”。等等。

在InfoQ上对Linda Rising就此主题进行了深入的采访:http://www.infoq.com/interviews/Linda-Rising-Fearless-Change。她可以说比我好多了。这本书也很好。

无论你做什么,都不要压得太多,也不要放弃。变化可能发生 - 特别是如果你采取resistance as a resource - ,有时它会在意外时间发生,所以总是keep a sense of wonder

答案 11 :(得分:0)

@FOR:你还有第二个问题,就是:

  遗憾的是,开发人员似乎并没有兴趣提高工作效率(无论如何他们都得到同样的报酬)

如果没有(可见)可以获得打算让让他们想要更高效?

答案 12 :(得分:0)

通过调试设计软件是一种很好的做法

支持这种开发方式的环境数量非常少:最着名的是Smalltalk。在Smalltalk中,您可以编写描述对象协议的测试,而无需实现方法。然后运行此测试将触发调试器,您可以将该方法添加到调试器中的正确类,并可以继续单步执行代码,直到实现所有功能并且测试为绿色。

这需要编译器在运行时和第一类调用时可用。它提供了非常短的反馈周期,是Smalltalks'的主要原因之一。生产率