一个很有哲学意味的接口设计

工程和哲学,通常很难联系到一起。现实生活中,也确实如此。但如果能在忙碌的工程中,拿出一些时间,也可以在繁杂的代码中,看到一丝哲学的火花。

 

作为曾经流行的技术,COM已经渐渐远离了人们的视野。然而作为曾经以此谋生的我,还时常会想起它。特别是那个意味深长的接口,IUnknown。

 

这是一个非常有意思的设计。一个编程用的接口,回答的,却是每个人心中最深沉的问题。这个接口,只有三个API。一个叫AddRef,一个叫Release。这两个API回答的,是生与死的问题。另一个API叫做QueryInterface,它回答的,则是“我是谁”。

 

人们用天数计算着自己的生命,IUnknown使用引用计数来决定自己的去留。所以,也不奇怪人们把“AddRef”和“Release”称为“生命”周期管理。

 

而“QueryInterface”,则是一个接口区别另一个接口的标志。COM世界中,一切都是IUnknown,彼此的不同,便只由QueryInterface的不同的回答来决定。如果说“AddRef”和“Release”赋予了IUnknown生命,那么QueryInterface便赋予IUnknown不同的生存价值。由是,便有了你我之分。如果将接口,看成不同的职责,那QueryInterface区别的,就如同职场上不同的职位。如果讲接口看成生活中的不同角色,那QueryInterface所区别的,就是父母,兄弟,夫妻等不同的身份。

 

如果你对人生有更深的思考,也许会问,那“什么是我”。也许有人会说,“我是谁”和“什么是我”不是同一个问题吗?真的么?我们每天辛勤工作,在公司,是不同的职责,不同的分工。我是工程师,他是老板等等。这是“我是谁”,但都是工程师,什么才是区分你我的根本呢?即使是同一个工作,也可以不同的人来做,哪一个是我?我们追求的所谓个性,无论是简单的IRect,IElement,还是复杂如IOleDocumentView,哪一个是真正的我所独有?都不是。我们工作,不喜欢别人仅以职能或结果来评价我们,因为那不是真正的“我”。我们生活,朝九晚五,吃喝拉撒,久而久之,都会感慨缺少真正属于自己的一片天地。而那缺少的所谓“自己”,究竟是什么?QueryInterface回答的,或者说界定的,是我所有,不是我。关于这个“什么是我”的问题,COM世界给出了坦诚的回答。这回答,便蕴含在IUnknown的名字里:我不知道。

 

不知道,其实是个不错的回答。因为不知道,才使得IUnknown的继承者,无所不能。而IUnknown本身,则颇有道可道,非常道的意味。

 

这就是一个程序员,在养家之余,还很享受的阅读代码的一小段思考。