软件设计的哲学(John Ousterhout分享)

软件设计的目标

  1. 软件设计最大的目标是降低软件的复杂性(Complexity),复杂性使软件难于理解和维护。

  2. 复杂性的来源:

    • 含义模糊(Obscurity): 重要信息不突出。
    • 相互依赖:模块无法独立于其他模块而被理解。
  3. 复杂性的危害

复杂性会逐渐递增,前面埋的坑,会导致后面的设计越来越复杂。

设计原则

暴露简单通用的接口,隐藏复杂的实现。

Class should go deep

正例:Unix 文件I/O 接口

  • Unix文件操作逻辑极为复杂,但前端模块只暴露的5个简单的接口。
  • 隐藏了文件在磁盘上的表现形式、块分配、目录管理、权限管理、磁盘调度、块缓存和设备信息等复杂的底层内容。

A deep interface

反例:Java文件操作接口,读写一个文件要客户端感知很多类和细节:

A deep interface cont'd

模块外部需要感知和必须处理的异常越少越好:

minimize exceptions outside

注重设计 vs. 注重速度

如果目标是尽快把feature作完,把bug都fix掉,最终导致的结果就是设计缺陷,越来越复杂。

tactical

如果初始有一个良好的设计,则在后面的迭代中形成良性循环,最小化复杂性。长远看来则节省了很多时间。

strategy

Facebook由最初的口号”Move quickly and break things”转变为”Move quickly with solid infrastructure”
Google和VMWare由于注重设计而成功,吸引了大量顶级工程师。

invest

持续的在设计上的小投入,最终换来巨大回报。

invest

参考