《Google 软件工程》读书笔记

1. 写在前面

        在图书馆瞎逛,偶然瞄见一本《Google 软件工程》Titus Winters, Tom Manshreck, Hyrum Wright 著。主要是在这一排的书架上就这本书看着挺新的(不知道为什么有一种喜欢看新书的情节),而且最近被领导老批评,怀疑是自己能力不足,所以就借回家翻一翻,总比刷小视频好吧。

2. 软件工程

        “软件工程就是随着时间而不断集成的编程。”实话说,被这个定义震撼到了。很简洁的一句话,并且把软件工程和编程的关系说清楚了。

        联系着软件工程和编程的一个关键参数是时间,而影响时间的关键因素则是变化,时间又影响软件的成本,成本是决策的一个关键参数,决策可能导致质量的衡量和改变。因此软件工程就是把时间、成本、质量的因素强加于编程行为的一项工作。呃,扯到了3要素有点熟悉的感觉。

        PS海勒姆定律:当一个API有足够多的用户时,在约定中你所承诺的已不重要:所有在你系统里面被观察到的行为都会被一些用户所依赖。后面这一句是我自己加的:无论这些行为是你故意为之还是失误所致!

3. 团队合作

        写下这段话之前,一直以为组织里面的每个人都按照制定好的规则做出行为就是合作。原来“合作”,并不是行为层面上体现,而是心里和行为的共同作用。真正的合作,应该是队友们在相互坦诚的前提下,互相补位,向着共同的目标干活。在一个优秀的团队中,MVP其实可有可无,尊重和信任才是关键。

3.1. 拒绝隐藏

        不要隐藏自己的不足和弱点,只有把自己的不足暴露出来,你的队友才知道怎么给你补位。这一项我以前也一直做不到,总是怕被别人知道自己的缺点,总是想在队友面前表现完美,以至于害怕失误,害怕尝试。Google的理念是,世界上没有那么多天才,绝大多数人都是凡人,都有自己的长处和短处,只有互补的团队,没有完美的天才。

        PS巴士系数:多少关键开发者被巴士撞了会让项目停摆。记得在前东家的时候,貌似全领域只剩下一个人都不会让项目停摆。

3.2. 谦虚、尊重和信任

        我接触过大部分的团队,谦虚一般是表面上的,大家在内心的深处其实并不那么愿意接受批评。从另一个角度来看,批评并不代表指责,回顾问题是为了解决问题,指责只会把问题复杂话,甚至会把借口误判为原因。

3.3. 无指责的回顾文化

        事情是如何发生的->事情是如何解决的->事情发生的原因是什么->以后如何避免事情的发生。

        再理性的问题回溯,都无法避免心理上的影响。在回溯这件事上,要求团队成员对当事人的尊重,也要求当事人的心理承受能力。“你越开放地接受影响,你就越有能力去影响别人;你表现得越脆弱,就显得越强大。”

        示弱和容错,是一个团队日趋强大的表现。

4. 知识共享

4.1. 提问

        提问是需要勇气的,帮助提问者提问的一个好方法则是营造一种提问文化。当发现身边的人随时无所忌惮的提出自己不知道的问题时,你还会对提问存在畏惧吗?当然营造提问的文化并不是一件简单的事情,可以从小团体开始。例如设立导师制,建设论坛,或者提问机器人等等,一切都是为了体现团队的厚脸皮提问文化。

4.2. 共享

        有厚着脸皮提问题的,就需要有耐心回答问题的人。然而对于无私奉献这一说恐怕不是所有人都能接受,毕竟大家只是打工混口饭吃。所以激励是一种很好的放促进方式,毕竟在积分奖励的刺激下,我才会坚持在CSDN上水。

4.3. 制度

        当每个人都进入了自己的舒适圈,谁还会在意那些微不足道的奖励机制呢。通过管理制度的要求,可以保证最低限度的文档交付,虽然这种方式下的文档成果一般是质量低下甚至更新不及时的。怎么说呢,每个人在一篇水文上修改一句话,终将也能打造一篇高质量文档吧。

5. 团队领导

        如果书上写的都是真的,那在谷哥干活真是一种享受,我情愿一辈子当码农。。。

        “谦虚、尊重和信任”,已经记不清楚这是第几次在书上看到了,这3个词概括了团队领导的核心要领。

        抛弃自我意识(谦虚、信任)、成为一名禅师(淡定、提问)、成为催化剂(建立共识)、移除障碍(争取资源)、成为老师和导师(共享知识)、设定清晰的目标、坦诚、追踪幸福感(你需要什么?)。不要用传统意义上的“管理”,要注重领导力、影响力和为团队服务。尽可能委派,不要自己动手。尤其要注重团队的焦点、方向和速度。

6. 大规模团队领导

        话说连小团队都怎么认真领导过的我,居然还在写大规模团队的领导学习笔记,真是讽刺!呃,好像曾经领导过将近30人的团队,不过当了逃兵。。。

        书上说优秀的领导者要满足“三个总是”,总是在做决策,总是不在场,总是在扩展。

总是在做决策:识别盲点,识别关键的权衡,决策然后迭代。

总是不在场:划分问题空间,子问题授权给领导者,调整与迭代。

总是在扩展:螺旋式解决问题,授权和安排专门时间,学会放弃,保护你的经历。

7. 度量工程生产力

7.1. 鉴别是否值得度量

        通过问题的形式开始:你期待什么结果,为什么?如果数据支持你的预期,将采取什么行动?如果得到一个负面结果,会采取行动吗?谁将决定对结果采取行动,他们将何时采取行动?

7.2. 根据目标和信号来选择有意义的指标

  • 目标:期望达成的最终结果。
  • 信号:用来判断我们是否已经得到了最终结果的东西。
  • 指标:信号的代理,这是可以度量的东西。

7.3. 采取行动并跟踪结果

        提供建议,并将这些建议内置于开发人员的工作流程和激励结构当中。

8. 规则、评审和文档

        大多数工程组织都有管理代码库的规则,关于源文件存储位置的规则、关于代码格式的规则、关于命名、模式、异常和线程的规则。应用规则一是为了让别人能看懂你的代码,二是减少出错的几率。规则的落地可以通过工具,另一种方式是通过流程,也就是评审。

        代码评审有三个方面(另一位工程师、代码所有者和“可读性”认证人)。书上有一点是我从来没有意识到的,“对于经过了代码评审后的代码就不是你自己一个人的代码了,而是一个集体企业的一部分”。这种认识让我感觉到了团队的力量。(Critique)

        文档的类型包括:参考文档,包括代码注释,设计文档,概念文档,着陆页面。文档令人讨厌的地方在于,需要和对待代码一样对待文档,及时更新,否则文档的有点将会被过时带来的痛苦统统掩盖。

9. 测试

        测试是软件开发不能逃避的一环,特别是书上写到谷歌采用单一的代码库,并且没有使用任何代码分支,所有人的变更都是提交到代码库头部!关于测试的好处和测试粒度这里不详细展开,但是关于推广测试的故事却挺有意思——把测试宣传贴在厕所!让测试文化迅速在公司内蔓延。。。

9.1. 单元测试

        编写代码的同时编写测试,努力做到代码不影响已有的测试,新的功能用新的测试来覆盖。通过公共API来进行测试,而不是调用实现细节。测试行为,而不是方法。DAMP(Descriptive and Meaningful Phrases) 而不是 DRY。

9.2. 测试替身

        测试替身(test double)是一个对象或函数,它可以在测试中代表那个真实的是是实现,类似于特技替身演员替代电影演员的情况。测试替身的技术包括伪造、打桩、交互测试以及实际实现。

9.3. 较大型测试

        嗯,除了单元测试剩下的就是较大型测试。较大型测试的类型包括:一个或多个二进制文件的功能测试,浏览器和设备测试,性能、负载和压力测试,部署配置测试,探索性测试,A/B差异(回归)测试,用户验收测试,探针和金丝雀分析,灾难恢复与混沌工程,用户评估。

10. 弃用

        弃用是一个沉重话题,而且是一个艰难的决定,然而万物皆有终结时,该舍弃的终将要舍弃。正如书上说的,有两种处理问题的方法:一种是已经过时的,另一种是还没开发出来的。。。

         弃用的流程管理要素:流程负责人,里程碑,弃用的工具(发现、迁移和防止倒退)。

11. 版本控制和代码搜索

        单一版本规则:单一源,单一代码库以及绝不能让开发人员选择“我应该依赖这个组件的哪个版本?”,尽管单一版本规则并不是普世的。(Monorepos)

        代码搜索工具能够帮助开发人员理解代码,进而极大地提高工程生产力。(Google Code Search)

12. 构建工具

        虽然所有事情都可以通过编译器和脚本来实现,但是对于一个大规模代码和团队来说,构建工具的作用无可替代。构建工具包括基于任务型的和基于构件行的,基于构件的构建系统能够提供分布式构建能力和依赖管理。(Bazel)

13. 静态分析

        静态分析指的是分析源代码的程序,用以发现潜在的问题,如缺陷、反模式等,在不执行程序的情况下就能诊断出问题。

        静态分析工具需要集成在开发者工作流中,作为预编译的一部分。(Tricorder)

14. 依赖管理

        说实话这章没看懂,只记住了一句话:如果能使用源代码管理,就不要做依赖管理。

15. 大规模变更

        大规模变更(LSC)是逻辑上相关但实际上不能作为单个原子单元提交的任何一组变更。大规模变更是由系统的基础设施团队负责执行大部分工作。

        大规模变更需要的基础设施包括::政策与文化,代码库分析,变更管理,测试和语言支持。

        大规模变更流程如下:

  1. 授权:写一份简短的文档解释变更的原因,对代码库的影响,以及潜在评审者可能提出的问题的答案,向专家委员会申请授权。
  2. 变更创建:变更过程应该尽可能自动化,以便当用户退回到旧的版本。
  3. 切片与提交:Rosie根据项目边界和所有权规则将一个大的变更分解为可以原子提交的变更。然后将每个对立切片的变更放入单独的测试-邮件-提交管道。

16. 持续集成

  1. 定义:对我们整个复杂而快速演进的生态系统的持续组装和测试。
  2. 快速反馈循环:编码/编译-》预提交-》提交后构建-》发布候选-》版本测试-》生产测试

17. 持续交付

  1. 将部署分解为可管理的单元;
  2. 特性开关;
  3. 力求敏捷;
  4. 只发布有用的功能;
  5. 更早地做出数据驱动的决策:如果全面性测试实际上不可行,则以代表性测试为目标。灰度发布。自动化的A/B发布。
  6. 建立发布规则;

18. 计算即服务

         嗯,这章也没看懂。

19. 水在最后

        每天晚上看一章到两章,终于把这本书看完了,其中依赖管理和计算及服务这两张确实是没看懂,主要是工作经理上对这两章的内容并没有涉猎。看了也不知所以然。。。

        好吧,接下来看点没那么大局观的书,把思想收一收

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 一个简单的用Canny算法进行边缘检测程序

以下是一个简单的边缘检测程序,使用Python和OpenCV库来实现。这个程序将加载一张图像,对其进行灰度化处理,并使用Canny边缘检测算法来检测图像中的边缘。请确保安装了OpenCV库(可以使用pip install opencv-python进行安装&#xf…

Vue的router.addRoutes不起作用

Vue的router.addRoutes()不起作用解决方案 最近在学习制作后台管理系统的时候,涉及到了权限,在通过后台获取到数据后使用router.addRoutes()时不起作用。 最终发现左侧菜单组件中的路由是根据this.$router.options.routes来渲染的,最终使用…

sw套合样条曲线

套合样条曲线,可以变成一条曲线,然后可以进行分段

UOS1060e分离ssh与sftp服务

文章目录 原理一、sftp 用户与目录二、ssh 和 sftp 服务分离三、启动与停止四、验证 原理 SFTP是SSH的一部分,SFTP没有单独的守护进程,它必须使用SSHD守护进程(端口号默认是22)来完成相应的连接操作。 通过新建另一个‘sshd’进程…

rclone迁移对象存储之间的数据

1 概述 rclone是一款文件复制工具,既可以用于在linux主机之间复制文件,也可以在对象存储之间复制文件。 rclone的官网为: https://rclone.orgrlcone关于对象存储的官方文档为: https://rclone.org/s32 安装 2.1 yum安装 yum …

使用Spring Boot和Screw轻松生成数据库设计文档

目录 引言 准备工作 项目初始化 引入依赖 配置数据库连接 集成Screw生成文档 基本配置 生成数据库文档 实战操作 示例项目 生成效果 结论 常见问题 延伸阅读 引言 数据库设计文档是项目技术文档的重要组成部分。它不仅有助于开发人员理解数据库结构&#xff0c…

PY32F系列32位单片机 特殊引脚复用说明

一 、 PY32F030 系 列 , 包 括 PY32F030 、PY32F003、 PY32F002A、 XL32F003 的特殊引脚使用说明。 1、晶振引脚的复用,使用 HSE/LSE 引脚作为 GPIO 功能引脚时,只要没有配置相关功能的情况下,正常配置 GPIO 功能即可。 其中&am…

SpringBoot3.x 整合 Spring AI

Spring AI 已经发布了一段时间,虽然推出的时候就被人说只是一个套了 API 的壳,但是作为 Spring 生态的一个开源项目,用它来结合到现有业务系统中还是一个比较好的方案,毕竟像笔者当初为了接入 OpenAI 的 API,还专门学了…

Pydantic与Sqlalchemy数据模型的枚举类型实践

说明: 乍看时以为很容易的东西,摸索实践后才知道窍门实战中我是用Tinyint / Interger 作为保存 enum对象数值的字段类型, 而不是用数据库中提供的ENUM类型字段,因为有更好的扩展性,性能,节省空间作为使用理…

Git 在Windows上添加文件换行相关设置

Windows使用Git时,如果在提交时希望换行符不变(CRLF换行不转换为LF),core.autocrlf选项可以按照如下设置。 时保留CRLF换行符,检出时转换为LF,core.autocrlf为true: git config --global core.…

pcd点云江湖之处处碰壁:点云文件pcd加载02

江湖好汉,休走,废了半天力气把threejs自带的代码搬迁到自己项目中了,高高兴兴给领导看。领导一句话,顿时无奈:领导曰:点云单色太丑,能不能按照分类展示? 一句话难道英雄好汉&#xf…

#P0564. 数组元素查找升级版

问题描述 给你 n 个数,再给你一个数 k,查找 k 在这 n 个数中第一次出现的位置(从 0 开始计数),不存在输出 No。 输入 多组测试数据,对于每组测试数据: 第一行输入一个整数 n (1 ≤ n ≤ 100…

深入理解Vue 3中的v-if和v-for指令

Vue.js是一款流行的JavaScript框架,其简洁的语法和强大的功能使得前端开发变得更加高效和愉快。在Vue 3中,我们看到了许多新的特性和改进,其中包括了两个最常用的指令之一:v-if和v-for。 1. v-if指令 v-if指令是Vue中最常用的条件…

eclipse配置JDK和Tomcat

eclipse配置JDK jdk配置 配置JDK: 首先,确保JDK已经安装并配置了环境变量。这包括设置JAVA_HOME环境变量,指向JDK的安装目录,以及更新CLASSPATH和PATH环境变量以包含JDK的bin目录。 在Eclipse中,通过Window > Pre…

【Verilog编程题】

20240514 20240515 20240516 题目时序有问题,valid_b在第六位数据的同时拉高,而不是在下一个时钟 20240517 module valid_ready( input clk , input rst_n , input [7:0] data_in , input valid_a , input ready_b , output ready_a , output re…

使用 PyTorch 和 Pandas 进行 Kaggle 房价预测

文章目录 1、环境设置2、数据下载3、数据预处理4、模型构建5、训练和验证6、训练模型并生成预测结果7、完整代码 在本篇博文中,我们将探索如何使用 PyTorch 和 Pandas 库,构建一个用于 Kaggle 房价预测的模型。我们将详细讨论数据加载、预处理、模型构建…

vue注册自定义指令

在 Vue 中,可以通过全局或局部注册自定义指令。下面是一个简单的示例,演示如何在 Vue 中注册一个自定义指令。 首先,我们需要定义一个自定义指令。在 Vue 中,自定义指令可以通过全局或局部注册,并在元素上绑定特定的行…

LaTeX 2022软件安装教程(附软件下载地址)

软件简介: 软件【下载地址】获取方式见文末。注:推荐使用,更贴合此安装方法! LaTeX 2022是基于ΤΕΧ的一种排版系统,特别适用于生成科技和数学文档的高质量打印。它可用于各种文档类型,从简单信函到完整…

Java进阶学习笔记2——static

static: 叫静态,可以修饰成员变量、成员方法。 成员变量按照有无static修饰,分为两种: 类变量:有static修饰,属于类,在计算机中只有一份,会被类的全部对象共享。静态成员变量。 实…