`
ender
  • 浏览: 42770 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

软件为什么这么复杂

 
阅读更多

春节前和同事在回家的路上看到了建筑工地,不由的感慨建筑业相比软件业来讲实在是成熟太多了! 想想看,建筑师设计好图纸,交给建筑公司(大包工头), 大包工头再报给小包工头, 小包工头随便抓一些农民工就可以干活了! 农民工们可不懂得那么多高深的建筑原理, 对整个建筑也并不了解,可是他们只需要把自己的一砖一瓦做好,整个建筑就能做成了 -- 当然也有豆腐渣工程-- 但毕竟是少数,排除在外。

 

更重要的是他们根本不用担心项目的后期客户突然想改设计方案,客户不会也不可能要求你把朝北的窗户挪到南边去,也不会要求把10层楼中的第3层和第7层扒掉重盖。

 

我们这些苦苦挣扎的码农们肯定会想, 什么时候软件业也能这样啊,什么时候我们也能快乐编程,按时上下班,或者以后这些底层的Labor work都让机器人做了, 我们都去做需求,架构,设计, 然后项目按进度,高质量的完成, 大家都很happy...

 

但是无数的无情现实告诉教育我们:别做梦了,这是绝对不可能的, 至少在可以预见的时间段(比如50年)是不可能的, 原因就在于软件的复杂性,在现有的技术情况下, 软件的固有复杂性无法解决, 只有依靠我们这么码农们去弥补。

 

为什么软件这么复杂, 为什么我们无法像建筑业盖房子,汽车业装配汽车一样去写软件?

 

1. 需求的复杂性

 

布鲁克斯 在著名的《人月神话》中提到软件的内在复杂性, 的确,软件系统的复杂性远远超过建筑业和制造业, 软件的需求是在人的脑子中的, 用自然语言都很难完整、准备的表达出来 。  一般情况下,人们只有看到一个运行的系统以后才会说: “奥, 我要的其实不是这个... ” 这是传统的瀑布方法失败的重要原因。 需求的不确定性是导致软件复杂的重要原因。

 

2. 原始的工具

 

即使需求很复杂,如果我们有强大的, 灵活的工具, 比如以自然语言来写程序, 我们也能处理。

 

但现实是残酷的, 我们只有计算机语言, 它相当的原始, 从二进制语言,到汇编语言,再到高级语言,其最基本的、最核心的东西依然是顺序,循环,分支, 即使加上面向对象,动态语言,库, 框架,计算机语言的本质仍然没有改变 ,就像牛顿三定律一出现,整个力学大厦已经建立起来了,后人只是在大厦和某些房间里做装饰而已,  使用计算机语言这种原始的工具,怎么能够表示复杂的需求? 

 

3. 软件组件之间的高耦合性

 

程序员的出现正是为了填充复杂的需求和原始工具之间巨大鸿沟,程序员需要用自己的大脑,使用极其”原始“的工具, 把无法准确表述的,尚在脑子中的需求映射到可执行的代码上,其难度可想而知!

 

当然我们程序员也不笨, 在长期的斗争中,我们学会了分而治之,把一个问题划分为一个一个的模块, 让这些模块低耦合,高内聚,  我们还学会了分层,让各个部分的联系达到最小, 可是所有的这些努力只是把复杂性降低了一点, 本质的复杂性依然存在。

 

普利司通制造的轮胎几乎可以用到所有的汽车, 但是我们程序员无法开发一个登录模块,让它用到所有的软件系统中, 我们程序远远必须要对这些框架,库进行定制,进行二次开发才能适应需求,这样的工作必须通过手工完成。

在某些业务领域例如电力,金融,财务等也许能出现一些重用性很强的“轮胎”, 但很明显不具备更大范围的通用性。

 

 

所以在现有的条件下, 不管用什么技术,组成软件的各个组件之间依然是高耦合的(对应传统产业而言), 高耦合会带来巨大的难以想象的复杂度。

 

 

 

 

12
5
分享到:
评论
15 楼 ender 2012-02-03  
zhxh007 写道
ender 写道
lyl_pages 写道
软件为啥有那么多的复杂性,那是因为现实有那么多的复杂性,软件是用来模拟现实业务的,计算机又比较笨,无法像人一样理解人类世界的业务,无法自动建立人类的业务模型,只能靠人通过代码的方式告诉它如何做了,所以告诉它如何做的人当然很辛苦。当某天计算机能理解人类的业务的时候,当计算机能自动构建业务模型的时候,我们就解放了。
未来的发展方向应该是人工智能,呵呵!

兄弟, 坚决同意你的看法, 我们憧憬那一天的到来吧

那我们这些码农门就失业了

没关系,我们会去制造那些AI ,估计更复杂了:-)
14 楼 faylai 2012-02-03  
因为盖房子需求明确而且千古没啥变化。
13 楼 tangzlboy 2012-02-03  
软件的需求是在人的脑子中的, 用自然语言都很难完整、准备的表达出来 。
有兴趣的,上路是最好的。没有兴趣的,别再填这个鸿沟。
12 楼 zhxh007 2012-02-03  
ender 写道
lyl_pages 写道
软件为啥有那么多的复杂性,那是因为现实有那么多的复杂性,软件是用来模拟现实业务的,计算机又比较笨,无法像人一样理解人类世界的业务,无法自动建立人类的业务模型,只能靠人通过代码的方式告诉它如何做了,所以告诉它如何做的人当然很辛苦。当某天计算机能理解人类的业务的时候,当计算机能自动构建业务模型的时候,我们就解放了。
未来的发展方向应该是人工智能,呵呵!

兄弟, 坚决同意你的看法, 我们憧憬那一天的到来吧

那我们这些码农门就失业了
11 楼 ender 2012-02-03  
lyl_pages 写道
软件为啥有那么多的复杂性,那是因为现实有那么多的复杂性,软件是用来模拟现实业务的,计算机又比较笨,无法像人一样理解人类世界的业务,无法自动建立人类的业务模型,只能靠人通过代码的方式告诉它如何做了,所以告诉它如何做的人当然很辛苦。当某天计算机能理解人类的业务的时候,当计算机能自动构建业务模型的时候,我们就解放了。
未来的发展方向应该是人工智能,呵呵!

兄弟, 坚决同意你的看法, 我们憧憬那一天的到来吧
10 楼 lyl_pages 2012-02-03  
软件为啥有那么多的复杂性,那是因为现实有那么多的复杂性,软件是用来模拟现实业务的,计算机又比较笨,无法像人一样理解人类世界的业务,无法自动建立人类的业务模型,只能靠人通过代码的方式告诉它如何做了,所以告诉它如何做的人当然很辛苦。当某天计算机能理解人类的业务的时候,当计算机能自动构建业务模型的时候,我们就解放了。
未来的发展方向应该是人工智能,呵呵!
9 楼 310628570 2012-02-02  
不复杂点,哪有来的钱啊。。。。。
8 楼 KimHo 2012-02-02  
软件的固有复杂性(有些书上叫根本复杂性essential cmplexity),是无法消除的,因为用户需求摆在那
但是,软件的偶发复杂性(addidental cmplexity),却是可以降低的,软件工程就是为了降低偶发复杂性
7 楼 yekui 2012-02-02  
换句话说,硬件做的是标准,软件做的是需求。
6 楼 yanhanxn2010 2012-02-02  
建筑业中的需求不可能经常变化,房子一旦建成了,就很少会去改了。而软件的事情,则是想改就得改,所以就复杂了
5 楼 sunnyfaint 2012-02-02  
要么接项目按需求做产品,要么提供满足普遍需求的成品。被动与主动,难度各具。想不扒楼,有够强悍的样品房也成啊。
4 楼 hanmiao 2012-02-01  
软件工程的思想很先进,但是在我工作的这几年时间里,接触到的几个公司都是同样的借口:降低成本,客户没有提这方面的需求,理想和现实有差距...在我看来,都是为了偷懒而找出来的借口,其实有很多问题都可以应用软件工程思想屏蔽掉的。
3 楼 SoCoolMan 2012-02-01  
汽车 房子 是别人做好了 让人去选,就这么多你不选就没了,
而写软件是 别人给我们他想要的结果,我们去做, 但人是善变的,保不准他那天改变主意了 我们就得跟着改
2 楼 liu78778 2012-02-01  
需求决定复杂度
1 楼 gc715409742 2012-02-01  
用软件工程的思想开发软件,能够减少软件的复杂。

相关推荐

    领域驱动设计:软件核心复杂性应对之道

    领域驱动设计:软件核心复杂性应对之道领域驱动设计:软件核心复杂性应对之道领域驱动设计:软件核心复杂性应对之道领域驱动设计:软件核心复杂性应对之道领域驱动设计:软件核心复杂性应对之道领域驱动设计:软件...

    复杂网络分析软件评价

    《复杂网络分析软件评价》一文深入探讨了复杂网络理论及其相关软件的最新进展,旨在为研究人员提供选择合适分析工具的指导。复杂网络,作为近年来跨学科研究的热点,其特性包括巨大的节点数量、动态的网络结构、多样...

    面向对象的软件工程:构建复杂且多变的系统

    面向对象的软件工程是一种以对象为中心的开发方法,它用于构建复杂且多变的系统,以适应快速变化的需求和技术环境。这种方法论强调模块化、封装、继承和多态性等核心概念,使得软件设计更加灵活、可维护和可扩展。 ...

    领域驱动设计:软件核心复杂性应对之道【完整版本】

    《领域驱动设计:软件核心复杂性应对之道》是领域驱动设计方面的经典之作。全书围绕着设计和开发实践,结合若干真实的项目案例,向读者阐述如何在真实的软件开发中应用领域驱动设计。书中给出了领域驱动设计的系统化...

    大三下复杂软件的设计之道:领域驱动设计.pdf

    为什么使用DDD呢?DDD的使用在多个方面显示出其优势。首先,它能够将领域专家与开发人员聚集到一起,这样的紧密合作有助于创建出更贴近业务实际的系统。其次,通过提供共同的语言交流,有助于确保团队成员间理解的...

    领域驱动设计:软件核心复杂性应对之道.pdf

    领域驱动设计:软件核心复杂性应对之道.pdf

    软件核心复杂性应对之道

    在IT行业中,软件开发是一项复杂且充满挑战的任务,特别是在处理核心复杂的系统时。"软件核心复杂性应对之道"这一主题直指软件开发的核心问题——如何有效地管理和解决软件系统的复杂性。这里,我们将深入探讨领域...

    领域驱动设计.软件核心复杂性应对之道-3

    书中介绍了大量优秀的设计示例、基于经验的技术以及促进处理复杂领域的软件开发的基本原则。本书将设计和开发实践相结合,在介绍领域驱动设计时,还提供了大量的Java示例,这些例子都是从实际中提取出来的,展示了...

    Pajek32-2G复杂网络分析软件

    复杂网络分析软件,是有关空间句法的应用软件。

    分布式复杂系统软件测试建模方法与应用研究.pdf

    文章作者针对上述问题,提出了基于模型的软件测试建模方法,为分布式复杂系统软件的全过程自动化测试及测试复用提供了技术方法。这种方法通过定义分布式复杂系统软件测试模型,并建立相应的测试建模过程,分析了其...

    领域驱动设计 软件核心复杂性应对之道

    总的来说,《领域驱动设计:软件核心复杂性应对之道》为读者提供了理解和实践DDD的全面指导,不仅适合软件架构师和开发者,也对项目经理、业务分析师以及任何参与复杂业务系统开发的人士具有很高的参考价值。...

    领域驱动设计.软件核心复杂性应对之道 PDF Part2

    它向读者系统地讲述了领域驱动设计的方法,介绍了大量优秀的设计示例、技术经验以及用于处理复杂领域软件工程的基本原则。本书做到了设计和开发实践相结合,在介绍领域驱动设计的同时,还提供了大量的Java示例。 ...

Global site tag (gtag.js) - Google Analytics