Software Engineering & Programming -- Chapter 1 of “Software Engineering at Google”
Software Engineering at Google 这本书介绍了在 Google 中 Software Engineering 的一些实践方法论,以及关于代码可扩展性和可持续性的一些原则。从我个人的学习角度,第一次读这本书可以发现在我学习中的一些概念在书中有明确的对应,比如 CI 的一些 rule 在 Google 是如何使用的,以及一些软件开发过程中应该注意到的点。
1. Software Engineering & Programming
“Software engineering” differs from “programming” in dimensionality: programming is about producing code. Software engineering extends that to include the maintenance of that code for its useful life span.
最大的区别在于代码需要可持续的时间,也就是代码的生命周期;如果是学校中的课程大作业,可能 Life span 很短,并不需要考虑太多的兼容性设计和一些测试相关的问题,只要保证 It works 就可以满足要求,但是在实际的工程中需要更多地考虑到代码的设计和生命周期的问题,也就是”It's maintainable“.
2. Maintainable: Hyrum's Law:
With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviors of your system will be depended on by somebody.
当一个 API 有足够的用户的时候,在约定中你承诺的什么都无所谓,所有在你系统里面被观察到的行为都会被一些用户直接依赖。海勒姆法则 - Hyrum's Law - 简书 (jianshu.com) 这里举的例子相当好,不同的 SQL 语句为我们提供了对于数据库操作的封装,但是当查询效率有显著区别的时候,我们就不得不深入查看 SQL 的细节以优化 SQL 的执行性能。
3. Scalable of System
Your organization’s codebase is sustainable when you are able to change all of the things that you ought to change, safely, and can do so for the life of your codebase.
command center: Self-referential functions and the design of options
可扩展性好的代码支持后期面向用户需求的很多修改,而不是说在代码开始阶段就设计好所有的需求。
对于组织或者架构的可扩展性,应当在设计之初也考虑到类似的设计,比如网络架构 (1条消息) 说说如何实现可扩展性的大型网站架构_deniro_li的博客-CSDN博客_网络可扩展性
下图是系统 Upgrade 的必要性随着时间的变化,可以看到越到后期,系统 Upgrade 的需求越明显。
补充:年轻的程序员面向需求,成熟的程序员应该从整个系统角度考虑来设计系统架构。
4. Beyonce Rule
If you liked it, you should have put a CI test on it.
关于架构的可扩展性,Google 的这个 rule 很值得思考,Beyonce Rule 描述的是基础架构和 CI 测试之间的关系。基础平台的架构如果影响到下游产品开发或者有依赖关系,应该对其负责的是下游的产品测试,通过 CI 发现这一问题。
5. Shifting Left
在问题的闭环中,及早发现问题的成本是最低的;也就是通过早期的测试更早的解决问题;我想这和 CI 本身也有共同之处:早发现问题,快速失败来解决代码中的早期问题。
参考:
- What I learned from Software Engineering at Google | Swizec Teller
- https://abseil.io/resources/swe_at_google.2.pdf