实际工作中的编程需要用到多少数学知识

:: 翻译, 杂谈

By: David Gao

如果只是做应用(网站/app)或多数的内部工具(自动化一些流程),基本用不到什么数学 知识,会数数就行了。也就是说,多数程序员的搜索引擎驱动的编程方式与数学关系不大:)

原文地址:How much math you need for programming

每当我打算学习算法的时候,这些算法中使用的数学似乎成为了无法逾越的障碍。我必须要 承认我的数学并不好,但是也不是那么糟糕,但这种“还不错”的知识水平是无法应对科技四 巨头1水准的算法和满足他们空间,时间复杂度需求的排序及搜索技术的面 试。我需要学习这些知识,因此我搜索到了几片关于编程所需数学技能的文章。将数学应用 到编程的,最著名的支持者就是Steve Yegge。 以下是我找到的在编程时所需的数学技能相关文章:

  1. Steve Summit(一位文笔出色的C-FAQs的作者)的数学笔记
  2. Steve Yegge他写的两篇文章Math EverydayMath for Programmers
  3. Eric S. Raymond的论成为一个黑客需要多少数学知识
  4. Paul Graham的on Math
  5. Evan Miller对前面三位作者进行回应的文章The Mathematical Hacker
  6. Steven Noble对Evan Miller计算斐波那契数列例子回应的文章 On calculating Fibonacci numbers in C

如果读者您还没阅读上面这些文章,我想您可能会对本博文试图阐述的观点产生一定的误解。 根据 Steve Summit、Eric Raymond 和 Paul Graham 的说法,您无需过多关注数学即可成 为出色的程序员、黑客(维基百科定 义 和 Eric Raymond的 关于黑客的定 义 )。Steven Noble的说法是读者应当学习一些数学,并且Evan Miller似乎赞同这些人的观 点,但是也有自己不同的看法。我开始编程仅仅是因为我喜欢它。

从2009年开始,我就是一个职业的C程序员,有时候也会使用C++,并且绝大多数时间我在使 用Linux和一些Unix。我对编程的热情使我能够使用多种不同的计算语言编写代码且能读懂 多种计算机语言编写的但吗,从中我学习到了多种不同的思维方式。 编写代码是非常容容 易的,但是使用特定语言并按照其规范进行建模是一项复杂,艰巨且耗时的任务。我的经历 告诉我:编程并不是数学。让我在说一次好了,编程并不是数学,并且它永远也不会成为 数学。如果读者想学习编程,那就去学习编程好了。不要去翻数学书,去阅读自己所使用计 算机语言的新闻组(例如comp.lang.c,comp.lang.lisp)。并且使用 Pan 这种新闻阅读器去阅读。阅读GNU中的软件源代码,并使用Linux发行版来进行日常工作(我 比较喜欢二进制文件比较少的发行版)。如果读者想通过学习大量数学知识,来学习计 算机编程,那么读者会感到非常困惑并且读者已经完全朝着一个错误方向前进,者很难是读 者学到太多编程相关的知识。

作为程序员,我们不断的在编程,为什呢?我们编程解决真实世界重的问题。这正是程序员 的工作,不断的解决各种问题。

那么数学家是做什么的?他们要去理解自然,并且用数学作为语言将它描绘出来,这是数学 家的工作。数学已经帮助我们解决了真实世界中很多问题。让我们来看看量子力学,它是物 理学的一个分支,它改变了我们数千年来关于原子的假设,并且它非常以来数学。数学无处 不在,不管是化工行业还是社会统计科学。在我们身边,我们时时刻刻都可以感受到数学的 影响。数学已经被作为非常重要的工具,不单单是用来让我们理解自然,同时也在不断解决 各种真实世界的问题。这是有原因的,因为这些属性都是数学的固有属性。

作为程序员,我不擅长数学,所以我试图用我的直觉、常识、流程图和更多其他类型的图表 来解决每天面临的问题。就这样持续了几年,我突然想到我正在建立一个模型来解决问题。 建立这个模型只有一个目标:清晰且简单描述问题是什么,解决方案是什么。我正在创建一 个模型,将一个问题作为输入提供给它,它将使用英语、流程图和我创建的许多其他类型 的图表生成一个解决方案作为输出。当然如所有人所知道的一样,这个模型需要有一定的前 提,规则和条件。清晰且简单是它的重中之重。它是一种通用的且抽象的机制,可以用于解 决问题。几个月前,我看到Evan Miller为了回应Bret Victor的Kill Math 而写的另一篇文章Don’t Kill Math

这两篇文章给我带来了巨大的冲击。首先,Bret 一直在尝试做我前几年就开始尝试的事情, 并且他在某些方面的产出远比我成功。我始终未能想出一些可以用来解决很多人问题的稳定 模型,但是Bret做到了这点。我会感到高兴吗?是的,因为我知道了我想要的东西,因此我 随时可以追随Bret的脚步,但是我没有这样做。为什么呢?

我始终未能找到稳定的模型是有原因的。因为我总觉得缺少一些东西。不管我怎么做,我付 出多少,依然会感觉缺少一些基础和基本的东西。每当我研究薛定谔方程、麦克斯韦方程、 牛顿定律、开普勒定律、不确定性原理或者Shulba Sutras 我都会感到这些东西是成体系的,但是我的模型不是。Kill MathDon’t Kill Math 这两篇文章,让我充分的认识到什么是完整性。它是Don’t Kill Math 中提到的一个数学特性。Evan在文章中提出的问题,以及他用最简单且容易立即的方式进行 了详细的解释,这使我结束了我对模型的探索。数学是一种简明扼要的解决问题和理解现象 的方法。这种行之有效的特性是数学固有的,就像灵魂是每个人都拥有的一样。使用数学方 法,可以让解决问题更简单且更容。

这让我想到一个非常基本的问题:为什么我讨厌数学? 我想这和学校教我数学的方式有莫 大的关系。我被教的是死记硬背的数学公式,解题方法,但是真正的数学并不是这样。 这 是学校的错,是我们教育系统的错,而不是学生的错。 回到我们是否需要数学才能成为一 名出色的程序员这个最开始的问题上

让我来展示下这个世界一开始是如何解决问题的:

然后使用数学方法,这就是大多数数学家所做的:

几乎所有计算机程序员/软件工程师/开发人员所做的:

Evan Miller阐述的观点是,读者可以在不使用大量数学的情况下成为一流的黑客,我是赞 同他的观点,并且这和其它的作者也是一致的。但是他强调,数学可以解决现实世界中问题 的作用和重要性,数学是可以非常有效的解决现实世界问题的一种方法。作为程序员,我们 在不断解决问题,但是如果我们使用数学解决问题,并将数学模型应用到我们的解决方案上 时,这也许会给我们带来一些意想不到的解决方案,这将使我们的工作和生活更加轻松(就 行副作用)

到了该总结的时候了:

  • 读者想要成为一流的程序员,并不需要数学,因为我们并不经常直接使用数学。如果读者 想成为程序员,还是应该专注于编程的学习。计算机编程和数学有非常大的差异,作为程 序员,我们需要专注如何编写更优的代码,如何使用特定的范式(例如函数式、面向对象、 泛型、程序、逻辑、声明等),如何创造更好的软件,我们也需要去理解设计模式,毋 庸置疑我们需要去学习C并使用它,从而让我们更好的理解计算机。这些其实都和数学没 有什么关系。我们需要先学习这些东西,并逐步掌握它们,当这是如果我们还有意愿,我 们就可以去学一些更深的数学知识。通过阅读Roberrt J. Chassell编写的Introduction to Progrmming using Emacs Lisp ,我们可以获知如何得到一个可定制的,自描述的,可扩展的实时交互式的文本编辑器。 阅读GNU Make Manual 就可以找出它为什么需要 M4Autoconf
  • 数学是理解这个世界的本质和解决问题而被广泛使用的工具。我们可以透过学习数学方法 来学会更多解决问题的方法。我已经开始学习概率了,就像Steve Yegge所说的那样,一 旦我们理解了数学,我们就可以判断一个问题是否是概率问题,微积分问题还是统计学问 题等。数学是和问题本质相关,但是软件不是,软件工程有自己解决问题的方式和工具, 我们仍需牢记这一点。

参考资料