1Software Engineering at Google

软件工程是什么

编程vs软件工程

软件工程定义时间维度规模挑战可持续性

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第1章:软件工程是什么(What is Software Engineering?)

一、导读

1.1 本章学习目标

第1章定义了"软件工程"与"编程"的区别——前者关注代码随时间的演变。

本章的核心学习目标包括:

  • 理解软件工程与编程的区别
  • 掌握"时间维度"在软件工程中的重要性
  • 理解规模对软件的影响
  • 学会用可持续性思维评估技术决策

1.2 为什么本章如此重要

Google 的核心洞察是:编程是写代码,软件工程是让代码在时间的考验下保持健康。一个能运行的程序和一个能持续运行10年的系统,需要完全不同的思维方式。

1.3 核心问题引导

软件工程与编程有什么本质区别?

为什么"时间维度"如此重要?

规模如何改变软件开发的本质?

什么是可持续的软件工程?


二、核心概念详解

2.1 编程 vs 软件工程

编程(Programming):
- 写代码让程序工作
- 关注当前功能
- 个人或小组规模
- 短期思维

软件工程(Software Engineering):
- 让代码在时间中保持健康
- 关注可维护性、可扩展性
- 大规模团队协作
- 长期思维

关键区别:
"编程"关注的是"代码能运行"
"软件工程"关注的是"代码能持续运行"

2.2 时间维度

软件工程的三个时间维度:

1. 短期(天/周)
   - 功能开发
   - Bug 修复
   - 代码审查

2. 中期(月/年)
   - 重构
   - 技术债务管理
   - 依赖升级

3. 长期(年/十年)
   - 架构演进
   - 技术栈迁移
   - 组织变革

关键问题:
"这个决策在6个月后还合理吗?"
"这个代码在2年后还能维护吗?"

2.3 规模的影响

Google 的规模:
- 数百万行代码的单体仓库
- 数万名工程师同时工作
- 数十亿用户的服务

规模带来的挑战:
1. 协调成本:如何让数千人的修改不冲突?
2. 知识传播:如何让新人快速上手?
3. 一致性:如何保持代码风格统一?
4. 依赖管理:如何安全地升级共享依赖?

规模改变了一切:
- 小团队可以口头沟通,大团队需要工具和流程
- 小项目可以手动测试,大项目需要自动化
- 小仓库可以快速重构,大仓库需要渐进式改进

2.4 可持续性

可持续的软件工程:

1. 代码可持续性
   - 可读性 > 聪明
   - 简单 > 复杂
   - 明确 > 隐式

2. 流程可持续性
   - 自动化 > 手动
   - 可重复 > 一次性
   - 文档化 > 口口相传

3. 组织可持续性
   - 知识共享 > 知识垄断
   - 心理安全 > 恐惧驱动
   - 持续改进 > 一成不变

三、实战案例

3.1 案例一:评估技术决策的时间影响

决策:是否引入一个新的框架?

短期评估(编程思维):
✓ 框架能让当前功能开发更快
✓ 团队有人熟悉这个框架

长期评估(软件工程思维):
? 这个框架3年后还在维护吗?
? 团队所有人都能学会吗?
? 升级框架的成本有多大?
? 如果框架被废弃,迁移成本是多少?
? 这个框架与我们的其他工具兼容吗?

结论:
不是"能不能用",而是"用了之后10年怎么办"

四、本章小结

软件工程 ≠ 编程:前者关注代码随时间的演变。

时间维度:短期、中期、长期的不同考量。

规模影响:规模改变了一切——沟通、测试、重构。

可持续性:代码、流程、组织的长期健康。


五、思考与练习

用一个你经历过的例子说明"编程"和"软件工程"的区别。

评估一个你正在使用的技术栈的可持续性。

如何在一个小团队中实践软件工程思维?


1/8软件工程
0%