前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何驱使行为改变 | 驱动变革

如何驱使行为改变 | 驱动变革

作者头像
ThoughtWorks
发布于 2019-05-05 06:58:29
发布于 2019-05-05 06:58:29
7100
举报
文章被收录于专栏:ThoughtWorksThoughtWorks

职权不是决定因素

绝大多数工程师对于变革有种无力感。这种无力感源于这样的想法:我不是管理人员,没有足够的职权,无法改变自己的组织。当这种感觉足够强烈的时候,它作带来的挫败感会使我们失去进一步行动的能力。

然而这种无力感无论是中层管理者、执行副总裁甚至首席执行官都会存在。论及变革,没人具有足够的权力。这是因为变革中最核心的问题不是改变组织的结构、战略或文化,而是改变人的行为与意愿——改变人的工作方式以及在工作中所关心的内容。 职权的确会让某些事情变得容易,有些大范围的变革还必须巧妙借助职权的力量——比如涉及组织结构调整的改变,但它不一定是变革成功的决定因素。

从2007年开始,国内很多软件企业开始尝试采用敏捷方法,其中不乏有中高层领导以行政命令推行敏捷方法的做法。我曾经在敏捷中国大会上碰到一位朋友,他跟我讲了他们公司的故事:他们公司里负责研发副总裁听说了敏捷方法之后,对于测试驱动开发非常感兴趣,认为这是提高软件质量的好方法。于是在公司内要求所有的研发人员都必须要开始采用测试驱动的方法进行编程,并制定了相应的考核制度。而最后的结果是,研发人员为了应对考核指标,写了很多无用的测试,花了额外的时间不说,对软件质量的提高并没能带来实质性的帮助。最后纵使在报告上有不错的测试覆盖率统计,绝大多数人——包括那位研发副总裁自己——都不认为这次变革是成功的,因为人们的工作方式和内容并没有真正地发生改变:他们并没有变得更注重质量,也没有采用自动化的方式来保证软件质量不受破坏。

比起职权我们更应该学会影响他人,驱动他们在行为上发生改变 。无论是否具有职权,成功地驱动变革都不是件容易的事情。拥有职权仍然需要小心使其发挥作用,没有它也不意味着我们完全被束缚了手脚,不能采取任何行动。关于职权在变革中的作用我们将在下一章讨论,在那之前首先需要讨论的是成功驱动变革的核心因素——如何驱使行为改变。


什么可以带来行为的改变?

有一种可以带来行为改变的方法,其主要模式可以表述为“分析—思考—改变”:

  • 针对特定问题向人们展示数据或者分析结果;
  • 通过数据或者分析的论证影响他们的思考方式;
  • 借由新的思维方式带来行为模式的改变。

这种方式天然受到工程师的喜爱。作为工程师,我们接受过严格的逻辑思维训练。我们相信数据以及理性的分析,并愿意根据分析结果调整自己的行为。我们理所当然地认为这是最合乎情理也是最客观理性的方法。不过令人意外的是,变革管理大师John P. Kotter的研究表明,“分析—思考—改变” 这种方式很少能真的发挥效果。他说对于“只对数据感兴趣的工程师”可能会有效果,但以我个人的经验来说,哪怕是对工程师,这招也没那么管用。

理智的局限

工程上的很多问题我们虽然知道优劣之分,但是难以量化和度量。比如Ruby到底比Java和.NET在研发效率上快多少?RESTful的架构风格比SOA(Service Oriented Architecture)在开放性和扩展性上好多少?采用结对编程的方式和不采用结对编程的方式在代码质量上有多少提高?我们明确地知道Ruby比Java和.NET的开发效率高、RESTful比SOA有更好的弹性、结对编程产出的代码质量更好,但是一旦论及多少和数量,却不是那么容易能够给出明确的答案。

那么我们要如何改变Java和.NET程序员的思维,让他们认为Ruby是值得尝试的?要如何改变具有多年SOA经验的架构师的思维,让他们相信RESTful是更好的选择?要如何改变从没有结对经验的项目经理,让他们理解结对并不是浪费时间和金钱呢?

此外,分析结果对人们思维的改变,远没有达到我们想象的那种程度。哈佛大学商学院Andrew McAfee教授富有洞鉴地指出:我们通常会高估新技术带来的效果和影响,大约三倍,而低估已有技术和方法的效能,大约也是三倍,只有在新旧技术相差十倍的时候,我们才会有明显的改变意愿。换句话说,如果我们希望发生的改变没有在某方面带来十倍以上的提升,人们的思考方式不会因为我们的分析而发生明显的变化。所以当你希望重构代码结构以获得更好的架构时,当你希望更换不同的数据库以获得更好的开发效率时,通常不会受到特别热烈的响应——这些改变虽好,但是远没有十倍以上的差距。

最后,也是最重要的,分析结果的确能够改变人的思维,但却很少能够有效地改变人的行为方式。比起思维,情感更能驱动人们作出行为的改变,而很少有分析结果能真正地打动人心,建立情感上的纽带。

几年前在推广Ruby的时候,我和几位同事组织过厦门Ruby用户组,期间我分享过一个主题:从面向对象技术发展的历史来看,为什么Ruby是更好的面对象语言。会后有位朋友私下找我沟通,他说:“从你提供的资料和分析,我或许相信Ruby这门语言有它的根源和发展;但是我实在无法想象在企业应用的开始中去使用它,因为我是企业级Java开发人员啊。”

这番话很有代表意义,Java对于这位朋友而言,与自我认知有关。他和Java有更深的感情联系——这是定义我的角色和身份的技术。所以他虽然能在思维上认可我给出的资料和分析,却很难真的作出改变。

感受带来改变

那么什么才是带来行为改变更有效的方法呢?答案是:目睹—感受—改变。

照John P.Kotter的话讲,这是“大多数在变革中取得成功的组织都会采用模式”。其模式可表述为:目睹是指通过一些戏剧性的、引人注意的情景或可视化展示(visualization)来帮助人们发现问题;在看到问题之后,引发人们情绪和感受上的冲击,让他们开始从内心深处作出反映, 削弱那些阻碍变革的情绪,比如自满、愤怒、怀疑或恐惧。增加紧迫感、乐观或者信任等有益于变革的情绪;这些正向情绪开始改变原有的行为,或者强化新的行为模式。

这种模式常常会产生较深远的影响,除了能够带来行为改变之外,在这个过程中所产生的戏剧性的、引人注意的情景或是可视化展示的手段会被广为流传,对越来越多的人产生影响,它所产生的效果是非常惊人的。这里我有两个案例要和大家分享。

第一个例子是戏剧化的展示。

我曾经帮助某客户团队实施自动化测试。在这团队里,从部门领导到团队成员,普遍认为他们所处理的系统功能点杂、业务流程多变,实施自动化测试会有很高的脚本编写成本。此外,这家公司有独立的测试部门,但是由于这个团队做的是内部运营系统,测试部门并没有给予足够的重视和配合,反而是一再降低他们系统的测试优先级。从测试部门获得帮助几乎是不可能的奢望,所以所有人都认为自动化测试是不可行的, 但是他们愿意给我一个机会。

经过调研之后,我觉得数据驱动的功能测试非常适合这个团队的现状。经过了不到一周的准备,我迎来了第一次进度展示。为了帮助团队树立信心,并强调测试成本并没有想象中的那么高,我设计一个略有戏剧性的场景:在展示会当场把针对一个流程的测试,扩展为真对八个流程的测试——而这个改动仅仅涉及测试数据,没有任何测试代码的变化。也就是说,在2分钟内,测试案例个数提高八倍(当然,基数是一个自动化测试案例,这没什么可骄傲的)。没有行业数据、没有理论分析、没有特殊工具,就像变魔术一样提高八倍。

最终的结果也颇具戏剧效果,团队里除了产生了乐观的态度和对我的信任之外,我还收到一张速写。画了一个胖子站在投影幕布前面,幕布上整屏幕翻滚着测试执行日志和弹出的测试用浏览器。画的作者跟我说,当时他看到这一幕感到非常震撼,从来没有想过自动化测试可以凭空出现一般突然多出很多。此后我也在这个团队之外的地方听到了这个故事,与之相伴的是,很多实施自动化测试成功的案例。

第二个例子是没那么戏剧性的可视化展示。

很多年以前,那个时候微软刚刚推出WPF(Windows Presentation Foundation),我所在的一个团队就采用了这个技术,为某客户开发新一代客户关系管理系统。由于WPF在当时还是比较年轻的技术,很多实践都不是很成熟,我们做了很多的探索。一段时间以后,团队感觉到测试覆盖率偏低。不是测试报告上展示出来的数值低,而是根据缺陷的修复时间和缺陷的泄漏数量得到的一个直观感受。当时团队里有人有这样一个议论:因为WPF本身有很多自动生产的代码,同时很多交互功能以及样式渲染与WPF API绑定过死而难以测试。那么WPF最高测试覆盖率到底是多少?如果在WPF上最高测试覆盖率只能做到40%,那么我们的测试覆盖率还是很高的呢。毕竟我们使用了MVP(Model-View-Presenter)模式,对于可测试性还是有很大帮助的。

这是一种典型的自满情绪,这种情绪对于变革的推进是非常不利的。因为在这种情绪支配下,行为惯性很大且非常不容易接受其他建议。于是我们做了一个很简单的可视化展示,把当前团队的测试覆盖率写在一张卡片上,然后把这种卡片悬挂在团队最显眼的地方。如果我没有记错的话 ,初始数据是32%。然后有意思的事情就来了,这个数据当时是全办公室的最低值。毕竟其项目都是Web项目,以当时的能力要做到100%也不是不可能的。很多其他组的同事路过的时候,都会询问一下原因——毕竟这个数值实在太低了。可能是问得人多了终于有些同事受不了,开始反思32%是不是我们能做到的最好结果?答案当然是:不是,很多新的技术和技巧被发明出来用以改善WPF下的测试问题。几个月以后这个组的测试覆盖率接近60%。

有意思的是很多年后Android开始流行,另外一个项目组再做Android项目的时候遇到了类似的问题,也是测试覆盖率较低。他们准备放弃的时候,有人给他们讲了这个故事,特别提到了当时我们组挂在外面的那个测试覆盖率卡片。只不过讲故事的人说:我记得看到的数字是百分之五十几,所以你们做到这个数字也该不难吧。

“分析—思考—改变”与“目睹—感受—改变”最大的差异就在于,前者着眼于具体问题的分析和解决,而后者注重建立情感上的联系。成功的变革最终都会解决一些具体问题,但单刀直入式地从解决问题开始,并不一定是驱动人们作出行为改变的最佳方式。而当人们在情感上建立联系之后,往往会作出更有效的分析,也更容易接受思维上的改变。

在这个过程中最核心的步骤是感受, 通过情感上的冲击消除不利于改变的情绪而提升变革的意愿。变革的意愿越强烈,成功改变行为的几率就越高。有两种感受与改变的意愿密切相关:信任感与紧迫感。所以驱动行为改变最重要的步骤是获取信任、确立愿景以及提升紧迫感。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ThoughtWorks洞见 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C++】C++ 类中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )
在 C++ 类中 , 普通的非静态成员函数 , 可以使用 const 进行修饰 ,
韩曙亮
2023/10/15
2300
【C++】C++ 类中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )
C++:23 再议const的用法(下)
(2)不能将const 类型的实参传递给形参为non-const 类型引用的函数。
用户3479834
2021/02/03
4030
C/C++ const
const是C语言的关键字,经C++扩充,功能变得强大,用法复杂。const用于定义一个常变量(只读变量)。当const与指针、引用、函数等结合起来使用时,情况会变得更加复杂。下面将从七个方面总结const的用法。
恋喵大鲤鱼
2018/08/03
8770
类和对象的提高
#this指针 其作用就是指向成员函数所作用的对象 非静态成员函数中可以直接使用this来代表指向该函数作用的对象的指针 例如:想要将某对象的公有成员自增,写一个函数 complex addone(){ this->real++;// 等价于real++; this->print();//等价于print return *this; } 在主函数中: int main(){ complex c1(1,1),c2(0,0); c2=c1.addone(); //这样不需要再传递参数了 return 0; } *静态成员函数不能使用this指针,因为静态成员函数并不具体作用某个对象 *因此,静态成员函数的真实的参数的个数,就是程序中写出的参数个数 #静态成员函数 静态成员,在声明前面加上static关键字 普通对象每个成员都有各自的一份,静态成员变量被所有对象所共享 普通成员函数必须具体作用于某个对象,静态成员函数并不具体作用于某个对象 **因此静态成员不需要通过对象就可以访问** 访问静态成员 1.类名::成员名 2.对象名.成员名 3.指针->成员名 4.引用.成员名 静态成员变量本质上全局变量,静态成员函数本质上是全局函数 例如,考虑一个随时知道矩形总数和总面积的图形处理程序 可以用全局变量或者静态成员变量来表示,但考虑不同 结构体中定义中,将w,h定义长宽,当出现一个对象时候(**在构造函数里完成**),总数变量加1,面积变量也是增加 同理在**析构函数**里面将其对应的减少,值得注意的是不能忘记了复制构造函数 *在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数 #成员对象和封闭类 有成员对象的类叫做封闭类(在一个类里面有其他类(被称为成员对象),这个类叫封闭类) 任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象是如何初始化的 具体做法是:*通过封闭类的构造函数的初始化列表 *封闭类构造函数和析构函数的执行顺序 1.先执行所有对象成员的构造函数,然后执行封闭类的构造函数 2.对象成员的构造函数调用次序和对象成员在类中的说明次序一次 3.当封闭类的对象消亡时,先执行封闭类的析构函数,再执行成员对象的析构函数 #常量对象 常引用 如果不希望某个对象的值被改变,则定义该对象前可以加上const 可以在类的成员函数后面加上const关键字,则为常量成员函数 *常量成员函数执行期间不应修改其所作用的对象(成员对象,成员函数) 例如:void getvalue() const; //声明 注意*常量对象不能执行非常量成员函数,可以执行常量成员函数 #友元 友元分为友元函数和友元类两种 友元函数:一个类的友元函数可以访问该类的私有成员 声明:在前面加上frind 目的:为了保证某个类的函数能够访问其他类的私有成员 友元类:如果a时b的友元类,那么a的成员函数可以访问b的私有成员 *友元类之间的关系不能传递,不能继承
废江_小江
2022/09/05
2850
【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )
类成员方法 , 除了定义构造方法与析构方法之外 , 还可以定义普通的成员方法 , 如设置 int age 变量的方法 , 这里声明一个成员方法 , 传入参数 int age , 给成员变量 int age 赋值 ;
韩曙亮
2023/03/27
5310
【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )
C++:09---类静态成员、类常量成员
一、类静态成员(static) 先介绍一下什么是静态变量、静态函数 静态局部变量:存在域(全局数据区),作用域(块作用域) 静态全局变量:存在域(全局数据区),作用域(整个文件) 静态函数:存在域(全局数据区),作用域(整个文件) static int a=10;//全局静态变量 static void add();//静态函数 int main() { { static int b=10;//局部静态变量 } } 特点: 静态static修饰的变量、函数,只需要初始化一
用户3479834
2021/02/03
1.6K0
C++:09---类静态成员、类常量成员
C++基础知识精髓
例程中声明一个命名空间Test,Test中声明一个结构体Account,而Account中定义变量和声明函数。
Linux兵工厂
2023/02/28
2K0
C++基础知识精髓
C++必知必会之基础知识-常用关键字(1)
Hello,大家好!我是木荣。温故而知新,可以为师矣。作为一名攻城狮,扎实的基本功是解决问题及完成工作中任务的重要前提。没有良好的基本功作为铺垫,一味的追求知识的宽度是毫无意义,知其然更要知其所以然。因此,在平时和小伙伴们聊天时,在谈到学习技术方面的问题,我会告诉他们注重基本功。所以,最近文章会总结一些日常编程工作中常用的重要基本知识点,根据平时工作中常用的也是重要的知识点逐步展开。
Linux兵工厂
2023/09/15
2150
C++必知必会之基础知识-常用关键字(1)
【C++】const对象和const成员
如果我们在定义一个对象之后,不希望在后面对这个对象进行修改,那么我们可以把这个对象声明为const对象。 声明为const对象之后,这个对象的所有数据成员后面都不能被修改!
谙忆
2021/01/21
1.2K0
c++面向对象的一些问题1.0
构造函数 特殊的成员函数,给对象的初始化,不需要用户调用,建立对象时,自动执行 它的函数名字与类相同,可以重载,没有返回值和函数类型。 如果不写构造函数,类会给出一个无参数的构造函数。 复制构造函数 a.程序新建立一个对象时,用另一个对象对它初始化。 b. 函数的参数为对象。 c. 函数的返回值为对象。 ---- 特殊的数据成员 常数据成员,const声明,其值不能改变。 const string sex; 静态数据成员,static声明,属于类,只能在类外初始化。 stat
热心的社会主义接班人
2018/04/27
5750
c++面向对象的一些问题1.0
c++之const修饰成员函数
常函数: 成员函数后加const后我们称这个函数为常函数; 常函数不可以修改成员属性 成员属性声明时加关键字mutable后,在常函数中依然可以修改 常对象: 声明对象前加const 常对象只能调用常函数 常函数: #include<iostream> using namespace std; class Person { public: int age; mutable int tmp;//用mutable修饰的为特殊变量,可以在常量函数中修改 void showPerson()
西西嘛呦
2020/08/26
6540
【C++】自引用this指针的秘密
当我们在进入一个房子之后,可以看见房子里的桌子、椅子、地板等,但是看不到房子的全貌。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向这个个实例。
全栈程序员站长
2022/08/29
8490
【C++】自引用this指针的秘密
C++:30 ---C++类成员,成员函数的内存布局
这里要指出的是大家可以看到静态成员函数和静态成员变量sx的地址都是0x00007FF开头的,实际上他们都在全局数据区域存储(全局变量,静态变量),如果你有耐心,可以断点查看下栈空间内的局部变量i的地址:
用户3479834
2021/02/03
1.3K0
C++:30 ---C++类成员,成员函数的内存布局
C++类与对象(三)
在调用构造函数的时候,就不是初始化成员变量了,而是给成员变量赋值。 C++中成员变量的初始化是在这里。
有礼貌的灰绅士
2023/03/28
3900
C++类与对象(三)
C++核心编程学习
包含常量区;主要是存放全局变量,静态变量,字符串常量,const修饰的全局变量, 不包括const修饰的局部变量(区域的数据在程序结束后由操作系统释放)
买唯送忧
2021/09/11
4010
【C++】C++核心编程部分-内存分区模型-引用-函数提高-类与对象-文件操作
相关视频——黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili(84-146)
半生瓜的blog
2023/05/12
1.9K0
【C++】C++核心编程部分-内存分区模型-引用-函数提高-类与对象-文件操作
C/C++常见面试知识点总结附面试真题—-20220326更新
C中,内存分为5个区:堆(malloc)、栈(如局部变量、函数参数)、程序代码区(存放二进制代码)、全局/静态存储区(全局变量、static变量)和常量存储区(常量)。此外,C++中有自由存储区(new)一说。 全局变量、static变量会初始化为缺省值,而堆和栈上的变量是随机的,不确定的。
全栈程序员站长
2022/09/14
1.6K0
C/C++常见面试知识点总结附面试真题—-20220326更新
c++系列之二 指向成员函数的指针(烧脑)
这是一篇翻译的文章,原文详细解释了C++中指向成员函数的指针,因为带有“教程”一词,所以比较通俗易懂。为了使文章读起来通俗有趣,翻译君并未一字一句一板一眼地翻译,并大量使用了诙谐的词汇(如“码农”)。另外,原文的某些地方分段不太合适(小学语文可能是体育老师教的。。),有些地方也稍嫌啰嗦,所以翻译君自己作了一些调整。如果对翻译君的翻译质量有意见,建议前往 原地址 围观。
程序员小王
2019/05/05
3.1K0
c++系列之二 指向成员函数的指针(烧脑)
C++面向对象程序设计
结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了
浪漫主义狗
2022/09/28
1.2K0
const成员函数一定是线程安全的吗?
//这个概念是为了实现限制成员函数仅仅用于左值或右值,带有引用修饰词的成员函数,不必是虚函数
用户9831583
2022/12/04
1.1K0
const成员函数一定是线程安全的吗?
推荐阅读
相关推荐
【C++】C++ 类中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文