1.1 软件工程到底在工程什么
软件工程不是“编程”的高级叫法。编程问的是:“我能不能把它写出来?”软件工程问的是:“当需求变化、用户依赖它、故障有代价时,一个团队还能不能持续让它正确运行?”
一个实用定义是:
软件工程是一门把不确定的人类需求,转化成可靠、可维护、可演进的软件系统的学科。
这个定义很重要,因为真实软件不是第一次跑通就结束。它会进入漫长生命期:需求变化、线上事故、数据迁移、新同事加入、新用户涌入、依赖升级、性能压力、安全问题,以及各种生产环境里的奇怪行为。
正在加载交互实验...
正在加载概念检查...
程序与软件系统
| 一个程序 | 一个软件系统 |
|---|---|
| 解决局部问题 | 长期服务用户 |
| 常常一个人就能理解 | 必须让团队共同理解 |
| 改一个文件就能修 | 需要测试、发布路径、监控和回滚 |
| 失败代价较低或较私密 | 失败可能公开、昂贵,甚至涉及伦理 |
这不是说每个脚本都要开架构评审会。意思是:工程投入应该匹配变化、协作和风险的强度。
注意
一个高级工程习惯:不要先问“这段代码聪不聪明”。先问“这段代码依赖哪些假设?这些假设失效时,我们怎么知道?”
四种工程压力
大多数工程实践都来自四种压力:
- 变化:需求、平台、用户、依赖、法规、业务优先级都会移动。
- 协作:多人需要共享理解,而不是互相读心。
- 风险:有些失败很贵、不安全、不公平,或者难以逆转。
- 反馈延迟:越晚发现错误,错误越昂贵。
代码很小也可能工程压力很高。一个 60 行的支付重试函数,可能比一个 3000 行的玩具应用更需要工程判断。
正在加载概念检查...
工程师真正设计的东西
软件工程师设计的不只是代码。他们还在设计:
- 模块与团队之间的边界。
- 通过测试、评审、日志、指标、用户反馈形成的反馈回路。
- 错误发布和错误数据的恢复路径。
- 产品、设计、工程、客服、运维能共同使用的语言。
- 决策记录,让未来维护者知道系统为什么长成这样。
好的工程常常让人感觉很稳。不是因为系统简单,而是因为重要风险有名字、有负责人、有检查、有恢复办法。
正在加载本节练习...