谷歌的软件工程

书籍描述

今天,软件工程师不仅需要知道如何有效地编程,而且还需要知道如何开发适当的工程实践,以使他们的代码库可持续和健康。这本书强调了编程和软件工程之间的区别。

软件工程师如何管理一个在其生命周期内不断演化并响应不断变化的需求和需求的活代码库?基于他们在谷歌的经验,软件工程师提图斯·温特斯和海鲁姆·赖特,以及技术作家汤姆·曼什里克,对一些世界领先的实践者如何构建和维护软件提出了坦率而有见地的看法。这本书涵盖了谷歌独特的工程文化、流程和工具,以及这些方面如何为工程组织的有效性做出贡献。

您将探讨软件组织在设计、架构、编写和维护代码时应牢记的三个基本原则:

  • 时间如何影响软件的可持续性,以及如何使代码随着时间的推移而具有弹性
  • 规模如何影响工程组织中软件实践的可行性
  • 一个典型的工程师在评估设计和开发决策时需要做哪些权衡

发布者资源

查看/提交勘误表

目录

  1. 前言
  2. 前言
    1. 随着时间的推移编程
    2. 谷歌的视角
    3. 这本书不是什么
    4. 临别赠言
    5. 本书中使用的惯例
    6. O'Reilly在线学习
    7. 如何联系我们
    8. 致谢
  3. 一。论文
  4. 1.什么是软件工程?
    1. 时间与变化
      1. 海鲁姆定律
      2. 示例:哈希排序
      3. 为什么不以“不变”为目标呢?
    2. 规模和效率
      1. 无法扩展的策略
      2. 可扩展的策略
      3. 示例:编译器升级
      4. 左移
    3. 权衡和成本
      1. 示例:标记
      2. 决策输入
      3. 示例:分布式构建
      4. 示例:在时间和规模之间做出决定
      5. 重新考虑决定,犯错误
    4. 软件工程与程序设计
    5. 结论
    6. 热释光;DRs公司
  5. 二。文化
  6. 2.如何做好团队合作
    1. 帮我隐藏代码
    2. 天才神话
    3. 隐藏被认为是有害的
      1. 早期发现
      2. 公车系数
      3. 进展速度
      4. 总之,不要隐瞒
    4. 一切都是为了团队
      1. 社会交往的三大支柱
      2. 为什么这些支柱很重要?
      3. 在实践中谦逊、尊重和信任
      4. 无可指摘的死后文化
      5. 成为谷歌
    5. 结论
    6. 热释光;DRs公司
  7. 3.知识共享
    1. 学习的挑战
    2. 哲学
    3. 搭建舞台:心理安全
      1. 师徒制
      2. 大群体的心理安全
    4. 增长你的知识
      1. 提问
      2. 理解上下文
    5. 扩展你的问题:问社区
      1. 群聊
      2. 邮件列表
      3. 雅思:问答平台
    6. 扩展你的知识:你总是有东西要教
      1. 办公时间
      2. 技术讲座和课程
      3. 文档
      4. 代码
    7. 扩展组织的知识
      1. 培养知识共享文化
      2. 建立规范的信息来源
      3. 保持循环
    8. 可读性:通过代码评审的标准化指导
      1. 什么是可读性过程?
      2. 为什么有这个过程?
    9. 结论
    10. 热释光;DRs公司
  8. 4.权益工程
    1. 默认设置为“偏差”
    2. 了解多样性的必要性
    3. 建设多元文化能力
    4. 使多样性具有可操作性
    5. 拒绝单一方法
    6. 挑战既定流程
    7. 价值观与结果
    8. 保持好奇心,向前推进
    9. 结论
    10. 热释光;DRs公司
  9. 5.如何领导团队
    1. 经理和技术主管(以及两者)
      1. 工程经理
      2. 技术负责人
      3. 技术主管
    2. 从个人贡献者角色转变为领导角色
      1. 唯一害怕的是…好吧,一切
      2. 仆人式领导
    3. 工程经理
      1. 经理是一个由四个字母组成的词
      2. 今天的工程经理
    4. 反模式
      1. 反模式:雇佣推手
      2. 反模式:忽略低绩效者
      3. 反模式:忽略人类问题
      4. 反模式:做每个人的朋友
      5. 反模式:破坏招聘条
      6. 反模式:像对待孩子一样对待你的团队
    5. 积极的模式
      1. 失去自我
      2. 做禅师
      3. 成为催化剂
      4. 清除路障
      5. 做老师,做导师
      6. 设定明确的目标
      7. 诚实点
      8. 追踪快乐
    6. 意料之外的问题
    7. 其他提示和技巧
    8. 人就像植物
      1. 内在动机与外在动机
    9. 结论
    10. 热释光;DRs公司
  10. 6.规模领先
    1. 总是做决定
      1. 飞机的寓言
      2. 找出致盲者
      3. 确定关键的权衡
      4. 决定,然后迭代
    2. 总是要离开
      1. 你的使命:建立一个“自动驾驶”团队
      2. 划分问题空间
    3. 始终保持缩放
      1. 成功的循环
      2. 重要还是紧急
      3. 学会丢球
      4. 保护你的能量
    4. 结论
    5. 热释光;DRs公司
  11. 7.测量工程生产率
    1. 为什么我们要测量工程生产率?
    2. 分诊:是否值得测量?
    3. 通过目标和信号选择有意义的指标
    4. 目标
    5. 信号
    6. 韵律学
    7. 使用数据验证指标
    8. 采取行动并跟踪结果
    9. 结论
    10. 热释光;DRs公司
  12. 三、 进程
  13. 8.风格指南和规则
    1. 为什么有规则?
    2. 创建规则
      1. 指导原则
      2. 样式指南
    3. 改变规则
      1. 过程
      2. 风格仲裁者
      3. 例外情况
    4. 引导
    5. 应用规则
      1. 错误检查器
      2. 代码格式化程序
    6. 结论
    7. 热释光;DRs公司
  14. 9.代码评审
    1. 代码评审流程
    2. Google的代码评审工作原理
    3. 代码评审优点
      1. 代码正确性
      2. 代码理解
      3. 代码一致性
      4. 心理和文化利益
      5. 知识共享
    4. 代码评审最佳实践
      1. 礼貌专业
      2. 写些小改动
      3. 写下好的变化描述
      4. 尽量减少审阅者
      5. 尽可能自动化
    5. 代码评审的类型
      1. 绿地代码评审
      2. 行为改变、改进和优化
      3. 错误修复和回滚
      4. 重构和大规模更改
    6. 结论
    7. 热释光;DRs公司
  15. 10.文件
    1. 什么是文件?
    2. 为什么需要文档?
    3. 文档就像代码
    4. 了解你的听众
      1. 受众类型
    5. 文档类型
      1. 参考文献
      2. 设计文件
      3. 教程
      4. 概念性文件
      5. 登录页
    6. 文件审查
    7. 文件哲学
      1. 谁,什么,何时,何地,为什么
      2. 开头、中间和结尾
      3. 良好文档的参数
      4. 弃用文件
    8. 你什么时候需要技术作家?
    9. 结论
    10. 热释光;DRs公司
  16. 11.测试概述
    1. 为什么我们要写测试?
      1. googleweb服务器的故事
      2. 以现代发展的速度进行测试
      3. 写,跑,反应
      4. 测试代码的好处
    2. 设计测试套件
      1. 试验尺寸
      2. 试验范围
      3. 碧昂丝法则
      4. 关于代码覆盖率的注记
    3. 谷歌规模测试
      1. 大型测试套件的缺陷
    4. 谷歌的测试历史
      1. 入职培训班
      2. 测试认证
      3. 厕所测试
      4. 今天的测试文化
    5. 自动化测试的局限性
    6. 结论
    7. 热释光;DRs公司
  17. 12.单元测试
    1. 可维护性的重要性
    2. 防止脆性试验
      1. 争取不变的考验
      2. 通过公共API进行测试
      3. 测试状态,而不是交互
    3. 编写清晰的测试
      1. 使你的测试完整简洁
      2. 测试行为,而不是方法
      3. 不要把逻辑放在测试中
      4. 写入清除故障消息
    4. 测试和代码共享:潮湿,不干燥
      1. 共同的价值观
      2. 共享设置
      3. 共享帮助程序和验证
      4. 定义测试基础结构
    5. 结论
    6. 热释光;DRs公司
  18. 13.测试双打
    1. 双重测试对软件开发的影响
    2. 谷歌测试加倍
    3. 基本概念
      1. 双重测试示例
      2. 接缝
      3. 模仿框架
    4. 使用测试双打的技巧
      1. 伪造
      2. 树桩
      3. 交互测试
    5. 真正的实现
      1. 喜欢现实而不是孤立
      2. 如何决定何时使用真正的实现
    6. 伪造
      1. 为什么赝品很重要?
      2. 什么时候应该写假货?
      3. 假货的忠诚
      4. 假货应该经过检验
      5. 如果没有假货怎么办
    7. 树桩
      1. 过度使用树桩的危险
      2. 什么时候留茬合适?
    8. 交互测试
      1. 更喜欢状态测试而不是交互测试
      2. 交互测试什么时候合适?
      3. 交互测试的最佳实践
    9. 结论
    10. 热释光;DRs公司
  19. 14.大型试验
    1. 什么是更大的测试?
      1. 忠诚
      2. 单元测试中的常见差距
      3. 为什么不进行更大的测试?
    2. 谷歌的大型测试
      1. 更大的测试和时间
      2. 谷歌规模的大型测试
    3. 大型测试的结构
      1. 被测系统
      2. 试验数据
      3. 验证
    4. 大型试验类型
      1. 一个或多个交互二进制文件的功能测试
      2. 浏览器和设备测试
      3. 性能、负载和压力测试
      4. 部署配置测试
      5. 探索性测试
      6. A/B差异回归测试
      7. 用户终端
      8. 探针和金丝雀分析
      9. 灾备与混沌工程
      10. 用户评价
    5. 大型测试和开发人员工作流程
      1. 编写大型测试
      2. 运行大型测试
      3. 拥有大型测试
    6. 结论
    7. 热释光;DRs公司
  20. 15.折旧
    1. 为什么不赞成?
    2. 为什么不赞成这么难?
      1. 设计期间的折旧
    3. 折旧类型
      1. 建议性否决
      2. 强制折旧
      3. 弃用警告
    4. 管理弃用过程
      1. 流程所有者
      2. 里程碑
      3. 报废工具
    5. 结论
    6. 热释光;DRs公司
  21. 四、 工具
  22. 16.版本控制和分支机构管理
    1. 什么是版本控制?
      1. 为什么版本控制很重要?
      2. 集中式风险投资与分布式风险投资
      3. 真理之源
      4. 版本控制与依赖关系管理
    2. 分支机构管理
      1. 正在进行的工作类似于一个分支
      2. 开发分支
      3. 释放分支
    3. 谷歌的版本控制
      1. 一个版本
      2. 场景:多个可用版本
      3. “一个版本”规则
      4. (几乎)没有长寿的树枝
      5. 释放分支呢?
    4. 单一回购
    5. 版本控制的未来
    6. 结论
    7. 热释光;DRs公司
  23. 17.代码搜索
    1. 代码搜索界面
    2. 谷歌如何使用代码搜索?
      1. 在哪里?
      2. 什么?
      3. 怎么用?
      4. 为什么?
      5. 谁和什么时候?
    3. 为什么是一个单独的网络工具?
      1. 比例尺
      2. 零设置全局代码视图
      3. 专业化
      4. 与其他开发人员工具集成
      5. 原料药暴露
    4. 规模对设计的影响
      1. 搜索查询延迟
      2. 索引延迟
    5. 谷歌的实施
      1. 搜索索引
      2. 排名
    6. 选定的权衡
      1. 完整性:库首
      2. 完整性:所有与最相关的结果
      3. 完整性:头与分支与所有历史与工作区
      4. 表现力:标记、子串和正则表达式
    7. 结论
    8. 热释光;DRs公司
  24. 18.构建系统和构建理念
    1. 构建系统的目的
    2. 没有构建系统会发生什么?
      1. 但我只需要一个编译器!
      2. 去救援?
    3. 现代建筑体系
      1. 一切都是依赖关系
      2. 基于任务的构建系统
      3. 基于工件的构建系统
      4. 分布式生成
      5. 时间、规模、权衡
    4. 处理模块和依赖项
      1. 使用细粒度模块和1:1:1规则
      2. 最小化模块可见性
      3. 管理依赖项
    5. 结论
    6. 热释光;DRs公司
  25. 19.评论:谷歌的代码审查工具
    1. 代码评审工具原则
    2. 代码评审流程
      1. 通知
    3. 第一阶段:创造改变
      1. 扩散
      2. 分析结果
      3. 紧密的工具集成
    4. 第2阶段:请求审查
    5. 第3和第4阶段:理解和评论变化
      1. 评论
      2. 了解变化的状态
    6. 第5阶段:变更批准(为变更打分)
    7. 第六阶段:做出改变
      1. 提交后:跟踪历史记录
    8. 结论
    9. 热释光;DRs公司
  26. 20.静态分析
    1. 有效静力分析的特点
      1. 可扩展性
      2. 可用性
    2. 静态分析工作的关键课程
      1. 关注开发商幸福感
      2. 使静态分析成为核心开发人员工作流程的一部分
      3. 授权用户参与
    3. Tricorder:谷歌的静态分析平台
      1. 集成工具
      2. 集成反馈通道
      3. 建议的修复
      4. 按项目自定义
      5. 预先提交
      6. 编译器集成
      7. 编辑和浏览代码时进行分析
    4. 结论
    5. 热释光;DRs公司
  27. 21.依赖关系管理
    1. 为什么依赖关系管理如此困难?
      1. 相互冲突的需求和依赖关系
    2. 导入依赖项
      1. 兼容性承诺
      2. 导入时的注意事项
      3. Google如何处理导入依赖项
    3. 从理论上讲,依赖管理
      1. 没有任何变化(又称静态依赖模型)
      2. 语义版本控制
      3. 捆绑分销模式
      4. 住在最前面
    4. SemVer的局限性
      1. 塞姆弗可能会超员
      2. 塞默可能会妥协过度
      3. 动机
      4. 最小版本选择
      5. 那么,塞默有用吗?
    5. 具有无限资源的依赖关系管理
      1. 导出依赖项
    6. 结论
    7. 热释光;DRs公司
  28. 22.大规模变化
    1. 什么是大规模的变化?
    2. 谁在和LSC打交道?
    3. 原子变化的障碍
      1. 技术限制
      2. 合并冲突
      3. 没有闹鬼的墓地
      4. 异质性
      5. 测试
      6. 代码评审
    4. LSC基础设施
      1. 政策和文化
      2. 代码库洞察
      3. 变更管理
      4. 测试
      5. 语言支持
    5. LSC过程
      1. 授权
      2. 更改创建
      3. 分片和提交
      4. 清理
    6. 结论
    7. 热释光;DRs公司
  29. 23.持续整合
    1. CI概念
      1. 快速反馈回路
      2. 自动化
      3. 连续测试
      4. CI挑战
      5. 密封试验
    2. 谷歌的CI
      1. CI案例研究:Google外卖
      2. 但我付不起钱
    3. 结论
    4. 热释光;DRs公司
  30. 24.连续交付
    1. 谷歌持续交付的习惯用法
    2. Velocity是一项团队运动:如何将部署分解为可管理的部分
    3. 孤立地评估更改:标志保护特性
    4. 为敏捷而努力:建立释放训练
      1. 没有二进制是完美的
      2. 满足你的释放期限
    5. 以质量和用户为中心:只提供使用过的产品
    6. 左移:更早地做出数据驱动的决策
    7. 改变团队文化:在部署中建立纪律
    8. 结论
    9. 热释光;DRs公司
  31. 25.计算即服务
    1. 驯服计算机环境
      1. 劳动自动化
      2. 集装箱化和多租户
      3. 摘要
    2. 为托管计算编写软件
      1. 为失败设计架构
      2. 批量与服务
      3. 管理状态
      4. 连接到服务
      5. 一次性代码
    3. 随时间和规模变化的CAA
      1. 作为抽象的容器
      2. 一个服务来统治他们所有人
      3. 提交的配置
    4. 选择计算服务
      1. 集中化与定制
      2. 抽象级别:无服务器
      3. 公共与私人
    5. 结论
    6. 热释光;DRs公司
  32. v结论
  33. 后记
  34. 索引

产品信息

  • 职务:谷歌的软件工程
  • 作者:提图斯·温特斯、汤姆·曼什里克、海鲁姆·赖特
  • 发布日期:2020年3月
  • 发布者:奥莱利传媒公司。
  • 国际标准书号:9781492082798