大小写引发的悲剧
我们知道,在Windows下是不区分大小写的,比如文件名,文件夹名,命令行参数以及注册表表项等等。这在提供我们方便的同时也把我们培养的不那么严谨,出错也就在所难免。
这是最近发生在我们公司的两个真实的案例。
1. Bin目录和bin目录
软件所有的DLL都是在Bin目录下的,有同事在fix一个defect的时候,需要判断某个DLL是否在这个Bin目录下,遗憾的是,这个判断他是用case sensitive的方式做出的,于是当目录名为bin而不是Bin时,该判断失败并在一系列后续操作后导致软件crash。而此时,软件的beta版本已经发布了。最后,我们只能以附加文档的方式告诉用户:如果发现这个问题,请强制把bin改为Bin。
2. /Install 和/install
我们有一个产品在安装时会调用一个命令进行注册:registerxxx.exe /install。但是该注册命令的实现中,对 /install这个命令行的判断却是case senstive的。于是,当我们安装包的制作人试图以首字母大写这种比较美观的方式调用此命令时:registerxxx.exe /Install,悲剧发生了。于是,我们只能在每次装完后自己手工注册~~~
习惯了windows下这种不区分大小写(case-insensitive)的工作方式,我们已经被培养的对大小写不敏感了。这样的问题相对来讲是比较难debug的:以至于眼睁睁的把问题行高亮在你面前,你也可能会视而不见 - 这本来就是对的嘛。是的,我们的经验给了我们这个十分自信的假设:大小写不同是没问题的。
福尔摩斯有句名言:There is nothing more deceptive than an obvious fact。没有比一个你所认为的事实更具有欺骗性的了。因为你错误的假设把它排除在了问题域之外,这成为了你意识的盲点。因此,很多时候在debug一个问题的时候,不要做任何假设,先站在一个比较宏观的角度检查一些基本的问题:插头插了吗?对象注册了吗?代码是最新的吗。。。大小写一致了吗?