OKR与敏捷开发的原理有着相似之处,但已经使用敏捷的团队再用OKR感觉会显得多余。这种误解的根源就在于对这两种模式不够了解,运用得当的情况下,OKR和敏捷可以形成强强联合的效果,他们可以创造出以价值为驱动的团队,改变团队的工作方式。

本文第一部分介绍了瀑布式目标与敏捷之间的冲突。

功能工厂

敏捷的诞生是为了确保软件的交付,可以替代瀑布式开发来管理软件项目。敏捷模式注重的是可交付成果(开发需求或软件功能)而非项目价值(业务成果)的管理。

事实上,敏捷中并没有单独跟踪结果的规范。

《敏捷宣言》本身具有一定的误导性,因为它告诉人们要衡量可交付成果,它的第七条原则规定:“可工作的软件是进度的首要度量标准”。

该原则默认所有可使用的软件都有价值,这显然是错误的。因为有些项目能够产生价值,有些不能;用户可能会采用软件的某些功能但却会摒弃其他的功能。

大多数公司陷入了“功能工厂”模式,其团队压根不关注交付产品的价值。正如约翰·卡特勒(John Cutler)所描述的那样,开发人员就像流水线的工人那样“坐在工厂里,批量制造各种功能,然后传送出去”。

马蒂·卡根(Marty Cagan)强调过这种模式可能导致的可怕后果:

“开发团队忙着具化细节、写代码和测试。他们对更大背景知之甚少,甚至不太相信自己的产品真的能成为解决方案。他们不在乎这些功能是否真正解决了潜在的业务问题。因为他们衡量进度的标准是输出而非成果。”

距《敏捷宣言》发表已经过去15年了,大多数公司使用敏捷只是为了交付,而在缩放框架上几乎没有什么帮助。因为他们选择这条阻力最小的路并且专注于改善软件开发过程。也正因此,几乎很少有公司能够真正实现公司业务的敏捷性。

敏捷交付

我喜欢把公司看成是一个包含了五个层级的架构,即文化、战略、策略、运营和目标。

公司目标反映公司的工作和运营方式,因此它也会渗透到其他四个层级。

传统公司的组织架构图示如下:

在传统的公司架构中,各个层级的特点分别是:

  • 文化是自上而下的,是指挥和控制。
  • 战略是静态的年度计划。
  • 目标遵循了瀑布模型。
  • 策略通过豪赌模式和长反馈周期产生作用。
  • 运营则使用瀑布式开发和项目管理模式。

通常,公司采用的敏捷,是指敏捷交付功能。仅仅只是用来替换公司最底层的架构:

敏捷交付仅在运营层面实践精益和敏捷性。当团队进行分散的实验时,敏捷取代了瀑布式开发,这也就导致团队无法形成实验文化。尽管各处都开展了一些A/B测试,但许多高风险假设未能得到验证。

鉴于敏捷交付不涉及其他层级的架构,因此其优势变得越来越小, 瀑布模型的缺陷与公司敏捷性的实现之间存在直接冲突。

瀑布式目标

在设定目标时,瀑布模型的思维模式仍然十分常见。公司通常会以年度为单位,自上而下地规定一系列静态的目标,而这与公司保持敏捷性之间存在直接冲突。

瀑布式目标遵循了静态的规划模式。通常由一群高层管理人员集体制定公司的年度目标,然后逐级向下传达,并最终形成公司该年度的固定计划。

没什么能比瀑布更形象地描述这种自上而下逐级传递目标的设定模式了!

这种静态的模式包括下列几种假设:

  • 可以提前明确整个计划的全部步骤;
  • 绝大多数计划都是正确的;
  • 市场状况基本保持不变;
  • 变动会很小。公司会在年中审核的时候处理这些细微变化,并在之后制定一个更新后的详细静态计划。

以项目为基础的瀑布式目标

更糟糕的是,瀑布式目标不关注价值,因为它们反复围绕着管理层批准的一系列项目而设定。

弗雷德里克•泰勒(FrederickTaylor)曾写道: “每个员工的工作都应该至少提前一天由管理层详细规定出来。” 如果他得知当今的公司依然遵循着他的教导,想必会异常欣慰。

在泰勒的敏捷管理理论中,团队存在的意义就是为了完成项目的交付。管理人员将严格按照流水线工厂的模式来规划工作。这种管理模式将导致公司反应迟缓、难以适应变化,同时还会增加风险和浪费。

在敏捷交付中,大多数的缩放框架都是能够取得一定成效的,因为他们着重通过敏捷的思维方法来推动瀑布式计划的实现。

由静变动的计划

信奉静态计划模型的人就像是苏联时期的中央领导人,他们制定5年计划方案,认定自己可以预测未来。

相较之下,动态计划则拥抱变化。他们在一个较小的计划周期内运转。动态计划假设市场条件和计划本身都会发生变化。更重要的是,我们对问题的理解将伴随着了解的深入而变化,而计划也会做出相应调整。

正如肯特·贝克(KentBeck)所写的: “一成不变地按照既定计划行事的唯一方法就是拒绝学习、固步自封。”

你希望团队可以在更短的周期内更新迭代并检验假设,那你怎么能效仿苏联通过瀑布式流程来设定一系列的静态目标呢?

这样肯定行不通,尽管我们在交付层面实现了敏捷,但在其他方面依然使用瀑布模型。

我们需要改变。

TBC......

原文作者|Felipe Castro
内容整理|Worktile

文章来源:Worktile官方博客

文章转载请注明出处。

系列文章|OKR与敏捷(一):瀑布式目标与敏捷的冲突的更多相关文章

  1. 系列文章|OKR与敏捷(三):赋予团队自主权

    OKR与敏捷开发的原理有着相似之处,但已经使用敏捷的团队再用OKR感觉会显得多余.这种误解的根源就在于对这两种模式不够了解,运用得当的情况下,OKR和敏捷可以形成强强联合的效果,他们可以创造出以价值为 ...

  2. 系列文章|OKR与敏捷(二):实现全栈敏捷

    OKR与敏捷开发的原理有着相似之处,但已经使用敏捷的团队再用OKR感觉会显得多余.这种误解的根源就在于对这两种模式不够了解,运用得当的情况下,OKR和敏捷可以形成强强联合的效果,他们可以创造出以价值为 ...

  3. Geotrellis系列文章链接

    本文存放了我在博客园中撰写的Geotrellis系列文章链接,方便查阅! 一.geotrellis使用初探 二.geotrellis使用(二)geotrellis-chatta-demo以及geotr ...

  4. IT人经济思维之投资 - 创业与投资系列文章

    前面笔者写过一个文(IT从业者的职业规划),主要通过笔者的从业道路的经验,介绍了IT从业者的职业选择道路问题,主要从技术.业务和管理三大方面进行了描述.然后,通过文(IT从业者的职业道路(从程序员到部 ...

  5. 重新想象 Windows 8.1 Store Apps 系列文章索引

    [源码下载] [重新想象 Windows 8 Store Apps 系列文章] 重新想象 Windows 8.1 Store Apps 系列文章索引 作者:webabcd 1.重新想象 Windows ...

  6. JVM系列文章(四):类载入机制

    作为一个程序猿,只知道怎么用是远远不够的. 起码,你须要知道为什么能够这么用.即我们所谓底层的东西. 那究竟什么是底层呢?我认为这不能一概而论.以我如今的知识水平而言:对于Web开发人员,TCP/IP ...

  7. Office 365 开发概览系列文章和教程

    Office 365 开发概览系列文章和教程 原文于2017年2月26日首发于LinkedIn,请参考链接 引子 之前我在Office 365技术社群(O萌)中跟大家提到,3月初适逢Visual St ...

  8. MyBatis 源码分析系列文章导读

    1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...

  9. 一步步实现windows版ijkplayer系列文章之四——windows下编译ijkplyer版ffmpeg

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

随机推荐

  1. Springmvc 横向源码原理解析(原创)

    1.springmvc的基本流程(不多赘述) 2.主要涉及到的类 //该方法返回HandlerExecutionChain 类 并不是直接返回handler 是因为在HandlerExecutionC ...

  2. Android 性能优化之使用Lint

    代码静态检查推荐: (1)Android自定义Lint实践 (2)美团外卖Android Lint代码检查实践 (3)Android自定义Lint实践2——改进原生Detector Lint 是 An ...

  3. C\C++ 内存对齐现象

    前几天一个在自学C语言的小伙伴问了我个问题,C语言结构体储存所占空间为啥和自己预测的不一样.看一下下面这一段代码: struct node{ int num; char ch; }a; printf( ...

  4. 11-Cookie&Session

    中文文件下载 针对浏览器类型,对文件名字做编码处理 Firefox (Base64) , IE.Chrome ... 使用的是URLEncoder /* * 如果文件的名字带有中文,那么需要对这个文件 ...

  5. js函数柯里化,实现bind

    1.柯里化: 把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术. 举个栗子: 一个计算两数之和的函数,需要传递两个参数,柯里化 ...

  6. JavaScript递归

    什么是递归? 在函数的内部调用自己 下面有一个例子,通过这个例子,大家就可以了解什么是递归 function fun(){ console.log(new Date()) //获取当前时间,并在控制台 ...

  7. 详解AMD规范及具体实现requireJS在工程中的使用

    前面的话 由CommonJS组织提出了许多新的JavaScript架构方案和标准,希望能为前端开发提供统一的指引.AMD规范就是其中比较著名一个,全称是Asynchronous Module Defi ...

  8. AIO系列文档(2)----TIO使用

    AIO系列文档(1)----图解ByteBuffer中介绍了ByteBuffer用法,下面通过介绍t-io介绍如何使用: hello world例子简介 本例子演示的是一个典型的TCP长连接应用,代码 ...

  9. [Swift]LeetCode82. 删除排序链表中的重复元素 II | Remove Duplicates from Sorted List II

    Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...

  10. [Swift]LeetCode264.丑数 II | Ugly Number II

    Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...