艾伟也谈项目管理,软件开发前期设计时的注意事项

  说起软件设计,我们可能每个人都做过,但是什么样的方案才是好的设计方案?如何才能设计出一个好的设计方案?在设计过程中需要注意哪些呢?不要总是说:低耦合、可维护性、可扩展性、简易性、可重用性等,本文试图另一个角度出发,带着前面的这些问题,使大家能明白那些问题的答案,并与大家一起探讨。

  什么样的方案才是好的设计方案?

  当我们完成了一个良好的设计方案后,我们回头再仔细分析是什么因素影响了我们的思路,使我们最终完成(确切的说是选择了)了这个设计方案(而不是另一个),我们会发现这些因素是:用户功能性的需求、技术性能上的要求和研发成本(或能力)的制约,当然其实还有一些其它因素如:客户主观上的要求、审美或商务因素、向前兼容性要求等,不过这些因素多半是一些非技术性因素,我们在此不做过多讨论;能否很好的满足这些因素就决定了一个设计方案是否是一个好的设计方案,所以我们在设计之初就必须对这些因素加以充分的考虑。

  如何才能设计出一个好的设计方案?

  但事实上,基本上没有一个方案是可以每个因素都能百分之百满足的,一个好的设计方案,往往是一个平衡的结果,这也是为什么我们在讨论设计方案是总是可能争论不休的原因,因为不同的人从不同的角度出发都可以得到他认为好的一个方案,人们总是会有各自的理由,而且那些理由都是有道理的,但请大家记住:一个好的设计方案,往往是一个平衡的结果。从某种意义上说能否做好平衡是决定一个方案是否是好的方案的关键,尤其是对那些复杂的大的设计方案。

  平衡的艺术

  但怎样才能做好平衡呢? 答案显然不是:一碗水要端平。有一个著名的原理叫 28 原理,它同样也适合我们软件开发的规律,我们的百分之 80 的精力设计和开发的部分只给我们带来了百分之 20 的回报,或者说,我们百分之 80 的回报只是我们的百分之 20 的努力得来的,这个原理告诉我们,我们在平衡时要抓住重点,那些非重点的部分,如果必要可以舍弃,舍弃它们可能会带来更大的价值。下面我们先分析一下前面提到的几个关键因素来仔细讨论下平衡的艺术。

  用户功能性的需求

  毫无疑问,我们的软件最终的目的就是为了要满足用户的需求,由于我们要设计的是一个产品型的软件,这就决定了我们的需求不是很好明确,面可能比较广,甚至有些需求可能还是我们自己想象出来的,但正因为如此我们才有平衡的必要,试想如果我们做的是一个项目,那只需要按照甲方的要求完成即可,合同上甚至很明确要求了,此时也没有多少需要平衡的了。一个产品型的软件,要把百分之80 以上用户都用的功能进行良好的设计做到易用好用性能出众并投入大量人力研发,而那些 50% 用户会用到的需求就可以少投入些人力与时间,那些百分之 5 用户才可能会用的功能且需要耗费大量人力时间的甚至可以舍弃不做。

  但平衡也不仅仅是在与选择做与不做某个功能,更在于怎么做某个功能,一般对于用户的需求我们会有下面几个实现方式:

  1 实现一个简单易用、设计良好、100% 满足用户需求的界面或功能

  2 通过一些界面上的选项设置来实现用户的需求

  3 通过手工修改一些配置文件来实现用户的需求(这种实现方式可能需要的研发资源只占第一种实现方式的1% )

  4 通过脚本来实现用户的需求

  5 通过插件或定制开发来实现用户的需求(后2 种方式其实就是说现在不考虑这个需求,以后就算有了我们能支持即可)

  不同的实现方式需要投入不同的量级的研发资源,从上至下占用研发资源越来越少,这就是我们需要做平衡的地方。

  技术性能上的要求

  用户总希望在软件界面上执行任何操作都能立即得到结果、希望系统能支持越来越多的在线并发、希望系统能全年不停机运行不出任何错误,希望系统能兼容各种平台…… ,所以对我们的系统有很多性能上的要求,要求我们必须支持集群、各种高速缓存、多语言、支持事务操作等,有些性能要求是必须在设计之初加以认真考虑的,因为从以往的经验来看,如果出于研发成本的考虑,系统一开始没有考虑集群、多语言、事务,而在以后系统成型后再予以考虑,那会往往付出更大的代价,这种代价有时是伤筋动骨的。

  同样是满足用户功能上的需要,一个实现需要投入大量研发资源,但程序效率很高,而另一个只需要少量的研发资源,但程序效率稍差,此时该如何平衡呢?相信大多数人都能做出正确的选择,要综合考虑:目前可用的人力资源数量、需要投入的研发资源的差异,模块的使用频度的因素;我经常说,对于客户端应用来说在用户的一次界面操作中只执行一次的函数就可以少花点时间实现,因为3ms 完成一个操作的执行和 300ms 完成一个菜单的执行其实对用户来讲是差别不大的,但这个并不适用与服务器端应用,服务器端应用还需要考虑到在线人数,如果能 3ms 完成就能支持更多的在线用户。

  研发成本(或能力)的制约

  这个因素往往是我们最应该多考虑,但是经常缺忽视的一个因素。

  以一个工程师一年开发3 个模块和一年让他开发 10 个模块来做个比较,只开发 3 个模块时,他基本上可以做到让每个模块完成到 90 分以上,包括代码质量、测试单元、文档等,还能有些时间学习和研究些新技术,并能保持一个愉快的心情高效率的工作下去;但是如果一年让他开发 10 个模块,他可能只能勉强做到让每个模块完成 60 分以上,代码可能有考虑不周全留下隐患、测试覆盖率不高、文档欠缺,终日忙于赶进度没时间充电,工作疲惫效率低下。

  多半的研发工程师是乐观的,在开始的时候自信满满,过低的估计了研发需要的时间,我经常说,要把一个模块完成到60 分可能 1 个人月,要完成到 80 分可能就要 3 个人月,要完成到 90 分以上可能需要 8 个人月,这个增长的比例并不是直线性的而是抛物线形的,所以研发周期往往难以估计,我们必须为将来准备足够的缓冲时间,某种意义说,越多越好。

  所以这也正是在上面的一些平衡过程中,有一些因素要让位于研发资源的投入的重要原因,一个为将来的研发困难做好了充分准备的设计方案才能算是一个好的方案。

  在设计过程中需要注意哪些呢?

  从需求出发

  从用户角度理解的需求出发考虑总是没错的,最忌设计时只考虑技术方面的问题,当然技术方面的问题也必须予以考虑,但前提是必须对需求最好充分的了解和分析,从需求出发并不是说需求最大,需求有时也必须让位于其他的一些因素,要做好平衡。

  从一开始就考虑那些影响面很广的技术要求

  这些因素很可能严重的影响设计,必须提前予以研究,这种研究可以是脱离需求的零散的,有时甚至可以写一些测试代码,但最终必须还是从需求出发,在充分的了解了各种技术点之后,再决定自己的最终设计

  充分考虑研发资源成本

  再好的设计没有付诸实施的资本也不行,所以还是那句话,要做好平衡。

时间: 2024-07-28 22:06:24

艾伟也谈项目管理,软件开发前期设计时的注意事项的相关文章

艾伟也谈项目管理,开始一个项目时最重要的是什么?

我的第一个工作是在一家软件资讯公司,刚上班的时候,公司给我们这些初出茅庐的愣头青安排了细致的培训.其中一个重要的科目是项目管理,一名资深软件咨询师前辈来培训我们我们,开场就问我们:"开始一个项目的时候最重要的是什么?" 我们有的说是"代码管理工具",有的说是"Process",有的说是"成员素质",但是这位前辈都摇头表示不满意,当我们都黔驴技穷的时候,他在白板上画了一个大大的方框--"Boundary! Settin

艾伟也谈项目管理,给敏捷软件开发的26条建议

我经常收集各种各样的至理名言,最近我重温敏捷软件开发:真正的问题是什么?下面是一份26条关键原则的清单,以指引敏捷软件开发团队. 1.完整地干完一件事后在开始另一件事:用厨房比喻来说就是:"先上这道菜,再开始做下一道".软件开发的最大问题就是同时开始几件事情,这将不可避免的造成某些工作被废弃,从而造成浪费.专注于一件事:完整地实现其功能:运行测试:编写文档:签入所有,把这当做一项工作完成,然后再开始下一件事. 2.不要破坏构建:非常明显,但必须被包含在任何软件开发建议清单中.程序员在签

艾伟也谈项目管理,敏捷开发,在路上

如果有一种方法能使你的软件缺陷率降低63%,核心缺陷率降低79%,整体投入减少62%,整个项目开发的时间缩短69%,你会采用这种新的软件开发方法吗? 在回答这个问题之前,你可能会问:是什么方法能达到这样的效果?答案是:敏捷开发.你一定会开始质疑:这是真的吗?或者你会说:我们也在用敏捷,但没有以上提到的这么夸张. 以上提到的一些数据来自Forrester,一家善于用数字说话的咨询公司.他们对多个采用敏捷开发的项目与传统开发方式进行对比,得出以上数据.而这些项目来自敏捷刚刚开始起步的2002年. 不

艾伟也谈项目管理,软件公司的两种管理方式

这篇文章是我的一个外国的同事Gareth推荐给我的,我和他一起工作过一段时间.他之所以觉得非常不错,是因为这篇文章让他身有体会,他觉得我也一定会有体会,并让我考虑一下翻译到我的blog上来.我看完后觉得很有代表性,而且觉得说得太对了,所以翻译过来,希望大家都读一读,最好转给你的公司老板. 这篇文章来源于 StakeExchange 上的一个问题--"为什么BA和PM的薪水要比程序员要高?",顶在一楼的回复分析了这个原因,并指出了两种管理文化. -------------------正文

艾伟也谈项目管理,谈软件协作:君子和而不同,小人同而不和

我们知道现在的软件开发最大的问题就是变化,其实这也不是软件本身的问题,我更觉得是软件的特点.因为他不像建筑,画个建筑图,一般不会偏到哪里去.然而很多需要软件的人,他可能希望软件能达到什么目的,至于具体是什么样子,他自己也不知道.大部分都是看到一部分想起一部分,自己也不断的修正.这也是为什么最近敏捷大行其道. 我甚至服务过一个客户,做一个公园系统,为的是送一张免费的VIP卡给业主,最终目的是卖房子. 既然软件的需求是不固定,也就是不断变化,所以我们签合同的时候往往有两种方式: 1.固定价格 这种就

艾伟也谈项目管理,编程习惯

文/Alexey Radul 译/程显峰 原文地址:http://web.mit.edu/~axch/www/programming_habits.html 近年来,我对编程艺术有很多体会.过后,我发现有些体会是错的:有些体会我遗忘了但又重新感受到:而另外有些则是必然会发现的.我还完善了一套项目管理的好习惯,这些习惯包括我自己的,或者小组的,抑或是更大的,公司内部的.一方面,这些习惯对软件的成功开发是至关重要的(太小或者纯粹巧合的不算),另一方面,这些习惯也不是什么高深莫测的东西,较小的篇幅就可

艾伟也谈项目管理,谁动了项目的时间?

项目进行到今天,我突然发现项目已经花费了快70%的时间,而离编码结束似乎还很遥远,面对着领导质问般的眼神和组员迷茫般的目光,我深深地吸了一口气,大脑开始了高速地运转,到底谁动了项目的时间? 项目情况 首先介绍一下项目的大概情况: 其实项目倒不是很复杂,一个处理业务流程的系统.接到项目的消息是七月底的时候,由于当时领导与客户谈妥之后,客户想在八月中旬就看到,所以当时就非常紧张.考虑到时间如此之紧,项目便匆匆开始.本来计划三个人的,但是考虑到时间太急,又加了三个人进来.在写SRS的过程中,客户那边传

艾伟也谈项目管理,关于项目管理的一点体会

这段时间,一直在负责一个项目的管理与开发.在时间短.任务紧,而团队人员又大部分是没有经验的菜鸟的恶劣情况下,我带领接近40人的团队,终于在客户规定的时间范围内如期交付产品.这其中,经历了需求变更.人员变动(因为其它任务,先后有近10人离开团队)等诸多问题,项目仍然取得成功了,不能不说有几分侥幸,但此外也有一些经验与教训可以与大家分享. 一.项目开发方面 需求 项目应以需求为核心.一个项目是否能够成功,对需求的准确把握在成功因素中要占上60%的比例.不管系统的架构设计.团队管理有多么的成功,如果需

艾伟也谈项目管理,需求管理成熟度的五个级别

需求管理是软件开发全生命周期重要的一个环节,我们每个人都知道它的重要性,但是要真做做好并不简单,我也写了一本在线电子书业务分析与需求.pdf来讲解需求相关内容.对于每种技术和方法,就像以前我写过的企业架构成熟度模型(EAMM)的一样,我们都不可能一下子就精通,而是按照一种学习的曲线进展,本篇本篇主要介绍一下需求管理成熟度的六个级别. 级别0:没有需求(no requirements) 没有任何明确的需求被记录下来,他们假定知道要构建什么,希望节省需求的时间来做开发,但这势必会给开发工作带来混乱,