读《Google 软件工程》

Software Engineering at Google》。

这本书从三个角度说明了软件工程是什么,分别是:时间、规模、权衡。时间应该是软件工程中最大的变量,随着时间推移新需求会出现,框架和库会升级打补丁,而原先的产品设计、服务端的算法、机器资源可能已经不再适合,这些变化需要维护,如何应对解决这些问题呢?当产品及业务扩大时,对应资源开销也会逐渐增大,资源包括人力和硬件资源(内存、CPU、存储、带宽),当这些规模不断增大如何保障相应的效率、成本?当面临这些问题时,往往不止一个方案,没有银弹,我们需要权衡利弊然后再再行动。在软件开发中会遇到许多诸如以上的问题,从这个角度可以窥探软件工程一些细节。

“软件工程”与“编程”在维度上不同:编程是关于编写代码的。软件工程扩展了这一点,包括在代码的生命周期内对其进行维护

区分相关但不同的术语“编程”和“软件工程”是很重要的。这种差异很大程度上源于随着时间的推移对代码的管理、时间对规模的影响以及面对这些想法的决策。编程是产生代码的直接行为。软件工程是一组策略、实践和工具,这些策略、实践和工具是使代码在需要使用的时间内发挥作用,并允许整个团队的协作。

对于软件工程师来说:

你如何维护你的代码,让它正常运行。

容易被忽视的成本 💰:

从历史上看,忽视社会成本的问题尤其容易出现。然而,谷歌和其他大型科技公司现在可以可靠地部署拥有数十亿用户的产品。在许多情况下,这些产品是高净效益的,但当我们以这样的规模运营时,即使在可用性、可访问性和公平性方面或潜在的滥用方面的微小差异也会被放大,往往对边缘化的群体产生不利影响。软件渗透到社会和文化的各个方面;因此,明智的做法是,在做出产品和技术决策时,我们要意识到我们所能带来的好处和坏处。

当我们评估成本时,我们需要牢记之前列出的所有成本:一个组织的健康不仅仅是银行里是否有钱,还包括其成员是否感到有价值和有成就感。在软件等高度创新和利润丰厚的领域在工程设计中,财务成本通常不是限制因素,而人力资源是。保持工程师的快乐、专注和参与所带来的效率提升会成为主导因素,仅仅是因为专注力和生产力变化大,会有 10-20%的差异很容易想象。

继续追问问题:

学习不仅仅是了解新事物;它还包括对现有事物的设计和实施背后的决策的理解。假设你的团队继承了一个已经存在多年的关键基础设施的遗留代码库。原作者早就不在了,代码也很难理解。与其花时间学习现有的代码,不如从头开始重写,这很有诱惑力。但是,不要想着“我不明白”并在那里结束你的想法,而是深入思考:你应该问什么问题?