在软件产品的不同阶段,总免不了一些临时的方案。有时一个严重的BUG分分钟要人命,鬼知道要多久才找得到根源。在入口加个检查好了,如果是某种类型的输入,就做个特殊处理,把线上问题解决了再说。有时新功能为了兼容老版本,好吧,在标准协议上加个特殊的命令字,没有这命令字就怎么怎么做。
临时方案就像在院子栅栏上开个小小的口子。过一阵子,你的同事,或者你自己,看到有现成的机制,也依样画葫芦,照着做一个。久而久之,小口子变成了大窟窿。年深日久,大大小小的窟窿,让原来优雅的设计早已无影无踪。
分析这期间人们的心理很有意思。当你想到一个很聪明的技巧,可以用很小的改动解决一个急迫的问题时,无论同事还是上司都会给你点赞。过了一阵儿,这事儿就给忘光光了。后来者看到这段代码,脑袋里大大的What the fuck。想象某个大马路上的井盖没了,路过的好心人拿块破木板给遮起来,以后路过的行人司机,绝少会感激这个举动,只会骂怎么还没修好,一经过就哐铛哐铛地响。团队里每个人都想,这代码太垃圾了,一定要找时间好好重构一下。直到离开团队,或者产品退役那一天,那代码还在那里带病跑着,或者压根没跑过。
这事也不只是在代码里存在。当年人们早早地发现了IP地址短缺的问题,嗖地一声整体迁移到IPv6已经不可能,于是NAT(网络地址转换)作为临时方案就出来了。多年之后,NAT变成了互联网运行的关键一部分。放眼看看,哪个家庭、公司、学校的网络不是私有IP地址段了,经常还是层层NAT,你家里是192.168,登录到宽带猫上面一看,ISP给的地址又是10.0打头。
现在风头正劲的JavaScript,当初创造出来,不过就是拿来做个跑马灯之类的装饰,何曾想过要承担现在的重任?可这一路从XMLHttpRequest到AJAX再往后CORS、WebSocket之类,竟全是为了解决这个那个的问题。
仔细想想咱这行当还是好的。咱们都把修改产品代码叫打补丁。试想一下,一件阿玛尼西服打了成千上万个补丁后是啥样子?而流行的软件,哪个不是补丁摞补丁?摞得多了,就把整块去掉,换上大的补丁。就这样从不知名的黄口小软件,慢慢变成支撑这个世界运行的一部分。
当你开始创造一个软件的时候,潘多拉的盒子同时也就打开了。BUG、需求变化、安全、可靠性、性能、可扩展性……各种各样的问题都从那里飞出来,只有完美软件的希望留在盒底。人类世界自古如此,软件也是。