我刚刚读了您发布的文章链接,我不得不说Fowler提出了一些非常好的观点,他说了很多话,多年来我一直在与我们的团队一起提倡。
海事组织,如果您进行任何体面的设计,则不应陷入困境。我一直认为软件是由构建块组成的。我仍然相信一些前期设计,但主要目标不是设计整个产品,而是提供总体架构/方向,以便您的团队可以形象化我们正在努力的共同构想。如果您有一堆立方体和三角形的零件,那么在您开始将零件拍在一起之前,先勾勒出城堡的组装方式会很有帮助。
由于我来自OO领域,因此对我来说,每个块都是一个类,并且该块的表面积是公共接口(外部或派生类可见的)。如果您遵循良好的SOLID原则,则将确保每个块都非常简单并具有直观的公共界面。回到我的类比,您想确保代码仅创建简单的形状。每当创建太复杂的类(许多函数,许多变量)时,您都会创建形状,这些形状在需求变化时很难重用。
我同意福勒的观点,因为进化设计的最大风险/挑战是您将设计决策留给编码时间,并且您希望每个开发人员都能做出这些决策。如果您没有适当的反馈机制,则系统可能会在这里崩溃。每当需要新功能时,非常容易找到需要扩展的功能,在其中添加某种条件,然后在该功能内添加一堆代码,这非常诱人。有时,这可能就是所有需要的东西,但这也是(IMO)导致死胡同组件的最常见惯例。这与进化设计无关。这就是所谓的“无设计”。
只要您花时间退一步说,等一下,该类已经有15个成员变量,让我提取其中的6个成员变量并放入自己的独立类中,您的软件将非常轻便重量轻,灵活且可重复使用的构建基块。当然,如果PM出现并改变了您对产品的要求的一半,您可能必须将一些积木拿出来,放回架子上并绘制一些新的积木(就像建造城堡时一样,您可能不会使用全部您的气瓶)。但是到那时,这只是做生意的一部分。需求已更改,并且通过保持代码灵活和模块化,您应该能够更改产品以使其与新的业务方向保持一致。
我相信,这种不断发展的设计方法可以适用于工程师的各个水平。就个人而言,我从事软件工作已经很长时间了,在我们的团队转向敏捷方法论之前,我负责几乎没有任何质量检查就将开发PC的几个主要组件直接运送给客户。同时,这些组件始终保持灵活性和可维护性。
我只是想说我认为自己在设计软件方面相对不错。同时,如果您要我写一份100页的设计文档,将其交给编码人员,并希望它能起作用,那么我可能无法用纸袋设计自己。在开始工作时,有时会绘制一些类似于UML的图(非常简化,而不是完整的语言),但是当我开始编码时,我将在需要的基础上进行重构,而最终的代码将永远不会像我最初绘制的那样。即使我花了一个月或两个月的时间来思考每个小细节,我也无法想象其他人能够使用我的图表并开发出可靠的软件,而无需在编码时修改设计。
另一方面,目前在我的团队中(现在很敏捷,我完全支持),我们有几个人是从嵌入式领域加入我们的,在过去的15年中,他们只做过C语言。显然,我为一些初步的计划和布置课程提供了帮助,但是我还确保定期进行代码审查和集思广益,以讨论SOLID和设计原理的应用。他们确实产生了一些意大利面条式的代码,这使我有些畏缩,但在我稍加推敲的情况下,他们开始重构已经产生的内容,有趣的是,其中一个人几天后又回到我身边说,我讨厌可以这么说,但是将代码移出后,它看起来更具可读性和可理解性。死胡同。点我 我想做的是,即使是对OO完全陌生的人,只要他有一位经验丰富的导师,也可以产生一些体面的代码,以提醒他“进化设计”与“无设计”是不一样的。甚至他的一些“更复杂”的类也不是那么可怕,因为每个类都没有那么多的责任(即没有那么多的代码),所以如果一个类“死胡同”,最糟糕的情况就变得更糟了。扔掉它,并编写一个具有相同公共接口的替换类(到目前为止,我写过的任何东西都从未见过这种偶然性的需要,而且我每周进行两次代码审查)。
最后一点,我也是设计文档的坚定支持者(至少对于我目前团队的业务状况而言),但是我们的设计文档的主要目标是组织内存,因此实际文档是在代码生成后编写的,重构。在进行编码之前,我们通常会经历一个快速(有时不是那么快)的设计阶段,在该阶段我们在餐巾纸/ mspaint / visio上绘制类的草图,我总是提醒人们,这一阶段产生的是遵循的道路,而不是蓝图,并且在他们开始编码时,任何没有意义的东西都应该改变。即使有这些提醒,新手还是会尝试将适合自己的代码放回到原始设计中,即使对他们来说感觉也不自然。这通常在代码审查中浮出水面。
堂,我写了很多东西 对于那个很抱歉。