现在谈谈程序的漏洞,业内也称之为“bug”。程序错误,即英文的Bug,也称为缺陷、臭虫,是指在软件运行中因为程序本身有错误而造成的功能不正常、死机、数据丢失、非正常中断等现象。
之前的一篇说过,人的语言能力有限,编程语言的能力亦有限。用语言不可能完全描述一个客观事物,语言能表达出来的是经过两次采样的,一次是人的感官对客观事物的采样,另一次是语言对感官采集到的信息提取和重构;然后再加一层,接收者将自然语言翻译成机器语言。也就是说经过重重转译,信息早就已经不是原来的样子了。所以开发程序的过程一定是先抽象出主干然后填充细节,首先力求表达主要信息,然后补充细节。但是问题来了,人力有限,细节是补充不完的。这些或遗留,或无能为力的细节就是bug。
现在说说程序变化的问题。变化是指功能或者功能结构上的变化。我目前编程工作的主要部分是实现新的功能,也就是在原来的东西上添加新的东西。打个比方,编程好比盖大楼,需要打地基,定主梁,分空间,现实里大楼建好后能改的就少了;但是程序是虚拟的,能改的地方很多,这带来了太多的问题。要加新功能,好改但是又难改,还是用大楼举例子,如果说只是将大楼外边换个颜色,那么很好改。但是很多时候,产品经理要的是取消掉3楼的电梯,同时不能破坏其他楼层的电梯;然后是在10层楼电梯井的地方盖一个游泳池;再是把7楼的顶梁柱换掉;并且要保证大楼的功能正常。这些还算是小改动,大的改动是将楼劈开,塞进去一个子楼,过段时间后又要将子楼拎出来,把子楼贴着主楼并加盖;再过段时间可能子楼就变成主楼了。
加功能就是这么不停的折腾还得保证楼不能倒,楼的功能依然完善,哪怕是硬塞一个子楼的时候,主楼的功能依然要完善。这其中的细节太多了,人力有尽,建的楼越复杂,产生的问题就越多。
可以说,程序的复杂性到了一定规模,就一定有bug,只是多少的问题。
总结一下,我认为产生bug有两大原因,一个是使用机器语言表述事物的能力有限,另一个是程序一直在变化,与原有结构产生了冲突。