Archive for September, 2009

我们所不知道的Code Review

Tuesday, September 29th, 2009

也许是待得太久,就像被一桶草莓酱从头浇到脚,尝哪里都是甜味一样,当初次看到Code Review成为一个如此重型并且低效的活动的时候,我才知道,草莓酱的外面,是空气,裹着大地的气息,大部分无味,又或者是烟草味,或者汽车的尾气。

先看一看我们看到的一个代码审查过程:

  • 开发人员领到任务。
  • 一周之后,代码写完了。他觉得没底,需要找业务专家技术专家来评审一下。这个时候他代码还没有提交。于是他把本地所有没有提交的、修改过后的文件,放到一起,压缩成rar包。找到他认为的技术高手业务高手(们),定会议室,发邮件通知。2小时过去了。
  • 技术专家业务专家收到了邮件,由于缺乏上下文理解,以及长达数千行的源代码,这类邮件一般不看——因为看了也是白看。
  • 终于到了Code Review的那一天。七七八八的来了几个人。一般来不全。因为高手之所以是高手,表现之一就是超级忙。
  • 于是代码的作者开始,一行一行的将代码讲下去。前几十分钟高手们也没办法理解——毕竟是一个星期的工作沉淀,哪有那么快理解的。大约30分钟之后,专家开始提出建议意见。这些意见一般涵盖了语法、编码规范、可能的业务错误、模块间关系等。专家们毕竟是专家。2个小时之后,专家们离去。
  • 开发人员虚心的把这些意见、建议写到小本子上。
  • 开发人员可能根据专家的建议进行相应的代码修改并且提交,也可能不;可能改对了,也可能不。评审过后,后续的实施成为黑洞……
  • 没了。

先思考一下,这个过程中的问题。


首先必须承认Code Review的价值。经验丰富的专家们在做代码审查的时候,能够根据以往经验,规避重大缺陷的发生,对开发人员给予有价值的指导。然而,这个过程,太冗长,太低效。

Code Review必须基于事实。这里的事实,就是,源代码库。SVN Repository, 或者HG/Git Repository. 在多人协作环境中,对于一份不在源代码库代码是基本不可信的 —— 你无法预知,他是否将会成为最终可工作软件的一部分。

积攒下来众多的代码修改,使得产生重型、低效的沟通方式成为必然。这类众型的沟通方式往往成本惊人 – 需要占用最好的人很长时间。

过分夸大专家的作用。根据以往经验,许多最终发现问题,回溯上来,其实是一些简单的逻辑问题。这些问题如果分散在平时结对或者更频繁的过程中,则更容易发现。很多情况下,是开发人员对常见的bad smell了解和修炼不足,而这些bad smell常常是导致问题的地方。例如在一个已经有3重循环的方法中加入了新的判断而没有测试;修改了函数的返回值而没有任何说明;if 判断中包含了多达4-5个变量的比较判断而没有抽象为一个更具业务含义的方法,等等。

Review手段的原始落后。Review必须基于变化。会看报表的人都知道,看报表只需要看两个东西:趋势和拐点。Code Review也一样,只需要看变化。SVN/Hg/Git这类现代化的工具给我们提供了丰富的,基于changeset的compare工具。查看一天,整个团队的check in情况,顶多只需要10分钟-15分钟。

在敏捷过程中,Code Review几乎是一个被忽视的环节——不是不做,而是时时在做。结对时,我们会对结对伙伴的编码习惯、新写的类、变量表示质疑;提交之后,有代码静态检查工具、单元测试工具、覆盖率工具帮助我们检查有没有犯简单愚蠢的错误、有没有破坏既有功能;持续集成服务器则中立、不知疲倦的在每次我们提交之后运行所有的过程。

Code Review不是一个审查环节。不是一个考核环节。它是交流和反馈环节。

闲话:关于敏捷

Wednesday, September 23rd, 2009

(10:09:50 PM) Stephen H. Wang: 好像很久没看到你上网了。:)
(10:10:52 PM) Michael: 最近白天都不用电脑
(10:10:58 PM) Michael: 工作原因
(10:11:06 PM) Stephen H. Wang: 哦,不用电脑?太神气了。
(10:11:11 PM) Stephen H. Wang: 神奇
(10:11:22 PM) Stephen H. Wang: IT业居然不用电脑*-)
(10:11:45 PM) Michael: 做咨询了…主要靠说话
(10:11:59 PM) Stephen H. Wang: 我们领导明天准备给我们安排一个讲座:Refactoring – Martin Fowler的书。
(10:12:04 PM) Michael: 哦
(10:12:08 PM) Stephen H. Wang: 哦~~~~原来如此,好工作!
(10:12:12 PM) Michael: 谁来讲
(10:12:17 PM) Stephen H. Wang: 内部安排的。
(10:12:28 PM) Stephen H. Wang: 可是就是这个领导,居然不认可你们公司的工作流程…
(10:12:33 PM) Stephen H. Wang: 我只有无语了。
(10:13:04 PM) Stephen H. Wang: 我第一次看这个书,说实在的,收获太大了。
(10:13:20 PM) Stephen H. Wang: 越接触敏捷,越觉得你们公司厉害。
(10:13:54 PM) Michael: 哈哈
(10:14:00 PM) Stephen H. Wang: 越来越觉得ISO,CMMI那一套似乎说得好,行不通。 – 软件还是人写的。不是过程写的。
(10:14:17 PM) Michael: 。。。
(10:14:21 PM) Stephen H. Wang: 除非有无限的资源,否则,初级程序员写出的代码质量不高。
(10:14:22 PM) Michael: 你不是现在才了解吧…
(10:14:41 PM) Stephen H. Wang: 第一次接触敏捷的时候知道这个概念,但是现在是实践出真知。
(10:15:06 PM) Stephen H. Wang: Daily Build, Night Release….
(10:15:37 PM) Stephen H. Wang: 而采用瀑布式根本做不到,怎么应对市场变化。
(10:16:00 PM) Stephen H. Wang: 不过,近期也有疑问,就是敏捷如何做测量。
(10:16:21 PM) Stephen H. Wang: 怎么判定软件的质量好坏。例如,以前提到的千行代码缺陷率。
(10:16:42 PM) Michael: 。。。
(10:16:45 PM) Michael: 你自己觉得呢
(10:16:51 PM) Stephen H. Wang: 不知道
(10:16:54 PM) Stephen H. Wang: 所以才疑惑
(10:16:57 PM) Michael: 我们的客户前一阶段就问了这个问题
(10:17:12 PM) Michael: 我的回答是 — 这就是一个扯蛋的指标
(10:17:12 PM) Stephen H. Wang: 我想转型的时候都会有此一问。
(10:17:24 PM) Michael: 当然没这么说…
(10:17:27 PM) Stephen H. Wang: 那么,如何判定敏捷以后的质量呢?
(10:17:38 PM) Michael: 按照Story来
(10:17:46 PM) Stephen H. Wang: 是因为自动测试 – All passed 所以就是质量过关了吗?
(10:17:47 PM) Michael: 每个Story的缺陷数量
(10:18:00 PM) Stephen H. Wang: 可是,每天一个发布,如何统计缺陷数量?
(10:18:22 PM) Michael: 你要想到 缺陷率是典型的后置式检查
(10:18:32 PM) Stephen H. Wang: 对!完全同意
(10:18:37 PM) Michael: 而敏捷里面所有的实践,质量是隐含的,不可侵犯的
(10:18:49 PM) Michael: 这就是我们所说的Built Quality In
(10:19:09 PM) Stephen H. Wang: 嗯,这个概念的确是很好。
(10:19:12 PM) Michael: 从项目的一开始,质量检测环节就贯穿始终
(10:20:11 PM) Michael: 比如,刚开始写Story, 就要和测试人员定义验收条件;开发Story采用TDD的方式,通过测试来检验功能,类似于砌墙的时候先扯水平线,然后开始铺砖
(10:20:27 PM) Stephen H. Wang: 嗯。
(10:20:34 PM) Michael: 一般的敏捷项目,测试代码与开发代码的比例至少是1:1。我们的项目一般是2:1甚至3:1
(10:20:50 PM) Michael: 千行代码缺陷率对于敏捷项目而言是个笑话
(10:20:57 PM) Michael: 因为代码行数是个很扯淡的指标
(10:21:16 PM) Stephen H. Wang: 呵呵,这个指标是针对以前的过程式开发而设立的。
(10:21:20 PM) Michael: 分母都没意义,分子除以分母更没意义
(10:21:50 PM) Michael: 比如说,你用2000行写了一个功能,发现了1个bug;我只用了20行,也发现了同样的bug. 是不是说你就比我厉害呢
(10:22:07 PM) Stephen H. Wang: 同意。
(10:22:49 PM) Stephen H. Wang: 可是 – 社会平均生产率这个词总还是能够说明一些问题的吧。
(10:22:50 PM) Michael: 开发软件是一项艺术活动。代码行导向的指标完全将其视作计件工人。
(10:23:13 PM) Stephen H. Wang: 是的,即使MS,也有Software Factory一说。
(10:23:23 PM) Stephen H. Wang: 日企更是大行其道。
(10:23:44 PM) Stephen H. Wang: 所以,有一个词:软件蓝领就应运而生了。
(10:23:56 PM) Michael: 软件的生产率仅仅取决于可工作的软件。所谓的生产率应该是产生可工作的软件的效率。代码行只是手段
(10:25:27 PM) Michael: 比如,你每天写1000行代码,没有可工作的软件,因为你只写数据库后台了;我每天只写50行,数据库弄一点,前台加一点,当天发布,第二天客户就能用。按照代码行统计,你的工作效率是我的20倍;但按照可工作软件的角度,你的效率是0
(10:25:52 PM) Stephen H. Wang: 换个贴切的词,我的效果是0
(10:26:34 PM) Stephen H. Wang: 也就是说,我每天都给客户发一个“可用的”软件,永远的beta是这个意思吗?
(10:27:20 PM) Stephen H. Wang: 那么你研究过ISO关于质量的6个特性吗?
(10:28:13 PM) Stephen H. Wang: 错了,是ANSI/IEEE
(10:28:39 PM) Michael: 没..
(10:28:41 PM) Michael: 啥特性
(10:28:57 PM) Stephen H. Wang: Functionality, Reliability, Usability, Effetioncy, Maintenability, Portablity.
(10:29:11 PM) Stephen H. Wang: 他们还分解成20几个小的特性。
(10:29:15 PM) Michael: 这个没错啊
(10:29:37 PM) Stephen H. Wang: 我们的测试人员在担心,如果不用手工测试,无法确保这些特性都达到预期的指标。
(10:29:51 PM) Stephen H. Wang: 这个就是我疑惑的地方。
(10:30:16 PM) Stephen H. Wang: 当然,我也在想,他们是为了保住饭碗,拼命地证明自动测试工具无法全面达到测试目的。
(10:30:33 PM) Stephen H. Wang: 但是Agile的团队,会不考虑这些吗?我想不会的。
(10:31:41 PM) Stephen H. Wang: 比如说吧,一个B/S的系统,应该能够运行在,windows 2000/xp/vista + IE 6,7,8 or Linux + FF or Chrome or Mac + Safari…
(10:32:01 PM) Stephen H. Wang: 可是这些全测试的话,人工测试会花开发几倍的时间。…..
(10:32:22 PM) Michael: 保住饭碗是个很正常的需求。正视这个需求,Agile有更好的办法解决
(10:32:50 PM) Michael: 那就是,测试人员与开发人员属于同一个团队,在一张桌子上一起工作
(10:33:36 PM) Michael: 测试人员的手工测试有价值,但正因如此,所以要将那些无价值的人肉回归测试纳入到自动化中,让测试人员有时间做更有价值的手工测试
(10:34:01 PM) Stephen H. Wang: 我知道Agile的这个做法,可是这正是CMMI最反对的地方。他们认为开发和测试应该分属两个不同团队,测试人员的工资,奖金,评定等都不受开发经理的制约,这样他们才能有勇气去测试并公开全部的bug.
(10:34:23 PM) Michael: 你觉得合理么…
(10:34:30 PM) Stephen H. Wang: 似乎两者都合理。
(10:34:40 PM) Michael: 开发人员跟测试人员彼此仇恨就对来两者都好吗
(10:34:40 PM) Stephen H. Wang: 所以我最近一直在迷惘着。
(10:34:50 PM) Michael: follow your heart…
(10:35:17 PM) Stephen H. Wang: 而那个做法正是规避仇恨的方法。如果归于同一团队(非Agile模式下),测试人员真的没有勇气提出Bug。
(10:35:37 PM) Stephen H. Wang: 所以,我想Agile肯定有另外的理由,使得测试人员勇于提出自己的见解。
(10:35:42 PM) Michael: 勇气是敏捷基本价值观之一
(10:35:54 PM) Michael: 你不提bug, 是对开发活动的不贡献
(10:36:03 PM) Michael: 这只是个假设
(10:36:30 PM) Michael: 事实上,敏捷团队里面,测试人员的成长比普通测试团队里面的成长更快
(10:36:39 PM) Michael: 而且开发人员的测试观念也成长更快
(10:36:40 PM) Stephen H. Wang: 比如:刚才提到的千行代码缺陷率,这个可能才是真正的引起开发和测试之间有矛盾的地方? – 因为Bug率直接影响了对开发人员的评价。
(10:36:58 PM) Michael: 其实从根本上说,就是个绩效问题
(10:37:09 PM) Michael: 按bug数量基本上是没戏的
(10:37:47 PM) Stephen H. Wang: 可否这么理解,开发团队和测试团队在一起,组成一个新的Agile团队,他们在一起,为了一个共同的目标而奋斗,一荣俱荣,一损俱损,才是能够让测试人员勇于提出Bug的根本原因?
(10:37:54 PM) Michael: 程序员产生代码行,测试人员消费代码行并提出bug, 这个貌似完美的生态系统粗鲁的无视软件开发完整性的客观规律
(10:38:00 PM) Michael: 没错
(10:38:13 PM) Michael: 整个团队只有一个目标:产生高质量的交付
(10:38:45 PM) Michael: 在此目标之下,以尊重 交流 反馈 勇气 简单为基本做事价值观和原则
(10:38:55 PM) Stephen H. Wang: okay,Quality和Delivery你都提到了,那么Cost呢,前两天听到一个老实说,敏捷是高成本的。我就更疑惑了。…
(10:39:06 PM) Michael: 谁说的…
(10:39:12 PM) Michael: 胡扯
(10:39:17 PM) Stephen H. Wang: 一个搞ISO/CMMI的老师…
(10:39:30 PM) Stephen H. Wang: 来跟我们讲如何进行软件的QA活动和Measure活动。
(10:39:50 PM) Michael: 靠,这样的话,如果没有充分的根据,会被喷的不像样子
(10:40:21 PM) Stephen H. Wang: 是啊,可是听课的大部分都是CMMI的忠实粉丝,所以我就没有多言,但是心里却很鄙视她的说法。
(10:40:53 PM) Michael: 你读过精益相关的书吧
(10:41:08 PM) Stephen H. Wang: 没有读过,只是听过TW的讲座。初步了解一点。
(10:41:24 PM) Stephen H. Wang: 知道这是起源于Toyota的一个生产汽车的思想。
(10:41:27 PM) Michael: 精益里面的核心观念:价值 价值流 流动 拉动 尽善尽美 这个你应该略有所知…
(10:42:32 PM) Michael: 核心思想是分析所有经营活动,找出其中的价值,找出价值流及其浪费点,使其流动,通过前端市场拉动,并让整个过程尽善尽美
(10:43:17 PM) Michael: 例如,软件开发中有价值的活动有 需求分析,架构设计,编码,测试,部署,客户演示等
(10:43:32 PM) Michael: 价值流基本与上述过程类似
(10:44:08 PM) Michael: 然而,这个价值流存在巨大的浪费:从需求分析到最终客户演示,在CMMI中需要几个月甚至一年的时间
(10:44:12 PM) Michael: 这是流不动的
(10:44:42 PM) Michael: 而敏捷里面,消除了漫长的等待而状态转换
(10:45:01 PM) Michael: 在一个短短的2周迭代开发中,上述所有活动都有一个完整的闭环
(10:45:23 PM) Michael: 客户可以在最多2周的时间里,得到一个完整可用的应用
(10:45:34 PM) Stephen H. Wang: 嗯,看来还是这个说法,就是非常多的瀑布迭代组成了一个敏捷整体。
(10:45:59 PM) Michael: 嗯
(10:46:01 PM) Stephen H. Wang: 那我有个故事要跟你分享一下。
(10:46:11 PM) Stephen H. Wang: 我去年到今年做了一个项目。
(10:46:24 PM) Stephen H. Wang: B/S的,java +jsp + DB2 + websphere
(10:46:33 PM) Stephen H. Wang: 采用了CMMI的开发方式。
(10:46:55 PM) Stephen H. Wang: 大约有100个左右的story(不知道你们的story是以什么级别划分的)
(10:47:10 PM) Stephen H. Wang: 最终制作了130多个页面。
(10:47:44 PM) Stephen H. Wang: 我的做法是这样的,先进行需求分析,彻底的分析,将每个细节都分析透彻,没有遗漏,没有二义性,没有错误….
(10:47:51 PM) Stephen H. Wang: 然后,组织开发团队进行开发。
(10:48:13 PM) Michael: 嗯…
(10:48:17 PM) Stephen H. Wang: 在我们公司几近变态的测试下,1次性通过测试。(这是以往没有的经历)
(10:48:33 PM) Stephen H. Wang: 我想知道,如果用敏捷的话,这么大规模的系统,你们大概需要多少个人月。
(10:49:03 PM) Stephen H. Wang: 我现在已经收到客户的需求变更要求。 – 我知道,如果用敏捷,那么这些要求将会在中间出现。而不是现在。
(10:49:22 PM) Michael: 我们不会这样估计。
(10:49:36 PM) Stephen H. Wang: 是的,我了解,这正是不同之处。
(10:49:59 PM) Michael: 我们会每个迭代给出一个交付版本,一般每两周给客户看一次
(10:50:05 PM) Michael: 让客户决定优先级
(10:50:25 PM) Michael: 当然在这之前,有一个大约2-4周的需求全面分析和优先级排序阶段
(10:51:13 PM) Stephen H. Wang: 我的需求分析投入了4个人,2个月。也制作了Demo和上千页的文档。我跟客户用了3整天,确认了所有细节。
(10:51:34 PM) Stephen H. Wang: 然后客户签字,这个就作为开发的依据 (当然,我这次的做法和以前比已经改革了许多)
(10:52:40 PM) Stephen H. Wang: 状态图,流程图,ER图….这些都是辅助我对需求进行分析的工具
(10:53:07 PM) Stephen H. Wang: Demo做的和成品都差不多了。就是数据是假的。
(10:53:38 PM) Michael: 这种做法叫lofi-prototype
(10:53:50 PM) Michael: 俗称原型法
(10:53:53 PM) Michael: 也不错
(10:54:13 PM) Stephen H. Wang: 正是如此,惭愧的说一句,我是在本公司第一个这么做的人。
(10:54:33 PM) Stephen H. Wang: 之前的系统更糟糕。质量不如意 – 这也是我一直探究如何解决的问题。
(10:54:51 PM) Stephen H. Wang: 举例来说,你们的测试人员会不会对左对齐右对齐,进行定义?
(10:55:31 PM) Stephen H. Wang: 就如这MSN的IM框,显示的log一定是左对齐的。
(10:55:31 PM) Michael: …啥叫左对齐?
(10:55:39 PM) Michael: 有啥用呢?
(10:55:49 PM) Stephen H. Wang: 并且,换行的时候必须根据窗口的大小自动调整。
(10:55:57 PM) Stephen H. Wang: 这是Usability的一项。
(10:56:10 PM) Michael: 如果客户需要,我们就做
(10:56:13 PM) Stephen H. Wang: 试想一下,如果Log都是右对齐的,我们看起来会是什么效果?
(10:56:28 PM) Stephen H. Wang: 可是如果客户没提呢?你们会主动的询问客户吗?
(10:56:33 PM) Michael: 当然会了
(10:56:43 PM) Michael: 但…这个左对齐是常识吧
(10:56:50 PM) Michael: 我们不做决定
(10:57:04 PM) Stephen H. Wang: 呵呵,这个不是常识……这个是技术。
(10:57:26 PM) Michael: 通过每个迭代的客户showcase, 让他们来提。然后统一放到剩下的,没有开发完的需求中,进行估计和优先级排序
(10:57:54 PM) Stephen H. Wang: 金额怎么对齐?日期怎么对齐?页面太宽了,HTML不能对每一列都设置固定宽度,如果这么做,等于对所有的都没有设置。
(10:58:37 PM) Stephen H. Wang: 所以,需要空一列不设置宽度。这样才能够在窗口缩放的时候自动适应大小。并且,可以适应多种分辨率,从1024*768 ~ 1280*1024都可以
(10:58:55 PM) Michael: 。。。你想说啥
(10:59:16 PM) Stephen H. Wang: 那么,空出的那一列,基本上都是显示内容最多的那列,okay,我们通常会对齐进行截断字符串,并且以tooltip的形式显示出来。
(10:59:24 PM) Stephen H. Wang: 那么截多长呢?
(10:59:29 PM) Stephen H. Wang: 这个也要问客户吗?
(11:00:15 PM) Stephen H. Wang: 我想,客户不会像我这么细,连这个问题都一一说明的。
(11:00:49 PM) Stephen H. Wang: 所以,我们的做法是,主动提案。这个地方左对齐,那个地方右对齐….并且有一套我们自己的标准(这是CMMI的常见词),然后经客户认可就行。
(11:01:41 PM) Michael: 核心思想是一样的,就是多与客户交流
(11:02:07 PM) Stephen H. Wang: 可是,CMMI的缺点也在于此。
(11:02:27 PM) Stephen H. Wang: 就是做事的是人,虽然有标准,但是遵守的程度却无从判定。
(11:02:40 PM) Stephen H. Wang: 于是,就出现了千奇百怪的现象。
(11:02:44 PM) Michael: 哈哈
(11:02:46 PM) Michael: 没错
(11:02:54 PM) Michael: 这边的客户提了一个观点
(11:03:27 PM) Michael: CMM的规矩多,但大多数都是用来破坏的;Agile的纪律少,但是要求绝对遵循的
(11:03:41 PM) Stephen H. Wang: 比如:那个截断字符串,有人认为应该写一个java函数,然后,讲显示的内容截成20个字符固定长度,结果中英文不一样长……
(11:04:11 PM) Stephen H. Wang: 而CMM中不会规定,截断字符串应该怎么截断。编码规范当中也没有写,于是就有了余地。
(11:04:26 PM) Michael: 呵呵
(11:04:48 PM) Stephen H. Wang: 然而这样的程序交到客户那里,客户说不合格。
(11:05:43 PM) Stephen H. Wang: 而Agile用的都是高手吧?
(11:05:58 PM) Stephen H. Wang: 所以,不会出现这样的问题也会出现错误的情况吧?
(11:08:13 PM) Stephen H. Wang: 我最近在写一套新的系统,准备采用Agile的方式,(可惜,还是我一个人,扮演n个角色)。
(11:09:23 PM) Michael: Agile对人的要求确实很高
(11:09:36 PM) Michael: 不仅仅是技术层面
(11:09:46 PM) Michael: 态度和人品也有相对较高的要求
(11:10:36 PM) Stephen H. Wang: 我觉得知识范畴需要的太广了。
(11:11:20 PM) Stephen H. Wang: 光页面布局就非常多的知识。
(11:11:35 PM) Stephen H. Wang: 你看过那本书没 《Don’t meke me think》
(11:11:51 PM) Michael: 看过
(11:12:01 PM) Michael: 这类的书多了
(11:12:06 PM) Michael: About Face 2.0也不错
(11:12:29 PM) Stephen H. Wang: 可是我所看过的软件,大多数都是左右结构,上下结构,或者上左右结构,左上下结构….
……

文化的风化与侵蚀

Sunday, September 20th, 2009

常常听说,一个团队的文化就是团队负责人的文化; 一个公司的文化就是公司领导人的文化。究其原因,就是因为领导人的喜好和评判标准极大的影响着团队成员的荣誉感与价值观。这些观念和标准是在长期的工作和合作工程中不断碰撞不断沉淀下来最终得到的一个利益博弈的结果,表现出来的形式就是形式各异的企业文化,或者公司文化。

企业文化具备强大的同化能力。它是超越规章制度之外的一个做事方式、价值观的基本指导。许多公司的新员工培训采取的各种各样的方式,无不是想尽快让新员工适应这个公司这个大团体,与其他成员一起,向同一个方向使力。在《额尔古纳河右岸》中,年迈老人采用眩晕、饥饿、清洗肠胃等方法来训练原本桀骜不驯的老鹰称为帮手的过程,与这种文化上的趋同手段并无本质不同。

当在一个环境中已经具备一些文化认同的人,到了另外一个环境,有哪些行为会使得原本坚信的东西觉得恍惚?哪些事情会导致原本坚定的信仰开始动摇?哪些则会干脆彻底的重建原有的行事方式?

首先是寂寞。在东西方的神话中这类的例子屡试不爽。比如西游记里面各式各样的妖怪,大多是寂寞的发疯,逐渐忘记了规矩,成精之后下凡找点乐子。甚至是魔兽世界中众神的代表,泰坦萨格拉斯,在长达数万年的孤身与恶魔斗争中的,逐渐丧失了对正义的信仰,结果导向了恶魔的一方,称为整个世界的敌人。电影《无间道》中的卧底,长时间在正义与邪恶之间游走,最终也恍惚的分不清正义与邪恶。将一个人或者一个团队扔到孤立的地步是使其受到侵蚀的最简单的方式。有些人意志坚定,能撑较长的时间,有些人意志薄弱或者干脆正处于文化成型期,此时的寂寞很有可能直接导致文化上的风化、孤立与重塑。

随之而来的是诱惑。西方的哲学体系里面,人是有原罪的——例如贪婪、背叛。当有足够多的诱惑来临的时候,诱惑带来的好处、守护带来的艰辛,使得人的原罪发挥作用,原本坚信的东西开始逐渐动摇。

在实际的工作中,这些首先能看到的好处就是荣耀的来源。例如,在公司里面,人人崇尚敏捷,尊重事实,注重实效。做到这些能够得到同事、领导的赞赏。而当进行长期咨询工作的时候,发现客户对面面俱到的计划、华丽的图表等表面的东西更加赞赏。长期下去,工作的中心出现偏移,获得认可与赞赏的诱惑使得行事方式发生变化,长期下去,当这些行事方式成为思维习惯,带来的文化的变迁使得返回到原来的工作岗位时觉得陌生。

与荣耀相对的是惩罚。我们都是在正确与错误的事情中不断获得反馈和成长。一旦得到某些惩罚,很有可能对心灵造成很长时间的创伤,并且在长时间内处于敏感戒备状态,无论是新的环境还是旧的环境,都处于不信任状态。例如,派一个来公司不久的人,接受了公司文化培训,去处理客户现场问题,结果被客户大骂一顿。这位新员工可能在很长时间内萎靡不振,并且对公司和客户处于非常不信任的心理状态。

趋同心理则是最后一个效果最缓慢的因素,它的表现最快但是影响最慢。每当我们到一个新环境我们总想表现的跟当地的人一样,以获得最大程度的认同——起码从外表上——那些妖精都知道变成人形呢——如果客户西装领带,我们也不好短袖T恤;如果客户习惯在每个周五举办酒会,我们也乐于参与,等等。这些都是外观上的,但长时间的趋同很容易让人从外观上和内心上逐渐妥协并转换——就像中药,虽然见效慢,但终究是见效的,而且有可能是最能根治的。

< 请谨慎理解这篇文章——我没有在这片文章中给出任何防御性或者建设性的建议,甚至你都有可能无法看出我的立场。文化的变迁很大程度上是主观的,根据原因不同,我所经历过的文化沙漠的形成大多数组织领导在既得利益与文化建设之间的平衡不足造成。>