《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)是逻辑上相关但实际上不能作为单个原子单元提交的任何一组变更。大规模变更是由系统的基础设施团队负责执行大部分工作。
大规模变更需要的基础设施包括::政策与文化,代码库分析,变更管理,测试和语言支持。
大规模变更流程如下:
- 授权:写一份简短的文档解释变更的原因,对代码库的影响,以及潜在评审者可能提出的问题的答案,向专家委员会申请授权。
- 变更创建:变更过程应该尽可能自动化,以便当用户退回到旧的版本。
- 切片与提交:Rosie根据项目边界和所有权规则将一个大的变更分解为可以原子提交的变更。然后将每个对立切片的变更放入单独的测试-邮件-提交管道。
16. 持续集成
- 定义:对我们整个复杂而快速演进的生态系统的持续组装和测试。
- 快速反馈循环:编码/编译-》预提交-》提交后构建-》发布候选-》版本测试-》生产测试
17. 持续交付
- 将部署分解为可管理的单元;
- 特性开关;
- 力求敏捷;
- 只发布有用的功能;
- 更早地做出数据驱动的决策:如果全面性测试实际上不可行,则以代表性测试为目标。灰度发布。自动化的A/B发布。
- 建立发布规则;
18. 计算即服务
嗯,这章也没看懂。
19. 水在最后
每天晚上看一章到两章,终于把这本书看完了,其中依赖管理和计算及服务这两张确实是没看懂,主要是工作经理上对这两章的内容并没有涉猎。看了也不知所以然。。。
好吧,接下来看点没那么大局观的书,把思想收一收
相关文章:
《Google 软件工程》读书笔记
1. 写在前面 在图书馆瞎逛,偶然瞄见一本《Google 软件工程》Titus Winters, Tom Manshreck, Hyrum Wright 著。主要是在这一排的书架上就这本书看着挺新的(不知道为什么有一种喜欢看新书的情节),而且最近被领导老批评,…...
研发机构大数据迁移如何保障敏感数据不泄露
随着云计算和大数据技术的飞速进步,越来越多的企业正试图通过数据迁移来提升IT基础设施的效率,减少成本,并增强业务的灵活性。但是,这一过程并非没有它的挑战,尤其是在数据安全方面。数据在转移过程中可能会遭遇黑客攻…...
【Spring Security系列】权限之旅:SpringSecurity小程序登录深度探索
作者:后端小肥肠 创作不易,未经允许严禁转载。 姊妹篇: 【Spring Security系列】Spring SecurityJWTRedis实现用户认证登录及登出_spring security jwt 退出登录-CSDN博客 1. 前言 欢迎来到【Spring Security系列】!在当今数字化…...
【收录 Hello 算法】第 10 章 搜索
目录 第 10 章 搜索 本章内容 第 10 章 搜索 搜索是一场未知的冒险,我们或许需要走遍神秘空间的每个角落,又或许可以快速锁定目标。 在这场寻觅之旅中,每一次探索都可能得到一个未曾料想的答案。 本章内容 10.1 二分查找10.2 二…...
【MySQL精通之路】SQL优化(1)-查询优化(11)-多范围查询优化
主博客: 【MySQL精通之路】SQL优化(1)-查询优化-CSDN博客 上一篇: 【MySQL精通之路】SQL优化(1)-查询优化(10)-外部联接简化-CSDN博客 下一篇: 当基表很大且未存储在存储引擎的缓存中时,使用辅助索引上的范围扫描读取行可能会…...
Mysql之基本架构
1.Mysql简介 mysql是一种关系型数据库,由表结构来存储数据与数据之间的关系,同时为sql(结构化查询语句)来进行数据操作。 sql语句进行操作又分为几个重要的操作类型 DQL: Data Query Language 数据查询语句 DML: Data Manipulation Language 添加、删…...
Python学习---基于正则表达式的简单爬取电影下载信息案例
一、定义函数获取列表页的内容页地址 get_movie_links() 1、定义列表的地址 2、打开url地址,获取数据 3、解码获取到的数据 4、使用正则得到所有的影片内容也地址 4.1 遍历,取出内容页地址 4.2 拼接内容页地址 4.3 打开内容页地址 4.4 获…...
.DS_store文件
感觉mac里的这个.DS_store文件烦人,老是莫名其妙的出现,然后造成困扰 处理方式如下: import os pic_list os.listdir("./mask_pic/") print(len(pic_list)) # 从文件夹中删掉 if(".DS_Store" in pic_list):print(&quo…...
【webrtc】内置opus解码器的移植
m98 ,不知道是什么版本的opus,之前的交叉编译构建: 【mia】ffmpeg + opus 交叉编译 【mia】ubuntu22.04 : mingw:编译ffmpeg支持opus编解码 看起来是opus是1.3.1 只需要移植libopus和opus的webrtc解码部分即可。 linux构建的windows可运行的opus库 G:\NDDEV\aliply-0.4\C…...
Java注解:讲解Java注解(Annotations)的概念,使用,并展示如何自定义注解,甚至框架级别的使用说明
1. 注解的概念 1.1 介绍Annotation的基础概念 Java注解(Annotation)是Java 5.0及更高版本中引入的一种元数据(meta-data),即数据的数据。它以一种形式附着在代码中,但是对代码的运行不产生直接效果。注解可以用于创建文档、追踪代码依赖性、甚至执行编译期版错误检查等…...
二维矩阵乘法案例
二维矩阵相乘计算原理:第一个矩阵的每一行分别与第二个矩阵的每一列做向量点乘,将所得结果填入新矩阵相应的位置。 例如,给定矩阵 A [ [1, 2 ], [3, 4] ]和 B [ [5, 6 ], [7, 8] ],它们的乘积AB分别为: AB[ 0 ] [ 0…...
selenium安装出错
selenium安装步骤(法1): 安装失败法1 第一次实验,失败 又试了一次,失败 安装法2-失败: ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问。: c:\\programdata\\a…...
前端中 dayjs 时间的插件使用(在vue 项目中)
Day.js中文网 这是dayjs的中文文档 里面包括了使用方法 下面我来详细介绍一下这个插件的使用 Day.js 可以运行在浏览器和 Node.js 中。 一般咱直接是 npm 安装 npm install dayjs 目前应该使用的是Es6 的语法 import dayjs from dayjs 当前时间 直接调用 dayjs() 将返回…...
tp5问题集记录 一
tp5问题集记录 一 前言车祸现场 前言 在写tp5接口的时候,发现model里面的参数查询出来之后,怎么改都不生效,也是自己不熟悉钻牛角尖了。 车祸现场 例如下面的代码使用model处理预处理 // SPUpublic function getSpuAttr($value, $data){$…...
AGI技术与原理浅析:曙光还是迷失?
前言:回顾以往博客文章,最近一次更新在2020-07,内容以机器学习、深度学习、CV、Slam为主,顺带夹杂个人感悟。笔者并非算法科班出身,本科学制药、研究生学金融,最原始的算法积累都来源于网络,当时…...
探秘机器学习经典:K-近邻算法(KNN)全解析
在浩瀚的机器学习宇宙中,K-近邻算法(K-Nearest Neighbors,简称KNN)如同一颗璀璨的明星,以其简洁直观的原理和广泛的应用范围,赢得了众多数据科学家的喜爱。今天,让我们一起揭开KNN的神秘面纱,深入探讨它的运作机制、优缺点、应用场景,以及如何在实际项目中灵活运用。 …...
数据可视化每周挑战——全国星巴克门店数据可视化
这是我国星巴克门店的位置,营业时间等数据。 1.导入需要用的库,同时设置绘图时用到的字体,同时防止绘图时负号无法正常显示的情况。 import pandas as pd from pyecharts.charts import Bar,Map,Line,Pie,Geo from pyecharts import option…...
【前端】js通过元素属性获取元素
【前端】js通过元素属性获取元素 <div for"hc_opportunity_config">aaaaa</div>//通过属性获取元素document.querySelector([for"hc_opportunity_config"]) document.querySelector([属性"属性值"])...
申请轻纺行业工程设计资乙级对企业有什么要求
注册资金:企业的注册资金应至少达到三百万,这是衡量企业经济实力和承担风险能力的重要指标。独立法人资格:企业应具备独立的法人资格,能够独立承担民事责任,并具备相应的经营自主权。专业技术人员配备:企业…...
基于单片机电梯控制系统设计与实现
摘 要: 介绍了电梯控制系统架构 , 指出了该系统的硬件设计和控制系统的软件设计以及系统调试 , 使系统可根据按键 要求完成载客任务,为电梯控制系统的优化提供了参考 。 关键词 : 电梯控制 ; 单片机 ; 系统设计 0 引言 在高层建筑中发挥…...
UE5 BaseEditorSettings.ini加载原理与配置生效机制
1. 为什么你改了BaseEditorSettings.ini却没生效?——从UE5编辑器启动流程讲起很多人在UE5项目里折腾半天,把BaseEditorSettings.ini文件翻来覆去改了十几遍,重启编辑器后发现:缩放比例还是不对、网格间距没变、甚至“启用实时预览…...
多自由度冗余空间机械臂位姿一体化规划与控制【附代码】
✨ 长期致力于空间机械臂、对偶四元数、位姿一体化、路径规划、跟踪控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于对偶四元数的冗余机械臂运…...
Python基础语法:访问器@property和修改器@xxx.setter
一、简介 访问器和修改器也是装饰器的一种。 property: 访问器,getter xxx.setter: 修改器,setter 访问器和修改器的根本目的是想将属性私有化,提供getter&setter去访问。 访问器和修改器能够做到访问属性其实在调用getter方法࿰…...
一次搞懂内存取证:用Volatility3和Cobalt Strike分析工具复现VNCTF‘来一把紧张刺激的CS’
实战内存取证:从Volatility3到Cobalt Strike信标分析全解析 在网络安全事件响应中,内存取证往往是发现高级威胁的最后一道防线。当攻击者使用文件无落地的技术时,传统的磁盘取证可能一无所获,而内存中却保留着攻击行为的完整痕迹。…...
AI写的论文双率如何压到20%以下?这几款工具实测有效
毕业季、投稿季用AI写论文已经成为不少人的高效选择,但查重率飘红、AIGC疑似率超标两大问题,让很多人犯了难。2026年学术检测标准持续收紧,知网、维普及主流AIGC检测系统同步上线双检规则,两项指标均控制在20%以下才符合基本提交要…...
如何进行TVA仿真引擎的“光照地狱”训练?
重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...
翻译 GDB 官方文档
翻译 GDB 官方文档项目地址官方文档地址下载源码包编译html运行翻译程序项目地址 https://github.com/shootercheng/gdb-translate.git 项目结构 $ tree -L 1 . ├── cmd ├── go.mod ├── input ├── internal ├── LICENSE ├── output ├── README.md ├─…...
别急着扔!12年老ThinkPad X230升级SSD和内存后,Win10流畅得像新电脑
12年老ThinkPad X230重生指南:极简升级打造流畅办公利器每次打开抽屉看到那台积灰的ThinkPad X230,总有种说不出的情感。这款2012年问世的经典商务本,曾陪伴无数人度过加班到凌晨的夜晚。如今性能确实有些力不从心,但直接丢弃又觉…...
Office RibbonX Editor:简单三步打造你的专属Office界面
Office RibbonX Editor:简单三步打造你的专属Office界面 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbonx-edit…...
探索Windows 10上的Android世界:揭秘WSA-Windows-10项目的3个技术突破
探索Windows 10上的Android世界:揭秘WSA-Windows-10项目的3个技术突破 【免费下载链接】WSA-Windows-10 This is a backport of Windows Subsystem for Android to Windows 10. 项目地址: https://gitcode.com/gh_mirrors/ws/WSA-Windows-10 想象一下&#…...
