本文最初发表在 iiSM.org 网站,经原作者 Gandalf Hudlow 授权,InfoQ 中文站翻译并分享 。
许多组织都向新软件项目施加压力,要求它们“完成”,因为整个组织都面临着来自高层的压力,必须在高层任意划定的截止日期前完成 。副总裁、项目经理、产品经理的奖金和聘用,都是要看他们在截止日期之前交付软件的能力如何而定 。这一错误做法带来的结果就是,部署到客户手中的软件版本 1.0,充满了混乱 。这种模式已经重复了一次又一次,以至于消费者都会说“用软件别用版本 1.0 的!”、“还是等等补丁包再说吧!”
这些组织没有意识到的是,所有的软件变更都可以划分成三个组成部分: 价值、填充和混乱 。混乱会破坏价值,而填充只是没人想要的功能 。当对代码施加截止日期的压力时,消除混乱所需的工作首先会被砍掉 。混乱会破坏价值 。不信?请你扪心自问,上一次你手机上的一款新应用出现混乱时,你做了什么 。那款你卸载后就忘掉的应用,就是刚刚被混乱破坏的新价值尝试 。
伦敦希斯路机场(Heathrow Airport)吸取了这个教训 。当时他们大张旗鼓地举办 T5 候机楼启用仪式时,连女王都莅临了!随着办理登记手续的延误,混乱的局面开始出现了 。接着出现行李堆积和传动带堵塞的情况,局面更加混乱了 。到了下午,英国航空(British Airways) 已经完全放弃托运行李的努力,乘客们被强行推上已经晚点的航班,并含糊其辞地承诺他们的行李将会一起抵达目的地 。新闻报道里充斥着堆积如山的行李照片 。没有人感到高兴,尤其是女王 。
由时间驱动的组织造成的 T5 候机楼混乱就是一个典型的灾难 。上面下达的命令很清楚: 只要完成它就行 !要避开所有不利于按期交付的一切阻碍:所有的建议、所有的专业知识、所有的发现努力!
下面是由于时间压力而导致交付延迟的各种混乱的总结 。
- 负载和性能问题 :一个需要每秒处理 100 个事务的系统,如果施加压力过大,则会将性能限制在每秒少于 2 个事务 。
- 间歇性问题 :人工测试实验室中出现的低频率问题在生产负载下成为操作上的噩梦 。
- 竞争危害 :许多公司使用的负载测试技术并不能在软件上产生 典型负载,因此大多数竞争危害都需要在生产环境中才能发现 。
- 内存泄漏 :在生产负载下,缓慢的内存泄漏会造成停机,因此需要采取一些变通措施,例如定期重新启动等 。
- 数据损坏 :数据损坏通常表现为低频率的中断或出现奇怪的值,而在生产负载下则变成高频率的数据损坏 。
- 未处理的错误 :时间压力越大,代码库的错误处理就越少 。我们这些有经验的人都知道,要正确处理错误情况就需要进行大量的工作,而这些恰恰正是时间压力较大的组织没有列入日程表中的工作 。
汽车失控的加速车辆在现场加速失控 。发生 8 起死亡事故 。其中一起撞车事故,被发现有长达 100 米的紧急刹车的痕迹,一直通往混凝土护栏 。怀疑可能是由于油门被卡所致 。
迫于时间压力下完成的代码
char bluetoothId[30]; int acceleratorAngle = 0; void processAccelerator() {if (acceleratorAngle > 0) {engine.throttle(acceleratorAngle);} } void processBlueToothOnline(char *deviceId) {strcpy(bluetoothId, deviceId); }
精心编写的代码//Fixed issue with blue tooth //id overflowing and corrupting //acceleratorAngle... //QA says wheeeeee! char bluetoothId[30]; int acceleratorHash; int acceleratorAngle = 0; void processAccelerator() { if (!validateHash( acceleratorHash, acceleratorAngle)) { report_critical(); abort(); return; } if (acceleratorAngle > 0) { engine.throttle( acceleratorAngle); } } void processBlueToothOnline( char *deviceId) { memset(bluetoothId, 0, sizeof(bluetoothId)); strncpy(bluetoothId, deviceId, sizeof(bluetoothId)-1); }
评点 :你是否曾经面临过这样的压力,被告知 只需完成即可 ?你交付的代码真的完成了吗?催促工程师按截止日期交付的组织往往很愿意按期交付 。这是因为他们的重点在于按期交付,而不是 一切就绪后 再发布有价值的、没有混乱的产品 。控制汽油流向汽车发动机的代码需要通过各种方式进行反复锤炼,以确保永不失效 。而时间驱动型的组织很少会加上这样的要求:“锤炼关键代码,找到破坏价值的缺陷!”在这种情况下,唯一的可取之处是,值得信赖的工程师在发现混乱时,往往会做一次性的尝试,而不是被迫在周五之前进行检查 。
推荐阅读
- 喝茶胃疼应该怎么办,胃反酸能喝茶吗
- 历史上的太子都是怎么死的 太子谋反有成功的吗
- 喝红薏米芡实茶的反应,红豆薏米芡实茶的禁忌
- java反序列化——XMLDecoder反序列化漏洞
- 秦国统一六国齐国真的没有反抗吗? 齐国向秦国投降
- 李鸿章为什么不反清朝 光绪和李鸿章的关系
- 刘邦怀疑韩信谋反捕捉韩信后 韩信当时反叛刘邦可以得天下吗
- 平南候与狄仁杰谁大 狄仁杰谋反
- 胆汁反流性胃炎治疗
- 喝了冬瓜荷叶茶的反应,喝荷叶茶有没有副作用呢