软件项目的过程诊断与改善已经有了很多的有效的参考模型和最佳实践方法集,其中,最有影响的是SEI的软件过程成熟度模型(SW-CMM/TSP/PSP体系)和敏捷联盟提出的敏捷方法集等。这些模型和方法的提出都基于不同的隐喻,比如,SEI把软件开发过程看作类似于硬件产品的设计与制造过程,关键过程依赖于基于活动和度量的有序过程的管理规范。CMM的基于活动的度量方法和有次序的、基于活动的管理规范与瀑布模型有非常密切的联系(先是需求活动,然后是设计活动,编码活动,单元测试活动,集成活动,以及系统接收测试),过程形成刚性的制度和规范稳定下来。因为CMM的思想受到瀑布式开发思想的很大影响,造成许多组织对CMM的认识停留在瀑布思想上,主要的原因是,以硬件的开发设计过程来类比软件过程。软件开发组织尝试着更加现代和高效的方法改进其项目管理过程,迭代开发技术、软件产业最佳实践和经济动机驱动组织采用面向结果的过程,重视开发业务案例和原型方案、可用发布、现场版本的发布等,这些方法形成敏捷方法的思想。基于敏捷方法的软件项目过程管理是不同于传统过程管理理念的过程管理方法,过程的可重构性而非稳定性是敏捷过程管理的核心,存在于各种层次的软件过程中,而这些能力在CMM里被认为是在最高级别成熟度的组织中才需要开始考虑并作为管理的重心。敏捷方法集为以过程的可重构性和自组织性为中心的过程度量、控制、改进提供了丰富的手段与思想。过程的动态性体现于定义、执行、控制过程,过程的执行是过程管理的一部分,即过程的动态自组织性(自适应)。
以传统的生产制造项目和工程建设项目BPR和BPI的方法来进行软件项目的过程改进是不适合的。各个敏捷方法集基于各种各样的隐喻,如极限运动(XP极限编程)、橄榄球赛(SCRUM)、自适应系统(ASD)、集市(Open
Source)等,把软件过程作为一个探索过程,不断的以经济原则对客户需求和技术需求进行评判和选择。而总的来说,新提出的软件项目过程模型大多与生物进化过程进行类比,在生物进化过程的隐喻下把软件开发过程看作一个智能体成长的过程,这个智能体一般认为是一个软件产品,或更深刻的认为是一个软件开发组织的知识结构,进化的动力是经济动机和残酷的市场选择。
软件项目的产品和加工对象都是“软”的信息,软件产品的特点与硬件产品相差太大。事实上,从某种意义上说,软件开发组织为客户提供的不是或不只是软件产品,而是客户所需要的信息,软件产品只是为客户提供信息服务的自动化代理而已。因此,可以为软件开发提出另一个隐喻——信息加工处理过程,即认知过程。
以信息为产品和加工对象的软件生产与一般的硬件生产过程有根本的不同,软件过程是生产制造过程和信息加工处理过程(即认知过程)的混合过程,而且信息加工过程是软件过程中最核心的过程。以信息加工的观点来解释软件开发过程,认为软件开发过程就是信息的接受、编码、贮存、提取和使用过程。可以把这一过程概括为由四种成分所组织成的模式,即感知系统,记忆系统,控制系统和反应系统。感知系统接受由环境提供的信息,即首先把输入的基本特征抽取出来加以组合;记忆系统是对输入信息的编码、贮存和提取活动;控制系统决定目标的先后顺序,监督当前目标的执行;反应系统则控制信息的输出。这个基于信息处理过程的开发过程并不是按上述顺序单方向进行的,各种成分之间存在着不同方式的相互作用,以保证对信息的加工、输出和反馈,沟通人与环境之间的联系。
在认知过程的隐喻下,软件项目被认为基于一个建构主义的过程模型,包括了学习与创新的行为,学习不简单是业务知识由外到内的转移和传递,而是学习者(开发者或是客户)主动地建构自己和组织的知识经验的过程,即通过新经验与原有知识经验的相互作用,来充实、丰富和改造自己和组织事实的知识经验。软件项目过程的认知过程参考模型把软件生产过程定义为信息的加工处理过程,软件过程能力是一个认知能力层次概念。
软件的开发过程是一个信息的加工处理过程,构成一个认知环境下的知识循环(如图1)。
图1 认知模型下的知识循环
客户的需求,以客户所习得的知识和经验为背景,是以客户的概念、符号和语言表示的信息,软件开发组织中的软件分析人员在获得客户需求表达之后以自己的知识和经验为基础,开始学习过程,在学习客户需求、理解客户的概念、符号和语言的成果上,构建自己的信息系统和知识结构,进而创造出新的以软件专业的概念、符号和语言表示的信息产品,即需求确认文档和系统分析设计报告。这些信息适宜于在软件开发组织内部环境中开发者之间的流动和创新,程序员的责任是把这些信息加工成计算机可以理解的概念、符号和语言,由计算机系统解释和编译。计算机系统是开发者和客户之间的智能媒介,软件的指令控制计算机系统把客户需要的信息转化为客户可以理解的概念、图像、符号和语言表示,传达给客户,实现最终的信息产品。而这还不是整个过程的结束,信息系统必须接受使用者的反馈信息进行持续的运行,所以,客户必须通过理解和应用软件的输入输出信息构建新的知识结构,反馈到信息加工过程,使软件组织和软件产品进行新的学习、改变和创新,使软件组织的知识结构和软件产品的功能结构对反馈信息做出适应性的变化。
在整个信息加工处理过程中,有三个主要的信息处理器:客户、软件开发者和计算机。软件是在客户→开发者→计算机→客户的信息处理循环过程中构建而成,循环过程中,信息的形态不断发生改变:客户的业务术语表示→软件开发专业术语表示→编程语言→计算机交互表示。
我倾向于把软件过程认为是一个存在于包括了客户、开发者和计算机系统三个主体在内的完整系统中的知识建构过程,而不是一个仅仅局限于软件开发组织内部的设计制造过程。各个主体都是一个智能体,必须对另外两个主体的信息表示进行学习和加工处理,进而建立自己的知识结构,而软件产品是联结这几个主体的媒介。因此,软件设计开发不是在客户需求形成文档时完成的,不是在编译成机器语言时完成的,也不能说是在交付给用户使用时完成的。客户的目标是信息而非软件,软件是在这个知识循环中为了不断向客户提供其所需信息而构建的信息加工结构。
把软件开发过程作为一个信息加工过程,可以从人类认知过程的信息加工理论中得到很多启发。
软件开发过程的SW-PASS模型,将软件生产的过程表示为由计划过程(Planning)、注意力过程(Attention)、同时性加工过程(Simultaneous
processing)和继时性加工过程(Successive processing)核心过程构成的有机整体。
图2 SW-PASS模型
注意力过程是所有过程的基础,是最低层次和最基本的过程,使敏捷过程实现快速的市场反应和合理的资源配置;加工过程处于中间层次,同时性过程和继时性过程实现业务需求向软件产品的编码过程;计划过程是主动适应市场变化的源动力,是系统中最高级的层次。三个层次4个过程以信息的加工处理为中心形成了有机整体。
首先,基于认知过程模型的软件过程基础是注意过程,强调的是注意的选择性和反应的速度。软件过程是以商业目标驱动的,这一点在新的软件工程方法中尤其突出。但事实上,目前软件过程中对业务需求和商业机会的适应很难令人满意。软件开发者和客户都为“什么是需求”而困惑,原因是需求调查与分析的范围过广而难有焦点;因为对每一个需求特性没有建立快速的反馈机制,对于过程的敏捷性得以实现的基础,软件组织在以往过程管理中忽视了如何把注意力集中于一个业务需求的焦点而执行快速的应对流程。注意过程在CMM和敏捷方法中都有很多体现,如CMM中的SSM、SPTO、OPF、DP、TCM等,而在敏捷方法中注意力更是其快速、适应和客户满意度的竞争力源泉。
注意是由商业目标驱动的,包括注意的选择和反应的速度。而注意的选择性在软件开发组织中意味着开发者需要暂时的放弃,XP方法中的YAGNI原则和测试在先方法是注意选择性的例子。在软件开发过程中的注意选择主要应该是理性的。XP的计划博弈是在客户与开发者共同参与的博弈过程中对开发焦点进行的选择。FDD把特性放在开发流程的首要位置,而由特性来驱动后序的软件开发,也是为了使开发工作能够找到稳定的焦点。为了提高反应的速度,敏捷方法中有很多的原则,如:小版本,测试在先,40
小时工作制,简单设计,迭代方法的应用等。目的在于在一定时间内把开发工作集中于尽量小的目标从而得到快速的交付物。
在焦点集中快速反应的注意机制基础上,存在两种信息加工过程:同时性加工过程和继时性加工过程。传统的过程管理理论过于强调过程的顺序性的特点,在继时性加工过程上的分析很多,如CMM的PR和SQA、SQM等,而在同时性加工能力的提高上则范围过窄,如SCM、ISM、SPE。信息加工的主要功能是接受、加工、维护输入的信息,同时性加工进行同步性的整合,如以体系结构为中心的软件过程和持续集成、设计模式,继时性加工进行信息的序列组织,如瀑布模型、迭代方法。过于强调过程的顺序性而忽视同时性、并发性,造成在很多软件组织中,一两个人组成的项目团队可以快速、高效的完成优秀的软件产品,而当成员增加时,效率就大大下降,软件功能不能使客户满意,这不能简单地解释为沟通协调问题,更多的是过程的同时性加工能力太差。分析模式和设计模式概念的提出对过程的同时性加工能力和继时性加工能力提高有极大的意义,可以解决以体系结构为中心的开发过程的结构重用问题,大大提高了体系结构的清晰性和成熟性。
为了提高同时性加工的速度。XP方法中提出了隐喻方法,试图在模式和体系结构之外找到一个沟通成本更少,内涵更丰富的原型,提高开发的同时性加工能力,但实践证明,隐喻是XP中很不成功的一个部分,也说明同时性加工过程的问题比想象中更难解决。XP的另一些方法——持续集成、重构是非常成功的同时性加工过程,持续集成使组织在任何时候都能提供一个可交付的系统全貌,频繁地进行功能的全面检验。而重构是为了打破原有迭代和模块开发造成的混乱状况,革命性地对系统的内部结构进行新的模式识别和模式创新。
计划过程是软件过程中的最高层次,为组织提供了分析活动、解决问题、评价成果的能力。计划过程是CMM的强项,如SPP、RM、TP、IC、QPM、PCM等,也是PMBOK很重视的方面。敏捷方法中不强调计划,但不是不强调计划过程,如XP中的小版本、计划博弈、结对编程、测试在先等都是很强的计划过程。
注意、信息加工和计划过程共同作用,相互影响。
PASS模型的目的是为给组织提供合适的软件开发环境,有利于软件组织的发展,有利于挖掘缺陷所在,并帮助组织克服这些缺陷。PASS不只用认知过程的角度来评价和鉴别各种类别的软件组织,更便于提供一个对组织过程的缺陷进行诊断的框架。
PASS模型的三个层次对于过程的诊断与改善是很重要的。一般的BPR理论以流程的核心程度、具体程度来划分层次。CMM以能力成熟的时间阶段性来划分层次,但过程自身结构的层次性以PASS来表示非常清晰。注意过程是基础层次,是组织对变化的适应、反应和反馈的基础过程。这一过程的敏捷性,决定了组织在市场应变能力、组织运行效率和软件产品服务质量的基本能力,以往以瀑布模型为主要参考过程的大多是因为在这一层次上敏捷性太低而造成计划过程的失灵和加工过程的低效。
但过分强调注意过程也产生问题。目前很多组织应用敏捷方法时难以成功的一个原因是过分强调适应、反馈,忽视了计划和加工能力的提高,把开发过程看作一个探索过程,把注意力只集中于客户需求的优先级,这虽然可以抓住一些市场机遇,或快速发现开发中的质量问题,但过程缺少全局和长远的建构过程指导,造成开发代价过高。
不同加工过程使软件开发过程形成不同的视图。从继时性加工角度,开发过程是迭代和增量的,从同时性加工角度,开发过程是演进的。把加工过程分为同时性加工过程和继时性加工过程使原来混淆的过程性质变得清晰,组织可以从而找到软件过程的缺陷而进行补救。
要保持同时性加工过程与继时性加工过程的平衡。重视继时性加工,如FDD,很难保证所有工作的整体性和同步性,常会造成一个需求的代码和测试已经完成大部分时才发现与整个体系结构或另外一些功能的冲突,或造成过长的接受测试反馈周期。过于强调同时性,容易形成复杂的计划,混乱的标准。如目前很多基于WEB的开放代码GNU开发,使系统混合了太多的标准和版本,影响到非专业用户的应用推广。所以合理的方法组合是必要的,如集成测试+单元测试,结对编程+重构。
项目管理者联盟,项目管理问题。
计划过程是最高级也是对其他过程影响最大的,忽视全局的严格的计划,一味追求市场需求的机会和挑战,不是一个成熟的开发过程。计划过程是决策中理性的方面,但即便CMM也有计划层次上的一些弱点,如需求适应的敏捷性容易低效,一个原因是把需求变化的管理放在配置管理和需求管理的内容中,而没有把关于需求适应的决策过程融入软件项目的全过程中,敏捷方法不强调计划,但理性决策更多的渗透到注意过程和加工过程,使敏捷方法具备其竞争力。
|