这一篇发布于2007.04月的InfoQ首期中文版中。
产品线工程:团队迭代及其问题
问题
项目到了末期,总是长期、持续的维护。这种维护的工作甚至占到了整个周期的三分之二以上。而维护工作过程中会发生什么,是少有人讨论的,因为对于多数工程专家来说,这是在“项目结束之后”的事件。
在我看来,维护周期的产出有一种可能:后续版本。这种情况大多数会出现在自主研发的产品上;源于客户需求,也会出现在一些面向客户的项目中。此外,基于客户项目的产品化,也是可能的输出。
这些输出的共同点是:没有改变项目的实质,而是对项目的延续或者完善。因此,客户项目的产品化也可以视为新版本,产品从技术研发到市场化也可以视为新版本。总之,项目的阶段性结束和持续维护,并不等于走向死亡,而可能是新版本的开始。这种过程如下图所示
该图很明显的表达了一种工程观点:V2与V1在两个不同的项目阶段中。这看起来很合理,甚至在实践中也常常这样做。但上图中潜在的问题是:如果维护工作的周期延长,则V2与维护存在资源争用。下图进一步描述这种可能性:
当出现这种资源争用的局面时,公司比较明智的做法,当然是强化维护工作,而延缓V2开发的启动。因为如果不维护,则会导致客户不满而流失既有市场,或因产品功能不完备而导致市场化受阻。
但是,我们不能直接通过持续维护的旧版本来产生新版本——后者应该是一个完整的、有独立性的产品。当资源争用出现时,公司的短期行为与产品的长期策略就不可避免的存在冲突。就我所知的,冲突的结果往往是:
旧版本得以维护,客户被短期满足;然后,
新版本的启动受阻,因此研发周期延后;然后,
同类产品竞争力加强,客户流失;然后,
新版本匆忙发布,功能与稳定性受到影响,客户流失加剧;然后,
产品线收益下降,团队萎缩,新旧版本都陷于维护,失去了更新版本的研发能力。
这种局面下,整个产品线便已经死亡了。而其根源,正是在于面临强大的市场压力时,旧版本交付与新版本启动过程占用了较多的时间,导致战略推进受阻。
如果一个公司有充足的资源,这可能不成其为问题。例如新、旧版本一旦可以用同等或渐增的规模来运作,或新版本不需要依赖于旧版本的资源(如人力和代码分支)。但大多数公司不会拥有这样充备、甚至是冗余的资源。
此外,在一些存在准入制度的,或者垄断的市场中,这也不成为问题。因为客户与开发商都是确定的,客户甚至愿意提供更多时间来保障旧版本的上线和投入实用。
除了上述情况,大多数时候我们都会为“下一个版本如何启动”的问题所困扰。而传统的工程模型中,并不讨论这个问题——产品的延续性会在项目可行性分析和公司战略层被讨论,但在“一个项目”被实施的过程中并不会被考虑。
本文假设需要两个团队来完成新、旧版本的更迭,并基于基本的工程原理,尝试通过组织方法与管理艺术来最小化这个过程的开销。并简单地说明“团队迭代”这种工程模式的原理、优势与问题。
项目基本过程的分解
RUP统一过程很好地解释了单个项目的各个阶段中,在客观上需要的资源投入情况。下面我们从设计者与实现者的两个角度来分析一下它:
对于业务建模、需求、分析与设计工作来说,在项目的先启与精化阶段,需要设计者(包括分析、设计和架构等)的大量参与;在构建阶段开始后,需求被(相对地)固化,而设计的调整也渐趋减少,而开发资源逐渐增加。直到后来,开发团队必然发现设计师、架构师和需求(用户)对他们指手划脚的时间越来越少,而测试团队却更深地影响着他们的开发计划——实施过程、测试过程等在不停的迭代,但计划与设计基本不变化。
一般来说,我们的大多数团队的人力资源用在“实现(编码)”,并以相对独立的团队来完成“设计”与“测试”。而这些团队的工作周期用工作量并不是一致的。以致于《人月神话》的作者会问:“在等待时,实现人员应该做什么?”
《人月神话》假设了一个“10个设计师、150人的开发团队”规模的项目。在这个项目中,程序经理提出了一个问题:体系结构团队需要10个月完成计划与设计,而他的150人却因此“只能坐在那儿干等10个月”。
Brooks提出的解决之道是“在(设计)说明完成的时候,才雇用编程实现人员”。当然,这是在三十年前的说法,大概会因此有人说这是“瀑布”的遗迹。但通过我们上面的分析,我们也应发现在客观事实上,先启、精化阶段与构建阶段所需要的人力资源的配比并不相同。以本例中的开发团队来说,在最初的10个月中,大概只需要8~20个开发人员参与到实现过程即可。
因此问题的本质并没有发生变化:在等待时,(剩下的130个)实现人员应该做什么?
然而接下来你也会发现,这个问题换个环境依然成立:在实现时,设计人员应该做什么?因为在构建阶段中,大多数的项目资源被消耗在实现和测试的循环里面,而构架、设计和需求存在(在项目周期中的)一致性,因此这些相关的设计、分析人员便处于“等待”状态。
基本定义
“10个设计师、150人的开发团队”,在总长度为3年的时间内,总是存在资源被空耗。Brooks对此的建议被推而广的结果是:在前期雇一批设计师,并在后期解散他们;对编程实现人员则反之。
我们应该认识到:这样反覆的组织结构,在一个公司来说是难于成为现实的。但是,对于以“职责分配”作为组织建构的基本原则的软件公司来说,我们可以给出一个简单的“AB团队模型”,并象下面这样看待问题:
A团队以实现为主,在初期需要“设计工作”的引导并确定方向;
B团队以设计为主,在设计的后期逐渐引入“实现工作”。
可见这两个团队对人力和时间的需求都将出现交叉。这种交叉会带来一种微妙的平衡。如下图所示:
这就是所谓的“团队迭代”。他讨论的不是A或B团队的具体工程方法,而是A和B团队出现重叠的这段时间里的工程方法。准确地说,就是这张图中B线和V2线所界定的时间区间中的工程方法。这两条线的基本定义是指:
B线:B团队发起并从A团队开始争用富余资源的时间;
V2线:B团队与A团队结束资源争用的时间。
组织的基本原则
我们现将面临一个问题,这个问题首先是与上面的这个“V2线”的名称有关。因为我们需要确定A、B两个团队的关系与组织模式。
之所以叫“V2线”,是因为我们必须确定B团队与A团队的工作目标,是在同一产品方面上的不同阶段。也就是说,B团队是在为A团队的后续版本而工作。如果没有这个前提,那么A、B的资源争用就是纯粹的战略方向之争,并不是工程方法所能解决的问题。
对于A、B两个团队的规模来说,A团队是当前目标的实现团队,因此所占用的资源(包括人力和管理资源)较多;B团队是将来目标的设计团队,因此所占用的资源较少且不紧急。从这两个团队的自身特点来说,A团队适合于用强化管理并使用里程碑方式来固化阶段成果,而B团队则适合以技术方式来领导。
这如同Brooks在《人月神话》中所设定的两种组织模型:产品负责人(项目经理)作为总指挥,技术主管充当其左右手;或反之。第一种模型是职权型的项目经理,这适合于大型和以产品为目标的团队(例如A团队);而第二种模型则是辅助型的项目经理,由于是技术主管引导整个团队,因此更适合于以计划、分析和设计为主的团队(例如B团队)。
因此,在A、B团队中的组织与分工都是不同。虽然同样要求管理艺术,但A团队严谨些,B团队则更富有创意与激情。正是由于AB团队模型内部是互补的,而且在管理职责上,是同一产品上的自然延续,因此可以有效地避免管理和组织冲突。
T线
组织结构中不存在职权冲突,并不等于不存在矛盾。AB团队模型与生俱来的问题就是“资源争用”。
在初起阶段,B线开始时,A团队中正好有部分人员(例如架构师)只需要投入较少的工作量,而他们正好在B团队所需的主要成员。在这时创建B团队,并不会感到太明显的资源争用。
然而B团队不可能总在“不停的计划和分析”,它必然要从A团队汲取资源,来完成设计阶段的实现、测试等工作。这个过程中发生的主要事件是“人力置换”,我们把它的起点位置称为“T线”。如下图所示:
由于A、B团队是同一项目的后续版本,因此当B团队出现的人力需求,是可以由A团队的富余人力来弥补的。——事实上正是如此,当B团队需要引入设计人员来组建时,A团队正好设计人员过剩;当B团队开始需要开发人员来实现时,A团队正好进入维护周期,开发人员会出现过剩。B团队从设计过程向实施过程完成过渡的同时,也就完成了从A团队吸纳人力的过程。
因此当B团队结束(开发型)项目团队的建设(或称为转变)的过程时,A团队也将进入项目的最终维护期。这个时候,最空闲的人力将是项目经理(事实A团队已经没剩下多少开发力量)。而B团队正好缺乏一个有实施经验的项目经理来驱动下一个阶段的工作。——换而言之,A团队的经理正好是B团队所需要的那个。
现在,对于A团队的经理来说,他在事实上持续地领导了相同项目前后两个版本的开发。而且开发人员在较大的程度上也是一致的。——可能由于项目的扩大,B团队还需要对外吸纳更多的人员,但骨干一定还是从A团队中迁移过来的部分。
优势
很明显,B团队快速地启动了V2项目,为产品的后续版本的开发活动赢得了充分的时间。在T线到V2线的时间里,将会有良好的分析、设计和团队组织与培训。由于人员基础上来自A团队,他们也会乐于提出问题,并在新版本中解决这些旧问题。
接下来,我们利用了人力。无论在哪个时间段内,人力都得到最充分的利用,A团队所富余的,正是B团队立时所需的。
最后,我们解决了Brooks的问题:在等待时,实现人员应该做什么?其实这个问题的根本于“等待”而不是“做什么”。我们应该问:为什么会有等待?显然,如果没有等待,那么我们的开发人员自然知道他该做什么。
团队迭代模式通过争用来消除了等待,使“等待时做什么”的问题变成了“如何平衡资源争用”。对于Brooks的原始问题,Brooks的答案是对的,但同时要付出“项目周期”的代价。而对于新的“平衡资源”的问题,我们在工程过程对资源的客观需求中找到了平衡点。通过在B线、T线和V2线之间合理地调配资源、分配管理职权和设定阶段目标,我们能够用灵活的管理技术和组织模式,来换得了更好的构架一致性、产品(线)延续性、团队的稳定性和(最重要的)更短的迭代周期。
冲突及其平衡
如果我们真的有两个团队或更大规模的团队资源,那么基于项目的迭代是不必须的。事实上,在一些公司里采用多个团队竞争的法则,从而得到新的版本或团队。但这些是以充备的资源为前提的,而且也无法避开向下兼容的问题。
而本文中的AB团队模型是强调合作的,两个团队一定是围绕相同的目标和设计在工作(因此必须一再提醒的是,如同《人月神话》中强调的一样:要保持设计的一致性)。如果这个前提不能被保证,那么AB团队模型无法消减其内部的冲突。
综合地来考虑,下列的因素是对团队迭代有害的:团队竞争、组织臃肿和不明确的产品线计划。
除了上述这些先期的可控因素之外,在项目过程中,我们还必须面临一些其它问题。
首先需要找到最好的切入点:B线。太早的话,A团队会因为受到太大的伤害而溃败;太晚则又牺牲了更多的时间,从而可能失去团队迭代的价值。
接下来,对于A团队的经理,从B线开始他将面临两种考验。第一个考验是立即到来的:他的团队可能变得有些混乱,因为部分人员开始面临两个项目的问题,一些人员会开小差,不知所措,另一些人员可能已经打好了铺盖卷。而从T线开始,A团队的经理迎来另一个考验:他必须要在人员逐渐流失的情况下控制好整个的团队。这个考验是最严峻的,因为A团队的经理如果控制不好团队的运作,那么项目可能不能保证市场化或满足用户需求。
最后的,也是最关键的问题:工程人员的素质。无论是现在,还是将来,应用“基于项目的迭代”这样的模型,都要求:
两个团队的负责人有良好的素质,他们围绕相同的目标在同共努力,而不是当前的具体工作,或阶段性的利益而争夺;
需要认识到在于B线-T线和T线-V2线这两个阶段中,所置换的人员的特性是不一样的。前者偏向设计与分析,后者着重实现能力;
两个团队的成员有良好的工程态度(不一定是经验),能理解团队结构变化的目的,以及乐于接受改变,接受新的工作。
分享到:
相关推荐
弹性力学数值方法:迭代法:预条件技术在弹性力学迭代法中的应用.docx
在软件工程领域,迭代开发是一种常见的项目管理方法,它将整个开发过程分为多个连续的周期,每个周期(即迭代)都包含设计、实现、测试和评估等阶段。迭代评估报告是这一过程中的关键文档,用于记录和分析每一轮迭代...
在数理统计、数据分析以及优化求解领域,MATLAB是一种常用的强大工具,它提供了丰富的函数库和算法,便于用户处理各种复杂问题。...通过不断的迭代和调试,可以找到合适的解,从而推动各种科学和工程问题的解决方案。
20210716-开源证券-倍轻松-688793-公司首次覆盖报告:便携按摩器龙头,产品迭代+渠道扩张驱动快速成长.pdf
迭代法是一种在计算机科学和数学中广泛使用的求解方法,特别是在优化问题和数值分析中。在给定的“迭代法-穿越沙漠问题”中,我们可以理解这是一个基于迭代算法的编程挑战,可能是为了模拟或解决某种涉及到多步骤...
迭代总结是对一个或多个迭代周期(通常称为Sprint)的回顾和分析,旨在评估团队的表现、产品的进展以及改进的机会。以下是对"迭代总结.docx"文档可能包含的关键知识点的详细说明: 1. **迭代过程**:迭代是将大型...
### 软件工程中的迭代开发方法 #### 第一章:软件工程概述 - **软件工程定义**: - 软件工程是一种系统化的、规范化的、可度量化的方法论,旨在指导软件的开发、维护及运行过程。 - 其目标在于提升软件的质量、...
1.领域:matlab,有限差分超松弛迭代算法 2.内容:基于有限差分超松弛迭代方法实现电磁场仿真+代码操作视频 3.用处:用于有限差分超松弛迭代算法编程学习 4.指向人群:本硕博等教研学习使用 5.运行注意事项: ...
数值迭代算法是解决数学方程组或非线性问题的一种常用方法,特别是在计算机科学和工程领域。这种方法通过一系列近似步骤逐步逼近问题的精确解。在本教程中,我们将深入探讨数值迭代的基本概念,以及如何在强大的编程...
- **总结**:回顾了软件工程与软件产品线之间的紧密联系及其对软件开发领域的重要意义。 - **未来展望**:探讨了软件工程与软件产品线在未来的发展趋势,例如人工智能、量子计算和区块链技术的应用,这些新兴技术将...
迭代学习控制(Iterative Learning Control, ILC)是一种在重复任务中通过不断学习和改进来提升系统...在实际工程中,这种迭代学习方法常用于机器人控制、航空航天、自动化生产线等领域,以实现高精度的重复任务执行。
弹性力学数值方法:迭代法:弹性力学迭代法的并行计算.docx
### 软件工程中的团队协作技巧 #### 第1章 简介 软件工程是一门涉及软件开发、运行及维护全过程的学科,它强调使用系统化、规范化的可度量方法来确保软件产品的高质量。在软件工程领域,团队协作是一项核心技能。...
本文介绍了C++中模板和迭代器的基本概念及其应用。模板为程序员提供了一种编写通用代码的方法,而迭代器则为遍历容器提供了一种高效且类型安全的方式。结合使用这两种技术,可以帮助我们编写出既强大又灵活的程序。...
雅可比迭代是基于矩阵的分块对角线优势来求解线性方程组的一种方法。在MATLAB中,`Jacobi_judge.m` 文件可能包含了实现雅可比迭代的函数,该函数可能通过比较连续两次迭代解的差异来判断收敛性。通常,当连续两次...
4. **提高团队士气**:每次迭代后都能看到成果,有助于提升开发人员的信心和动力,促进团队合作。 5. **生成更高质量的产品**:通过持续测试和改进,可以在早期发现并修复缺陷和性能瓶颈,确保产品质量。 #### 三、...
在软件工程的移交迭代阶段,用户手册作为交付的一部分,确保开发团队向运维团队或最终用户清晰地传达了软件的功能和使用方法。这包括了详细的操作步骤、故障排除指南以及可能出现的问题解决方案。此外,迭代过程中,...
Gauss和SOR迭代法广泛应用于科学计算、工程问题、经济模型等领域,特别是在处理大型稀疏线性方程组时,由于它们的计算复杂度较低,能够有效节省内存和计算资源。 总结,Matlab中的Gauss迭代法和SOR迭代法实现,不仅...
### 产品迭代开发流程详解 #### 一、项目立项与规划 在进行任何具体工作之前,首先要明确项目的立项。这一步骤通常涉及到对项目背景、目标、预期成果以及潜在风险等因素的综合考量。项目立项阶段完成后,需要进一步...