本文适合:正在做项目交付的工程师、想从"写代码"过渡到"做工程"的开发者、对软件工程感兴趣但觉得理论枯燥的同学。
你将收获:第一章5个核心概念的实战解读、3个一线项目踩坑案例、1套从"程序员思维"到"工程师思维"的认知升级框架。
写在前面
开始读《构建之法》第四版之前,我心里其实有个疑问:软件工程的书我翻过不少,大多读完就忘,因为跟日常干活的感觉对不上------书里讲流程、讲规范,现实里是需求天天变、人手永远不够、deadline从来不会延期。
但这本书第一章读完,我发现邹欣老师不是在教流程,而是在回答一个更底层的问题:为什么我们需要软件工程? 这个问题的答案,决定你怎么理解后面所有章节。
下面是我的读书笔记,穿插了一些自己项目中的真实体会,希望对你也有启发。
01 | 软件 = 程序 + 软件工程
这是全书开篇的第一个等式,也是整本书的"地基":
程序 = 数据结构 + 算法
软件 = 程序 + 软件工程
看起来简单,但这个等式背后藏着一个残酷的现实:能跑的代码 ≠ 能用的产品。
一个人在宿舍写个计算器,那是"程序"。但要让这个计算器被百万用户安装、不崩溃、能升级、能适配不同系统------就需要源代码管理、配置管理、质量保障、测试、需求分析......这些全都是"软件工程"的事。
书里还延伸了一步:
软件企业 = 软件 + 商业模式
光有技术不够,还得有人买单。
我的实战感悟
刚入行那会儿,我觉得写代码就是全部,能跑通、能交付就是胜利。后来参与一个跨团队大项目,代码明明没问题,上线过程却问题不断:环境配置不一致导致报错、多人改同一份代码互相覆盖、测试环境和生产环境数据库版本不同......每一件都不是"程序"的问题,但每一件都能让项目翻车。
这些"看不见的工程",才是让程序变成软件的关键。
一句话提炼
从"代码思维"到"工程思维"再到"商业思维"------每往上走一步,你的视野和决策质量都会上一个台阶。写代码只是等式最左端的一环。
02 | 为何需要软件工程
这个问题的反面更有意思:没有软件工程会怎样?
书里梳理了软件开发的四个阶段演进:
|------------|------------|------------------|
| 阶段 | 特征 | 需要软件工程吗? |
| 玩具阶段 | 一个人写着玩 | 不需要 |
| 业余爱好阶段 | 小团队搞搞 | 勉强不需要 |
| 探索阶段 | 团队变大、需求变多 | 开始需要 |
| 成熟产业阶段 | 大规模协作、长期维护 | 必须有 |
前两个阶段靠个人英雄主义还能撑住。一旦项目规模上来、团队协作变复杂,没有工程方法就是灾难------需求蔓延、进度失控、代码腐化、人员离职导致项目瘫痪。
踩坑案例
我之前经历的一个项目:早期3个人开发,效率极高,老板觉得"这团队真行"。后来扩展到十几个人,突然就不行了------没有统一的代码规范,每个人写法不同;没有变更管理,需求随口一加就改;没有回归测试,改一个bug冒出来三个。
回头看,不是团队变弱了,而是项目复杂度越过了"个人英雄主义"能驾驭的临界点。
一句话提炼
软件工程不是"一开始就该有"的,而是"复杂度到了就必须有"的。关键是要能判断自己处于哪个阶段。
03 | 软件工程的目标:创造"足够好"的软件
这一节是整章最打动我的部分。
目标不是"完美的软件",而是****"足够好"的软件****。
什么是足够好?书里给了四个维度的约束:
|------------|------------|--------------|
| 维度 | 含义 | 互相牵制 |
| 时间 | 项目截止日期 | 想要快?砍范围或降质量 |
| 成本 | 预算和人力 | 想要高质量?多花时间和钱 |
| 范围 | 功能覆盖面 | 想要全?加时间和成本 |
| 质量 | 可靠性和体验 | 想要稳?牺牲范围或时间 |
四个变量互相牵制,你不可能同时全要。 工程的本质就是在约束之间做取舍。
我的血泪教训
我以前是"代码洁癖"型的人,每个函数都要写得优雅、每个边界条件都要覆盖、每个设计都要符合原则。结果呢?需求都变两轮了,我还在纠结第一个版本的架构够不够干净。
后来被项目逼着学会了"先跑通再优化",反而交付效果更好。这不是偷懒,而是认识到:在截止日期前交付可用的东西,本身就是一种专业能力。
做研究和做工程的思维模式完全不同:
|------|--------------|--------------|
| | 做 研究 | 做 工程 |
| 追求 | 最优解 | 可行解 |
| 核心问题 | 理论上能不能做到 | 现在值不值得做 |
| 评价标准 | 正确性、优雅度 | 交付价值、用户满意度 |
用研究思维干工程的活------总想一步到位,结果永远在重构,永远没交付。
一句话提炼
"足够好"不是妥协,而是在约束条件下做出最优决策。这才是工程师的核心能力。
04 | 软件工程的广阔天地:知识领域与内涵
这一节像一张全景地图,让我看到软件工程不只是"写代码+管项目"那么简单。
书里列出了九大知识领域:
|--------------|----------------|----------------|
| 知识领域 | 解决什么问题 | 我的熟悉程度 |
| 软件需求分析 | 搞清楚到底要做什么 | 还行 |
| 软件设计 | 怎么架构和拆分 | 还行 |
| 软件构建 | 写代码本身 | 熟悉 |
| 软件测试 | 验证做对了没有 | 还行 |
| 软件维护 | 上线之后的事 | 一般 |
| 配置管理 | 版本、环境、依赖的管控 | 薄弱 |
| 工程管理 | 进度、风险、资源协调 | 还行 |
| 软件过程 | 用什么流程组织所有活动 | 一般 |
| 质量保障 | 贯穿全程的信任体系 | 薄弱 |
坦白说,我自己在配置管理和质量保障上认知很薄弱。以前觉得CI/CD是运维的事,质量保障是测试的事,但实际上这些是每个工程师都该有概念的"基础设施"。
第四版特别提到了参照ACM/IEEE-CS/AAAI《计算机科学课程指南2023》的核心知识单元,并融入了胜任力模型。这是前三版没有的更新,说明在AI时代,软件工程的知识边界在扩展------不只是技术能力,还包括职业素养和伦理意识。
一句话提炼
这张知识地图最大的价值是帮你"查漏补缺"。你不需要每个领域都精通,但至少要知道每个领域在解决什么问题,不然遇到问题都不知道往哪个方向找答案。
05 | 软件工程与计算机科学
这两者的关系,书里用了一组对比,我觉得特别精准:
|------------|---------------|--------------|
| 维度 | 计算机科学 | 软件工程 |
| 核心问题 | What(是什么) | How(怎么做) |
| 追求 | 最优解 | 足够好的解 |
| 变量 | 相对固定 | 不断变化 |
| 评价标准 | 正确性、复杂性 | 交付价值、用户满意度 |
| 时间维度 | 无限期探索 | 有截止日期的约束 |
一句话总结:计算机科学是"发现"的世界,软件工程是"构建"的世界。前者给你弹药,后者教你在战场上活下来。
做交付工程师后,我对这个区别感受极深。客户不会关心你的算法是不是最优的,他关心的是"这个功能什么时候能用""上线之后稳不稳""出了问题多长时间能恢复"。这些问题都不是计算机科学的范畴,但恰恰是软件工程必须回答的。
一句话提炼
技术只是手段,交付才是目的。很多技术出身的同事在项目中陷入困境,根源往往就是用"科学思维"干"工程活"。
干货复盘
|----------------|--------------------|
| 本章核心概念 | 一句话理解 |
| 软件=程序+软件工程 | 能跑的代码不等于能用的产品 |
| 为何需要软件工程 | 复杂度到了就必须有,不是可选项 |
| 目标是"足够好" | 在约束条件下做最优取舍,而非追求完美 |
| 九大知识领域 | 帮你查漏补缺的全景地图 |
| 与计算机科学的区别 | 科学发现世界,工程构建世界 |
第一章 最大收获: 软件工程不是一套工具或流程,而是一种在约束下做决策的思维方式。我们日常纠结的需求变更、技术选型、进度压力,本质上都是在做同一件事------在不确定性中找到"足够好"的路径。
下篇分享第二章:个人技术和流程。如果这篇笔记对你有帮助,欢迎转发给也在学软件工程的朋友。