“不可能啊”、“一定是服务器的原因”、“我的程序不应该有问题啊”,这些年工作听到的最多的就是这些话了,程序员都是比较自信的,总是觉得自己的程序肯定没问题。
程序就是程序员的自我延伸,花了几个小时甚至几天时间构建的结果,最后它以“正确”的形象印入你的意识里,你自然不希望别人找出什么纰漏,即便找出什么纰漏了,自己也意识到了“不足”,感情上很难接受,所以大部分人都会习惯性的“辩护”,甚至试图找一些迂回手段证明自己是对的。实际上很多时候,只要我们稍微回归一下,跳出自我守护的那一亩田地,也许我门就会很轻易的发现:我们的确错了。
心理学上有一个学术名词叫做“认知失调”,所谓认知失调就是指在一个人的认知系统里即将出现新的认知与就旧认知(旧的信念,自我建立的理论)产生冲突引起的心理上的不适,为了调节这种不适感,一方面为旧的认知辩护,另一方面希望在新的认知和旧的认知上找到共存的平衡。例如,你告诉吸烟者吸烟有害健康,应该要戒烟,吸烟者就会出现认知失调,但是他们很快就会从中解脱出来,因为他们会以“吸烟能减轻压力,令他们轻松”的理由来说服自己。
认知失调是一种很常见的心理现象。在我们设计到实现我们的程序的过程中,我们在心理上已经慢慢的建立了自己对程序的相信。再到代码审查阶段或测试阶段,总会有人指出其中不完美之处,于是出现了认知失调,所以我们会习惯性的“辩护”。一个开发团队中,要形成良好的氛围,首先要克服认知失调现象,提高程序员的认知是比较重要的。
我们的前辈们很早就意识到这个问题了,并且有些程序开发组已经克服了这种认知的局限。远在计算机刚刚成为可能之初,我们的前辈冯·诺依曼很早就意识到了自己在检查自己的工作方面的能力的确不足,他或许是第一位能够认识到这一点的程序员。而在他的朋友中,有人回忆,冯·诺依曼总是很别人说他自己是一名蹩足的程序员,并且总是不厌其烦的请人帮他读程序,希望能发现一些错误和纰漏。在今天我们看来,冯·诺依曼无疑是一个天才,就是这样一位天才的程序员都能有会不足之处,我们又有什么不能面对自己的错误呢?
再来转述一个故事。比尔是早期空间跟踪系统的一名成员,他负责写一个模拟器,对整个网络中的空间跟踪站以及实时输入进行模拟,这个模拟器的核心是一个非常紧凑的循环。实际上,它只有13条指令。比尔研究了很多个小时以后,觉得自己终于有些信心了,但是他还是希望找到一些要求比较苛刻的人来帮他检查程序。
比尔找到了马里琳,她愿意细读他的程序,他也读她的程序,这是他们工作组里再平常不过的事了,这种相互批评的方式能让当事人不会感到自己在接受别人的批评。而比尔认为自己这方面训练有素,没必要通过这种交换来保护自己的自尊心。在他的程序开发价值观里,那种隐秘的、保守的开发方式很不好,只有开放的、分享的开发方式是好的。在他的程序中可能发现错误是人人可见的简单事实,暴露这些错误,不过是为了将来更好的改进,所以并非是对他个人的攻击。
在这个例子中,比尔经历了他程序开发生涯中最“糟糕”的一天。经历反复的检查,马里琳发现了很多错误,随着错误一个一个的被发现,比尔反而变得越来越开心。要是比尔和我们大多数程序员一样,肯定是开始在为自己辩解了。最后,在他们的一次学术会议上,他向全世界公布了一个惊为天人的事实:13行代码中,马里琳成功发现了17个错误。他认定那天并非他写程序的“良辰吉日”,在那天剩下的时间里,他干脆把程序放到一边,然后向周围的人讲述这一小插曲中的每一个令人捧腹的细节。
同时,马里琳并没有觉的自己发现这么多错误而窃喜,而是清醒的认识到:她发现17个错误,那么是不是还有可能有更多的错误。她经过长时间的修改之后,和比尔一样,同样找来另一位阅读者。那天下班前,一边是比尔继续向周围同事讲述这件快事,另一边是马里琳和其他人一起又发现了3个错误。
故事的最后,当这段程序加载到计算机后,哪怕是经历任何“魔鬼似的”测试也没有发现任何错误。实际上,这个模拟器已经被至少十个以上的计算机中心使用,至少九年之内没有发现其他错误。对于每个发现的错误,比尔并不认为是对自己自尊的伤害,事实上,这种自尊恰恰体现了一个人的愚蠢,否则试想一下这个故事的结局会是怎样?
两个故事说明认知的重要,最后总结几条观点:
1、每个程序员的会出现认知失调的现象,应该正常对待。
2、再牛逼的人都会有自己的认知盲区,需要别人去发现。
3、理性对待别人发现的错误。