从另一个方面看锤子与钉子的问题

关于这个经典的锤子与钉子的比喻我曾经多次引用,特别是当看到有人刚学了一项新技术就想拿它来解决所有的问题时,我都会语重心长地给他们讲这个:

不要手里拿一把锤子,看什么都是钉子。

但是十几天前有一次和令狐谈到XML和YAML的时候,想到了另一个方面的问题。那天我们谈到了关于XML被滥用的问题。令狐说:

实际上把XML当成普通文本文件来用的应用并不少见。不知道算是XML的幸运还是不幸。这样使用XML是对XML本身的一种误用。错不在XML。XML应该用在它应该被用的地方(例如SOA),而我提到的那种情形,约定一个更简单的专用格式可能效率更高。

我说:但是XML有比较好的扩展性,而且有现成的DOM之类的可以用。

令狐说:

有些应用(嗯,其实我就是在说Java的一些配置信息)其实本身是很专用的,这个时候一个通用的解析器其实并起不了什么决定性的效果。举个例子来说, Windows的INI格式也可以解决相当多的问题,有一定的扩展性,有现成的解析器,用起来即快又简单。为什么不用?因为没有XML流行而已。

我说:windows INI操作API是win平台下的。

写一个通用的INI操作类不会花太多时间的。而且我只是举个例子,说明现在很多XML应用其实并非一定要XML不可。现在的XML使用的太泛滥了。像RoR用的配置文件就不是XML而是YAML,不照样工作得很好?
YAML 基本上就是把动态语言(如Ruby、Python)的基本数据结构以可读的形式表达出来。它的好处是可以跟这些动态语言的数据类型进行直接的映射。应用面 是很狭窄,但是对特定的应用来说,比XML要更好。当然我并不是说YAML就是银弹了。只是说在XML之外还有别的东西可以用。

我说:不可否认,XML被滥用的情况还是很多的。但要一般情况下偶还是会舍YAML而选择XML,省得多学一个东东。

令狐说:

呵呵,因为你手上只有XML这么一把锤子。但实际上并不是所有的应用都是钉子。你固然可以用XML解决一切问题,但其中的很多并不是最优的解决方案。

这里的问题就在于:YAML可能在某些方面的确比XML好,但是学习YAML需要付出时间和精力。特别是:XML用于动态语言的话,也有很方便的binding工具。这样来说,YAML的优势就比较有限,还没有明显到值得专门去学习它的程度。

所以说,有时候也要考虑到,换一把锤子是需要成本的。如果没有足够的收益,将就一下可能更好。

当然,这也不是说原来的说法就不对,还是要视情况而定的。比如说,如果YAML在动态语言中的性能表现比XML要好,而你的应用对性能要求高的话,那还是值得一学的。这里的关键是成本和收益的比率,不加考虑地换或不换都是不对的。