【问题标题】:YAGNI and junior developersYAGNI 和初级开发人员
【发布时间】:2009-07-18 19:06:57
【问题描述】:

在为新系统编写代码时,我不想在设计中引入我可能永远不需要的不必要的复杂性。所以我在这里关注 YAGNI,而是在我认为需要更多灵活性或职责变得更加清晰时进行重构。这让我可以更快地移动。

但是初级开发人员有一个问题,他们不知道何时重构或在哪里构建设计。他们只是在现有设计中塞进更多代码。

那么,解决这个问题的最佳方法是什么?我是否应该更频繁地构建一个更具前瞻性的设计,以便在添加时他们有一个很好的例子可以效仿,即使我们可能永远不需要添加任何东西?还是我应该继续进行更多的代码审查、教育等?还是两者兼有?

你们中有人遇到过这类问题吗?你是怎么解决的?

【问题讨论】:

    标签: yagni


    【解决方案1】:

    我会推荐代码审查或结对编程。它使您有机会教育您的开发人员并提高整体质量。

    【讨论】:

    • 确实,我希望更多的代码审查和指导初级开发人员能够更好地利用你的时间,而不是编写大量你不知道自己需要的多余代码,以防万一初级开发人员想要添加它(无论如何,他们经常会这样做与您的设计相冲突)
    【解决方案2】:

    也许您首先明确地认识到您的部分工作是帮助培养初级开发人员。如果你不是老板,管理层应该签字同意。管理层需要认识到,您的选择是现在开发它们还是以后清理它们,并且您需要管理层的支持来度过这将花费的时间。

    代码审查和结对编程是个好主意。它们特别好,因为它们不“只适用于初级人员”——我和我的一位亲密同事都这样做;我们在一起将近 100 岁,拥有超过 70 年的编程经验:-)

    但是这里有一个更大的问题:使您最有效的编程方法(YAGNI + 重构)对您的初级合作伙伴无效。我的经验是人们需要数年时间才能学习YAGNI 的好处,所以如果你期望他们只是学习你做事的方式,你会让自己失望。

    我鼓励您确定一些您认为对您的初级合作伙伴有用的方法。特定的方法可能无关紧要(异端!);我在复合/结构化设计、基于对象的设计、代数规范(!)和极限编程方面取得了成功。但是

    • 一定要选择一些有名字和文献的东西,让你的后辈能够以学习为荣,这是他们可以在未来的项目中使用的技能。

    • 为了表明它很好吃,你可能需要自己吃狗粮。选择一些你可以忍受并有生产力的东西。

    • 仔细观察你的后辈,并教他们一个决策程序,他们可以用来确定何时应该向你寻求指导。

    祝你好运!

    【讨论】:

    • 初级开发人员通常通过清晰的接口甚至单元测试来进行编码,从而获得最好的学习效果。通过亲眼所见学习良好的编码实践比自己动手学习要容易得多。
    【解决方案3】:

    他们年少而你年长是有原因的。

    意识到何时需要更改设计的能力就是其中之一。

    我会像你一样继续前进,但鼓励他们在事情变得困难时来找你。然后,如果需要,您可以与他们一起更改设计,这对您来说比重构它更容易,并且有助于您将知识传授给初级开发人员。

    【讨论】:

    • +1,但要小心——初级开发人员并不总是能意识到事情何时变得困难。对某些人来说,困难是正常的。
    【解决方案4】:

    一个很好的方式来展示设计的构建程度是指定设计在构建时将做什么,然后编写测试以涵盖新功能。测试通过后,开发就完成了。

    您可能会在此过程中意识到您忘记测试某些内容。这很好,并且是有用的反馈,可帮助您下次更好地指定。编写缺少的测试,并且只写足够的代码让它们通过。

    然后重构。知道重构时要寻找什么需要一些练习。开始

    • 我们刚刚编写的代码中是否存在可以消除的重复项?
    • 我们刚刚编写的代码与预先存在的代码之间是否存在重复?
    • 我们刚刚编写的代码是否涉及太多事情? (即,我们应该打破合作者吗?)

    重复几十次,它会变得更容易。

    【讨论】:

      【解决方案5】:

      另一种看待 YAGNI 的方式是,对代码的任何更改都需要证明是合理的。

      要求任何提交需要相关的单元测试(或 BDD 用户故事,选择你的毒药)可能会有所帮助吗?它有助于传达您的意图(您希望人们思考他们为什么要添加此功能)并且您可以免费获得回归测试。

      还让新手开始考虑模块化(通常需要使您的代码可测试),如果您以后确实需要重构,这将有很大帮助。

      【讨论】:

        【解决方案6】:

        我完全支持代码审查和教学,但我认为面向未来的设计也很重要。也许您可以从设计 API 和使用 API 的初级开发人员的角度来考虑它。这样一来,您就可以完成他们会搞砸的繁重工作(识别重复的代码并消除它),而他们会做所有没有效率地利用您的时间的繁重工作。

        当然,这必须与培养初级开发人员技能的需求相平衡。等式的两边都不能忽略。

        【讨论】:

          【解决方案7】:

          在我看来,这可能有助于确定他们将要做的工作,然后对其进行验证,以帮助他们建立判断力,这正是您所要求的。配对是一种选择,但如果您不能抽出那么多时间,那么可以设置一个“检查点”来查看他们的表现并防止他们走错路。

          【讨论】:

            猜你喜欢
            • 2021-08-11
            • 2010-10-28
            • 1970-01-01
            • 2014-06-02
            • 2022-07-04
            • 2021-07-24
            • 1970-01-01
            • 2010-10-05
            • 2010-11-28
            相关资源
            最近更新 更多