1.1 瞄准正确的目标
大多数软件是为软件开发实验室或QA部门的测试工程师设计的。其设计和构建的目的是通过类似这样的测试——“顾客的姓氏和名字都是必需的,但中间名的首字母是可选的”。这些软件的目标,能在QA部门所营造的人工环境中(而不是在现实世界的生产环境中)正常运行。
今天的软件设计类似于20世纪90年代早期的汽车设计,它们都与现实世界脱节。那些汽车仅仅在凉爽舒适的实验室中设计,模型和CAD图纸展示看起来都很绝妙。那些汽车给人完美的曲线感,在巨型风扇前闪闪发亮,在稳定气流中低鸣。在实验室这种宁静空间里,设计师所做出的设计既是那么地优雅、复杂、精巧,又是那么地脆弱、不中用,最终早早被淘汰。如今大多数的软件架构和设计,同样在干净、稳定却与现实相差甚远的环境中进行。
一辆汽车看起来很漂亮,但它在路上能够行驶的时间少于在店里陈设的时间,这种车有人要吗?当然没人要!人们想要的是专为现实世界设计的汽车,它的设计师应该知道:当汽车行驶里程超过5000千米后一般要更换机油;即使轮胎的花纹深度磨损到1.6毫米,也必须和新胎一样工作良好;当人们在车上一手拿着早餐,一手拿着手机时,有可能会猛踩刹车。
当系统通过QA测试后,是否就能拍着胸脯说系统已为进入生产环境做好了准备?仅通过QA测试并不能证明系统在未来3~10年的适用性。这个系统可能是软件中的丰田凯美瑞,可以连续正常运行数千小时,或者可能是软件中的雪佛兰Vega(该车第一次在公司试验道路上试车时,车身前部就折断了),或者是软件中的福特平托车(一款连平常追尾都易起火爆炸的汽车)。几天甚至几周的测试,不可能说明系统未来几年会怎样。
制造业的产品设计师一直在追求“可制造性设计”。这种设计产品的工程方法能够让人们以低成本和高质量的方式制造产品。而在这个时代之前,产品设计师和制造商都各自生活在自己的世界里。那些无法拧动的螺钉、容易混淆的零部件,以及本可利用现成零件进行替代的定制零件,都体现出这两个世界缺乏交流。这些设计不可避免地导致了低质量和高成本。
今天,我们正面临类似的状况。我们无法交付合格的新系统,因为我们一直在接听请求技术支持的电话,试图解决之前匆忙交付的不完善的系统所遭遇的问题。软件行业的“可制造性设计”,就是“为生产环境而设计”。我们虽然不会将设计交给制造商,但会将完成的软件交给信息技术运维部门。我们既需要设计一个个彼此独立的软件系统,也需要设计由相互依赖的系统所组成的整个生态系统,从而以低成本和高质量的方式进行运维工作。