Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

从算法到软件

复习

  • 编译器总装:源码能被编译、链接并运行
  • 数据结构与算法:用合适的结构与算法高效解决问题
  • 测试:正确之外,还要考虑出错与验证

TL;DR

  • 能算出答案,不等于软件已经完成
  • 软件还要被人使用、阅读、修改和维护
  • 它面对真实输入、真实用户与长期变化
  • 算法是软件的核心,但不是全部

正文

  走到这里,你已经能让一段程序正确地跑起来,也能为它挑选合适的算法。但一个很现实的问题摆在面前:“能算出答案的程序”,离一个真正的“软件”,还差多远?

一次性程序 vs 长期使用的软件

  很多练习里的程序是一次性的:输入给定、输出正确,就完事了。可真实的软件不是这样。它会:

  • 被很多人长期使用
  • 收到各种不规范的输入(错的、空的、超大的)
  • 被反复阅读和修改
  • 在需求和环境不断变化中存活很多年

  这就要求它不只是“算得对”,还要易读、易改、不易坏、出错时能查。这些,正是软件构造(software construction)关心的东西。

差在哪

  一个算法正确的程序,可能还缺这些:

  • 没弄清需求:做出来的不是用户真正要的
  • 一团乱麻:没人看得懂,也没人敢改
  • 一碰就碎:边界输入、异常情况就崩
  • 出了问题查不出:没有日志,无法定位
  • 多人没法协作:代码无法合并、无法维护

  算法解决“怎么算”,软件构造解决“怎么把它做成一个能长期用的东西”。 前者是核心,后者是让核心真正落地的过程。

这一部分要讲什么

  接下来的章节,会依次覆盖:从需求到设计、找错与验证、协作与构建、运行与维护。它们大多不是“算法”,却决定了一个软件能不能真正被用起来。

  这不意味着算法不重要——恰恰相反,好的算法是软件的骨架。只是当程序要走向真实世界时,还需要在骨架上,装上能让它长久运转的血肉。

思考题 1

  “能算出正确答案”的程序,为什么还不等于一个软件?

思考题 2

  软件与一次性的程序,最大的区别是什么?

小结

知识点

  • 算法正确不等于软件完成
  • 软件需长期使用、阅读与维护
  • 要应对真实输入与异常情况
  • 软件构造关注“如何做成可长期使用的东西”

参考资料

  1. Wikipedia(zh):软件工程:系统化地开发与维护软件
  2. Wikipedia(zh):软件构造:把设计落实为可运行软件的过程

思考题答案(仅供参考)

思考题 1

  因为它可能只对给定的输入算得对,却未必能应对真实世界的各种输入,也未必易读、易改、易维护,更未必在出错时便于排查。软件不仅要“算得对”,还要能长期、可靠地被使用和维护。

思考题 2

  一次性程序只求某次运行结果正确;软件则要被长期使用、反复修改,面对真实用户与不完美输入,还要多人协作、可读可维护。也就是说,软件要在“时间和变化”中存活,而不只是算对一次。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪