软件工程
什么是软件工程
软件工程(Software Engineering)是关于如何系统化地构建高质量软件的学科。它不只是"写代码" — 它关注的是整个软件生命周期:需求分析、设计、实现、测试、部署和维护。
你一个人写一个课程作业,不需要软件工程。但当项目规模变大、团队人数变多、维护周期变长时,没有工程方法论就会出大问题 — 代码混乱、bug 频出、改一个功能牵一发动全身。软件工程就是解决这些问题的。
为什么要学软件工程
写出能维护的代码。 你会写代码,但你写的代码半年后还能看懂吗?换一个人能接手吗?软件工程教你写出可读、可维护、可测试的代码。
学会团队协作。 真实世界的软件都是团队开发的。版本控制、代码审查、任务分工 — 这些协作技能是软件工程师的基本功。
理解"好软件"的标准。 不是能跑就行。好的软件要正确、可靠、高效、可维护、可扩展。软件工程帮你建立这些质量意识。
面试和职业发展。 软件工程的实践能力(代码质量、系统设计、工程习惯)是大厂面试和日常工作的核心考察点。
核心知识模块
代码质量
- 代码可读性:命名规范、注释、代码风格
- 代码审查(Code Review):如何给别人的代码提反馈,如何接受别人的反馈
- 静态检查与测试:类型检查、lint 工具、单元测试、集成测试
- 技术债务:短期妥协与长期成本的平衡
规格与设计
- 规格(Specification):前置条件、后置条件、行为等价性
- 抽象数据类型(ADT):封装、表示独立性、抽象函数与表示不变量
- 接口设计:好的接口长什么样,怎么设计可复用的组件
- 不可变性(Immutability):为什么不可变对象更安全,什么时候用可变
版本控制与协作
- Git 工作流:分支策略、合并 vs 变基、PR/MR 流程
- 团队版本控制:多人协作的 Git 实践
- 持续集成(CI):自动化构建和测试
软件设计原则
- 单一职责原则:一个类只做一件事
- 开闭原则:对扩展开放,对修改关闭
- 依赖倒置:依赖抽象而非具体实现
- DRY 原则:不要重复自己
并发与安全
- 线程安全:共享可变状态的风险
- 锁与同步:synchronized、Lock、死锁
- 消息传递:用消息队列代替共享内存
怎么学
从一门好课程开始。 软件工程不是靠看书能学会的,需要在实际项目中练习。推荐 MIT 6.031 Software Construction — 这门课把软件工程的核心概念讲得非常透彻,每节都有配套练习。
在真实项目中实践。 找一个有几千行代码的项目(开源项目或者课程大作业),练习代码审查、写测试、重构。理论不实践,永远停留在纸面上。
养成工程习惯。 每次写代码都问自己:这段代码别人能看懂吗?测试覆盖了吗?有没有更简洁的写法?这些习惯比任何具体技术都重要。
读优秀代码。 GitHub 上有大量高质量开源项目。读它们的代码结构、命名方式、测试组织,比看十本教材都管用。
推荐资源
系统课程
- MIT 6.031: Software Construction — 强烈推荐。30 个阅读材料覆盖核心主题,每个都有配套练习
- Berkeley CS169: Software Engineering — 侧重敏捷开发和 SaaS 架构
- CMU 17-313: Foundations of Software Engineering — CMU 的软件工程基础课
书籍
- 《代码整洁之道》(Clean Code,Robert Martin)— 关于如何写出可读、可维护的代码
- 《重构:改善既有代码的设计》(Refactoring,Martin Fowler)— 系统化的代码重构方法
- 《设计模式》(GoF)— 经典设计模式参考书