On this page · 6 sections
在计算之前,我们已经做了选择
“数学是工具箱”容易让人以为:现实先提出一个完整问题,然后我们挑选公式求解。但很多困难发生在公式之前。把什么当作对象,哪些差异可以忽略,什么算作更好,都会改变问题本身。
我更愿意把数学理解为一门翻译语言:它把模糊诉求转成可讨论的结构,再让计算检验这些结构的后果。这个理解并不意味着数学比材料、软件或组织更高一等;翻译若遗漏了关键语境,表达得越精确,反而越容易让人过度相信它。
三个节点足以暴露问题的层次
考虑一张说明性有向图:A 到 B 的代价为 2,B 到 C 为 2,A 直接到 C 为 7。若目标仅是总代价最小,A→B→C 的代价为 4,优于直接路径。这里的数字只是教学设定,不代表某个城市的距离或实际项目结果。
现在关闭 B→C。把原先的最短路径继续显示出来,会得到一个数值漂亮却无法执行的答案。正确处理是从可行图中移除这条边,重新求解,选择代价为 7 的直接路径。这不是算法变差了,而是问题已经改变。
模型如何进入软件
| 层次 | 本例中的决定 | 需要检查 |
|---|---|---|
| 对象 | 位置成为节点,可通行关系成为边 | 方向与可达性是否表达完整 |
| 目标 | 最小化边权之和 | 代价单位是否一致 |
| 约束 | 关闭的边不可使用 | 新状态能否及时进入图 |
| 实现 | 求解并返回路径或无解 | 返回结果是否仍满足当前约束 |
程序需要的不只是一个最短路函数,还包括明确的数据结构、输入验证和无解分支。只有当代价满足所用算法的前提,计算保证才适用;假设改变时,不能只换一份输入,却保留原来的保证。
测试也应从模型出发:关闭某条边后结果不能再包含它;所有出口都关闭时应返回不可达;返回路径的总代价应该等于各段代价之和。这样的检查把数学语言变成了程序可以承担的约束。
最低代价,不一定是最好的决定
假如代价只表示时间,模型不会自动考虑台阶、照明或使用者的体力。对于不同的人,同一条路径的可行性就可能不同。算法无法主动补上我们没有表达的需求。
反过来,把所有关切都压成一个分数也不总是进步。安全或基本可达性可能应成为硬约束,而不是允许用少量时间收益抵消的惩罚项。某些取舍需要先与实际使用者讨论,再决定能否量化。
共同语言的价值,也包括知道何时停下
数学抽象让问题可以被证明、比较、实现和反驳。但一次访谈、一段异常记录,可能提醒我们重新画图,而不是继续优化求解速度。共同语言的力量,在于让不同领域看见彼此的假设,不在于消除领域知识。
因此,我希望把学习分成一个循环:提出结构,写出前提,做出实现,再让现实指出缺口。数学不是最终裁判,而是让这个循环更清晰的一种纪律。
数学与技术不是一条单向箭头
我曾用数学指导物理、物理指导技术的链条整理知识。它能说明基础知识的重要,但现实关系也会反过来发生:工程遇到新问题,推动模型与方法改变;测量工具进步,又让原来无法观察的现象进入研究。
因此,“数学为王”对我更有用的含义,是掌握一种跨问题组织结构的能力,而不是给所有学科排等级。它需要与领域经验相遇,才能知道该抽象什么、该保留什么。
Sources & further reading
- ACM / IEEE-CS / AAAI · CS2023 ↗
Further reading · 计算机科学课程框架,作为学科范围的延伸阅读。
