这本书刚读时候以为是讲数学理论的,逐渐意识到其对数学史的分析非常广泛而深刻,然而读到最后意识到作者想表达的还有数学、物理(自然科学的缩影)以及人的符号和知识体系、研究方法之间的关系。
最近借了本Robert Sedgewick 的 Introduction to Programming in Java An interdisciplinary approach,因为从他的那边Algorithms(红皮书)写作风格和在线内容体会到此人的其他教程可能也一样非同寻常,结果真的是再次被震动了:用最简单的编程工具,比如某个案例里就用几个if else,表达非常深刻而且简练的计算过程,这是绝大部分碰到过的教程都没有的。当然也很惭愧,很多用最基本语法写成的短小代码都很难看懂,说明真正的“编程”训练还需要很长的路。
然而这些精炼深刻的代码不是主要源于对编程语言、(狭义的)软件开发本身的了解,而是对数学、物理现象、计算过程以及逻辑本身的认识。这一点也是很多人都常常提到的。
类似地,Negative Math:How Mathematical Rules Can Be Positively Bent 这本书从对数学和一些自然现象本身的理解给读者展现了一幅对负数及相关概念探索、建构、接受以及升华的历史画卷,以此说明一个重要的道理:数学规则是人为约定的,一开始源于基本的物理现象(比如长度、数量)后来逐渐成为自称一体的形式系统「邱奇所谓的“形式语言”」,与人们常常认为的数学是物理的语言、数学是最精确的语言不同,数学只是对物理现象粗略的描述,而物理对数学的采用和修正的历史已经证明从物理现象本身探索并丰富(甚至彻底修改部分)数学体系的合理性和重要性。
作者先从习以为常的负数概念出发,通过数轴零点两侧负数、正数的不对称特征「比如正数乘以正数还是正数,负数乘负数在我们学到的“数学”中则变成正数跑到另一侧去了」引出负数的一些异常现象,然后结合与负数密切相关的虚数讲述历史上人们多次根据其物理解释欠佳而对负数的拒绝,比如虽然负数可以表达欠款等金融概念,却没有“负长度”等几何意义。然而19世纪由于物理学大发展对数学工具的需求增加,负数使用带来的各种便利使得人们不再“苛求”其物理意义,而非欧几何的出现摧毁了人们上千年秉持的“集合完美论”这一创建其他数学分支的基础,各个数学分支也进一步独立发展,对负数的疑惑被进一步认识成数学语言与物理现实之间的关系的思辩。
在引言部分作者反驳了一些反对质疑数学体系的看法,比如为何要探究数学语言背后、历史上的聪明人一定把问题解决掉了后人何必操心等等。实际上很多问题唱思常新,更何况常常问题不会随着历史而自然解决,比如人们一度忘记问题、对问题不再感兴趣等。
在独立思考更加难得的今天,这本成书与2006年的不大不小的书探讨的问题真可谓永恒。
这对学习编程、软件开发有什么启发?首先我觉得提升综合素养、锻炼思辩能力本身就是无价的,不一定什么时候发挥作用;作者对历史的叙述和数学问题分析水乳交融,把问题彻底理清并深入浅出地分析本身就是“可转化技能”。
其二这本书有助于思考各种对数学和编程关系的看法,以及对编程本身的认识:编程不一定强行采用通行的数学模型,可以创造自己的数学语言,实际上编程语言本身就可以视为非常好的“数学语言”(形式语言),由此看来模拟物理现象时候的方法其实还处于探索的初级阶段,比如一些开源的机器学习库能够计算一些比较复杂的物理现象,像图像识别,但距离更高层级的东西还很远。实际上使用传统的数学探索“情绪的数学模型”、“嗅觉的数学模型”也是非常不利的,而且如作者书后半部提到的,“这些(形式)模型能比较精确地模拟物理现象整体,却无法揭示其中间过程”。
相比那些片面无理夸大、神秘化“数学”的教程和言论,我认为这本书谈了些难得的真话。这些话正巧以更抽象地方式表达在图灵的老师邱奇等人的书中。
目前我远不能阅读scikit-learn、deeplearning4j等库的源码,更别说自己写以机器学习为代表的复杂计算的代码,然而我清楚地了认识到了这些东西背后存在着迥异于绝大部分数学教程所呈现的思维方式和计算过程,这些巧的东西是非常珍贵的,估计一般难以展示。代码虽然可以开源,代码本身无法体现的逻辑构造和思维方式才是重点。
本书还涉及西方数学传统、若干重要数学工具(比如微积分)的发展脉络以及以“负数乘负数等于负数”为公理的微型数学系统创建为例所展示的模型探索方法等内容。