漫谈软件设计与分工协作
本节导读:
阐述“分工/协作”是世界万事万物进化发展的必然选择,也是软件设计首要指导思想,也是软件分层、分模块的理论依据。
对于从事软件行业的人来说,大部分人会经历软件架构设计,想尽可能的将软件设计的灵活、简单、好用,谈到软件设计我们经常会听到一些术语,比如:面向对象设计、设计模式,设计原则、分层思想等。但这些模式、原则起什么作用,为什么需要这些模式、原则,我们可能说是为了软件可阅读性,可维护性,可扩展性,为了程序解耦,为了模块化,为了插件化。但这是理由吗,这个理由能站得住脚吗?隐藏在这些需求背后的是否有个“万有引力”在支配呢?
| ||
| ||
| ||
|
让我们的思绪回到中世纪,牛顿那个年代,那个年代的人们对于日月星辰的运转规律已经有比较准确认识,人们已经学会根据日月星辰的规律来指导生产生活实践,但是这个时代的人们仅仅是在利用规律,并不知道是什么在支配这些日月星辰的运转,直到牛顿出现,发现了万有引力,人类才利用万有引力将人造卫星送上天。
那么我们软件行业的很多规律、原则,比如上面提到的,面向对象开发、程序解耦、设计模式、设计原则、模块化,插件化,这些都是工作经验的总结,但我们为什么必须遵守这些规律和原则,这些规律和原则背后的万有引力是什么?
要解决这个问题,我们需要从计算机最初诞生说起,在第二次世界大战中,敌对双方都使用了飞机和火炮,猛烈轰炸对方军事目标。要想打得准,必须精确计算并绘制出"射击图表"。经查表确定炮口的角度,才能使射出去的炮弹正中飞行目标。但是,每一个数都要做几千次的四则运算才能得出来,十几个人用手摇机械计算机算几个月,才能完成一份"图表"。针对这种情况,人们开始研究把电子管作为"电子开关"来提高计算机的运算速度。许多科学家都参加了实验和研究,终于制成了世界上第一台电子计算机,起名为"埃尼阿克"。
第一台计算机制造出来后,没有内存,电脑只负责计算,输入输出都要靠人,第一台计算机使用相当不方便,因此冯·诺依曼博士在此基础上提出了计算机“冯·诺依曼结构结构”,见下图:
从上面看计算机出现了分工,分为输入、输出、计算、控制、存储五个部分,这五个部分承担不同的责任,并且相互协作,计算机硬件实现了“分工与协作”。
自从第一台计算机诞生后,计算机开始了飞速的发展,尤其随着存储系统的完善,计算机不仅仅应用在军事科研计算领域,开始进入通信、存储、计算机辅助设计、计算机辅助管理等经济商业领域,计算机程序也有机器码到高级语言进化。计算机领域有了“计算机硬件”、“计算机软件”,计算机软件又分为“操作系统”,“应用系统”,也出现了分层,分工思想,不同的层的程序相互协作。
上世纪90年代后,计算机全面应用于商业领域,为了适应工业化生产,计算机程序又分为开发语言和数据库,2000年后又出现了struts spring hibernate等,不同的组件解决不同层面的问题,也体现了“分工与协作”。
回想一下人类本身、人类社会、国家机构、企业组织架构,一辆汽车,我们发现“分工与协作”无处不在。
人由头、胳膊、腿、身体构成,头又由眼睛、鼻子、最、耳朵、大脑构成。
人类社会最初是原始部落,大家都从事体力劳动,后来出现了男子耕种,女子纺织,再后来部分人从事体力劳动,部分人从事脑力劳动,再后来一部分人从事农业活动,另一部分从事商业活动。
国家机构也同样,有分工有层次,省级,县级,乡级,还有直辖市,有中央委员会,国务院、军委、法院、检察院等,国务院又分好多部门。
企业组织架构也一样,有总经理、副总经理、部门经理、普通员工,部门分为财务部、经营管理部、采购部、运营部、市场部等。
一辆汽车也是由发动机、离合器、车架、轮胎等多个部件构成,每个部件又有很多小部件构成。
软件系统(包括电信、金融计费系统以及大型互联网网站)同人、同社会、同国家、同汽车一样,都是由很多层次,很多部分构成,并且不断演化和进化,分工原来越细,协作越来越多。
讲了这么多,那么软件设计中的万有引力是什么呢?
我认为“分工与协作”软件设计中的“万有引力”,也是世界上的万事万物存在的“万有引力”,世界上的万事万物包括人、人类社会、国家、企业、家庭、团体、汽车、飞机、轮船、仓库、房子等无处不存在着分工与协作,现实世界的每一个事物都是由部分构成整体,而且部分与整体存在着协作关系,部分与整体、部分与部分都是相互联系的。这也印证了java,c++高级开发语言最初宣称面向对象开发,将世界上的一切物体都抽象为对象。
下图是常见的web开发jar包
下节导读:
阐述软件分工的原则,协作原则,从现实世界分工习惯来推导软件系统应该如何分工,指导软件系统如何解耦。