4

在我看来,敏捷方法论鼓励我们保持简单、精简,而不是在需要时才增加复杂性和复杂性。但技术变革的速度和规模鼓励使用越来越抽象、复杂和复杂的工具和模式,以复杂的方式解决我们可能尚未(并且可能永远不会遇到)的问题,并具有显着的学习曲线和大量的努力投资。

4

9 回答 9

11

KISS 和 YAGNI 是否与日益复杂的趋势不符...

汽车有一个加速器一个制动器,以及一个可以左转和/或右转的方向盘:由驾驶员决定何时使用哪个。

于 2009-09-10T01:49:25.187 回答
4

我会保持简短的回答,让专家更好地阐述......

我认为 KISS 适用于您列出的所有内容。你提到越来越多的抽象和复杂性,我认为它们是相互平衡的。

我们今天正在开发的系统一定很复杂,因为大多数时候,复杂问题的解决方案本质上是复杂的。但是,为了简单起见,我们使用抽象。即使我们的复杂系统是用 8 层构建的,我们也可以通过保持每一层简单来遵循 KISS。

例如,从列表中选择一两个项目:

  • SOA 并不复杂,因为我们可以将服务调用包装在一个包装器对象中。这个对象处理连接并进行调用,这很容易做到,因为它们只是传递参数。
  • MVC 并不复杂,因为我们清楚地分离了我们的逻辑。我们有一个用于引导请求和设置数据的简单控制器,一个表示我们的域的简单模型,以及一个显示传递给它的任何数据的简单视图。

但是,在这两种情况下,整个模式(或系统,如果你愿意的话)都是复杂且重要的。事实上,我们一次只考虑一个小而简单的部分,然后将它们组合在一起,这让我们在工作时能够保持我们的思维模式。

于 2009-09-10T01:49:12.003 回答
3

我同意ChrisW 的回答

这个想法是尽可能地坚持使用 KISS 和 YAGNI,但是当需要出现并且您需要一个复杂/复杂的解决方案时,站在巨人的肩膀上并使用经过验证的模式来指导您。这些模式和实践旨在简化您的工作,如果使用它们比 hack 替代品更难,您应该坚持使用 hack。只要确保你考虑到可维护性等。

例如,当您构建网站的第一个版本时,它可能包含 1 或 2 个主要功能和几个页面。您可能不需要 MVC (即使以这种方式开始可能很好)但是,在您添加更多功能并且您有几十个页面要管理以及如何在它们之间共享功能之后,它可能会变成显然您需要 MVC 来更好地构建您的应用程序。

类似地,如果从一开始你就知道你将不得不处理返回一个公共数据的多个视图之类的事情,MVC 通过为你制定一个模式来简化你的问题。

总而言之,现在是 YAGNI,但如果您以后需要它,然后使用已知模式/解决方案 KISS。

于 2009-09-10T02:34:12.087 回答
3

叹。

我们必须拥有越来越复杂和抽象的组件来满足对越来越复杂的软件的需求。

我们大多数人的大脑空间有限。我们必须学会通过使用更复杂的抽象来应对我们有限的大脑。

另一种方法是不使用抽象,将自己限制在机器代码上。

请阅读http://www.cs.utexas.edu/~EWD/transcriptions/EWD01xx/EWD117.html

“尽管存在所有缺陷,但数学推理提供了一个出色的模型,说明如何用有限的大脑来掌握极其复杂的结构。而且似乎值得研究这些经过验证的方法在多大程度上可以移植到计算机使用艺术中。在编程语言的设计中,人们可以通过考虑“机器能做什么”来引导自己。然而,考虑到编程语言是用户和机器之间的桥梁——事实上,它可以是被视为他的工具——考虑“人能想到什么”似乎同样重要。正是在这种情况下,我们将继续我们的调查。

于 2009-09-10T02:43:04.143 回答
2

我将做出一个主观的回答(所以起诉我)。我认为如果你用首字母缩略词编程,那么你会遇到麻烦。

归根结底,您是想为企业赚钱,或者希望自己赚钱。因此,您做出的每个决定都是基于成本、时间和收益的工程决策。您必须在实施成本、维护成本等方面评估技术的使用,并做出最佳选择。

我认为唯一公平的答案是选择的工具和技术必须与工程的预期目标相匹配。

于 2009-09-10T01:50:31.410 回答
1

首先,首字母缩略词列表并不一定有意义 - 例如,没有比 POCO 更简单的东西......

然而,在许多情况下,通过使用 IoC、MVC 和 MVVM 等概念最有效地实现 KISS 和 YAGNI - 只要您正确使用这些模式。

模式本身并不复杂。可能需要一些学习才能理解该模式试图完成的任务,但通常,模式的存在纯粹是为了简化代码、维护或可用性——通常是以上所有。例如,这与保持简单完美契合。

于 2009-09-10T01:51:20.783 回答
1

它是正确工作的正确工具的问题。问题在于架构师和/或开发人员开始相信特定方法或技术是“金锤”。那是事情变得宗教化的时候,宗教和理性不能很好地结合在一起;)

哦,顺便说一句,“敏捷”并不一定意味着您不使用您提到的某些首字母缩略词,或者某些实现它们的框架。这些决定通常是在实施开发人员与敏捷相关联的各种事物(例如用户故事、冲刺等)之前做出的。

于 2009-09-10T01:48:30.647 回答
1

恕我直言,您(通常)不想从复杂的设计开始。这可能是本地方法而不是服务吗?我还需要一个 IoC 容器吗?当涉及到设计模式时,这一点尤其重要。

但是,当您测试和重构代码时,某些模式(例如 Ioc)将帮助您实现目标,例如可测试性和 DRY(不要重复自己)。如果你很了解设计模式,你可以在适当的时候应用它们。

于 2009-09-10T02:20:36.863 回答
-1

是的

-- 这个空间故意留空 --

于 2009-09-10T01:58:33.140 回答