冬Blog

醉心技术、醉心生活
posts - 107, comments - 902, trackbacks - 32, articles - 1
  博客园 :: 首页 :: 新随笔 ::  :: 订阅 订阅 :: 管理

战略与战术--再论软件设计的度

Posted on 2008-08-04 10:33 冬冬 阅读(2144) 评论(15)  编辑 收藏 网摘 所属分类: Software Engineering

软件开发的时候总是面临着各种决策,大到模块的划分,小到函数体的写法,这些都是设计的问题。做设计不难,难的是做一个好的设计。然而什么是好的设计?标准是什么?

军事上常说“战术是为战略服务的”。这句话换到软件上来可以变成很多说法:函数是为对象服务的;对象是为底层设计服务的;底层设计是为构架服务的;构架是为需求服务的;需求是为了客户的生产生活服务的……不同的抽象层次上对应不同的战略与战术。

做好一个设计的根本就在于不仅仅着眼于当前的工作层面,而应该能够很好的理解当前工作服务的那个层面!

比如写函数体吧,就需要理解该函数在当前对象上下文中所处的地位和作用,不理解当然也能完成工作,但却称不上一个“好”字。也许有人会问“什么是好?我把当前函数优化到常数复杂度算是好了吧?”那也未必,“好”与“不好”需要放到大局中去看,如果当前函数只在系统启动的时候调用一次,那就没有优化的意义,尽快完成该函数才叫做“好”!

在需求分析方面这一点更重要、更明显!“需求总在变”这话一点儿不假,但是不变的是用户开发这个软件的目的,这才是用户的真正需求。想办法满足用户这个目的就是做好当前项目的捷径。比如现在大部分的中小企业、特别是事业单位的门户或者部门网站,提需求的时候吹得天花乱坠,什么在线办公、客户管理、内部互动啦,说得很好听,其实做了都不用,老板(领导)在意的就俩字:美工!客户的真正目的是什么?政绩!

因此,只有战术在战略层面的地位和意义,才能恰如其分的完成手头工作。把每件事情都做到精益求精的不是工程师,是艺术家。就好比憋足了吃奶、如厕、行房的劲打赢每一场丈的指挥官不一定合格,且不说伤亡巨大、天怒人怨,如果连本来应该败掉的诱敌之战也赢了,那就地军法处置!

对于.NET企业级应用,涉及的层次理论,可以这么粗略的划分:

电子电路 — 汇编 — 系统内核 — CLR — 函数 — 对象 — 设计模式 — 架构 — 需求 — 客户的生产力(竞争力)

搞.NET的大部分工作在函数、对象、设计模式这个层面上,构架师当然是工作在构架的层面、需求分析师以需求为主。敏捷软件开发提倡的一点就是软件的目的在于提升客户(在它们那个领域)的竞争力,这明确的提出软件工程中一个更高级别的抽象层次。剩下的通常不属于咱们操心的范围了。

写函数的时候看看对象;看对象的时候关注一下模式;搞模式的时候瞅瞅构架;做构架的时候不能忘了需求。这不但是职业规划,更是做好当前工作的必要条件,难怪人家说:不想当将军的士兵不是好士兵!

Feedback

#1楼   回复  引用  查看    

2008-08-04 10:49 by thriving.country      
好文,很重要,支持!

#2楼   回复  引用    

2008-08-04 11:09 by xbin[未注册用户]
好士兵的最终命运:
没打死 -> 将军
已打死 -> 烈士

#3楼   回复  引用  查看    

2008-08-04 11:11 by 怪怪      
对象是因为函数使起来不方便搞出来的语法糖, 设计模式是因为面向对象的种种不足而发展出来的手法; 而架构应该分为两个方面, 一个是面向需求的, 一个是面向设计与实现的手段的。

可以说, 从函数->面向设计与实现的架构之间这一部分,虽然很多人津津乐道, 但最没有价值^^

#4楼[楼主]   回复  引用  查看    

2008-08-04 11:17 by 冬冬      
@怪怪
哈哈,你的文章一直很坚持这个观点,我看了不少了,也挺有道理的。

不过我还是面向对象这种思想是有意义的,这两天看《深入解析Windows操作系统》,里面说Windows内部也运用了大量的面向对象思想。

也不可以不叫面向对象,叫封装啦、多态啦之类的,其实大家都明白,就是一种设计的方法,呵呵。

#5楼   回复  引用  查看    

2008-08-04 11:19 by Desmend      
很有感触……

#6楼   回复  引用    

2008-08-04 11:22 by future001[未注册用户]
@怪怪
说的太对了,现在很多人整天搞的云里雾里的分层设计,架构设计,设计模式,设计了半天却不知道软件最终能干什么!

#7楼   回复  引用    

2008-08-04 11:41 by xiaoqi[未注册用户]
了解客户需求和自己的团队最重要,


对于我一直负责的项目,很有把握做好,因为我比客户还熟悉他们的整个业务流程.

对于未涉及的行业项目,感觉还比较迷茫,把握不住客户的需求。

#8楼   回复  引用  查看    

2008-08-04 11:54 by 怪怪      
@冬冬
对象是语法糖, 这不是我说的, 是Anders同志的金口玉言^^

而我本人所掌握的东西里, 其实要找出一个相对擅长的, 也恰恰是面向对象相关的知识;我反对的并非面向对象的名字, 而是它所代表的一系列思维、设计和表达工具对那些有益特性的实现方式。

这只是我不自量力的希望看看还有没有其它路而已。至少在目前,对这些不断新瓶装旧酒的玩意,运用肯定是不能避免的, 因为就这些摆在那儿, 外加上协同工作等限制条件,咱不用也没得可用了。

不过一路走过来后, 我还是赞成把脑子而不仅仅是软件过程轻量化一点~

#9楼   回复  引用  查看    

2008-08-04 11:55 by RicCC      
Christer Johannson对架构师的建议: 工作在系统级,但要从概念细节和机制设计入手

#10楼   回复  引用  查看    

2008-08-04 11:57 by Caling Xie      
楼主讲的 very good!!

#11楼   回复  引用    

2008-08-04 12:03 by 毛心宇[未注册用户]
mark as read
特来提醒……

#12楼   回复  引用  查看    

2008-08-04 12:42 by 水言木      

#13楼   回复  引用  查看    

2008-08-04 16:56 by 金色海洋(jyk)      
>>写函数的时候看看对象;看对象的时候关注一下模式;搞模式的时候瞅瞅构架;做构架的时候不能忘了需求。

我怎么觉得应该倒过来呢?

先弄一个架子出来,然后参考模式的思路,弄点细节出来,也就是定义各个对象的关系,最后是代码实现了。

呵呵。

#14楼   回复  引用  查看    

2008-08-04 17:16 by Mainz      

软件架构师就像一个建筑设计师,能设计出鸟巢很厉害

而程序员就像鸟巢的民工,每天只是负责砌砖而已。所以程序员要想成为架构师,就要培养架构师的思维、方法和角度,而不是盯着一个砖而已。

手里拿着一块砖头,心里应该像坐在直升机上看鸟巢一样清楚!

#15楼   回复  引用  查看    

2008-08-05 09:02 by 金色海洋(jyk)      
好像鸟巢不是用砖砌起起来的吧。

外面的哪个好像是用的一种比较特殊的钢材。

换句话说,用砖头盖大楼,盖不了多高,改用钢筋水泥,可以改更高一点的。

想要改更高的,就要用更先进的原材料才行。

好的设计固然伟大,但是实现设计的“原材料”也是不可小视的。
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1259687




相关文章:

相关链接: