Software archaeology - [2004-05-20]
有时我觉自己就像一个考古学家。
代码跟人一样,也会变老。而且,就像老年人一样,老代码往往非常脆弱。当代码交由LMT团队维护后,情况日渐恶化。他们不了解原始实现细节,不愿意改动既有代码,以防破坏现有稳定性。他们最多就是增加新功能、修补BUG啥的。他们倾向于尽可能小地影响组件,但这些小改动日积月累,使得代码益发脆弱。我审查这种代码时,感觉自己像一个考古学家,在一座古城中进行挖掘探索。如果你仔细观察,可以分辨出某段代码由谁开发。
线索之一是TAB风格,不同的开发人员使用不同的TAB风格,这很有指向性。类似的,花括号、变量命名的风格各不相同。
过去几个月我一直在审查winmm.dll的源码,它有十五年的历史了,最早是为Windows 3.1开发的。过去这些年里,它被移植到Win95、WinNT、Win64上。代码做过增强,以支持诸如WDM、PnP之类的新技术。有些功能被改动过,现在的操纵杆(joystick)逻辑完全不同于当年。所以,winmm.dll源码中增加了很多东西,但都是零零散散地加进来的。
此外,自从winmm.dll开发以来,微软软件开发规范有了长足的进步,现在看自己写的这些旧代码很痛苦。1980年代内存很贵,代码大小为王,开发软件时会牺牲可读性以换取尽可能小的代码尺寸。
顺便说一句,不只是winmm.dll或微软产品有这些现象,任何足够老的代码都具有这些特征。我相信,当你审查任何陈旧的代码时,都会发现我所描述的现象。
scz: 代码老去的时候,就是大洞出场的时候。微软、苹果这些世界级的软件厂商,在考量向后兼容性时,绝对不会像国产手机厂商那样,重构、完全替换、blahblah,啥?不兼容了?关我P事,谁让你买我家手机的,活该!另一方面,微软、苹果的大洞出场时,历史一般很"悠久"。