旁观者效应”是如何毁掉我们的代码的

http://www.aqee.net/how-the-bystander-effect-is-ruining-your-code/ 1964年,纽约昆斯区,28岁的Kitty Genovese在经受了长达35分钟的性侵犯后最终被谋杀致死,共有38个本地区人性正常的居民经过,但没有一人提供帮助。

旁观者效应

这个故事例证了‘旁观者效应’中的一个不幸的心理特:援助的几率与旁观者人数成反比。旁观者数量越多,他们当中任何一人进行援助的可能性越低。

作为程序员,我们几乎每天都能看到“旁观者效应”在起作用。如果你的代码库已经有了相当的体积和年月,你很可能知道它们会存在一些问题,比如缺乏封装或模块分离,类继承结构过于复杂,方法太长——读起来就像是Stephen King最近写的小说,未经测试或无法通过测试等等——但没人想去做点什么。

“旁观者效应”的问题根源

问题的根源是缺乏物主(所有者)身份。我们总是在假设别人会来修补这些问题。如果这些问题出现在我们的代码库中,我们很可能对之无动于衷,因为“这事儿跟我无关”。程序员对这样的问题通常的反应:这是别的程序员造成的问题,我才不管呢。这种“这事儿跟我无关”的态度很流行。

可是,这事儿事实上跟你有关。

外差因素(Externalities)的负面效应

经济学上有个词叫做“外差因素(Externalities)”,它形象的描绘了这样一个情况:A人从某件事情上获利,但B人却要为此买单或部分的买单。你作为B人,免不了会遇到要去修改A人所写的恐怖的类代码。你以为这个类应该是经过精心设计的,你以为它们都有相应的功能测试代码。但事实上,你为了一个小小的修改做了大量的工作。你的老板会奇怪,这样一个简单的任务为什么需要这么多的时间。别人犯下的愚蠢错误最终却要你来擦屁股——这就是“外差因素(Externalities)”的负面效应。

培养物主身份

纠正“外差因素“的负面作用的方法很简单:接受问题的所有者身份——不论问题是不是由你造成的。为什么要在意这个问题是谁的责任呢?造成这些问题的人很可能早就不知去向了。还在等待他们来修改这些问题吗?你永远都等不到。我们应该这样去想:除了我,没有人会来修改这些代码。

一旦你这样做了,一种所有者的身份就开始出现了。当你花了很大的功夫修改好了这些问题,而问题再次出现时,这些问题自然归你所有了,因为你为它们付出了汗水。

这样一来,我们就会开始”义务“的改进我们的代码库。你打开一段有问题的代码,你忧心忡忡的研究它,你忧心忡忡的心情很快云消雾散了,因为你发现有另外一个”圣人“已经把它修复了——多么美好的世界呀!这样的事情之所以能发生,是因为每个人都找到了自己的责任感。这是最美好的时刻。

行动起来!马上!

感觉如何?在接下来的一周里找一天时间,翻出一段代码,就当是走错了路,拐进了一条本不想走到胡同,修改一下。提交你的修改,并附加这样的注释:

/*
JKH 09/12/2012 - 重构了有问题的事务处理。如果这是你喜欢的,请将此做法传递!
*/

[英文原文:How the Bystander Effect is Ruining Your Code ]

时间: 2024-10-14 05:40:11

旁观者效应”是如何毁掉我们的代码的的相关文章

错误和问题解决的成本

问题描写叙述 错误 数据收集 根本原因 版本号   组件:数据修复           在一个实际成本组织中,(平均,先进先出,后进先出) 一个或更 多的下面情况可能发生: 1.导航到物料成本历史表单上的数量信息,与现有量表单的数量不匹配的记录 2. 一些物料前期已计成本的数量与前面的事务处理历史表单的数量不匹配 3. 全部的库存值报表与事务处理值报表不匹配 4. 存货层次成本更新表单的总数量与现有量数量表单不匹配(只在先进先出/后进先出) 5.这些症状的不论什么一个意味着 MMT-CQL不匹配

代码整洁之道(一)理论篇

自上世纪末,有关仅以测试和代码驱动设计的概念一去不复返.相对于任何宏伟的愿景,对于细节的关注甚至是更为关键的专业性基础. 当然,开发人员通过小型的实践获得可用于大型实践的技能和信用度. 其次,宏大的愿景中最细小的部分没有把握好,都会将整个大局的魅力毁灭殆尽. 这就是整洁代码之所系.神在细节之中 软件的生命周期= 20%生产 + 80%维护 即便是汽车行业里,大量的工作也并不是在于生产而在于维护或者避免维护.对于软件而言,百分之八十或者更多的工作量集中在我们美其名曰的“维护”的事情上:其实就是修修

(Android第一行代码实验一)活动的最佳实践

活动的最佳实践    1.知晓当前是在哪一个活动         这个技巧将教会你,如何根据程序当前的界面就能判断出这是哪一个活动.  首先需要新建一个 BaseActivity 继承自 Activity,然后在 BaseActivity中重写 onCreate()方法.         public class BaseActivity extends Activity {                @Override              protected void onCreat

《梦断代码》第4-5章阅读笔记

前台与人对话,后台与比特对话,言简意赅.创建还是复用?每个软件迟早都会到达这个岔路口.的确,我们不也是这样,复用固然便利简单,但能否完全适合自己现在的编程环境仍是一个未知数. 而创建虽然费时费力但无疑是针对自己的状况,两者各有优劣.向往未来那种程序可由复用的部件组成,软件部件将在全球范围内提供,那样我们或许会告别这痛苦的编程过程了吧,只去享受那成功的喜悦.软件界那太多势不两立的标准,或许是阻碍我们复用代码的一大难题吧.“程序员总以创作为荣,叫他们拾人牙慧,无异于佛其逆鳞.”的确,原创固然很棒,但

如何写出无法维护的代码

如何写出无法维护的代码 酷壳里有很多我觉得很不错的文章,但是访问量最大的却是那篇<6个变态的Hello World>,和它能在本站右边栏“全站热门”中出现的还有“如何加密源代码”,以及编程真难啊等这样的文章.可见本站的读者们的偏好,我也相信你们都是“身怀绝技”的程序员.所以,今天给大家推荐这篇文章,相信一定能触动大家的兴奋点. 这篇文章的原文在这里(http://mindprod.com/jgloss/unmain.html),我看完后我想说—— 什么叫“创造力”,创造力就是——就算是要干一件

codecombat之边远地区的森林12-22关及地牢39关代码分享

codecombat中国游戏网址: http://www.codecombat.cn/ 所有代码为javascript代码分享 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 12.兽人营地 // 如果有敌人,则攻击之 // 如果没有敌人,则攻击财宝箱 loop { // 使用if/else语句 var enemy = this.findNearestEnemy(); if (enemy) { this.attack(enemy); } else { this.atta

php代码之要点分析一

一.post与get请求方式的区别: 1.请求形式不同:get请求是将数据俯角在URL结尾发送给服务器,post方式是以单独的消息形式,在后台发送给服务器. 2.发送长度不同:get请求最大数据量为2k,post请求理论上无限制,可以在配置文件中设置其大小. 3.安全度:因为get方式数据是附加在url后发送给服务器,因此,get的安全性要低. 4.运用场景:get适用于数据简单,安全性要求不高的时候使用,否则,使用post. 二.常量的声明和使用: define('PAI1', 3.1415)

毁掉自己的汇编程序

下午的上机课,有位同学写的程序死了.她百思不得其解. 我看了几遍程序,没有发现问题. 多次观察后,发现程序修改数据时,由于循环次数错误地设多了,以致于改到了代码段--代码段的指令于是被当作数据改掉了,而此处的数据,当然它仍然还要被当作指令执行,恰好对应了wait指令!于是,程序进入了等待-- 那程序到底有没有问题?我看的程序没有问题,但运行的,却是老版本的.exe.开始时,源程序是错误的,她修改后,却没有再编译.接连!唉,这样的错也能犯?难为我当教师的了.麻子不叫麻子,叫什么来着? 按下这个不表

阅读郭林《第一行代码》的笔记——第2章 先从看得到的入手,探究活动

一.活动是什么,活动的基本用法 活动(Activity)是最容易吸引到用户的地方了,它是一种可以包含用户界面的组件,主要用于和用户进行交互.一个应用程序中可以包含零个或多个活动,但不包含任何活动的应用程序很少见,谁也不想让自己的应用永远无法被用户看到吧? Android程序的设计讲究逻辑和视图分离,最好每一个活动都能对应一个布局,布局就是用来显示界面内容的. 创建和加载布局 @Override protected void onCreate(Bundle savedInstanceState)