代码之家  ›  专栏  ›  技术社区  ›  Martin

为什么执行雅格尼如此困难?[闭门]

  •  7
  • Martin  · 技术社区  · 15 年前

    雅格尼-你不会需要的

    我只是一个初级开发人员,但我发现即使是高级开发人员也在做同样的事情。

    “嗯,这个系统可能会使用它,而这个,所以让我们为它设计。”

    15 回复  |  直到 15 年前
        1
  •  25
  •   Matt Rogish    15 年前

    为某事而设计

    …完全不同于

    为某些东西设计意味着您正在为将来的扩展设计应用程序,以防需要编写代码(这很好……这意味着您正在使软件可扩展且易于维护)。

    设计某样东西意味着你现在正在写整件作品……不管你是否认为有人真的会使用它。这不一定是一件坏事,但可能是对时间的巨大浪费。

        2
  •  9
  •   user151323 user151323    15 年前

    这与完美主义有关。让我们完善它,让我们为所有可能的未来场景做好准备。

    在决定需要它的机会时,实事求是和冷静是有帮助的:做出选择,然后回答“是”或“否”。也许是否定的。

        3
  •  7
  •   naaka    15 年前

    只要使用TDD!!!

    很少你会发现自己在为一个你不需要的特性编写测试。。。

        4
  •  7
  •   peterchen    15 年前

    因为雅格尼是一个原则,而不是万灵药

    从这个意义上说,雅格尼是在那里的 避免

    • 当您需要编译器时,请创建编译器,而不是自编译编译器框架
    • 不要低估实施工作。
    • 不要高估应用程序的生命周期和需求的稳定性

    平衡相互竞争的需求是困难的。但这就是为什么——正如麦康奈尔尖锐地指出的那样——软件开发是工程。


    其他原则——海事组织更基本的原则——是 最小意外原则 复杂性的封装 :一个实体的公共接口/契约应该比它的实现更简单-否则,要正确调用函数,我需要知道的比我自己需要知道的更多。有时,这意味着您的实现需要完成。

    /// Estimates the time required to comlete the batch.
    /// If the time cannot be estimated reliably, the return value is -1
    /// \returns [double] estimated time in seconds
    double EstimateDuration(Batch & batch);
    

    这是一份简单的合同。奥托,

    /// Estimates the time required to comlete the batch.
    /// If the time cannot be estimated reliably, the return value is -1.
    /// This function does not support looping batches (right now, looping
    /// batches only run under a servicve account with no UI, so it's not needed).
    /// Also, when the moon is full, the return value is -1, but an estimate 
    /// is found in batch.JeffsEstimate. This value is used only by Jeff's core 
    /// build script which runs roughly once a month.
    /// \returns [double] estimated time in seconds
    double EstimateDuration(Batch & batch);
    

    合同,是对实施的描述。

    设计没有坏处


    毕竟,他们是年长的 我不了解他们——他们的倾向可能是由于老派的灌输和对变化的恐惧。或者他们是大四的学生,因为他们知道自己的工作——他们已经知道你现在比以后更愿意做什么,以及哪些部分 可以

        5
  •  6
  •   Kylotan    15 年前

    一般来说,如果您发现自己在想,“它可能需要[xyz]”,那么这应该在您的代码中起到明确的作用。即使您不支持xyz编码,您也应该以这样一种方式编码,即重构以添加xyz支持是尽可能实际的。然而,有时这可能意味着使某些东西比严格需要的更通用。知道在这条道路上应该停在哪里可能是只有特定领域的信息加上经验才能告诉你的事情。

        6
  •  4
  •   JB King    15 年前

    用非技术性的术语写出需求有时也会有所帮助。这让我知道我必须在最后展示什么,而不必担心更精细的细节,例如,系统的用户不太可能阅读我的源代码并嘲笑我使用我们使用的任何命名约定。他们关心它的工作,做他们需要和想要做的事情。

    另一个问题是,“他们真的这样要求吗?”并尽量减少对功能的假设。如果它不在列表中,那么就把它删掉,尽管问问他们是否想要它。

        7
  •  3
  •   system PAUSE    15 年前

    您无法确定其他开发人员将如何使用您的工具,有时,灵活地进行设计更有意义,这样您的产品就可以在更广泛的场景中使用。向前兼容性也是一个巨大的考虑因素。

    YAGNI仍然适用,但“it”往往处于元特性级别,而不是特性级别。

        8
  •  2
  •   Brian Genisio    15 年前

    雅格尼其实更像是一个问题。作为高级开发人员,我们一直在违反YAGNI。这实际上是一个“需要”的问题。你需要它吗?定义“需要”。我见过用雅格尼教条形成的可怕的泥球。

    并不是说我认为雅格尼没用。。。总是值得问“我需要这个吗?”。

        9
  •  2
  •   Tequila Guy    15 年前

    答案介于他的方法和我的方法之间。我们怎样才能达成折衷?在试图做出一个“完美”的设计之间,如果将来不得不改变某些东西,人们会欣赏或讨厌它。

    至少在设计模块时,IMHO的答案可以归结为面向对象编程的基本原则,比如定义清晰的接口。

    因为你认为明天可能会被其他人使用,所以你计划放置的任何东西都必须经过数小时的辩论!你应该有充分的理由为那些目前连名字都没有的人添加“免费赠品”!

    对于这个问题,我仍然需要一个明确的答案。也许是这里的某位架构师设计了大型应用程序,并曾100次面对这种情况:)

        10
  •  1
  •   Justin Rusbatch    15 年前

    以一种使将来的特性更容易实现的方式设计应用程序是很好的,但是在需要之前不要真正实现这些特性。如何进行这项工作完全取决于您正在进行的项目。

        11
  •  1
  •   Ryan Michela    15 年前

        12
  •  1
  •   Beatles1692    15 年前

    我们公司有一个经验法则:当我们讨论设计一个新功能时,首先要回答的问题是“谁真的想要这个?”如果客户是幕后主使,那么我们会试图了解他真正想要什么,以及是否有其他方法来解决他的问题(而不是添加一个新功能)。如果团队成员要求使用此新功能,他应该有充分的理由。性能问题和市场营销问题是其中之一,在我们向代码库添加一些新特性之前,我们再次尝试充分理解请求并讨论所有可能的替代方案。

        13
  •  1
  •   ndp    15 年前

    • 清晰书写的用户故事/需求。如果你的工作的“验收标准”被清楚地列出,那么就更容易判断某件东西是进了还是出了。
    • 期望你快速完成事情的人(也许是你自己)。这迫使你确保你没有偏离正轨。
    • 每天站立(或更频繁),以确保你不会进入杂草
        14
  •  0
  •   Xetius    15 年前

        15
  •  0
  •   BenB    15 年前

    雅格尼通常是事后诸葛亮。只要确保你足够敏捷,在“雅格尼”变得明显时删除“我”。

    推荐文章