Richie

Sometimes at night when I look up at the stars, and see the whole sky just laid out there, don't you think I ain't remembering it all. I still got dreams like anybody else, and ever so often, I am thinking about how things might of been. And then, all of a sudden, I'm forty, fifty, sixty years old, you know?

为什么无法面向对象

条条道路通罗马,能解决问题的都是好办法。

1. 产品需要满足用户需求。
每天都在用windows、ie、word、firefox等,都很好用,但对用户来讲谁关心后面的代码、架构是什么样子。
生产线上的人每天都在用你写的产品,他们只关心产品是否能准确地完成功能,没有故障,操作是否方便。

有很多人觉得架构不好,代码ugly,所以重写产品,下面几个老链接大家可以看看。
说说: http://blog.joycode.com/demonfox/archive/2007/03/21/98381.aspx
Things You Should Never Do, Part I: http://www.joelonsoftware.com/articles/fog0000000069.html
里面提到NetScape的重写等,甚至微软的word也曾打算过重写,好像是这些文章还是别的什么地方提到过一个ftp代码重写了3、4年才完成。

我们每天面对着一行行代码时,是否能多想想这些代码怎样方便的帮助用户完成想要的工作?它们怎样才能帮助公司实现更多的利润,帮助客户实现更大的价值?新的设计思想的运用、代码中隐藏的每个错误会给项目带来什么影响,会给客户造成什么损失?
这些不仅仅是老板、架构师、项目经理的责任,项目中的每个人应该有比较深刻的认识,才能做出好产品。程序员的职业生涯想要往高处走,哪怕是升为一个高级程序员、架构师,都需要不断的将目光关注在这些方面。所以不要一天到晚只盯着代码看问题,总跟代码过不去。

2. 产品需要满足市场需求,满足市场运作策略。
很多程序员出身的,后来做项目经理了,做销售了,不少已经在做老板了,多了解一下他们面临的问题,他们的想法。也许不久之后你也打算创业做老板了。
没有多少项目能够像暴雪那样,动不动写个6、7年,产品推出来还能保证巨大的市场成功,Vista写了5年已经很长,再写个几年可能要失控。尤其国内这种激烈的竞争环境,慢个半拍人家就已经把它做的很好了。
所以老板有市场压力,项目经理需要承担项目周期与质量压力,需要处理各种技术、未知故障风险。

很多时候老板的要求并不是错的,客户的要求并不是不合理的,只是你没有理解,所以都被你宣判为无理的、搞笑的、不适合产品开发的要求。所以心里开始抵触,不能全面的配合老板、经理实现目标,有时候做出来的东西牛头不对马嘴。最后老板说程序员不可思议,程序员说老板真差,double-lose!

3. 不要盲从。
"不要迷失在技术的海洋中"应当也是这个意思。
看《领域驱动设计》,作者开始就说了这种方法不是万能药,他的不少项目使用这种方法都失败了。看《企业应用架构模式》,作者并不会告诉你你的项目应该用领域模型、事物脚本还是表模块,要根据实际状况选择。最近刚开始看《分析模式》,每一种模式都从简单到复杂讲述,但一开始作者就提出了根据需求具体选择采用简单方式还是复杂模型,正确实现需求的就是好模型,不要盲目的为产品做过多假设。
尽管Martin Fowler和Eric Evans都受敏捷思想的影响,这不是关键,其它书籍也差不多如此。他们提供的只是一种方法、思想,具体环境具体运用,开篇不起眼的一些话,在理解了这些思想之后,这些话才是最重要的。
一个经理如果总能按园子里大家的想法来管理、开发产品,极有可能是一个彻底失败的经理。

4. 产品需要积累。
产品的成熟并不是指代码多漂亮,架构多完美,这些东西只占据比较小的分量。产品成熟更多的是指产品功能、性能、稳定性、用户使用性,以及从业务功能、运营部署要求面看起来一定的灵活、扩展性。

很多时候会听到这种话:这个项目这么简单,真搞不懂他们怎么花了那么长时间;这么简单一件事,想不透为什么写的这么复杂。
仔细看过上面推荐的两个链接,结合自己的经验很容易理解,很多非常ugly的代码中隐藏了不少疑难杂症的修复知识,这是一个方面。
另外一个方面,将需求一步步收集起来,将产品从无到有做起来,能够满足用户要求在生产线上运行起来,不是件容易的事情,这个里面很多困难你想不到,交给你重做一次未必比前人做的好。

很多人在学习设计模式,很多人每天都在不断的重构代码,有没有人实际的去关注过,你做的这些工作,真的给产品、给用户带来了多少好处,实现了多少价值。其实脱离实际需求,程序员拍脑袋想的很多东西,花了很大精力去实现,可能从头到尾就没有发挥过作用,或者作用非常有限。
很多时候你发现自己负责的产品很灵活、功能很强,可是到用户那边,到下一个项目/客户,新的需求非常多,不少时候已有架构无法满足。

比较长一段时间内,要象大家讨论的方式来做项目,象不少程序员心中想象的情景去开发一个产品,是不大可能的。我们只能不断的在项目中做小的修改来积累产品,在适当的时候做一些大的调整来改善产品。
如果从产品最开始就采用大家推崇的各种方法、思想来做一个产品,这个产品成功的概率多大?
不要说小公司才有这种烂做法,没有心胸的经理才会否定这种做法,看看Oracle、MS、HP等,看看印度的软件工厂,难道都是采用大家理想的做法?

保证第一个版本可用,第二个版本好用,第三第四个版本能够通用,不是代码层面,而是功能层面的,相信不少公司产品都是这样的战略。这里不仅有市场策略,也有产品项目迭代开发方式,功能的逐步完善、用户反馈等等其它各方面的考量因素。

最后:
看待问题不要太单纯,面向对象也好非面向对象也好,存储过程也好SQL也好,多探讨交流让大家都加深认识就行了,至于实际环境应该采用什么方式,都不能做定论。
不少程序员、开发团队确实是得过且过,对未掌握的东西不大愿意去了解,因陈守旧,也确实是一个方面,有的是本身上进心不够,有的是生活或其它压力太大,工作的事情只是敷衍。既然是在园子里活跃的,应该大部分不属此列,所以更应该注重的是注意改变自己的视角去分析问题,使自己的技术研究更有针对性方向性,看待问题更全面。

posted on 2007-11-03 23:59 RicCC 阅读(3972) 评论(11)  编辑 收藏 所属分类: Others

Feedback

#1楼  2007-11-04 01:31 volnet(可以叫我大V)      

首先肯定楼主说的很对。
不过人们之所以有这样的心理也是可以理解的。
1、程序员通常是由一些痴狂者或者是好强者或者是积极探索者组成的,因此容易对新鲜事物引发争论再加上对掌握高深技术来显示自己充满了欲望,这样的心理同样导致自己会加入到跟风跟时尚追求那种胜利的感觉。作为一名工作人员,再去谈论自己的代码质量的时候,因为圈内人人都懂OO,因此,写不OO的CODE会被别人误会为不够专业(通常总是自作多情地如此想……)
2、面向对象确实对改良代码起到好处。
这一点可以理解为在面对领域问题相对比较复杂的情况下,OO可以帮助理清思路并且能够用来解决很多问题,让CODE更趋近于业务,因为业务的变化不是翻天覆地而是循序渐进的,因此CODE的变化通常也不用翻天覆地地变化。这就叫做沿着路走不至于走歪……
3、重构还是有一定好处的,重构通常为了突破现有代码中的限制,这样的重构才是恰好时机的,因此恰到好处的重构是有益的,但是蛮目重构意义不大,作为增强自身技术实力还是有好处的。
4、不能仅仅着眼于NOW,放眼FUTURE,不学习就会被淘汰,可以把工作时间用于锻炼自己不失为好想法。   回复  引用  查看    

#2楼  2007-11-04 01:48 怪怪      

主要是扩展与变化是不是直接就包含在最初的需求里面。

另外,很多项目重写一遍的代价还小于预先设计的代价,即使代码行数看着很多也是这样。 我以前带一个很初级的程序员, 一个月有些代码也能出个好几千上万的,万一再要求点灵活性,比学习CodeSmith然后生成或者学习某某框架再应用成本都低很多。这里头有个思考的成本,思考的成本使得整体成本降低,才应该去思考。除非目标就是奔着成面向对象专家去的,失败一两个项目对增长经验更好,嗯就怕老板不愿意。

不过有时候我们可以预期到一些变化,而且感觉通过思考,可以让产品获得快速修改或者扩展的能力,使得产品推出后在竞争中的后续策略可以更灵活,反映更迅速,那么付出这个代价就是值得的。

主要还是咱们的项目/产品的具体情况,还有咱们干活时候的具体情况。   回复  引用  查看    

#3楼  2007-11-04 09:13 Justin      

合适的时候使用合适的技术,OO只是其中一种选择   回复  引用  查看    

#4楼  2007-11-04 14:05 spermakert1983 [未注册用户]

是这样的 关注产品本身就是关注问题本身 很多人都深陷技术的泥潭,比较 每天有很多开源的框架问世 每天都有新的思想和技术
可是没有想到的是 这些技术本身就是针对产品 或者 是针对问题而诞生
脱离了产品 脱离了需求 脱离的现实 技术本身没有存在的价值
选择正确的解决问题的模式 才是脱离技术泥潭的最好方法   回复  引用    

#5楼  2007-11-04 17:05 Nathan2008      

写得非常好,同意楼主观点   回复  引用  查看    

#6楼 [楼主] 2007-11-04 22:04 RicCC      

@volnet(可以叫我大V)
@怪怪
@spermakert1983
@Justin
@Nathan2008
OOA、OOD是很不错的方法,主要是熟练度的问题,就象怪怪说的,思考的成本非常高,主要原因是不熟练(方法本身以及业务领域),我也经常这样。这一层知识要传达到团队每一个成员,难度更高。基于这样的情况,我们就不能轻易的将这种巨大的风险引入到项目中。

要在那些维护过好几年的产品上运用这些东西,我有清晰的思路,因为业务知识、广泛项目的积累,与大量用户深入的接触,与其它产品的对比研究,对业务领域到底是什么,需要什么样的解决方案、扩展性等非常了解,在这样的基础上改善或者重新搭建技术架构,成本和风险非常低。
切换到一个陌生的领域时,情况就完全不一样了。一开始可能以为OOA、OOD方法掌握不够透彻,不能做到放之四海皆准,这只是一部分原因。
另外一部分,是业务领域的不熟悉,就算面向对象掌握的足够透彻,技术架构设计的太灵活,无疑也加大了实现层面以及项目过程控制的复杂性,也就加大了项目风险。业务不熟悉,技术架构的灵活性很多时候就是在打赌,有输有赢是常事,哪怕是面向对象的权威、资深人士也不例外,只是他们胜算得概率高一些而已。

作为权威,被人花重金寄予厚望请过去指导项目,而采用所有程序员都唾弃的方法来实现,当然有失体面。但对于我们,完全没有必要秉持某种思想方法不放,我们可以采用最普通的方式实现,当运用条件成熟了再做改变。这样没有包袱的做项目,没有偏见的对待任何一种技术,运用起来更自如,项目风险更低。

这也是目前环境下敏捷/XP能够体现出强大优势的根本原因。它们一直强调,能实现当前的需求就是正确的方案,夸张一点,少一行是错,多一行也是错,因为对当前不存在的需求做假设,有没有作用不说,投入的成本太高,给项目带来的风险是间接的隐性的,结果却是相当严重的。

不要全世界已经走到前面去了,我们跟在后面捡些冷菜还以为是个丢不了的宝。   回复  引用  查看    

#7楼 [楼主] 2007-11-04 22:12 RicCC      

当然了,努力的学习,深入地探讨交流,提升自身的能力,好好理解和掌握这些方法,在适当的范围内试用研究,这是基础。只有这样,合适的时候才能成功运用。每种技术都是这样   回复  引用  查看    

#8楼  2007-11-05 09:05 Anthan      

存在即是合理
只是我们如何才能发挥他应有的效用   回复  引用  查看    

#9楼  2007-11-05 09:24 bangbang [未注册用户]

什么时候需要重写代码?那就是维护代码需要的成本过高或是现有架构不能胜任后续开发的时候。就这么一条原则。   回复  引用    

#10楼  2007-11-06 13:49 Cure      

赞同楼主,讨论不能没有实际应用中的问题域或者说上下文,否则讨论花费的精力和收获不成正比。   回复  引用  查看    

#11楼  2008-01-30 01:26 古典小说 [未注册用户]

开心就好   回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-02-26 04:16 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接:
所属专题: 关于面向对象的讨论