分享

Quick-Kill 项目管理(完成“不可能的”任务)

 ekylin 2006-07-30

  * 这是我今天在美国著名的Dr.Dobb开发网站上看到的一篇关注度很高(TOP5)的文章。我恰巧使用过文中讲的(或类似的)方法,而且效果不错,所以把它翻译过来作为参考。

原文:
Quick-Kill Project Management
译文:

Quick-Kill 项目管理

作者:Andrew Stellman & Jennifer Greene     翻译:tianxinet(胖猴)

怎样进行敏捷的(smart)软件开发,即使面对“不可能的”时间表

Andrew 和 Jennifer 是 “实用软件项目管理(Applied Software Project Management)”一书的作者(O‘Reilly & Associates)。 在www.stellman-greene.com 可以联系到他们。

(译者注:文中lead developer、lead都可以认为是team leader,因为在小型团队中这些角色往往都是重合的)


    假如你是一个5人小组的lead developer,你在一个项目中工作了几周,小组才刚刚上路。你的小组成员包括高级架构师到刚刚走出校门的初级程序员。这时候你的上司把你叫到办公室,告诉你高层主管刚刚在电话里训斥了他,他希望你的项目在昨天完成。而当终于完成的时候,已经超过许诺日期很长时间了。用户有一项工作要作,并且这个软件是必须的。如果软件不能工作,或不能工作的很好,你最好去更新你的简历。

    这是你最后一次加入这种高压力状况的小组,这种项目是一场恶梦。小组成员已陷于错误的歧路很多天,你不得不扮演英雄,每个周末投入其中工作40小时去修正严重的设计问题。和高级经理开冗长的会议,顽固的bug好像永远不能搞定,经常工作到深夜。当小组终于交付了一些东西,用户却恨它。似乎用户点击每一个button都会有一个bug,而他们期望的特性却从没有在交付的软件中出现。

Quick Kill
    许多小组发现他们每天都处于类似的境况,lead developer面对严峻的考验。lead developer未必直接管理他的小组,但他负责把软件“送出门去”,他受到小组的尊重,当他作出一个决定,人们通常愿意追随他。但lead developer的工组不是管理而是开发,他需要花费大多数时间设计方案、设计软件、构建代码。

    Quick-kill项目管理由3个方法组成,这些方法让lead能够使他们的项目产物满足老板的期望和用户的需求:
        • 前景和范围文档(Vision and scope document)
        • 工作分解安排(Work breakdown structure,WBS)
        • 代码复查(Code review) 

        *译者注:WBS如果照词面意思翻译成“工作分解结构”之类的很别扭,结合文中对WBS的描述,翻译成“工作分解安排”是合适的。

    这些方法中的每一个只需要少许时间来执行,并且可以帮助小组避免一些最常见和代价高昂的项目缺陷。使用它们,leads能极大的增进交付满意软件的几率。

前景和范围文档(Vision and scope document): 6 小时
    如果一个小组不能真正理解所构建软件的“内涵”(context),他们很可能在整个项目过程中都作出糟糕的决定。这些糟糕的决定浪费小组的宝贵时间去修正,如果没修正,又会导致项目不能符合用户的需要而损害小组和用户的良好关系。(如果)对项目的真正范围(scope)没有很好理解,小组唯一能预见的事就是被人“在屁股后追”(urgency),他们脱离了试图满足的需求。程序员能够看到自己的单个程序,但是脱离了大的构想。这是导致项目延迟和失败的最大单一原因。

    幸运的是,有一个简单直接和容易执行的经验来帮助小组避免这些问题――花不超过一天的时间写一份前景和范围文档,并帮助小组避免数周的改写和错误的开始。

    写一份前景和范围文档的第一步是和项目的干系人(stakeholders)交谈。不幸的是,谁是项目干系人不总是显见的。Lead应该找出最受项目影响的人――要么他打算使用软件,要么软件不开发出来他就有麻烦。干系人通常乐于谈他们的需要,这正是lead developer――和其他小组成员,如果可能的话――应该和干系人谈的。和每个干系人谈不超过一个小时来获取他们的需求。

    前景和范围文档应该是简明的、不超过两页(见表1)。通过和干系人交谈得到的所有信息应该加到“问题陈述”部分。

    表1:       

 1. 问题陈述
   a. 项目背景
   b. 干系人
   c. 用户
 2. 方案前景(Vision)
   a. 前景陈述
   b. 功能规格(Features)列表
   c. 将不会被开发的功能规格(Features)
 

表 1: 前景和范围文档概要

“项目背景”部分是项目要解决问题的概要,应该提供一份问题的简明历史记录,和组织(注:用户的组织)如何决定构建软件去处理它。这个部分应该覆盖这些原因:这些问题为什么存在、组织的问题历史记录、先前被采用来试图解决这些问题的项目、得出的开始当前项目的方法。

“干系人”部分是干系人的列表。每一个干系人可能提到名字、头衔或角色(象支持组经理、SCTO、高级经理),每个干系人的需求用几句话来描述。“用户”部分是类似的,包括用户列表,与“干系人”一样,每个用户可能提到名字或角色;可是,如果有许多用户,试图给每个用户命名(注:指角色命名)通常是效率较差的。每一个用户的需求都要描述。

“用户”和“干系人”的需求是这个文档最重要的部分。除非小组理解驱动项目的需求,否则可能导致他们在对干系人来说不重要的问题上浪费时间。构建解决这些错误问题地软件是简单地,但是构建适当的软件的唯一办法,是项目中的每一个人在项目开始前理解软件将为什么和怎样被构建,并达成一致。这是项目计划的目标。

“前景(vision)”部分提出软件目标的描述。所有的软件都是为了满足特定用户和干系人的需求,小组必须识别需求并且写下“前景陈述”(描述需求怎样被满足)。“前景陈述”部分的目标是描述项目被预期达到的(期望)。它应该解释项目的目的。应该有一个非常有说服力的理由:为什么花费时间、金钱、资源在这个项目上。

功能规格列表包含一个“什么要做”和“不作什么”的简明列表。在撰写这部分前,小组应该写出文档的其他部分并且对他们要满足的需求进行开放的讨论。每个单一功能应该解决“问题陈述”部分的一个需求。小组常常提出一个好像明显的,但不是真正解决需求的功能规格,这些功能规格应该放在“将不会被开发的功能规格”中描述。



工作分解安排(Work Breakdown Structure,WBS): 2 小时
    搞定了功能规格(features),开始针对这个功能规格工作之前,lead应该和小组一起提出对每一个功能规格的评估(estimate)列表。许多开发者在评估时会遇到很多麻烦,幸运的时有一些指导方针可以使评估过程简单可靠。

    评估是重要的,因为它要求小组成员从头到尾考虑项目的每个方面。大多数程序员承认有这种不安的感觉:伴随着他们(原先)假定的任务的实现,原来(似乎)简单的问题会变得越来越棘手。如果其他小组的成员依赖这些工作,它可能把整个项目拖入混乱。好的评估经验可以避免经常发生的灾难。评估一个项目要求小组预先给出完成项目的步骤,并且提出每一步需要几天(或周,或小时),找出这些数字的唯一方法是整个小组坐下来考虑许多稍后在项目中可能被遗漏的细节。

    做评估的第一步是把项目分解成一个完成最终产品要做的任务列表。这个列表叫做“工作分解安排(work breakdown structure,WBS)”。有许多方法把一个项目分解成一个WBS。lead developer应该把小组成员组织在一起开会讨论任务列表。

    一个有用的准则是――任何项目都可以分解成10~20个任务。对于大项目来说(比如航天飞机),任务是非常大的;对于小项目(象简单的计算器程序),这些任务很小。

    一旦小组成员就WBS达成一致,可以开始讨论每一个任务,以使他们能够对每一个任务提出评估。在项目的开端,小组成员没有做评估需要的所有信息;然而,他们需要提出数字。去处理这些不完善的信息,他们必须做一些关于待处理工作的假设(assumption)。通过做假设,小组成员能够为后面可能添加的信息预留位置,使评估更加精确。

    假设是评估的重要关键,如果两个人对完成一个任务需要多长时间有争执,很可能他们对产品和生产产品的策略做的假设不同。换句话说,任何争执通常都是关于执行这个任务需要什么,而不是完成任务所要做的努力。例如,为一个设置计算机时钟的工具给出相同的前景和范围文档(vision and scope document),但是一个开发者可能假设做一个命令行接口,另一个开发者假设做一个结合系统控制面板的图形界面。

    通过帮助另一个程序员讨论这些假设,并且就他们的分歧达成临时决议,lead能够帮助他们就此任务达成一致评估。Lead应该一个接一个地提出每一个任务,并且小组应该决定每一个任务需要多长时间。每次遇到争执,就意味着有遗漏的假设,Lead应该与其他小组成员一道准确地指出那些遗漏的假设是什么。当这些假设被发现时,应该记下来。当讨论过程和更多的假设被记下来,小组成员会对项目了解的更多,并且将要开始就软件怎样被构建做决定。这帮助小组就每一个任务的评估达成一致。

    最终WBS应该由任务列表、每个任务的评估、任务的假设组成。提出WBS中10~20个任务的假设大概会用去小组1个小时的时间。创建WBS以及做评估的总时间大约2小时。这对于一个5人小组的基本评估应该时足够的。但是,如果是一个大项目,就需要把项目分成很多块,然后每一块用2小时去评估。

代码复查(Code Reviews): 每次复查2.5 小时
    在一次代码复查中,小组检查一个代码样本并且修正它的任何缺陷(defect)。一个缺陷是一个不能象程序员想要的那样运行的代码块,或者可以改进的代码块(比如让它更易读或提高它的性能)。

    执行代码复查是一个帮助小组构建更好软件的有效方法。除了帮助小组发现并修正bug外,代码复查对于程序员进行被复查代码的交叉培训(cross-training)以及帮助初级开发者学习新的编程技术是有益的。最重要的是,当开发者知道随后有人要阅读的时候会趋向于写更好的代码。

    代码复查的第一个任务是选择检查的代码样本。复查每一行代码是不可能的,因此程序员要选择哪一部分的代码需要复查。如果复查的代码选择的正确,代码复查会是有效的。多数项目中,大量缺陷集中在相对小部分的代码中。如果代码选择的好,那么复查能帮助小组揪出缺陷,轻易地节省远比复查花费的时间更多的时间,如果这些缺陷留在软件中,稍后会需要更多的时间来追踪和修正。

    对于lead developer来说选择正确的代码样本并不困难。好的复查候选代码可能实现一个棘手的算法、使用一个难弄的API或者对象接口、需要特殊的专门技术去维护、或者可能使用了一个新的编程技术。这对于在一个软件中任何缺陷都将导致灾难的高风险部分选择代码样本是特别有用的――不仅仅是因为那些代码可能有更多的缺陷,还因为更多人会沿着这条线索去维护软件。当有大范围的修补时,引入缺陷的风险很高。

    准备复查时,lead分发代码的打印稿(带有行标号)给每一个小组成员。小组成员分别花费半小时通读(如果可能并执行)代码样本一次,他们尽量指出代码是否真的在干作者想让它干的事。他们应该查找准确性、可维护性、可靠性、可控性、安全、可扩展性、复用性、效率问题。这些问题的任何一个都应该被看作是一个缺陷。每一个小组成员尽可能多的发现缺陷,并在打印稿上做标记。

    准备完后,team leader把大家集中起来开复查会议。代码复查开始是由lead developer(大声地)阅读一段代码样本。他不是逐字阅读代码,而是做一个该代码块的简明描述。如果任何人(包括lead)不能理解这些代码在干什么或不同意给出的阐述,代码作者要解释这些代码应该完成什么,有时一个小组成员能够提出一个更好的、更加清楚的方法来完成同样的事情;通常只是大概说明这些代码的用途。

    然后小组成员应该讨论代码中发现的任何缺陷,这时lead必须扮演会议的仲裁者。如果任何人发现一个缺陷,lead应该判断小组是否能够提出一个办法修正它,如果判断能,小组应该提出解决办法;如果判断不能,把它作为未决问题以便随后修正。另外,lead向包含复查记录(log)的表格中添加一行,每个发现的缺陷在这个表格中都有对应的行,每行列出包含缺陷的代码行号、鉴别人、以及一个怎样解决缺陷的描述(或者标记该问题为未决的)。在记录(log)的顶部,lead应该记下会议召开的时间以及复查的是哪一段代码。

    复查会议应该不超过2小时。如果持续时间超过2小时,那么将来应该选择一个更短的代码样本来复查。会议结束后,lead应该把记录mail给小组成员,并且指定代码负责人修正缺陷。一旦缺陷被修正,lead应该复查更新的代码并确认代码被正确的修正。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多