Dorian Deng-www.doriandeng.cn

追随理想和美人而生活

博客园 首页 新随笔 联系 订阅 管理
  95 Posts :: 0 Stories :: 203 Comments :: 76 Trackbacks
本文最初发表在理想&美人上。

大家都希望自己参与的项目能够成功交付,然而影响每个项目是否成功的因素却千差万别。在此,根据自己的经验,说说一些在适当时候有用的方法,可以从一定程度上提高项目成功率的方法。就像设计模式一样,这些方法的使用过程必然是一个仁者见仁、智者见智的过程。

1. 尽量不要考虑项目外的重用

许多人认为能提高软件的重用度是最好的,然而每个项目实际情况都会有所不同,在设计项目中的某个模块、方法时,过多的考虑项目外的重用,必然会参加项目的 复杂度,增加时间的开销。也许有人会说,这会减少下一项目的开销,试问,下一项目是什么项目?有什么需求?各方面有什么影响因素?有谁会在当前知道这一 切。 如果真要重用,应该是在项目结束后再将可重用的部分提取出来,经过修改、优化后做为企业的可重用资产,而不是当前项目中的一厢情愿。

2.经常检查项目架构

项目架构通常是在项目实现开始前就已确定的东西,是一个总体的设计。然而,在这时,对项目需求的理解、复杂度的估计对还停留在一个初始阶段。如果在项目 开发过程中不随着对项目的理解改进架构,必然让项目中的成员都按错误的方法开发项目。所以,必须经常检查项目的架构,进行必要的重构。

3.重构

有人说,都写了这么多了,再修改不是浪费时间嘛。他可能没有想过,一个下午的重构可以加快以后几个月的开发速度,这节省下来的时间是无法想象的。再者,通过重构,通常能想到更多简单的方法来代替现有的实现,这样的经验,同样可以简化其他模块的开发。

4.避免过度集成,让每个模块只做自己的事

 一个常见的例子是,在业务系统中通常会有许多的审批,很多人一下子肯定会想到把审批做成一个通用的模块。这是没有问题的,然而通常的问题是,太多的人将 审批结束后的业务处理也放到了审批模块的业务逻辑中,其实,那些是各业务模块自己的事,审批应该只完成审批即可,至于审批结束后怎么办,让该干这事的模块 自己去处理。

5.避免过度灵活

设计和代码并不是越灵活越好的。一个常见的例子是,使用泛型时可以使类或者方法操作不同的对象,然而,在 .NET 常用的 N 层架构中,如果一系列的类本来就是针对某个特定实体的操作,就没有必要还指定为泛型,再在使用时指定为使用特定的实体类。这颇有画蛇添足的感觉。

6.减少锦上添花的功能

 页面无刷新,更酷的显示效果等等,对于业务系统来说都是些锦上添花的事,如果因为这些而使业务界面非常复杂,给业务处理带来一系列的问题,极端情况是业 务处理无法继续时,再漂亮的界面也是无用的。一个忠告时,仅在确保业务处理正确进行的前提下再考虑其他的。这一点有一个前提是与用户进行必要的沟通。

7.适当拆分

 这一点与 4 类似。尽量降低每个模块的复杂度,让脑力劳动转化成体力劳动。一个常见的例子是,通常对某个表单都会有增加、修改、删除和查看的功能。但是,前三种操作通 常仅在某个功能点上、特定状态和特定权限的人进行操作(也许仅在在系统中的唯一一个界面中)。而查看操作却会分布在项目的各个角落,如果将这四种操作都放 在同一界面中,虽然可以减少界面数,但增加的却是这一界面的复杂度,要对各种状态、条件进行必须的判断来进行界面元素的只读设置,这个复杂度的增加是指数 级的,而如果将查看拆分开,工作量将是线性的,就算要做10个查看界面,总比复杂度变成 10*10 要容易处理得多,况且还可以组件化。

这些都是由项目中的经验而来,总的来说,都是为了降低项目的复杂度,提高开发的效率。需要时可以适当的加以使用。



posted on 2007-12-25 23:25 Dorian Deng 阅读(2602) 评论(25)  编辑 收藏 所属分类: 项目管理

Feedback

#1楼  2007-12-25 23:37 cnodin [未注册用户]
而如果将查看拆分开,工作量将是线性的,就算要做10个查看界面,总比复杂度变成 10*10 要容易处理得多,况且还可以组件化。
============
如果查看界面需要修改,不是要修改10个地方?
  回复  引用    

#2楼 [楼主] 2007-12-25 23:40 Dorian Deng      
是的修改10个界面,但是一般不会有错误发生。如果不可以修改数据的人可以修改数据,相信领导们会很不高兴的,再说了,可以组件化查看模块。
  回复  引用  查看    

#3楼  2007-12-26 00:54 sban      
我赞同查看与修改分开。如果有权限,可以在查看模块直接触发修改模块。毕竟触发修改比起在这个界面做修改要简单多了。
  回复  引用  查看    

#4楼  2007-12-26 09:30 阿牛 - 专注OOP      
总结的很好!支持。
有时,多做体力活是很值的。
  回复  引用  查看    

#5楼  2007-12-26 09:38 Jack Niu      
深有同感啊!
----
关于察看与修改,我一般习惯的做法是提供一个列表式的查询+表单式的修改(察看)。表单界面如果有修改权限,就直接是修改界面,否则紧紧是一个察看界面 (WinForm系统)。
  回复  引用  查看    

#6楼  2007-12-26 09:40 Yoshow      
1. 尽量不要考虑项目外的重用

这点说的好啊,我就发现我们的经理觉得什么程序必须要能重用,他才爽. 有时真是瞎折腾啊
  回复  引用  查看    

#7楼  2007-12-26 09:42 Jack Niu      
--引用--------------------------------------------------
阿牛 - 专注OOP: 总结的很好!支持。
有时,多做体力活是很值的。
--------------------------------------------------------
多做体力活有时是有点好处,但是除了完成项目之外,也要考虑一下个人的成长,个人的兴趣。多做体力活,对个人的技术成长不利,同时也会让你失去做程序员的兴趣。就个人而言,如果同样花8小时,我宁愿做脑力活,不做体力活。

@@ 当然,搂主的观念我是完全赞同的,很多情况也是这样做的;我要说的只是项目成功+个人成长。
  回复  引用  查看    

#8楼  2007-12-26 09:57 chy710      
极限编程....??
  回复  引用  查看    

#9楼  2007-12-26 10:19 PerfectDesign      
第一条非常好!软件变化过于迅速,你无法预计以后的需求,最好的办法就是紧密切合目前需求快速上线并推动到软件的下一个版本
  回复  引用  查看    

#10楼  2007-12-26 10:35 A.Z! [未注册用户]
就我的经验非常赞同lz的几点方法,再补充一些其他的方法
1.在和客户讨论需求的时候要虚心,不要觉得你比客户更懂需求,要尊重客户的BA,尽量引导客户把各个需求细化到可以控制的范围里,总体上不要帮客户想需求,可以提一些比较讨好的实施成本很低的潜在需求,这部分需求是用户不好意思提的,比如对客户领导的特殊处理。
2.代码保持简洁,这点是决定一个项目实施成败的关键点。
3.交付的时候要牢牢地把问题圈定在需求范围内,不要在交付的时候看到新的需求。

  回复  引用    

#11楼  2007-12-26 11:20 Leem      
一段好的代码往往看起来是很简洁优雅的,有些人把代码写的很复杂,看起来好象很高深的样子,其实他根本没有理解透,完全可以用很简单的方法实现同样的功能.
  回复  引用  查看    

#12楼  2007-12-26 12:09 Nathan2008      
赞一个
  回复  引用  查看    

#13楼  2007-12-26 12:18 SZW      
好的代码就像女人的身材,要丰满但又不臃肿
  回复  引用  查看    

#14楼  2007-12-26 12:53 留恋星空      
好的代码就像女人的身材,要丰满但又不臃肿 !

UP
  回复  引用  查看    

说得挺好的。
提一个向后矛盾的地方吧。

在第一条里说了:尽量不要考虑项目外的重用。
而在第四条里又说:审批流程可以做成一个通用的模块(只是说负责的范围不要太大)。如果不纵观多个项目,不考虑下一个项目也很可能有相似的审批,那么怎么会出来一个“通用”的模块呢?

好像有一点鸡蛋里挑骨头的味道。:)

疑问:适当拆分。
诚然,简单的页面可以更快的完成和更好的维护,但是浏览页面也要分离出来是不是代码冗余了呢?在有对你的“而查看操作却会分布在项目的各个角落”很是不理解。

在多个地方需要查看倒是可以理解,但是并不是说一定要作多个页面呀?一个浏览页面不可以吗?

什么?您说权限不一样,看到的信息也不一样,那也可以向点其他的办法呀。

比如说用户控件(UserControl)。


保留?!

博主说了要主键化,那么这个主键化是什么样子的呢?是不是我说的用户控件呢?还是自定义的服务器控件(表单控件)?

没有说清楚嘛。:)


  回复  引用  查看    

#16楼 [楼主] 2007-12-26 18:14 Dorian Deng      
@金色海洋(jyk)
"通用审批"在此仅指项目内的通用。

“适当拆分”
如果4者放在一起的话,基本上模块的复杂度可以用10*10 来表示,如果拆开,复杂度可以用 10 + 10 来表示。这二个复杂度放在一起,你会选择哪一个呢?适当的冗余没有什么不可以。

至于,用什么方式组件化,不同的项目中使用不同的开发工具,自己决定吧。





  回复  引用  查看    

#17楼  2007-12-26 18:37 jillzhang      
楼主说的有道理
但前提条件是可控,也就是说你对项目有足够的控制能力和评估才能这么做,有些情况下,前期不重视设计,后期重构可能无济于事。
  回复  引用  查看    



1、“仅指项目内的通用”
太可惜了。

2、增加、修改、和查看,这三个我是放在一个页面里的,删除是放在另一个页面里。

这个复杂度并不是太大,10*10 是甚么意思呢?

放在一起可以锻炼一下自己的思维能力和代码的控件能力。

这个是要适当的锻炼一下的,脑筋越用越灵活。

当然这个也是有缺点的,一个人能掌握,并不带名其他人也都能掌握。

都分开了,代码也就简单了,能够掌握的人也就多了。这是分开的优点。

但是随之而来的缺点就是:需要较多的代码,需要较多的人来编写这些多出来的代码。


  回复  引用  查看    

#19楼  2007-12-27 08:26 BlackCat      
不错的文章,编程要美
  回复  引用  查看    

#20楼  2007-12-27 14:53 webqsoft [未注册用户]
好的程序就像女人
即能干,
又好看。
  回复  引用    

#21楼  2007-12-27 21:52 电视机9号      
第七点:适当拆分,这点值得思考,多一个判断,复杂度就相应递增。
  回复  引用  查看    

#22楼  2007-12-28 21:18 luli [未注册用户]
嗯,支持
英雄所见略同
  回复  引用    

#23楼  2007-12-28 21:53 xiaohua [未注册用户]
其实我们写程序方法很多,要提高效率也有很多种,只要自己觉得那样最省事,我就用哪样的.楼主总结的好,顶一个!!!
  回复  引用    

但是感觉你好想什么也没有说一样。
  回复  引用    

呵呵
  回复  引用    


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


相关链接: