阅读更多

0顶
0踩

非技术

原创新闻 软件开发不可与建筑类比

2016-05-31 10:36 by 副主编 mengyidan1988 评论(0) 有3894人浏览
引用
原文:SOFTWARE DEVELOPMENT IS NOT A FORM OF CONSTRUCTION
作者: Mark Levison
译者:陆其明,爱奇艺公司技术总监,拥有10多年的软件技术研发和管理经验。已经出版的著作有《DirectShow开发指南》、《DirectShow实务精选》、《Windows Media编程导向》、《脚本驱动的应用软件开发方法与实践》,译作有《代码之道》、《高效能程序员的修炼》、《程序员的修炼——从优秀到卓越》。

多年以来,软件行业一直在使用一种类比,即以建筑来做参考和比喻。这种比较在软件语言里随处可见,比如架构(architecture)、地基(foundation)、建造者(constructor)、项目(project)、施工规范(building code)等。这些说法是如此之流行,以至于影响到了我们对软件开发的理解。不幸的是,这种比喻从根本上来说是不恰当的,它的缺陷已经把我们引向了一些错误的道路。



在建筑行业,很多重点都放在可预测性上——预先把需求确定清楚,并且缩减成本。这些都是成熟行业的标志。而当我们把这些重点应用到软件上时,问题就来了!

经验法则、施工规范和原材料
现代建筑可以追根溯源到几百甚至几千年以前——就看你把起点放在哪儿。经过所有历史的沉淀,大量的专业知识凝结在了经验法则里,比如:
  • 在大部分地方,每平方英尺的建筑成本是一个众人皆知的常数。举个例子,我们最近在家里做了一些翻修,行业里的朋友就提醒我们说:在渥太华,典型的翻修成本在每平方英尺\$35到$50之间。他们说得非常准!
  • 对水泥楼板深度的一个比较好的评估是,相当于它的无支周长的1/180。
  • 另一方面,软件最多也就70年的历史。它的经验法则还没有像建筑那般牢靠的历史,尚不足以保障坚不可摧的应用。

经验法则最终会被编写成施工规范而固化下来。造房子的时候,施工规范决定了从壁骨间距,到墙上和屋顶绝缘物数量的方方面面。这些规范意味着所有的房子都达到了最低要求标准,极大地提升了成本的可预测性。

这些施工规范的存在,主要是因为建筑材料(木头、钢铁等)和工具(铁锤、锯子等)的种类是有限的。这些材料的属性和故障模型都是可预见的。能与特定材料配合使用的工具为数不多,也已被充分认知。当然,在建筑行业,材料和工具也在持续进化,但其进化速度远远比不上软件。

在软件行业,跟上一系列新材料和工具的难度要大得多!编程语言、程序库、支持工具每年都会冒出来,并且不断进化。内容也在不断丰富。即使我们专注于现有的语言和库,为了制定标准规范而去探索所有的细节并且体会个中的细微差别,这也需要花上几年的功夫。

正是因为易懂、稳定的材料和工具,才有了制定建筑规范的可能。而软件世界的不稳定性,决定了我们在这个领域永远也不会有“施工规范”。
引用
在软件行业不存在有用的经验法则或施工规范!

物理约束和稳定的需求
大楼、桥梁和其他建筑工事都受着物理约束的支配。依据使用的材料,这些约束决定了一个建筑物的尺寸、形状和用途。举例来说,木结构建筑受限于4~6层的高度;桥梁的跨度受限于使用的材料,以及这些材料相关的物理属性。

大楼和桥梁的建筑代表了一个问题域,已被人世代研究和试验。因此,客户需要问的问题都是可预见的,答案的范围也是有约束的。

建筑设计必须适应现场和功能的约束。想象一下,把办公楼建成围绕单点旋转的陀螺仪那样,尽管很有趣,但它在物理上不切实际,也无法满足功能上的需求。在修筑桥梁或公路时,依据需要承受的车辆类型和尺寸,都有清晰的标准去遵循。

而软件并不受制于类似的约束。如果客户真的想要一个陀螺仪那样的东西,我们很可能可以交付。我们需要支持的用户类型以及用途,与建筑比起来要宽泛得多!

大楼一旦开建,地基都打好了,你就不能轻易改变尺寸或现场位置。大楼的内部机构一旦开工建设,你就不能随意决定新增一个电梯井或者加一个侧翼。修建桥梁时,一旦桥墩浇筑好了,你就不能因为客户选错了地方而把它们移动20米。(好吧,你能,只不过在此之前的工作都白费了,你需要从头再来!)

而对于软件来说,我们几乎可以做我们想要的任何改动,简单也好,复杂也罢,比如把支持的用户数从100提高到1000,改变产品方向(Yelp原本只是一个向朋友推荐餐厅、医生等信息的工具。后来才演变成了一个评论网站),换一种编程语言(我曾经参与过从Java变到.NET又变回Java的项目)——所有这些变动比从头再来的成本要小得多!
引用
译者注:Yelp是美国著名商户点评网站,创立于2004年,囊括各地餐馆、购物中心、酒店、旅游等领域的商户,用户可以在Yelp网站中给商户打分,提交评论,交流购物体验等。

正因为我们在软件上有极大的灵活性,我们也能够在开发的全过程中接受需求的改变。开发早期阶段被挖掘出来的需求,在它们被最终实现之前往往会变动好几次。
在建筑的世界里,设计师把一套设计图交给建筑工人的时候,还能有相当的信心他们可以正确理解。尽管还是会有一些关于变动的需求和沟通,但变动的程度不可与软件同日而语。反观软件世界,我们并没有有效的方式(即使是UML)来做到给开发者交付了设计图之后就可以甩手不管。取而代之的是,我们要在客户和软件开发者之间持续不断地进行一系列的会谈。

软件比建筑更倾向于接受大幅度的改动!

人员
在建筑行业,工人通常被认为是可以交换和替换的。存在这样的假设:在造一间房子的时候,如果你把木匠换掉,结果通常是一样的。

这在软件世界里可不是这么回事!因为工具(编程语言和库)和问题领域存在的复杂性以及变数,开发者、业务分析师、测试人员、用户体验设计师等人是不能随处流动的。

那些认为软件与建筑有关联的人想当然地以为,人员是可以替换和交换的。但那与事实相去甚远!软件的所有实质内容都是各团队里的人构建出来的,如果你把一个团队成员替换掉,这会在以下三个主要方面对团队带来影响:
  • 他们会失去只有那位前团队成员才了解的知识;
  • 他们必须培训新团队成员:他们在做什么,以及最新的进展;
  • 他们必须花时间与新人建立起有效的工作关系。

结果是,替换或增加一个新人把整个团队的进度拖慢了至少3~4个月。从个案来看,新的团队成员在完全发挥效力之前常常花费比那更长的时间。尽管建筑行业在人员变动时也会遭受进度拖延的痛苦,但其痛苦程度是远远不及软件项目的。

Fred Brooks(《人月神话》的作者)有一句名言:“向进度落后的项目中增加人手,只会使进度更加落后。”40多年过去了,这句话仍然有效!

结论
那些经常用来描述软件的建筑隐喻是错误的。可悲的是,因为有了这层暗示,我们把很多重点放在了错误的地方:
  • 力求把需求预先定义清楚,而不是接受:变化才是常态;
  • 强调架构和架构师的重要性,而不是接受:软件是可适应的,可由团队里的任何人来改变;
  • 假设人员是可替换的,并且时间问题可以通过增加人手来解决,而不是接受:每个人都是独特的;
  • 追求可预测性,而不是接受:我们的领域还没有被很好地认知。

引用
软件与建筑绝无关系!
我们不是在建造,而是在探索!

我们在客户的问题空间里探索。我们正在提出新的想法,而它们刚好用代码来表达。让我们丢弃老的建筑隐喻吧,因为它们会使我们通向未来之路的地基崩裂坍塌。持这个观点的人可不止我一个哦!
  • 大小: 115.4 KB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 软件的体系结构可以类比建筑中的结构定义与业务架构

    软件的体系结构可以类比建筑中的结构 建筑:盖房子需要砖瓦石头,窗户,门还需要水泥,钉子,螺丝,砌砖墙需要水泥将其粘合起来,安窗户,门需要用钉子吧门窗固定到墙里,显然不能使用钉子将砖钉成墙,用水泥把窗户...

  • 软件开发不能用盖房子来比喻

    多年以来,软件行业一直在使用一种类比,即以建筑行业来做参考和...这些说法是如此之流行,以至于影响到了我们对软件开发的理解。不幸的是,这种比喻从根本上来说是不恰当的,它的缺陷已经把我们引向了一些错误的道...

  • 软件开发不能用建筑开发来比喻

    多年以来,软件行业一直在使用一种类比,即以建筑行业来做参考和比喻...这些说法是如此之流行,以至于影响到了我们对软件开发的理解。不幸的是,这种比喻从根本上来说是不恰当的,它的缺陷已经把我们引向了一些错误的道

  • 软件工程选择与判断题

    一些软件工程的简单选择题与判断题记录

  • 软件开发过程模型

    软件工程的概念 ■基于软件危机对于计算机发展的阻碍, 1968年...其中,软件开发技术包括软件开发方法学、软件工具和软件工程环境。软件项目管理包括软件质量、项目估算、进度控制、人员组织、配置管理、项目计划等。...

  • 系统困境与软件复杂度:为什么我们的系统会如此复杂?

    点击上方“朱小厮的博客”,选择“设为星标”后台回复"书",获取后台回复“k8s”,可领取k8s资料读 A Philosophy of Software Design 有感,软件设计与架构复...

  • 通过隐喻更充分地理解软件开发

    然而随着时间的推移,与那些不善于运用隐喻的人相比,人们普遍认为,那些使用隐喻来指明软件开发过程的人明显更能理解编程并能更快地写出更好的代码; 3、常见的软件隐喻 软件中的“书法”:编写代码 关于软件开发,...

  • 软件开发模型

    文章目录瀑布模型1、六阶段2、案例3、优缺点快速原型模型1、案例2、抛弃策略3、附加策略4、原型设计工具增量模型1、案例2、适用场景迭代模型1、案例2、增量模型与迭代模型的差异敏捷开发1、敏捷开发宣言2、站立会议3...

  • 关于软件开发“隐喻”

    作为软件开发人员不可避免的涉足软件过程管理,无论是管理者还是实施者都是过程参与者。当我们要向外行解释软件开发是怎么回事,通常来...有篇文章“软件开发不可与建筑类比”来表明一个不恰当的软件开发隐喻。 值...

  • 软件工程师,不懂点设计模式怎么行

    □设计模式实际上就是类与相互通信的对象之间的组织关系,包括它们的角色、职责、协作方式等各个方面。□设计模式通常和面向对象编程结合起来使用。面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计...

  • 软件开发基础

    软件开发基础 软件开发基础 Table of Contents 1 引言 2 软件开发的由来 3 软件开发基本组成部份 4 类推有助于理解软件开发 4.1 软件开发中常用的类推 5 软件开发流程图 1 ...

  • DayDayUp:计算机技术与软件专业技术资格证书之《系统集成项目管理工程师》证书考试历年真题及其解析之2021年/2022年

    DayDayUp:计算机技术与软件专业技术资格证书之《系统集成项目管理工程师》证书考试历年真题及其解析之2021年/2022年。

  • 软件开发随笔系列二——关于架构和模型

    这篇文章基本上不涉及具体的技能、工具,更多是我对“如何设计好一个软件”这个问题多年来的思考和总结。要回答这个问题,我觉得第一是要说清楚这个软件究竟是什么样的。我自己的答案就是上面描述的“3+1”模型: > ...

  • 西门子S7-200PLC与MCGS触摸屏联动控制步进伺服电机的技术解析及应用实例

    内容概要:本文详细介绍了利用西门子S7-200PLC与昆仑通泰MCGS触摸屏联合控制步进伺服电机的方法和技术要点。首先阐述了硬件接线的具体方式,包括PLC输出接口与伺服驱动器之间的正确连接以及必要的安全措施如急停开关的接入。接着深入探讨了PLC程序的核心代码片段,涵盖原点回归、手动正转触发、绝对位置计算等功能模块,并解释了关键指令如PLS的作用及其使用注意事项。此外,针对触摸屏的关键配置进行了说明,涉及数值输入框、指示灯、多状态按钮等组件的设置,强调了绝对定位逻辑的实现。文中还分享了一些常见的调试问题及解决方案,例如伺服电机抖动、数据刷新延迟等问题的处理办法。最后提到该方案已在实际生产环境中成功应用并表现出良好的性能指标。 适合人群:从事自动化控制领域的工程师和技术人员,特别是那些希望深入了解PLC与触摸屏协同工作的专业人士。 使用场景及目标:适用于需要高精度定位控制的小型自动化生产线或机械设备中,旨在帮助用户掌握如何构建稳定可靠的步进伺服控制系统,提高工作效率的同时降低成本。 其他说明:作者凭借丰富的实践经验提供了许多宝贵的建议和技巧,对于初学者而言是非常有价值的参考资料。

  • 光储并网直流微电网Simulink仿真模型:MPPT与混合储能系统的优化设计

    内容概要:本文详细介绍了光储并网直流微电网的Simulink仿真模型构建,涵盖多个关键技术点。首先讨论了光伏系统的最大功率点跟踪(MPPT)算法,特别是扰动观察法的具体实现及其优缺点。接着探讨了由蓄电池和超级电容组成的混合储能系统,强调了它们各自的特点以及如何通过控制算法进行有效的功率分配。此外,还讲解了二阶低通滤波法的应用,用于提高电能质量和优化不同频率范围内的功率管理。最后,文章深入解析了逆变器的双闭环控制系统,包括电压环和电流环的设计,以确保逆变器输出与大电网的良好匹配。 适合人群:从事新能源系统设计、电力电子技术研究的专业人士,尤其是对Simulink仿真工具有所了解的研发人员。 使用场景及目标:适用于希望深入了解光储并网直流微电网内部机制和技术细节的研究者和工程师。主要目标是帮助读者掌握如何利用Simulink工具箱搭建完整的光储并网直流微电网仿真平台,从而为实际工程应用提供理论支持和技术指导。 其他说明:文中提供了大量具体的Matlab/Simulink代码片段,便于读者理解和实践。同时,作者分享了许多宝贵的实战经验和调试技巧,有助于解决实际建模过程中可能遇到的问题。

  • 西门子1200 PLC轴运动控制程序模板:多轴伺服、电缸控制及PLC通信实战应用

    内容概要:本文详细介绍了一套成熟的西门子1200 PLC轴运动控制程序模板,涵盖多轴伺服控制、电缸控制、PLC通信、气缸报警、电路图、威纶通触摸屏程序和IO表等方面的内容。该模板已在多个项目中成功应用,特别是在海康威视的路由器外壳装配机项目中表现优异。文中不仅提供了具体的代码示例,还分享了许多实战经验和技巧,如轴控制块的参数设置、PUT/GET通讯的心跳检测、气缸报警的互锁逻辑、电路图中的电源保护措施等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些需要进行PLC编程和轴运动控制的从业者。 使用场景及目标:①快速掌握西门子1200 PLC轴运动控制的编程方法;②提高PLC程序的稳定性和可靠性;③优化设备性能,确保高效生产和故障预防。 其他说明:该模板不仅适用于新项目的开发,也可以作为现有系统的改进参考。通过学习和应用这些技术和经验,可以显著提升工作效率和产品质量。

  • 智能驾驶领域基于神经网络的驾驶员风格自适应ACC系统安全距离模型研究

    内容概要:本文探讨了基于神经网络训练的不同驾驶员风格自适应ACC(自适应巡航控制)系统,尤其是其安全距离模型的研究。传统ACC系统采用固定的参数设置,难以适应不同驾驶员的驾驶习惯。文中介绍了通过神经网络训练,使ACC系统能够学习并适应不同驾驶员的驾驶风格,从而动态调整安全距离的方法。具体实现了基于LSTM和物理模型融合的混合式神经网络结构,以及定制化的损失函数,确保系统在不同驾驶风格下的安全性和舒适度。实验结果显示,该系统能够在不同驾驶风格间灵活切换,提升应对复杂路况的能力。 适合人群:对智能驾驶技术和机器学习感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于智能汽车的研发和改进,旨在提高ACC系统的智能化水平,使其更加符合不同驾驶员的习惯,提升驾驶体验和安全性。 其他说明:文章还讨论了模型的实际应用挑战,如不同地区的驾驶文化差异,并提出了相应的解决方案。

  • 计算机三级网络机试考试试题及答案(下).pdf

    计算机三级网络机试考试试题及答案(下).pdf

Global site tag (gtag.js) - Google Analytics