A Philosophy of Software Design | John Ousterhout | Talks at Google
Talks at GoogleYouTube ↗
延伸阅读 2
字幕解读
Ousterhout 认为软件设计缺少系统讨论和教学,介绍以反复实现、代码评审和修改来训练设计能力的课程。设计上应追求深模块与小接口,尽量通过合理语义消除错误处理负担;开发者还需从只求功能落地的战术心态转向战略投入,持续降低复杂度,换取未来更快的开发。演讲承认目前课程高度依赖教师评审,难以扩展,也没有量化证据支持投资回报周期。
英文字幕轨道 · 引文按字幕原文展示,可点时间戳回看片段。
内容要点
- 通过迭代项目、同行评审、教师细致反馈和重写,可把设计原则落实到具体代码中。
- 深模块用简单接口隐藏大量实现,能降低使用者必须理解的复杂性;应优先追求抽象质量,而非机械限制代码行数。
- 可通过定义更宽容的正常语义消除许多错误情形;战略性维护需要持续小步投入,避免临时补丁累积成系统复杂度。
视频章节 6
- 软件设计为何缺乏教学
- 用反复评审训练设计
- 深类与简单接口
- 让错误情形消失
- 从战术转向战略设计
- 设计投入与小步改进
具体观点与证据 4
接口成本包括使用者必须理解的副作用与依赖,不只是函数签名;深模块应以较小认知成本提供较多功能。
深度不是代码行数,演讲也承认某些浅模块无法避免。
everything someone has to have in their mind in order to use that class.将删除变量定义为确保变量不存在,可消除重复清理时无需处理的异常。
只适用于能自然重定义契约的情况;无法履行调用契约的I/O错误仍须报告。
redefine the semantics, so that unset makes a variable not exist.系统复杂性来自多人持续叠加的小妥协,不能指望以后修一个大问题就全部清除。
经验性设计判断,不是已量化的维护成本模型。
It's hundreds or thousands of mistakes made by many people over a period of time.设计投资应融入小步迭代,而不是写代码前花数月一次性设计整个系统。
讲者承认无法提前准确预见系统;建议投入比例与回本期限缺乏量化证据。
You have to use a somewhat iterative approach.补充字幕原文 2
深类的关键是以简洁接口隐藏大量能力,从而降低使用方需要承担的理解成本。
very simple interface with a very large amount of functionality underneath it演讲者主张尽可能缩小必须显式处理异常的位置;更好的情况是重新定义语义来消除异常路径。
the number of places where people have to deal with exceptions解读边界
课程和原则主要来自讲者的教学与工程经验;讲者明确表示缺少设计投入回报周期的量化数据,课程也尚未解决规模化问题。