搞软件工程最好能懂点建筑 ^_^ ——《大道至简》读书笔记

EHM_软件工程层状模型 摘自《大道至简》P89

 

今日听一位同事对C++的一个学习总结,提到“面向对象就是把所有东西看成相互关系的独立体,面向过程则一条线哗哗……的下来”——虽然不免错误和偏颇,但让我想到了上面这副图。
周爱民称之为“方法”,我觉得叫“方法的抽象”或直接套用哲学中的“方法论”更合适些,因为方法第一眼总让人与算法相混淆。
面向过程的程序=算法+结构,面向对象的程序内部依然如此,面向对象与面向过程是一种进化和包容的关系,而不是对立的关系。所以面向对象在外层确实还包裹了些什么——看待事物的抽象角度、或者说看待事物的方法论。

就像盖房子:
古老的房子=盖法(和泥、地基、测量、技巧等) + 材料(水泥、转头、木头等),一个工匠搞定。
现在不行了,要盖摩天大楼,要找一帮的工匠。聪明人说了,这样吧:每个工匠负责一层,层与层之间规划出楼梯、电梯、通风、下水道等互连,层内工匠自己负责设计(单层、复式、有无阳台等)……同时聪明人还大胆的请来德国专家设计了一套样板房,工匠们大多效仿,个别还做了稍加改造,后来发现样板房之间互连起来非常省心。但也有一些个性十足的工匠不屑于参考样板房,天马行空的发挥了起来,有些个性工匠最后的产品依然互连方便不说,内部构造独特,采光充足,运用了很多智能化家电,令人羡慕;而另外一些个性工匠就不那么幸运了,竟然有一个把下水道设计的与楼下的通风口相连,验房时还没被发现,直道后来住人了才搞得不可收拾,唉,索赔又无门,只好忍气吞声。
每层内依然是“盖法 + 材料”,但多了聪明人的方法论,摩天大楼总算有谱了。

盖法就是算法,材料就是结构,层与层之间就是对象间关系。图纸上是程序,盖起来的过程是实例化,盖好的房子住起来就是进程、线程、或例程。
每层独立为一体,自我负责,同时又有继承重载等关系……这体现的就是面向对象的方法论。
样板房就是父类(如果只是个图纸就是抽象类,如果还搞出了实物则是接口类),工匠们效仿就是继承,稍加改造就是重载。最终用户用的改造后的房间,也就是子类重载后的方法。
样板房互连省心表示从同一个父类集成的子类之间具有很多一致性,很容易做到接口统一。
个性工匠是个性设计师、个性软件开发师,好的即能够做到类内算法效率一流,有能够做到类对外接口仍然不变,差的的就捉襟见肘、顾此失彼了。
验房的人是测试人员,当然下水道的问题责任不光在测试人员,只能怪这个故障太隐蔽、或者时间全让工匠们的开发占完了、或者根本就没留给测试人员什么时间,甚至是开发人员兼任测试人员、或者开发人员与测试人员关系铁、说一说面上过去也就算了……反正故障到了客户才发现,然后开始客户找版本发布人员、版本发布找系统测试人员、测试找开发人员、开发找需求人员、需求找规划人员……大事化小、小事化无罢了。

扯远了,其实宗旨是想说,以前怎么没有把“面向对象”-“面向过程”看成“进化与包含”的关系,而是看成了“对立”的关系呢?

【过程】
前面两点还沉迷在具体的细节中,了解和精通了前面两点也顶多算个Coder,向进一步修炼为软件工程人员,还需要了解过程和工程。
过程:进一步细化步骤、分配角色,把做小软件中可能一晃而过或意识不到的“需求”、“设计”、“测试”、“维护”等步骤从“编码”中独立出来。

聪明人开发第二栋大楼的时候为了避免“下水道风波”,给工匠们添加了很多约束,尤其是互连方面的。同时聪明人还剥夺了工匠们自由设计内部的一些权力:房间的设计必须统一以便支撑墙能够贯彻上下、阳台和窗户的设计必须统一以便不影响市容……只给工匠们留下了不多的发挥空间:方门做成园的、栏杆做成欧式的……虽仍能博来“匠心独具”的掌声,但似乎少了些什么。工匠们见面就唉声叹气,尤其是那些个性工匠再加上一些“不安份守己”的想法,自嘲的说自己已经不再是“工匠”了,已经沦为“工人”了。而有些工匠们则不以为然,觉得少去了很多烦心事,办事更有效率了。
不安分守己的工匠有大抵有两种结果:被聪明人发现并提拔为设计人员,自己黯然推出日益火爆的房地产市场。

削弱工匠们的设计部分,单独找一些人来做,就是细化步骤、分配角色。以前的软件英雄们一人独挡一面的情况很难出现了,分身为了Designer、Coder、Tester、Supporter等。
以前的程序员在这个“过程”的进化过程中有些依然留守做Coder,有些与时俱进升华为了Designer,或不安心做Coder而黯然转行。后来入行的大多先从Coder做起,很难体会到Design+Code+Test+Support的快乐和眼界了。

细化步骤、分配角色只是做好一个产品的必要条件,同样,过程也只是做好产品的必要条件——这还只是设计师圈子里的事情,聪明人已经把眼光看的更远了。

【工程】
有了几栋楼的经验,聪明人赚了不少钱,但有一天聪明人认识了王石,交谈之间顿觉惭愧。
聪明人看到,随着中国经济的持续高速发展,只盖好房子是不够的,一些前期工作显得越来越重要:拍卖地皮、政府攻关、概念宣传…… 一些后期工作也越来越重要:营销代理、品牌价值、排号炒号、捂盘销售、认筹解筹、借款套现……呵呵,讲歪了。
聪明人独力难支,终于拉了一帮兄弟开了一家公司,搞起了真正像样的“工程”。

工程不再局限于讨论一砖一瓦、混凝土比例,也不再局限与讨论样板房、层间互连等问题。所以,工程不是仅仅针对C++的,也不是针对面向对象的,工程是任何想把软件项目做大必须要面临的问题。
工程需要更加宽阔的视野。这里的工程也决不是某个IDE中新建里面的project,那只是一个文件组织而已。
工程大多需要一个公司了。

聪明人的公司终于开张了,张灯结彩、敲锣打鼓之后尘埃落定,聪明人托着下巴还是很费了一番脑筋考虑公司如何搞好这个“工程”,也就是办好这个公司了:
1。设立物流部门,负责供应商认证、采购、库存、账目和内部配给,再也不能出现酒桌上决定每块转头多少钱、和两个工地抢转头的情况了。
2。设立财务部门,负责财务、账目、流动资金和应付税务部门。
3。设立人力资源部门,负责考核、员工激励,一定要增强团队凝聚力,以后哪个员工再说我聪明人给的奖金不公平就找他们去吧。
4。设立技术与研发中心,负责引进和开发工具,进口西门子的吊车、美国的脚手架、法国测量仪器、看在日本人死皮赖脸的非要免费给我用推土机的份上,就试用一个月它的推土机。至于开发工具嘛,主要任务是逐步增强国产化率,争取把进口工具早日替换为国产的,其中免不了向国内企业友情提供西门子吊车的资料,甚至借个大家烟酒研究 ^_^
5。设立A、B、C……好多新部门。

软件工程与其他传统工程在面对物流、财务、人力资源等问题时是本质相通的,所以通常所说的狭义的“软件工程”并不包括这些(周爱民进一步把他们独立为图中的“组织”),而只包括技术与研发中心所关心的事情:
1。软件做大了肯定不是一个人,而是一个团队,团队沟通、团队凝聚力是个首要问题。
2。有效工具的使用以提高生产效率,尤其是好的编译器(GCC)、好的IDE(Tornado、Eclipse)、好的操作系统(VxWorks)、版本管理工具(ClearCase、SVN、VSS)、故障变更工具(CQ)等。


好了,说道这里我大概已经黔驴技穷了,还是收尾做个ending:
广义的“软件工程”像图中所画,包括了程序、方法、过程和工程,几乎软件工程的书中都会提到,但大部分的书的大部分内容都集中在“过程”这个概念上,主要给我们推广“需求-设计-实现-测试-维护-迭代”这个生命周期的概念,然后煞有介事的讲了一些著名的“过程”模型:瀑布、RAD、螺旋、以及新的发炫的ALM、RUP、XP极限……
这些东西很有价值也必学不可(当然,如何要搞软件开发的话,呵呵),但我们不能只停留与此,就像我们不能只停留在图中第三个圈里面原地踏步一样。

聪明人已经成了身价过千万的大老板了,但他依然在夜深人静的时候考虑一个问题:  盖法 + 材料 + 方法论 + 过程 + 工程 = 成功 么?
还差“上帝之手”……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值