从算法到软件
复习
- 编译器总装:源码能被编译、链接并运行
- 数据结构与算法:用合适的结构与算法高效解决问题
- 测试:正确之外,还要考虑出错与验证
TL;DR
- 能算出答案,不等于软件已经完成
- 软件还要被人使用、阅读、修改和维护
- 它面对真实输入、真实用户与长期变化
- 算法是软件的核心,但不是全部
正文
走到这里,你已经能让一段程序正确地跑起来,也能为它挑选合适的算法。但一个很现实的问题摆在面前:“能算出答案的程序”,离一个真正的“软件”,还差多远?
一次性程序 vs 长期使用的软件
很多练习里的程序是一次性的:输入给定、输出正确,就完事了。可真实的软件不是这样。它会:
- 被很多人长期使用
- 收到各种不规范的输入(错的、空的、超大的)
- 被反复阅读和修改
- 在需求和环境不断变化中存活很多年
这就要求它不只是“算得对”,还要易读、易改、不易坏、出错时能查。这些,正是软件构造(software construction)关心的东西。
差在哪
一个算法正确的程序,可能还缺这些:
- 没弄清需求:做出来的不是用户真正要的
- 一团乱麻:没人看得懂,也没人敢改
- 一碰就碎:边界输入、异常情况就崩
- 出了问题查不出:没有日志,无法定位
- 多人没法协作:代码无法合并、无法维护
算法解决“怎么算”,软件构造解决“怎么把它做成一个能长期用的东西”。 前者是核心,后者是让核心真正落地的过程。
这一部分要讲什么
接下来的章节,会依次覆盖:从需求到设计、找错与验证、协作与构建、运行与维护。它们大多不是“算法”,却决定了一个软件能不能真正被用起来。
这不意味着算法不重要——恰恰相反,好的算法是软件的骨架。只是当程序要走向真实世界时,还需要在骨架上,装上能让它长久运转的血肉。
思考题 1
“能算出正确答案”的程序,为什么还不等于一个软件?
思考题 2
软件与一次性的程序,最大的区别是什么?
小结
知识点
- 算法正确不等于软件完成
- 软件需长期使用、阅读与维护
- 要应对真实输入与异常情况
- 软件构造关注“如何做成可长期使用的东西”
参考资料
- Wikipedia(zh):软件工程:系统化地开发与维护软件
- Wikipedia(zh):软件构造:把设计落实为可运行软件的过程
思考题答案(仅供参考)
思考题 1
因为它可能只对给定的输入算得对,却未必能应对真实世界的各种输入,也未必易读、易改、易维护,更未必在出错时便于排查。软件不仅要“算得对”,还要能长期、可靠地被使用和维护。
思考题 2
一次性程序只求某次运行结果正确;软件则要被长期使用、反复修改,面对真实用户与不完美输入,还要多人协作、可读可维护。也就是说,软件要在“时间和变化”中存活,而不只是算对一次。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪