程序员一生其实主要在做两件非常矛盾的事,就是创造接口,和打破接口。

在系统设计的时候,每一个组件都有和外界交互的接口。整个系统能够良好运行就靠设计合理的接口。当落实到具体实现时,又要设计一大堆接口,这次是数据结构和函数。代码是首先给人看的。人脑的高速缓存放不下所有实现,所以接口一定要简洁,别人才能理解和维护。接口的表现形式最主要是类型,编译器保证类型是匹配的。编程语言也是朝着有助于程序员定义接口的方向演变,主流的编程语言都渐渐有了更高级的类型系统。编程在某种程度上来说更加容易,类型系统充当了接口的文档,使得阅读代码更高效。

但是在某些领域,做的第一件事就是打破接口。在性能优化中,不同级别的接口都可能被打破。所谓打破,就是理解接口背后的实现,然后针对这个实现改变调用接口的方式。硬件和软件的接口就是指令集(Instruction set architecture),软件一般是不需要关心指令集是怎么实现的。为了性能,我们必须了解指令集的背后,然后优化之。比如为了避免缓存的false sharing,多线程的结果会往往先存到thread local的变量中,最后再聚合在一起。