起步于系统工程师,迈进入测试工程师,从起初的C/S系统到互联网时代的B/S系统,从事过电信增值业务、软交换、烟草OA、公安技侦和电子商务等行业的软件测试开发和管理多年,愿与大家共同分享共同交流,关注软件项目管理、测试团队管理、软件流程控制和软件性能测试及自动化测试技术。互联网时代,技术推动进步,欢迎人才推荐:jonas.wangl@alibaba-inc.com

发布新日志

  • [转载]敏捷开发实践

    2009-11-19 17:24:04

          

        随着Agile敏捷开发的流行,越来越多的公司采用敏捷开发用于软件产品和应用的开发。笔者的产品开发团队在两年前开始采用敏捷开发方法,一直实践到现在,并取得不错的成果,包括:产品功能更加符合市场和业务人员的需求,开发效率获得提高。本文从实践的角度介绍笔者所在团队的产品敏捷开发过程和作者的敏捷开发体会。

    敏捷开发体会

        实施敏捷开发近两年来,我对在产品开发中应用敏捷方法有着深刻的体会。首先说下产品背景。我参与的产品是面向行业的产品,在全世界都有客户,有10年历史,和一百多个基于不同版本的客户,我们的团队完全负责产品的未来发展方向、发布计划、架构、设计、开发进度、测试、客户支持等。在这样一个面向全球的产品和自主的团队环境中进行敏捷开发体会尤其深刻。

        1) 注重概念和架构设计,而轻详细设计

        敏捷开发中,注重概念和架构设计,而轻详细设计。这里的概念设计,可以看成是为什么要做这个产品或模块,强调的是产品的路线规划、市场趋势、客户价值、技术趋势等。架构设计,可以看成从整体上看,概念设计应该用什么方式实现、分几个层次、多少组件、不同层次和组件之间关系是什么。详细设计,则是具体的设计和做法、API接口等。

        一个产品,特别是面向行业的产品,概念设计和架构设计非常重要,需要考虑行业未来的发展方向,产品在市场中横向和纵向的比较,技术的发展方向,和每个模块的投入和收益的比例等,这样才能尽可能保证产品沿着正确的方向前进。在产品中新增或删除一个模块需要非常谨慎,因为一旦新增模块被客户使用,以后就很难在产品中去掉这个模块。还需要考虑产品各个版本之间的兼容性,以及客户的升级迁移。所以,在开始正式开发之前,通过概念设计和架构设计,梳理思路是非常必要的。

        2) SWOT分析

        以前在做项目时,大多是从技术角度来考虑哪一些功能模块需要做,哪一些功能模块先做,而没有一个系统化的分析方法。造成的结果是有一些功能模块投入很多资源,却并不一定是客户最想要的。

        在敏捷开发中,更加注重客户需求。如果对产品进行SWOT分析,就能选出付出最小工作量,但能获得最大价值的模块。

        SWOT分析阶段会在概念设计和架构设计之后进行,输入是概念设计和架构设计,输出是模块的重要度和需要的时间。这样按照性价比可以进行排序,选出最能符合市场的模块。

        一款产品哪个模块重要,哪个先做,需要花多少资源和时间投入,花这么多时间和资源的模块是否在客户心中有相应的重要程度等,这些都是由这款产品的市场策略来决定。所有产品都是为了市场和赢利为目的,Agile方法更好地帮助企业实现了这一点。

        3) 业务和客户驱动,而非技术驱动

        这点说是体会,也可以说是教训。在我们的产品开发过程中,在某一新版本中重新设计了老版本的某一个重要模块,而引发了几个问题:一是,新版本的模块和老版本模块的兼容性问题,导致老版本客户无法平滑的迁移到新版本;二是,新版本的改进是纯技术方面的重新实现,不管对客户而言,还是对内部的架构而言,都没有明显好处;最后导致的结果是我们花了很多资源和人力去重新实现,但是在最后由于种种考虑还是废弃了重新实现的模块,依然沿用老模块。

        在产品的敏捷开发中,虽说拥抱变化,但不盲目变化。产品的改动需要经过概念设计、架构设计以及SWOT分析后,三思而后行。敏捷开发中也强调"在整个项目开发期间,业务人员和开发人员必须天天都在一起工作",确保技术人员能够开发出客户需要的产品。

        4) 时刻考虑版本兼容性

        敏捷开发,废除了过多冗余的文档和繁杂的设计,强调拥抱变化。但作为产品,敏捷开发不意味着盲目地去变化。

        当设计变动、API接口重构、配置文件变更时,要时刻考虑产品的架构、规划路线图,老版本的兼容性,及迁移平滑性。否则,随着版本的增多,必将面对着大量的维护工作。

        5) 轻文档,但非无文档

        敏捷开发强调沟通的重要性,而轻冗余文档。但敏捷开发并不意味着无文档。在敏捷开发过程中,适量的文档还是很有帮助,有助于整理思路,加快沟通和讨论。

        我们产品中的文档包括:概念设计文档、架构图、当前版本要实现的功能列表,以及SWOT分析。

        这些文档在每个产品版本开始之前会有产生,在每个迭代的过程中根据业务人员和市场的反馈也会有一些变更。通过我们实践证明,这对产品的思路、沟通讨论都非常有帮助。

        而且这些文档,大多是几页PPT,书写和维护工作都很小。

    敏捷开发过程

        敏捷开发改进了产品的开发流程,提高了整个团队的效率。下面分析敏捷开发前和敏捷开发后的产品开发的各个阶段。

        1) 敏捷开发"前"的产品开发过程

    图1 敏捷前开发流程

        上图是敏捷开发前我们产品一个版本的开发流程,整个开发大概持续一年左右。从图中可以看出,流程中的大多数活动都是串行进行。这样的一种类似瀑布的开发流程,前提是需求在产品的初始阶段就完整的被捕获并正确的分析,这样才能保证最后交付的产品是客户所需要的产品,但通常这样的理想状况很难实现。

        类瀑布的开发流程缺乏灵活性,无法通过开发活动来发现不够确切的需求,导致产品无法随着业务人员和市场的反馈而随需应变,开发出符合业务人员需求的产品。

           2) 敏捷开发"后"的产品开发过程

     

    图2 敏捷后开发流程

        上图是敏捷开发"后"我们产品一个版本的开发流程,整个开发大概也是持续一年左右,但每个迭代都是1个月时间。和敏捷开发前相比,有很多的区别和优点,下面是其中几点:

        市场和需求驱动,拥抱变化

        在我们产品敏捷开发中,每个迭代结束,都会有一个产品迭代演示大会,把这个月的开发结果演示给组员、业务人员、售前,甚至客户,并收集反馈。此外,在开发的过程中,产品的业务人员和售前时刻保持与产品开发团队的沟通和工作,保证开发出来的产品是符合业务需求。

        充分利用资源和时间

        敏捷开发前,产品的需求设计阶段占用整个开发流程35%左右的时间,这段时间只需要几个核心的架构师和设计人员,无法充分地利用开发和测试人员。敏捷开发后,迭代开发、强调沟通、缩减文档,在每个迭代初期就可以充分地利用开发、测试人员的时间,达到效率最大化。

        每日交付

        产品开发过程中,每天都会做自动化Build,并生成可以交付的产品。业务人员、客户都可以试用并提供反馈和新需求。

        充分自动化

        敏捷开发强调拥抱变化,这必然带来动荡的产品代码变更。每一个新的功能和修改的功能,都可以影响到其他功能,造成副作用。所以,需要自动化去支持变化,在变化的同时保证质量和开发速度,包括编译自动化、单元测试自动化、功能测试自动化、UI测试自动化、集成测试自动化等。

    架构师和Scrum Master的重要性

        流程的变化必将带来岗位和职责的变化,架构师和Scrum Master是在敏捷开发中两个重要的人物角色:

        1) 产品架构师

        在产品的敏捷开发中,特别是我所参与的产品是面向行业的产品,架构师是个举足轻重的角色,需要有深厚的行业背景、创新能力,以及架构能力。

        产品是为了解决一类客户需求而存在。但是,客户的需求往往是会随着业务的发展而变化,而且竞争对手也会有类似产品的推出。所以一个产品推出市场后,所具有的功能模块慢慢地会越来越成熟,并拥有越来越多的竞争对手,慢慢地失去竞争力。一个好的产品,特别是面向行业的产品,要具有长期的生命力,需要具有下图所示的产品模型:

        成熟的模块:指的是推出市场有一段时间,这些功能模块因满足客户的需求而被广泛使用。随着市场趋于稳定,大量竞争对手的产品也推出类似的功能。这些成熟模块都是产品的基本模块,不代表产品的竞争力。产品中如果只具有这些功能模块,随着需求和竞争的激烈,慢慢会走向灭亡。如90年代的BP机一样,当手机一旦推出,这个产品也就走向灭亡。

        发展中的模块:指的是刚推出市场并且具有强劲的市场生命力、符合客户当前几年的业务发展需求,正在被大客户所接受的功能模块。这些功能模块是产品占领市场的动力,是继成熟的功能模块后,产品的新的增长动力。

        研究中的下一代产品方向:指的是还没有推出市场、正在研究中的、符合未来行业五到十年发展方向的模块。当然如果能创造出未来的发展方向,则是最高境界。如任天堂的Wii、苹果公司的iPhone。

        一个行业软件产品要保持长期的生命力,在整个产品的生命周期架构规划中,需要考虑到这三种模块和特性,只有这样才能保持产品的先进性和长久生命力。

        敏捷开发也强调拥抱市场变化,这对产品架构师提出了很高的要求——深厚的业务背景、创新能力、技术洞察力和架构思想。

        2) Scrum Master

        Scrum Master虽然是敏捷开发的新名词,但其工作内容和开发组长没什么太大的区别:安排任务、协调资源、控制进度和解决难题。

        架构师根据对行业的理解和创新,设计出产品的架构。Scrum Master则是进一步分解和实现这个架构中的每个组件。如果形容"奥运会开幕式"是一个产品,架构师则设计整个开幕式的主题、创意、架构和包含的主要环节,而Scrum Master就是整个庞大工程的详细设计者和协调者。

        在我们产品中有三个Scrum Master,各自负责架构中的不同模块,并和开发人员一起把模块分解成一个个单独的、可以衡量的用例,然后协调开发人员高质量的完成任务。

        此外,每天早上需要主持小组成员进行一个10分钟左右Scrum会议。每个组员汇报昨天完成的任务,是否完成任务以及碰到的问题,最后是今天打算完成的任务。Scrum Master会协调解决每天碰到的问题,确保产品进度和质量。

    总结

        在笔者的理解中,敏捷开发是一种思维方式和软件过程方法论,以及一系列的最佳实践,它能帮助团队开发出更加符合市场需求的产品。我们的团队在产品两个版本的敏捷开发历程中,不断摸索,找到了一条适合自己的产品敏捷开发流程,我们还将继续用敏捷的思想改进我们的敏捷开发流程,希望能与大家讨论探索,持续改进。

        通过这篇文章,我是想站在软件测试角度来说下我个人的想法,很显然敏捷开发中的两大重要的角色就是开发工程师和测试工程师,而且测试工程师的作用将发挥的淋漓尽致,最大限度的超出了开发工程师,因为我们不仅要保证单元测试、模块测试、集成测试和系统测试等功能外,还要保证系统性能在满足需求,另外还要做测试自动化脚本开发,所以说测试的工作会在敏捷开发流程中大大体现出来,有的同学问了那这样要求测试技能很高的,是的,没错,要想在敏捷开发过程中起到测试驱动开发,测试指导开发,我们的技能肯定要提升,目前瀑布式和类迭代方式的开发模式在有的项目中已不适合了,不仅浪费资源而且增加项目的开发进度,所以逼着我们去尝试新的开发模式--敏捷开发!

  • 为什么要引入敏捷开发

    2009-11-19 15:21:50

    为什么要敏捷?这个问题可能有很多种答案,既有简单的回答,也有复杂的回答,还可以从多个角度、多个层面来问题这个问题,比如个人、团队、企业和组织分别为什么要敏捷等等。

    这里,我想列出几个最基本的原因。

    Better, Faster, Cheaper(BFC)软件研发要敏捷,首先是因为敏捷能给我们带来很多好处,比如降低风险,提高质量,缩短时间,减少成本等等。如果敏捷软件工程不能带来比传统软件工程更多的好处,那为什么要敏捷?没有必要。这是最基本的逻辑。

    任何软件工程、软件过程改进的目标,有点像奥运口号,无非是 BFC: better, faster and cheaper,还有人提出了 cooler, happier ... 显然,敏捷改进的目的是为了比传统管理和开发方法做得更好、更快、更节省等等,这是我们的基本出发点和判断准则。

    敏捷方法的崛起是 20 年来世界软件工程的又一次重大革新也许很多人还没有意识到,敏捷变革(agile transformation)是当前正在进行中的世界软件工程史上又一次重大的 paradigm shift(范式转变)。另一次著名的范式转变发生在上世纪末的八九十年代,也就是大家比较熟悉、公认的由传统结构化编程向新型结构化编程(OO,面向对象)技术的转变。

    “敏捷”是一个形容词,“敏捷”也是一种状态,敏捷(如快速应变)能力是所有优秀企业/组织、优秀团队和优秀个人都具有的一种基本特质。因此,不出意料,敏捷软件工程、敏捷过程和方法,也率先被世界上最优秀的一批软件研发领导企业、组织、团队所实践和采用,目前业界熟知的有微软、IBM、Yahoo!、诺西、华为等等。

    “敏捷”的一个反义词是“迟钝”,作为个人或组织,不能及时地响应变化,适应变化,代表他已经衰老,不合时宜了。进化论告诉我们,物竞天择,适者生存。历史和未来都将证明,不具有敏捷能力的软件研发组织,迟早会被现代市场竞争所淘汰。

    敏捷过程改进是国内中小软件企业和组织提升竞争力的重要手段与整体实力和适应能力更强的大中型企业相比,中小企业通常对项目的时间、成本、风险和利润率等要素更为敏感,经不起几次折腾。

    而与传统软件过程、传统管理和开发方法相比,敏捷方法具有以人为本、轻载(lightweight)而灵活、成本低、开销小、效率高、见效快等优点,尤其适合中小软件研发企业或组织的软件过程改进和企业业务流程再造(BPR)。

    敏捷方法弥补了 CMM/CMMI、ISO 9001 等体系的不足在过去八年中,我们看到真正的 CMMI 专家一直在研究敏捷,学习和吸收敏捷的长处,出现了 CMMI 主动拥抱敏捷、与敏捷集成或融合的显著趋势。既然 CMMI 要拥抱敏捷,就说明敏捷有 CMMI 所缺少的东西,如此庞大的 CMMI 体系仍然是不全面的。

    CMMI 与敏捷并非水火不相容的关系,而是可以相互补充、相互促进的关系。现在人们逐步认识到,没有敏捷度(Agility)考量的成熟是不全面(片面)的成熟。

    通过了 CMMI L5 之后,软件研发组织的过程改进向何处去?敏捷过程改进是组织过程持续改进的一个重要和主攻方向。就我个人的经历看,这两年来国内不断有拿到 CMMI 证书的客户和朋友向我打听敏捷改进的事情,征求我的建议,CMMI L3 到 CMMI L5 的企业都有。这的确是一个好现象,相信未来 5 年内这样的 CMMI 组织会更多。

    事实上,不论您的软件研发组织、企业已经获得了 ISO 9001 证书,还是 CMM 各级证书,或 CMMI 各级证书,甚至 CMM L5 或 CMMI L5 等各类顶级证书,抑或以上各级、各类证书啥都没有,从提高效率、加强内功的角度看,实施敏捷过程改进,或者参考敏捷方法、敏捷过程模型进行持续过程改进,都是一个非常值得考虑的举措。
  • 敏捷开发的一些方法

    2009-11-18 18:31:37

    敏捷开发包括一系列的方法,主流的有如下七种:

    XP

    XP(极限编程)的思想源自 Kent Beck和Ward Cunningham在软件项目中的合作经历。XP注重的核心是沟通、简明、反馈和勇气。因为知道计划永远赶不上变化,XP无需开发人员在软件开始初期做 出很多的文档。XP提倡测试先行,为了将以后出现bug的几率降到最低。

    SCRUM

    SCRUM是一种迭代的增量化过程,用于产品开发或工作管理。它是一种可以集合各种开发实践的经验化过程框架。SCRUM中发布产品的重要性高于一切。

    该方法由Ken Schwaber和 Jeff Sutherland 提出,旨在寻求充分发挥面向对象和构件技术的开发方法,是对迭代式面向对象方法的改进。

    Crystal Methods

    Crystal Methods(水晶方法族)由Alistair Cockburn在20实际90年代末提出。之所以是个系列,是因为他相信不同类型的项目需要不同的方法。虽然水晶系列不如XP那样的产出效率,但会有更多的人能够接受并遵循它。

    FDD

    FDD (Feature-Driven Development,特性驱动开发)由Peter Coad、Jeff de Luca 、Eric Lefebvre共同开发,是一套针对中小型软件开发项目的开发模式。此外,FDD是一个模型驱动的快速迭代开发过程,它强调的是简化、实用、 易于被开发团队接受,适用于需求经常变动的项目。

    ASD

    ASD(Adaptive Software Development,自适应软件开发)由Jim Highsmith在1999年正式提出。ASD强调开发方法的适应性(Adaptive),这一思想来源于复杂系统的混沌理论。ASD不象其他方法那样 有很多具体的实践做法,它更侧重为ASD的重要性提供最根本的基础,并从更高的组织和管理层次来阐述开发方法为什么要具备适应性。

    DSDM

    DSDM(动态系统开发方法)是众多敏捷开发方法中的一种,它倡导以业务为核心,快速而有效地进行系统开发。实践证明DSDM是成功的敏捷开发方法之一。在英国,由于其在各种规模的软件组织中的成功,它已成为应用最为广泛的快速应用开发方法。

    DSDM不但遵循了敏捷方法的原理,而且也适合那些成熟的传统开发方法有坚实基础的软件组织。

    轻量型RUP

    RUP其实是个过程的框架,它可以包容许多不同类型的过程,
    Craig Larman 极力主张以敏捷型方式来使用RUP。他的观点是:目前如此众多的努力以推进敏捷型方法,只不过是在接受能被视为RUP 的主流OO开发方法而已。
  • 如何正确对待需求的变更

    2008-11-28 21:03:13

    软件项目,在开发/测试进行中,需求改变是很平常也很正常的事情;为了不影响开发和测试的进度及项目整体进度,那么我们如何正确对待它的变更呢?

    1.  对于需求和需求变更的理解

    软件需求是整个软件项目的最关键的一个输入,和传统的生产企业相比较,软件的需求具有模糊性、不确定性、变化性和主观性的特点,它不像生产汽车、电脑等硬件的需求,是有形的、客观的、可描述的、可检测的。软件需求是软件项目最难把握的问题,同时又是关系项目成败的关键因素,因此对于需求分析和需求变更的处理十分重要。

    软件需求变更会给项目带来巨大的风险,会导致项目的成本费用增加、开发周期延长、产品质量下降及团队工作效率下降等不良后果,因而需求变更在软件开发项目中应该尽量避免。然而由于政府对特定软件的相关要求、用户部门市场战略的调整、工业界的发展等因素都可能带来需求的变更,而这些因素往往不可避免。在软件开发过程中如果只有一条真理的话,那一定是:需求的变化是永恒的,需求不可能是完备的。因而,对于需求变更应该正确的对待,尽量将其负面影响降低到最低。

    2. 减少需求变更

    正如前文所说,需求变更往往是不可避免的。通常是项目负责人员花费了大量的气力避免需求变更,可最后需求变更总是会出现。但是这并不意味着项目开发人员不应该做这方面的工作,项目开发人员对于需求变更的正确态度应该和软件测试的态度一样,在需求并更发生之前尽量减少需求变更,以将需求变更带来的风险降低到最低。项目开发人员切忌在项目设计之前试图消除需求变更,这样做往往费力不讨好。

    相比于需求开发人员而言,客户可能对需求变更认识不足,认为他们出钱,程序员或软件开发公司就要为它服务,因此客户对需求变更往往将需求变更视为儿戏,随个人喜好随意变更需求。因此,在需求人员同用户代表或用户部门主管人员接触时,就应该向他们挑明态度,和他们协商好,特别是应该让他们清楚软件的定价应该与软件的功能相关,以及需求随意变更所带来的风险的承担者应该由客户和项目开发者共同承担。通过这样做,让客户在需求分析之前就尽量对他们所需要的功能有个整体的了解和确定的思路,而不是等到程序员开始编码了,才提出以前原本在需求分析时就可以提出的需求。

    让客户明白减少需求变更的重要性后,需求分析人员应该采取合适的方法同客户交流,帮助他们明确他们的需求。需求分析人员和客户的关系不应该仅仅是记录人员和需求提供者,他们的关系应该更多的是战略合作伙伴关系。虽然需求分析人员和客户存在着服务商和顾客的关系,但是他们有着一个共同的目标:开发出适合客户需求的软件,因此需求分析人员除了记录客户提出的需求以外,还应和用户讨论,提出一些建议,使用合适的工具帮助客户提出需求。在需求分析时,尽量多的召集需求研讨会,邀请开发人员和客户共同协商探讨,在研讨会上允许任意的提出需求,并将这些需求整理成档后由客户代表和需求分析人员共同商议可选的功能,这样能够尽量使得需求完备。在需求开发时,开发人员采用原型的方法启发客户思考功能需求也不失为一个好办法。

    虽然需求不可能是完备的,但是在项目开始设计时尽量使得需求完备还是应该的,也是值得的。

    3.  规范文档

    需求文档作为客户和开发人员的接口在整个项目开发过程中起着举足轻重的作用。需求文档应该按照一定的格式和规范书写,而且应该具备完整性、一致性、基线控制、历史记录等特性。文档书写完毕以后应该交给客户审阅,在客户满意的基础上确定基线。一个完整规范的需求文档不仅能够有助于设计人员和编码人员完成项目开发,更重要的是它作为一个阶段性的成果可以供软件需求变更时参考。

    需求变更发生后,也应该生成相应的文档,并且这些文档的书写也应该采用规范的形式书写。需求变更文档也应该包含基线以供下一次修改参考,还应包含历史记录以供开发人员和客户清楚当前的文档内容的新旧以及历史文档的情况,以备以后查看。

    4.  设计良好的体系结构

    开发软件就如同建造一座房屋,软件体系结构则如同建房屋时的规划。两层高的家庭住宅和几十层高的商业大厦建造时的规划必然不同,同样,大型软件和小软件采用的体系结构也必然有所区别。因此,设计一个合理的体系结构对于项目的成败也是十分关键的。

    体系结构的建立一般位于需求分析结束之后,软件设计之前。软件体系结构的设计是从结构的角度对整个系统进行分析,选择合适的构件,安排构件间的相互作用以及他们之间的约束,形成一个系统框架以满足用户需求。在设计软件体系结构时,不仅应该想到如何完成满足现在已经提出的用户需求,同时也应适当地考虑到需求的变更。

    采用有弹性和可扩展的软件体系结构设计可以有效地降低需求变更引起的风险和维护代价,能够在项目范围未发生变化的前提下很好地适应需求的变化。体系结构的灵活和可扩展性设计使得开发者可以在这种体系结构上面进行各个功能层的组合和分离,也可以将各个功能层分布在各个不同的服务器上共同提供服务,因而能够快速的对需求变更作出响应,并且对已经开发好的系统产生尽可能少的影响。

    体系结构的设计除了考虑到体系结构的灵活性和可扩展性以外,还应尽量采用松散耦合的结构,使得结构中的各个构件之间的关联程度尽可能的少,这样就能在需求发生变更时一个构件的变化对另一个构件产生尽可能少的影响。

    现有的软件体系结构很多,包括管道-过滤器结构、B/S结构(含C/S结构)、解释器/虚拟机结构、黑板系统以及基于中间件技术的体系结构。在设计体系结构时,首先应该选出适合项目需求的系统结构,然后在从中挑选出那些扩展性比较好,构件之间耦合性比较小的体系结构。基于中间件技术的体系结构就是扩展性比较好的体系结构。采用中间件技术,中间件作为用户界面和操作系统以及网络的连接点,向上为用户提供服务,向下屏蔽操作系统和网络的细节。这种分层的思想能够很好的适应操作系统和网络的变化,可扩展性十分的好。同时,可以在中间件中给出容易改变的接口或是为系统将来改变预留接口来实现功能上的需求变更。当然可扩展性比较好的体系结构远不止基于中间件技术的体系结构这一种,具体的选择和运用应该由设计人员根据实际需要考虑。

    5.  采用面向对象思想

    需求是不稳定的,因而没有不变的需求,然而需求之中却有稳定的东西,这就是对象。世界都是由对象组成的,而对象都是持久的,例如动物、植物已经有相当长的时间。虽然对象也在变化,动物、植物也在不断的进化。但对象在一个相当长的时期内都存在,动植物的存在时间肯定比任何一家企业长久。面向对象的开发方法的精髓就是从企业的不稳定需求中分析出企业的稳定对象,以企业对象为基础来组织需求、构架系统。这样得出的系统就会比传统的系统要稳定得多,因为企业的模式一旦变化,只需要将稳定的企业对象重新组织就行了。

    面向对象(OO)技术的三大特征保证了采用OO技术可以建立易于改变和加强可重用性的软件系统。封装可以把问题影响的范围缩小,外部的变化要求对系统的影响可以限定到某个类层次或某些类层次中,从而改变系统的一部分相对简单;继承可以使改变基于原有技术基础,很大程度上减少重复开发工作;多态的应用可以使开发和设计人员在相对统一的接口下更改系统的实现细节,从而改变系统的行为。

    显然,OO技术是一种增强软件可维护性、健壮性以及保持设计稳定性的一种分析和设计方法,可以在一定程度上快速对需求变更进行反应,并可相对减少需求变更需要的成本。因此,在系统开发过程中应该尽量的采用面向对象的思维方式来构建系统和开发系统。

    6.  需求变更控制

    正如前文所言,需求变更不可避免的会发生,那么当需求变更发生后项目开发人员应该如何应对呢?

    一般来讲,需求的变更通常意味着需求的增加,需求的减少相对很少,而且处理也比较容易。当客户提出新需求的时候,项目开发人员应该分析这些新需求对项目现阶段带来的风险,得出双方实现变更需求的需要的成本,包括时间、人力、资源等等方面,再与客户商讨是否有必要进行变更和如何在最小代价下实现变更。

    当客户确实希望进行需求变更时,可以让开发人员开发一个快速原型,让用户体验一下,以确保客户确确实实的希望添加这些需求。在客户和项目开发人员共同确定了需求变更后,项目开发人员应该与客户签订一份新的合同。

    当客户提出需求变更并且签订了合同后或是开发人员根据市场和国家政策作出的需求变更得到确证后,项目开发人员应该决定何时实施这些变更。对于那些对系统影响不大和一些优先权十分高的需求变更可以立即在项目中实施,而对于那些对于整个系统现阶段的开发影响很大,而且又不是十分紧急的需求可以放在下一个版本中进行。无论是立即实施还是放在下一个版本中,都应该给新的需求一个充足的开发和测试时间,保证产品质量。

    结论

    在面对需求变更时,除了通过减少需求变更和规范文档,从分析和设计的角度通过采用合理的分析和设计方法适应需求变更以外,还应该改变我们设计的意识和对需求变更的理解,做好对需求变更的控制和管理,做到对需求变更的灵活应对,在一定程度上降低维护代价和提高用户满意度。
  • IT项目团队内部成员管理

    2008-11-02 21:44:58

    团队成员选拔原则
     
      团队成员的选择是组建团队的第一步,也是决定这个团队是否能有效工作的关键因素,整个团队的未来业绩将直接取决于选拔到的成员的努力。在选拔过程前,可以先通过心理测评、专业考察、查阅档案等方式获取有关人员的可靠数据,包括专业能力、性格特征、个人经历、人际关系等方面,建立备选人员人才库。
     
      成员选择的基本原则除了要求具有基本的专业素质外,还要求具有较宽的专业知识面,对产品具有整体意识和系统集成的思想,并具有较强的合作精神。而团队领导则要求具有多专业的协调能力及处理团队与其他部门关系的能力,并能够营造好的团队文化。作为一个整体,团队的专业技能组合要达到必要的高度和广度,同时要求团队成员必须具有很好的人际关系能力,注意角色配置,以利于相互交流、彼此理解与通力合作。在挑选团队成员的过程中,既要考虑他们的性格、能力,更要遵循自愿的原则。团队成员还应该包括团队顾问或专题顾问,他们来自各职能组织部门,不直接参与产品的开发,但提供技术和知识上的支持。
     
      团队成员角色定位
     
      在形成团队时,首先根据任务的需要,确立团队成员的工作对象和工作方式,定义团队成员的工作对象和工作方式,定义团队成员的角色,形成各角色成员的来源、权利、义务及行为规则,确定各角色成员的选拔方式和评判标准,然后通过挑选和考评,并通过授权的方式形成整个工作团队,开始工作。团队成员的角色定位首先要根据团队的角色设计,主要考虑专业的需要,成员要从技术角度能够对团队做出贡献,要注意区分专才成员和通才成员,对于专业化越强的角色,越需要专才成员,对于系统集成工作,则通才更为适合。同时要在成员性格特征的基础上,应用团队角色理论,给成员一个合适的团队角色。
     
      团队成员职业发展和培训
     
      为增加团队的凝聚力和向心力,增强成员对团队的归属感和责任感,项目团队可以通过帮助成员设计职业发展方向,来帮助成员适应多方面的工作和未来发展的需要,同时使成员为自己的良好发展前景而不愿轻意离开团队。成员加入团队后,根据成员个人的条件和背景,由成员和项目经理共同协商,结合项目特点,研讨一套切实可行的个人职业生涯发展体系,协助成员开发其各种知识和技能,尤其是专业性知识和技能,为成员提供实现个人专长的契机。通过个人职业生涯发展计划,使每位成员对自己目前所拥有的技能、兴趣及价值观进行评估,接着考虑项目的变化需求,使自己的特长及发展方向符合团队的需求。通过团队为成员设计良好的个人发展计划和职业发展阶梯,就会促进团队和成员的发展,降低成员的流动率和流动倾向。对于那些看重学习和愿意获得新技能的成员,由项目团队提供培训机会,鼓励他们,以增加他们的满足感和责任感。
     
      项目经理的作用
     
      项目经理是团队的灵魂,是决定项目成功与否的关键人物,同时作为团队的领导者,他的管理素质、组织能力、知识结构、经验水平、领导艺术等都对团队管理的成败有着决定性的影响。在一个特定的项目中,项目经理要对项目实行全面的管理,包括制定计划、报告项目进展,控制反馈,组建团队,在不确定环境下对不确定性问题进行决策,在必要的时候进行谈判及解决冲突等。其中组建团队是项目经理的首要责任,一个项目要取得好的成绩,一个关键的要素就是项目经理应该具备把各方人才聚集在一起,组建一个有效的团队。在团队建设中,要确定项目所需人才,从各有关职能部门获得人才,定义成员任务和角色,把成员按任务组织起来形成一个高效的团队。要建立并使团队有效运行,项目经理需要起关键的作用。主要体现在整体的规划,组织,协调和控制等方面。
     
      (一)整体规划:计划安排项目工作,使各项目工作形成有机整体。
     
      (二)组织:同有关部门联络,选择并确定项目团队的职责。
     
      (三)协调:确定职能专业部门和其他项目参与者之间的分工,有效的调用项目团队和每个成员。
     
      (四)控制:监控进度,鉴别问题,并开创和调节正确的行为。
Open Toolbar