软件开发为什么失败?

我从事软件开发工作已经有十年了,这十年中,亲眼所见、亲耳所闻,报纸、杂志、网络上有各种各样软件项目开发的经验和教训,总的感觉是,成功的少,而失败的多,有的是部分失败,有的是完全失败,我在软件的开发中,也有许多失败的教训,那么软件为什么会失败呢?对于这个问题的回答,有各种各样的答案,我所经历的软件开发中的失败,总结起来,大概是这么几种:

遇到了技术难关项目管理错误,软件失去了控制。

用户需求变化太快,无法把握。

由于某些人员变化而引起项目失败。

我认为,上面的问题只是项目失败的现象,本质并不在于上面提到的几种原因,而在于在软件开发的过程中,项目管理者在项目管理中所犯的几个致命错误:

一、没有或者没有好的项目计划

在开发活动中,项目计划是项目启动后的头一件重大事件,但是经常被忽略或者得不到应有的重视。

项目计划好比是一份项目的交通图,指导项目准确的达到目标,即使它不是被形成提交客户的正式文件,也应该是项目组内的规范文档。可是项目计划往往只是由项目管理者制定或是在项目管理者的脑子里,只有项目管理者知道。这样的项目计划比较粗糙和模糊,同时由于项目计划是由项目管理者制定的,项目组的其他成员只能被动的执行。而项目管理者既不可能是项目中的全才,也不可能代替其他成员工作,因此这种得不到成员认可的项目计划就等于没有制定项目计划。

为什么每个项目都需要一份项目计划,并且要形成规范的文档呢?这是因为:

第一、通过制定计划,使得小组成员,对项目有关事项,如资源配备、风险化解、人员安排、时间进度、内外接口等形成共识,形成事先约定,避免事后争吵不清;

第二、通过计划,可以使得一些支持性工作以及并行工作及时得到安排,避免因计划不周造成各子流程之间的相互牵掣。比如测试工具的选择,人员的培训都是需要及早计划和安排的。

第三、可以使项目组人员明确自己的职责,便于自我管理和自我激励;

第四、计划可以有效的支持管理,作为项目管理者、业务经理、QA经理、测试经理们对开发工作跟踪和检查的依据;

第五、做好事先计划,就可以使注意力专心于解决问题,而不用再去想下一步做什么。

第六、计划是项目总结的输入之一,项目总结其实就是把实际运行情况与项目计划不断比较以提炼经验教训的过程。通过计划和总结,将项目过程中的经验和教训变成公司及项目组成员的知识积累。

制定项目计划的过程被称为项目策划。在项目策划时,要尽量让所有项目参与人员估计自己的工期,使团队成员积极参与到项目中来,而且由于技术发展如此迅速,往往只有具体模块开发人员对那部分工作最了解;项目管理者应该积极推动项目有序进行,积累项目管理数据,推动开发过程能力成熟度的提高,以便可以协同开发人员进行越来越准确的项目估计。

实际工作执行项目计划常常遇到各种困难。有的组织文化中有种观念认为计划是一种约束,反正大家努力往前赶就对了,没必要自己捆住手脚;另外一种情况是大家没有按照计划工作的习惯,计划虽然做好了,做的时候还是我行我素,项目管理者也没有维护计划的习惯,项目开始没多久,项目管理者就埋头去解决具体的技术问题,将计划完全撂到了一边。

事实上,不仅是在项目计划这一问题上,在其它引入制度化的场合都遇到了类似的困惑。据说,美国家庭常会对做家庭清扫这样的事情列出一张“责任矩阵表”,按表的内容顺序进行扫除活动,完成一项作一个记号,这其实就是一种简单的项目管理,他们在如此自然的运用,对于中国人是不可想象的。但是制度化是商业社会的基石,迟早要渗透到社会生活的每一个缝隙。具体到项目管理中的计划活动,除了尽量把计划做的更具可行性以外,努力在组织内传播和培育制度化的组织文化也将是项目管理者们的一项长期责任。

二、正确对待需求变更

作为软件开发人员或者软件系统客户,相信我们都遭遇过因为需求变更而需要修改系统的情况,一般说来客户会要求改变界面,改变操作方式,甚至改变业务,说,当时我是那样要求的,不过现在我们的业务调整了…这时需要中断正在进行的工作,需要查证以往的资料,需要修正计划,需要……。

需求包括业务需求、用户需求和功能需求。业务需求(Business

Requirement )反映了组织机构或客户对系统、产品高层次的目标要求,用户需求(UserRequirement )描述了用户使用产品必须完成的任务,功能需求

(Functional Requirement )定义了开发人员必须实现的软件功能。在软件系统开发过程中,有很多问题都是由于在需求分析阶段没有正确地收集、编写、协商、修改产品真实需求而产生的,造成这样的状况有几方面的原因:

第一、对需求的理解分歧,当客户向需求分析人员提出需求的时候往往是通过自然语言来表达的,这样的表达对于真实的需求来说是一种描述(甚至只是某个角度的描述),远远不能保证这样的描述可以得到百分之百的正确理解,也许在同客户交流的第一时刻就埋下了理解分歧的种子,打一个比方说客户说我要的是大象,身子象一堵墙,耳朵象扇子,四条腿象四根柱子,尾巴象绳子,分析人员想,哦,墙、扇子、柱子、绳子这些我都知道,但是真的做出来的时候客户当然会跳起来了!这是理解分歧的问题,有客户表述责任、同时也体现了双方的交流不够,项目管理者工作中很重要的一项就是“沟通”。项目管理者应该不断组织协调甚至参与和用户的沟通。

第二、系统实施时间过长,一个大中型系统的建设可能要延续一段时间,当客户提出要求之后,他当时并不能看到系统的运行情况,当双方认为理解大概没有分歧的时候(事实上还会有个Deadline ),开发方就开始工作了。当客户拿到差不多可以试用的产品时他可以实际操作,这时候他就会对系统的界面、操作、功能、性能等有一些切身的体会,有可能提出需求变更要求;

第三、客户具体情况不同,有可能客户行业的竞争度高,需要随时作出调整和反应,那么他们自然会经常提出需求变更的要求;也有可能客户所在的行业操作不规范,本身存在很多人为因素,这时候开发方更是需要随时准备应变;开发本身要求有可能是来自开发方自身版本升级或性能改进、设计修正的要求出现需求变更,这时更是无法绕开这个问题的了!

所以说就算分析人员和客户之间不存在理解分歧,客户对于实际的系统还是会提出一些个人意见,就算没有个人意见,他们自己的业务会变化或环境发生变化,这些都是无法避免的,所以我们不应该梦想客户需求不变,当我们开始一个项目的时候就应该意识到,客户需求变更一定会有的。

那么对于这样的现状,我们该怎么办呢?客户是上帝,难道我们就象以前一样,跟着客户的需求不停地修改软件,到最后工期延长,员工疲惫,成本成倍增长,客户满意度降低,原来的设计也会改变得支离破碎,系统难以维护?

如果需求一定会变化,如果我们不得不面对的话,或许可以通过以下的几个方面做到:

加强人员沟通

我们要提高与客户的沟通能力,增强服务意识和责任感,因为将要开发的系统直接建立在和客户沟通后形成的《需求分析》的基础上的;同时规范需求分析人员和客户沟通的方式,以及规范需求说明的格式,如果可能的话,尽量采取象XP的UserStory ,或者用户可以理解的用例图来对需求进行标准、规范的描述,保证双方在工具的协助下对需求达到共同的认识。

确定文档的有效性(Validity )

需求文档是相当重要的,可是目前存在一种奇怪的现象,本来说必须要有文档,而且是按照某种特定的格式,当然这没有错,但接下来,却没有人关心文档的真正内容是否正确,格式是否真的合理,是否实用(而且很多情况下是在几天时间里赶出来或补上去的),例如我遇到一个例子,

需要在原来的需求基础上进行后续开发,文档找到了,完全符合格式的要求,但是我在里面找到的线索是有限的,结果是自己花几天的时间查找数据表结构、甚至查看数据表的内容,询问当时的开发人员,才分析到所要的关系,这种情况在设计文档里也存在,所以同时提一提,希望我们的开发人员、PM 以及各级领导可以注意文档的有效性和有用性问题,甚至对文档的格式进行一下合理性检查。

建立代价估算(Cost Estimate )概念

这一点对开发方和客户同样重要,因为如果出现需求变更,不可避免将带来成本的增加、开发时间延长等不良后果,这样的影响是双方的。

这时候需要区分需求变更的原因,是客户方必要/不必要的要求,还是由于开发方的工作失误,还是双方都有原因,然后对现实情况进行分析,得出双方实现变更需求的需要的成本,包括时间,人力,资源等等方面,再与客户商讨是否必要进行变更和如何在最小代价下实现变更。

当客户看到实际的代价估算,他们也会再一次慎重地考虑需求变更问题,也会更容易理解系统建设中的进行状况,自然开发方也不用负担所有的需求变更成本,所以进行成本分摊还是有其积极意义的。

当然还有建立需求变更版本控制等等专业的需求管理。

从软件分析和设计着手

前面说了面对需求变更的几种策略,那么从软件系统分析和设计的角度来看,通过采用合理的分析设计方法,进行可扩展性设计也是有效地降低需求变更引起的风险和维护代价的一个重要手段。

三、项目管理者和开发人员之间的关系

项目管理者和开发人员之间的关系,本来应该是相互团结,相互帮助,共同面对问题的关系,可是许多项目管理者把这种关系扭曲成了管理与被管理的强制性关系,用种种规章制度,种种管理方法来强迫开发人员接受,把自己放到了开发人员的对立面,和开发人员离心离德,甚至还美其名曰"量化管理,科学管理"。在这种糟糕的管理下,开发人员没有任何办法,要么被动接受糟糕的管理,要么辞职以抗议。一旦一个项目发生了这种情况,它想成功就非常难了。

这种问题原来并不明显,现在随着各种MBA,印度经验,软件工厂等似是而非的理论的泛滥,许多人,尤其是许多根本不懂软件开发的管理者,更加变本加历,用近乎苛刻的手段来加强对开发人员的管理,提出种种令人发笑的量化指标来对开发人员进行度量,还加上理论的依据,对于敢于反抗他们这种做法的开发人员,一律以开除来解决问题,造成的一个非常荒诞的现实就是,许多公司里宁愿使用刚刚毕业没有任何经验的学生,不要有工作经验的工程师,美其名曰:易于管理,哈,容易上当受骗而已。请问,在这种管理者和开发人员之间的关系作用下,软件项目有可能获得成功吗?

我个人并不反对尝试性的使用各种开发方法来进行管理,也不反对MBA来管理开发人员,我反对的是软件开发中的强权行为,完全剥夺了开发人员应当具有的对于项目的发言权和建议权,完全不考虑软件开发作为高强度脑力劳动的特殊性,用外行来管理内行并不可怕,可怕的是这个外行偏偏认为自己是内行,这才是事情的可怕之处。外行就是外行,不能因为处在管理者的位置上,就认为自己一下子变成了内行,谁敢反对我谁就走人,用这样的人来管理软件开发,项目组内没法形成一种民主讨论的机制,人人只考虑进度而不考虑质量,软件开发怎么可能成功呢?

项目管理者和开发人员并没有本质的区别,他们只是所处的岗位不同,担任的责任不同而已,在软件开发的问题上,尤其在具体的技术细节上,往往管理者不甚精通,如果他不能吸纳开发人员的智慧,而是自己一个人拍脑袋来做决策,那么失败就在眼前了。

在软件开发中,无论采用那种模型,那种工具,都离不开人的参与,离不开人与人之间的关系,如果不能正确对待人与人之间的关系,把本来正常的,平等的,合作的人与人之间的关系变成了不正常的,不平等的,对抗的人与人之间的关系,那么还希望项目能够成功,无异于缘木求鱼,南辕北辙了。

以上谈到了项目失败的几方面原因,实际上还有很多原因,但是以上的几点是完全可以通过科学的管理解决的。作为一名项目管理者我们没有办法保证所做的每个项目都成功,但是可以通过学习和运用科学的管理办法提高项目的成功率。这是我们的工作也是我们的责任。

时间: 2024-11-24 06:21:03

软件开发为什么失败?的相关文章

敏捷软件开发简述

前言:由于我读了邹欣老师的<构建之法:现代软件工程(第二版)>,因此对敏捷软件开发有了比较大的兴趣.于是我在网上找了一些论文,比如Requirements Engineering and Agile Software Development.A decade of agile methodologies: Towards explaining agile software development.在读了这些论文之后,对敏捷软件开发有了大致的了解.这篇博文主要是简单介绍敏捷软件开发,重点集中在主

敏捷软件开发VS传统软件工程

敏捷软件开发:又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新兴软件开发方法,是一种应对快速变化的需求的一种软件开发能力. 与传统软件工程相比,它们的具体名称.理念.过程.术语都不尽相同,相对于"非敏捷",更强调程序员团队与业务专家之间的紧密协作.面对面的沟通(认为比书面的文档更有效).频繁交付新的软件版本.紧凑而自我组织型的团队.能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发中"人"的作用. 本文将介绍敏捷软件开发的历史背景与发展,

敏捷软件开发?什么是敏捷?

敏捷软件开发?什么是敏捷? 敏捷开发(Agile development)是如今软件工程项目中一个大热的词汇,很多大大小小的开发团队都喜欢高举敏捷开发的旗号,搞出一套显得大大不同于传统的运行模式来区分自己的团队博取眼球,他们手头所做的事情,只是套用一套流行的敏捷开发模板,如Scrum,Crystal,XP到自己的开发流程中,就认为自己的整个开发体系会有一个质的飞越.然而他们是否能真正驾驭所谓的敏捷开发?他们是否理解了敏捷开发的核心理念?这都是要划一个大大的问号. 笔者我在刚刚接触这个词的时候,下

软件工程:传统软件工程 vs 敏捷软件开发

前言 软件工程(Software Engineering): 是一种层次化技术. 将系统化的.规范的.可量化的方法应用于软件的开发.运行和维护,即将工程化的方法应用于软件. 研究"建立和使用一套合理的工作原则,以便经济地获得可靠的.可以在实际机器上高效运行的软件"的方法. 敏捷软件开发(Agile software development): 一种应对快速变化的需求的一种软件开发方法.基于迭代和增量开发,通过自组织,跨团队,沟通协作完成开发工作. 一.传统软件工程 (一)产生背景 随着

敏捷软件开发与传统软件工程

敏捷软件开发与传统软件工程 北航计算机学院 14061157 李奕成 引言 软件开发过程是软件工程中相当重要的一环.一个正确.高效的软件过程能够提高软件工程活动的稳定性.可控性和有组织性.但是,并不存在一种软件过程能够完美的适应所有的软件工程情况.因此,在不同情况下选择合适的软件开发过程显得尤为重要.现代软件工程方法必须是"灵活"的,也就是要求软件工程活动.控制以及工作方法适合于项目团队和要开发的产品. 说到软件工程.敏捷开发,就要提到软件过程的发展历史.20世纪60年代,不存在现代意

电脑小白学习软件开发-C#的选择语句、异常捕获,进攻程序员

写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用视频. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是不在话下. 不得不说,C#这门语言是小编以为最好的语言.其优美的语法,最具人性化的新特性,以及无敌的开发工具令人陶醉.接触过不少语言,却一直回味写C#的那种状态. 本人认为目前C#是比较适合入门的语言,最为小白,热衷于电脑编程开发的人,可谓是一个大大的福利. 不管如何写过多少中语言教程,在写C#教程时却是如此的富含感情.为了完成我们的全栈梦,作为服务器端,

敏捷软件开发 – SRP 单一职责原则

SRP:单一职责原则  一个类应该只有一个发生变化的原因. 为何把两个职责分离到单独的类中很重要呢?因为每一个职责都有变化的一个轴线.当需求变化时,该变化会反映为类的职责的变化.如果一个类承担了多于一个的职责,那么引起它变化的原因就会有多个. 如果一个类承担的职责过多,就等于把这些职责耦合在了一起.一个职责发生变化可能会削弱或抑制这个类完成其他职责的能力.这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏. 有两个不同的应用程序使用Rectangle类.一个应用程序是有关计算几何

《快速软件开发》的感悟

书中对不同的人员有不同的动机作了一些比较详细的分析.比如:开发人员有比如成就感(当然我觉得任何参与到这个其中的人都有成就感的).开发机遇.工作乐趣等.又如对管理人员,其动力主要是:责任感.成就感.还有受认可程度等.因为自己在一开始对这些东西并不是非常地清楚,所以有些工作开展起来并不是非常顺利.现在了解了一些这个东西之后,对激发人员动力是非常有用的.同时这一章举了一些激励失败的例子如过分夸张的表扬等,这些tips对于PM是非常有用的.所以推荐PM去阅读一下这一章. 团队合作是在12章中有比较好的介

《敏捷软件开发读书笔记之一》

要想成为一名优秀的软件开发者,需要熟练应用编程语言和开发工具,更重要的是能够领悟代美代码背后的原则和前人总结的经验——这正是本书的主题.本书凝聚了世界级软件开发大师RobertCMartin数十年软件开发和培训经验,不仅是一部深入浅出.生动易懂的面向对象原则与模式著作,而且还是一部通俗的敏捷方法导引书和快速实用UML教程.分为敏捷开发,敏捷设计,薪水支付案例研究,打包薪水支付系统,气象站案例研究和ETS案例研究六个部分,包含30个章节.以下是我对前两个部分的认识及见解: 以下六章是对第一部分敏捷