Leslie Lamport认为:如果你从一开始就没有正确设计,那么你编写的每一段代码都是一个补丁。
Leslie Lamport 是一位计算机科学家和数学家,因其对分布式并发系统的理论和实践的基本贡献而于 2013 年获得 ACM 图灵奖。他还创建了LaTeX和TLA+,这是一种高级语言,用于“在进行任何编码之前写下程序中的想法”。
Leslie Lamport观点
如果你创建了一个程序,而且它被广泛使用,你就会在某些时候想要修改它。而现实世界是,你不会回到过去,从头开始重做一切。你会开始打补丁。我们已经看到了这种情况,随着时间的推移,程序越来越难处理,越来越难修改......最终,要么代码被扔掉,要么从头开始重写。
这是熵定律。
所以你开始修修补补 就会变得马马虎虎,但如果你不从一开始就做好设计,那么你写的每一段代码都是一个补丁。你从第一天开始就会一团糟。我很喜欢艾森豪威尔的一句话,他说:"没有一场战役是按计划打赢的,但也没有一场战役是不按计划打赢的"。
网友观点
1、值得注意的是,Lamport 的背景是非常复杂的分布式系统。你不能在他所做的工作中只是“敏捷和迭代”。绝大多数软件在几乎每个开发阶段都可以不断迭代。如果没有支持第一个版本的出色设计,您就无法“仅仅迭代”分布式数据库的设计。
2、说“面对不断变化的需求,你必须从一开始就做好设计”是很疯狂的。你尽了最大努力,但有时你还是会错过。
3、静态的、最高级的“设计”的想法是一个有缺陷的概念。
4、莱斯利·兰波特 (Leslie Lamport) 因提出了一种计算机算法而闻名,他花了几十年的时间才向其他人解释这一算法。他是一个非常聪明的人,但肯定不是最聪明的。
如果你开始将软件视为有机的而不是矿物的,那么作为程序员的生活就会好得多。这不是雕像,而是一棵树。树木会随着时间的推移而发生变化,有时它们会让你感到惊讶,但并非所有的惊喜都是坏的。
所有参与软件工作的人都是有机的,他们的投入与你的投入同时进行。因此,结果表现得好像它是有机的,尽管严格来说它是无形的。
对于一棵树,你知道它可能是什么,但它有自己的议程,虽然你可以引导它并强烈建议某些事情,但试图真正控制它最终会导致死亡。树的,或者有时是你的。
5、“预先设计一切”和“这很难,所以我不会费心去尝试”之间存在着巨大的鸿沟。与 TDD 一样,重要的是在使用该工具之前了解您要尝试解决哪个问题;否则它就是漫无目的的,并且可能无法实现既定的目标。
6、任何认为可以预先设计出接近正确的软件的人都是妄想。
我的设计周期是这样的:
- 这会带来什么商业价值?
- 现在让我们在白板上进行屏幕截图并拍照?
- 现在,当我在 balsamic 中输入屏幕截图时,我会坐下来思考哪些屏幕截图被遗漏了。
- 我会问更好的问题,例如有多少用户或我第一次错过的任何问题,并显示屏幕截图。
- 将会做出改变。
- 我会向他们展示这些变化,通常这是更小的后排和第四排。
- 现在我考虑后端来支持这一点。我可以使用redis吗,我必须使用postgres吗?Flask和Python就够了。我可能必须使用 Node 才能获得更好的性能,C++ 是可以考虑的。
- 为该技术堆栈以及数据的移动方式设计一个模板。也许是模式和数据通信结构的粗略想法,但不要浪费一分钟尝试在这个细节上进行预先设计,因为它会是错误的。这就是为什么你最终会得到充满了没人使用的字段的蹩脚数据结构。
- 是否有任何风险如此之大可能导致项目失败?如果是这样,这很重要吗?如果是和是,立即建造这个超级危险的东西。如果项目失败,它可能会就此夭折;或者可以删除此功能。
现在弄清楚最小用户流量是多少,这样人们就可以开始弄清楚原始设计有多糟糕。
现在基本上是:
- 按照不改变的可能性的顺序继续添加核心功能。我首先想要不变的,然后把它们固定下来。登录、忘记密码等。
- 也许此时将产品发布给部分或所有用户。
- 开始添加辅助功能,这些功能按价值顺序都是值得拥有的。
- 根据需要添加新功能。
- 返回并更改核心功能,结果证明这些设计很糟糕。
- 返回并删除以前核心但没有人使用的功能。
- 现在对辅助功能执行相同的操作。
基本上,任何构建产品并认为自己的设计接近完美的人都是妄想症,或者是一个非常不灵活的人,不会实施更改。他们不会实施它们的原因之一是他们糟糕的、不灵活的设计很难改变,以至于每个人都放弃了。
实际上,任何认为设计可以预先完成的人都是糟糕的设计师。