本书的构思过程
2017年秋,我与Manning取得了联系,得知他们有意出版本书。我由此开始将对本书的设想转化为具体的计划,这是一个漫长的过程。因为这是我第一次写书,所以写作过程比想象的困难得多。Manning对我最初的目录提出了一些难以回答的问题。
- 谁会对这个话题感兴趣?
- 这里会不会太抽象?
- 你真的能用一章的篇幅让大家学会在学校里要用一个学期才能学完的微积分吗?
所有这些问题都迫使我更仔细地思考哪些计划是可以实现的。下面,我会分享一些关于这些问题的思考,帮助你理解应该如何阅读本书。
我决定把本书的重点放在一个核心技能上——用代码表达数学思想。我认为,即使你不是程序员出身,这也是一个学习数学的好方法。我上高中的时候,在TI-84图形计算器上学会了编程。我当时就产生了一个宏大的想法:可以编写程序来帮我完成数学作业和科学作业,给出正确的答案并输出答题步骤。正如你所预料的那样,这比只帮我做作业要困难得多,但让我产生了一些很有帮助的想法。对于任何一种想通过编程解决的问题,我都必须清楚地了解其输入和输出,以及在解决方案的每个步骤中发生了什么。最后,我确信自己真正地理解了相关的数学资料,并实现了一个程序来证明这一点。
这就是我在本书中想与你分享的经验。本书中的每一章都是围绕一个具体示例程序来组织的,想让它可以运行,就需要把所有的数学知识正确地组合在一起。一旦完成这个过程,你就会充分相信自己已经真正理解了这个概念,并且可以在未来的某个时候再次使用它解决问题。我在本书中加入了大量的练习,来帮助你检查自己对数学知识和代码的理解。我还添加了一些小项目,邀请你对所学知识做出新的尝试。
我和Manning讨论的另一个问题是,应该用什么编程语言来编写示例。最初,我想用函数式编程语言,因为数学本身就是一种函数式“语言”。毕竟,“函数”的概念起源于数学,比计算机诞生的时间早得多。在数学的各个分支里,都有返回其他函数的函数,比如微积分中的积分和导数。然而,要求读者在学习新数学概念的同时学习一门陌生的语言(如LISP、Haskell或F#),会使本书更难读、更难理解。因此,我们最终选择了Python这门易于学习的流行语言。Python不仅有很多优秀的数学库,而且恰好是学术界和工业界数学爱好者的最爱。
我和Manning一起探讨的最后一个关键问题是,本书将包含哪些数学主题、不包含哪些主题。这很难选择,但至少我们在书名上达成了一致——Math for Programmers的宽泛性带来了内容上的一些灵活度。我的主要标准变成了:这是“程序员的数学”,而不是“计算机科学家的数学”。考虑到这一点,本书可以不包含离散数学、组合学、图表、逻辑、大表示法等主题。这些是计算机科学课涉及的主题,大多用于程序研究。
即便如此,还是有很多数学主题可以选择。最终,我选择专注于线性代数和微积分。我对这两个主题有很多想法,而且其中有很多不错的示例应用可以进行可视化和互动。无论是线性代数还是微积分,都可以单独写成一本厚厚的教科书,所以我必须写得更有针对性。因此,我决定将本书建立在机器学习这个前沿领域的一些应用上。有了以上决定,本书的内容就逐渐清晰了起来。