代码的艺术:用工程思维驱动软件开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.6.5 重视对外接口

外部通过系统向外提供的接口来访问系统所提供的功能。

在实际工作中,很多软件工程师常常忽视了对外接口的设计,他们对系统内部机制的设计非常感兴趣,会投入很多精力;而对于对外接口的设计,很多人会认为这没有多高的技术含量,所以往往投入的精力较少,热情度较低。

1. 对外接口比系统内部实现更重要

这里我想表达一个观点:系统的对外接口比系统的内部实现更重要。这是为什么呢?

第一,对外接口定义了系统对外所提供的功能。如果功能不正确,系统就不会产生价值,而我们编写软件的最终目的是提供价值。

第二,对外接口决定了系统的外部关系。在这方面,希望大家能够记住一句话“外交无小事”。对于内部实现,想要优化和修改是非常容易的,而对于外部关系,在确定后是非常难以修改的。

2. 对外接口的形态

刚才强调了对外接口的重要性,大家一定会问,那么哪些是对外接口呢?

对外接口形态包括:

(1)模块对外的函数接口。

(2)平台对外的API(Application Programming Interface,应用程序接口),可能是Web API,也可能是RPC(Remote Procedure Call,远程过程调用)接口。

(3)系统间的通信协议。比如,基于Protocol Buffer定义的协议,或者私有二进制协议。

(4)系统间存在依赖的数据。比如,一个系统给另外一个系统提供的词表。

3. 设计和修改对外接口的注意事项

由于对外接口是给外部用户使用的,因此在设计时需要考虑对外接口的“用户体验”,以保证其易用性。有些系统的对外接口由于没有做过很好的规划和命名,导致使用者在使用过程中非常难以理解。

另外,在修改对外接口时要非常小心,要努力保证对外接口的向前兼容性。平日里一个常见的问题是,系统第一版的对外接口设计得非常仓促,待这个接口已经被大范围使用后,软件工程师又想做较大修改,此时才发现修改的成本非常高。如果修改后的对外接口无法向前兼容,那么会影响已经调用了老接口的各种上游的应用。希望读者能够了解对外接口的设计和修改规律,在第一时间就把对外接口的设计做好,避免在后期陷入这样的困境。

由于篇幅关系,关于系统设计的方法我们只做概括性介绍。感兴趣的读者可以阅读Google关于系统设计的三大经典论文:GFS[4]、Big Table[5]、Map Reduce[6]。在阅读过程中,可以重点关注以下几方面。

(1)作者是怎么描述问题和出发点的?

(2)作者是怎么描述系统所支持的模型的?

(3)作者是怎么描述系统架构的?