抽象漏洞定律The Law of Leaky Abstractions

这是Joel在2002年提出的,所有不证自明的抽象都是有漏洞的。抽象泄漏是指任何试图减少或隐藏复杂性的抽象,其实并不能完全屏蔽细节,试图被隐藏的复杂细节总是可能会泄漏出来。

抽象漏洞法则说明:任何时候一个可以提高效率的抽象工具,虽然节约了我们工作的时间,但是,节约不了我们的学习时间。

代码生成工具如ORM等Hibernate都是这种思路,它抽象了一些东西,但是,所有的抽象机制都是有漏洞的。唯一可以处理漏洞的方法就是知道抽象的原理,都抽象了些什么东西。所以,在你了解抽象原理的过程中,时间之神将讨回你之前节约的时间。

SQL语言是为了抽象需要查询数据库的程序性步骤,而不允许你定义你想要什么,然后让数据库能够分析你的目的然后分解为多个查询数据库的步骤。

但在某些情况下,某些SQL查询比其他逻辑上等价的查询慢几千倍。这方面的一个著名的例子是:一些SQL服务器如果你指定:where a = b and b= c and a= c”会更快,而不是指定“ where a = b and b = c”,即使它们的结果集是相同的。

SQL让你不去关心过程,而应该是规格目标,也就是你想获得的,这是抽象的目的。但有时抽象会泄漏,并导致可怕的性能问题,你研究查询机制,去发现哪里做错了,并找出如何使您的查询运行得更快。

其他例子包括:我们使用Tomcat以后要去研究Tomcat源码,使用了Hibernate以后,要去阅读Hibernate源码,使用了Spring之后,对其机制要探究,但是这些复杂的框架有时是无法让你象学习使用它们一样轻易展示他们的神秘。

所以,现在可以将Tomcat的容器包含在java程序中(注意,不是Java运行在容器中,而是相反),这种微服务轻量概念开始得到提倡。NodeJS等框架将Scoket IO包裹在事件中,而不是将事件附属于Socket IO等等都是案例。

参考:
http://www.jdon.com/idea/javaee7/websocket-jetty.html

[该贴被banq于2013-12-21 10:09修改过]

我觉得抽象漏洞没啥不正常的,拿spring,hibernate来做例子也不太恰当。它们只是工具而已啊。那我买辆车,我只要会使用就行,我不一定非要知道底层的东西,然后会修车吧?