Teaser Image

mindwind

十日画一水,五日画一石




「人会过敏,程序亦然。」

上个周末在家看了集《House MD》,一个手上出现红色疱疹的病人来到House医生的医院。 House医生根据病症现象诊断为对某种肥皂产生了过敏,然后开了1片抗过敏药,疱疹症状减轻。 但一会儿后开始出现呼吸困难并发哮喘,House医生立刻注射了1cc肾上腺素后病人呼吸开始平稳。 但不久又出现心动过速,很快病人心跳停止,经过一番抢救后,最后又回到原点,手上的红色疱疹开始在全身出现。

这个剧情突然就让我联想到曾经程序中出现的一系列连锁问题。 我们在本地开发完成了程序,进行了各种测试感觉完全没问题了,再将它转移到另外一个环境给其他人使用时,有时总会出现些奇怪的问题。 进程启动后莫名的消失、运行过程中抛出从未见过的异常,特定情形下的随机错误等等。 现在我把这些问题统统归类为——程序过敏反应。 过敏在医学上的解释是:“有机体将正常无害的物质误认为是有害的东西,产生抗体”。 程序的过敏反应则是:“程序将潜在存在问题的环境当作正常处理,从而产生了异常”。 而潜在的环境问题通常就成了程序的“过敏原”。

人体产生过敏反应的原因十分复杂,医生除了给你开抗过敏药来缓解症状外,通常最佳建议都是让你远离过敏原,无法从根本上改变你的身体让其不再过敏。 而程序的过敏反应从理论上来说都是可以避免的,但现实是有些理论就是无法被实践的。 一个系统是依赖大量由不同程序员创造的代码来运行的,有些来自第三方,有些是自己开发的,那么就不可能有一个人能完完全全明白整个系统的全部代码。 自然也就没人能识别所有代码的“过敏原”,并小心翼翼的绕过这些“过敏原”。

你不知道自己对什么过敏,直到你碰到一种东西引起你过敏。 程序世界也一样,有一种药叫抗过敏药,那么也有一种代码叫抗过敏代码。 虽然代码规范、设计模式等都是为了帮助程序员写出健壮的、易维护的程序,但解决不了程序的过敏反应。 直到你遇到程序过敏现象,并根据现象不断深入挖掘分析出过敏原,才可能开发出抗过敏代码,这里可能存在一个反复试错的迭代过程。 就像抗过敏药不能解决所有过敏症状一样,不是所有的程序过敏反应都能通过抗过敏代码来解决,如果代码解决不了只好退而求其次用文档来描述。 就像在路上遇到个大坑,第一个碰到的人如果没能力修补好至少可以立块牌,避免后面的人重蹈覆辙。

最后,我想可能有人会有兴趣想知道House医生最后又如何医治那个病人的,答案在《Doctor House》第1季第6集。