数学系怎么往编程的方向走?

感谢邀请,虽然以自己的资历显然产生不了什么有用的意见,但我的确有点想法愿意写下来。

几天前我们邀请到 @David Mao 来作为嘉宾录制的一期 podcast(内核恐慌 #12: 数学与编程)。David Mao——或者应该叫他更为人所知的昵称,木遥——的资历是:数学奥赛保送北大数学系、UCLA 应用数学博士、明尼苏达大学博士后、Google 员工。木遥的窗子 这个 blog 上面有他从二〇〇三年(我没写错年份)到今天写下的许多文章,你可以去读一遍,然后再回来看答案。其实应该说,你读完之后看不看我的答案一点都不重要。如果时间有限,我推荐和你的问题或许有点关联的三篇:
当然,如果只读这三篇,就错过了更大的宝藏。

以下是一些看法。数学系背景对于学习计算机来说是重大的优势,计算机理论的先驱是数学家、电子计算机的发明者是数学家、计算机语言的创始人也是数学家。所以有数学背景去学习编程,至少是学习编程问题中最为抽象和纯粹的那一部分,要比程序员学习数学要容易得多。只是传统数学教育里面可能会比较忽视离散数学领域的知识,这一部分却是对于计算机科学而言非常重要的。计算机科学所面对的可计算性、计算复杂度、数理逻辑、数论、数值分析之类的问题也许不太会在课堂上出现,而需要你付出额外的心力去自己学习。

除此之外,编程所需要的一种能力是「计算思维」,这也需要自己培养。它使得你能够将现实世界中的问题转化为可以用计算机解决的数学模型,这就是所有的编程知识和技巧所服务的最终目的。当然这并不是说编程就不需要磨练技巧,恰恰相反,和解题一样,编程技巧也需要大量的习题来锻炼、内化。我觉得大学里的余裕让你有这样的资本可以将所有你能够涉及的编程语言都接触一下,用木遥的话说,如果他回到十年以前,一定会把市面上所有的语言都学一遍。也许 C++ 会让你对编程语言的复杂度有认知上的偏差,但实际上许多语言都比 C++ 简单得多,上手很容易。以较低的成本一步步提升编程能力比较容易,也更有乐趣。

书的话我可以推荐:
  • Knuth 的《具体数学(Concrete Mathematics)》(注意找第二版。评论里有朋友说数学系的话这书翻一翻就可以了,也许是对的)。
  • Structure and Interpretation of Computer Programs(SICP),以 Scheme 语言讲授一些初见时略为晦涩的概念,初看时也许会产生「学这个能干啥」的困惑(或者,因为你是数学专业的学生,不会产生这样愚蠢的疑问,那就更好了),但是读完一定会有很好的助益。
  • Essentials of Programming Languages,相比 SICP 要切实具体一些,帮助你弄懂现实中语言背后的机制。
  • Seven Languages In Seven Weeks,为你介绍一些常见的编程范式。
  • Code: The Hidden Language of Computer Hardware And Software,一本讲编码和计算机原理的书,可以归为我自恨「怎么没有早点读到」的那一类书。
以上书籍最好只读英文版,可以省去很多自以为是捷径的弯路。

以下三本倒是可以读中文版:《最后期限 (豆瓣)》、《人月神话》和 Joel on Software

当然,我不确定你说的「往编程方向走」具体是什么意思,如果是希望纯粹以编程为业,多少有些可惜了。我觉得还是熟练掌握编程这一技能之后利用它去做自己喜欢的事情更好。

希望对你有所帮助。
原发布于 https://www.zhihu.com/question/28569688/answer/41485058