自上而下是描述您所知道的事物或重新构建已经构建的事物的好方法。
自上而下的最大问题是,很多时候根本没有“顶”。在开发系统和探索领域时,您将改变对系统应该做什么的想法。您不知道的事情(例如,您希望系统执行的操作)如何成为起点?
自上而下的“本地”是一件好事……在编码之前进行一些思考显然是件好事。但是,进行过多的思考和计划并非如此,因为您所设想的并不是真实的情况(除非您之前曾去过那里,即如果您不是在建造而是在重建)。在构建新事物时,全局自上而下只是胡说八道。
自下而上应该是(全局)方法,除非您知道问题的100%,您只需要对已知的解决方案进行编码,而不必担心寻找可能的替代解决方案。
Lisp方法是蒸馏自下而上的。您不仅可以自底向上构建,还可以按照需要的方式对砖进行成形。没有什么是固定的,自由是全部。当然,自由需要承担责任,并且您可以通过滥用这种力量来制造可怕的事情。
但是可怕的代码可以用任何语言编写。甚至在那些被设计成心灵笼子的语言中,也希望猴子能够使用这些语言来启动并运行良好的程序(这个想法在很多层面上都是错误的,甚至在思考时也会受到伤害)。
您的示例是关于Web服务器的。现在在2012年,这是一个定义明确的问题,您需要遵循一些规范。Web服务器只是一个实现问题。尤其是如果您要编写与现存的其他数百万个Web服务器基本相同的Web服务器,那么除了一些细节外,没有什么是真正不清楚的。即使您对RSA的评论仍在谈论具有正式规范的明确定义的问题。
有了一个定义明确的问题,有了正式的规范和已知的解决方案,那么编码就成了问题的根源。自上而下可以。这是项目经理的天堂。
然而,在许多情况下,没有经过验证的众所周知的方法可用于连接点。实际上,即使是什么点也很难说。
例如,假设要求您指示自动切割机将要切割的零件对准与理论上的重复徽标不完全一致的印刷材料。您将获得机器拍摄的材料零件和图片。
什么是对齐规则?你决定。什么是模式,如何表示?你决定。如何对齐零件?你决定。零件可以“弯曲”吗?这取决于,有些不是,有些是,但是当然不会太多。如果材料变形太大而无法将其切割成可接受的形状怎么办?你决定。所有材料卷是否相同?当然不是,但是您不能使用户烦恼以适应每个卷筒的对齐规则……这是不切实际的。相机在看什么照片?这种材料,无论可能意味着什么……可以是颜色,也可以是黑底黑字,只有光反射才能使图案清晰可见。识别模式是什么意思?你决定。
现在尝试设计用于此问题的解决方案的一般结构,并以金钱和时间给出报价。我敢打赌,即使您的系统架构...(是的,架构)也将是错误的。成本和时间估算将是随机数。
我们实施了它,现在它已成为一个工作系统,但是对于系统的形状,我们改变了很多次。我们添加了整个子系统,现在甚至无法从菜单访问它们。我们多次切换了协议中的主/从角色。也许现在我们已经掌握了足够的知识,可以尝试对其进行更好的重建。
当然,其他公司也确实解决了相同的问题...但是,除非您是其中一家公司,否则您自上而下的详细项目很可能是在开玩笑。我们可以自上而下设计它。您不能因为以前从未做过。
您可能也可以解决相同的问题。自下而上地工作。从您了解的内容开始,学习您不了解的内容并加总。
新的复杂软件系统正在增长,而不是设计的。时不时有人开始从头开始设计一个大型的,新的,不正确的复杂软件系统(请注意,对于一个大型的,复杂的软件项目,只有三种可能性:a]规范是模糊的,b]规范是错误的并且自相矛盾。或c]两者...,最常见的情况是[c]。
这些是典型的大型公司项目,仅PowerPoint幻灯片和UML图就投入了成千上万小时。在消耗大量资源后,它们总是会完全失败……或者在某些非常特殊的情况下,他们最终会交付价格过高的软件,仅能实现最初规格的一小部分。而且该软件总是会受到用户的深深憎恨……不是您要购买的那种软件,而是您因为被迫购买而使用的那种软件。
这是否意味着我认为您应该只考虑编码?当然不是。但是在我看来,构造应该从底部开始(砖块,具体代码),并且应该向上发展……并且您对细节的关注和关注应在某种程度上“淡化”,因为您与现有产品的距离越来越远。自上而下的呈现方式常常是好像您应该一次对整个系统投入相同级别的细节:只是保持它分裂每个节点,直到一切都变得显而易见为止……在现实中,子系统是从子例程中“成长”的。如果您对特定问题没有经验,那么子系统,模块或库的自上而下的设计将是可怕的。一旦知道要插入的功能,就可以设计一个好的库,而不必相反。
Lisp的许多想法正变得越来越流行(一流的函数,闭包,默认的动态键入,垃圾回收,元编程,交互式开发),但是Lisp仍然在当今(在我所知道的语言中)在塑造代码方面非常独特。满足您的需求。
例如,关键字参数已经存在,但是如果不存在,则可以添加它们。我为我正在尝试的玩具Lisp编译器完成了此工作(包括在编译时进行的关键字验证),并且不需要太多代码。
相反,使用C ++最多可以得到的是一堆C ++专家,他们告诉您关键字参数不是那么有用,或者说是一个非常复杂,破碎,半支持的模板实现,实际上并没有那么有用。C ++类是一流的对象吗?不,您对此无能为力。您可以在运行时或编译时进行自省吗?不,您对此无能为力。
Lisp的这种语言灵活性使其非常适合自下而上的构建。您不仅可以构建子例程,还可以构建语言的语法和语义。从某种意义上说,Lisp本身是自下而上的。