日更134天 - (翻译)The Mathematical Hacker(下)

尽管函数式编程具有美学上的优点,但我发现前面的解决方案比它们的递归对应方案更漂亮。它们在恒定(而不是线性)时间内运行,而且很容易适应非整数输入的工作。更重要的是,它们鼓励程序员提出并研究这些问题:为什么斐波那契方程涉及5的平方根?取一个分数的阶乘是什么意思?这些问题都有巧妙的答案,而仅靠递归关系是不容易发现的。

在对其递归解决方案进行编码之后,Lisp黑客更有可能提出一个无关紧要的问题:我如何才能将这两个函数简化为一个函数?

Lisp黑客传统的问题在于,它过度关注编程的问题--编译器、抽象、编辑器等等--而不去思考程序员知识范畴之外的思路。我猜想,Lisp学校的论文作者--Raymond、Graham和Yegge--提到 "不需要数学",是因为他们把时间花在担心如何使代码更加抽象上。这种想法可能会导致紧凑、强大的代码库,但用经济学的语言来说,有一个机会成本。如果你只考虑你的代码,你就没有机会发现外面的世界,以及可能最好地描述它的数学方程式。

尽管二十一世纪的早期似乎更倾向于Lisp派的哲学,但我预测本世纪余下的时间将属于那些能够成功地将数学应用于实际问题的Fortran派的程序员。宣称大多数编程问题 "不需要数学 "是很诱人的,但这只是在制造、供应链管理或棒球领域,"不需要数学 "也许是正确的:高级数学对现有的从业者来说似乎完全没有必要,但只是在我们没有发现特定的数学概念是思考手头问题的正确方式之前。一旦发现了这个对应关系,数学就至关重要了。

我对计算机编程中的数学的未来感到乐观的原因有两个。第一个是与网络公司产生的数据量的增长有关("大数据")。随着更多类型的数据在手,有更多的方程可能被实用化。由于这个原因,人们对先进的机器学习技术很感兴趣,即使是简单的统计技术也可能被证明有至少同样多的应用。应用于商业数据的数学将产生更好的商业洞察力,更有效的运作,更好的产品(如推荐)和新产品(如预测服务)。

我对数学在计算机编程中的地位持乐观态度的第二个原因是:普通消费者拥有的数据比以往任何时候都多,而数学可以帮助人们理解这些数据,或者至少使其更加美观。传统上被认为是 "科学计算 "的应用领域(例如,地理信息系统或图像处理),现在对拥有(例如)地理标记的数字照片集的普通人来说很感兴趣。例如,Instagram是建立在对图像的颜色通道进行操作的几个方程式上。对数学的理解可以帮助程序员为用户解决实际问题,并提供一个更令人愉悦的体验。(为此,你可能会喜欢我以前的文章《Winkel Tripel Warping Trouble》)。

说到底,数学并不能帮助你理解计算机编程。它不是为了寻找隐喻,或理解永远不会被应用的 "基本原理"。相反,数学是理解世界上各种现象的工具:行星的运动,数据的模式,对颜色的感知,或者世界上无数的事情,通过数学公式都可以更好地理解。黑客的工作是找出如何将洞察力编码成一段可以反复使用的代码。

我们是否应该回到过去的好日子,即人们用Fortran编程,所有东西都是一个数组?很难说。我们需要的是在黑客教育中注入应用数学。在Lisp学校的论文中长大的黑客们知识面太窄了。我们需要实例、教程和成功案例,来展示数学在计算机程序中的成功应用。尽管大多数计算机程序员不爱炫耀,但我们需要黑客们在发现新的有趣的数学应用时能广而告之。我们需要宣扬这种科学好奇心精神。

最后,我们需要下一代有抱负的黑客将数学纳入他们的自学计划。我们需要大学生学习物理学、工程学、线性代数、统计学、微积分和数值计算等课程,我们需要他们教育那些从小就对这些东西一无所知的长辈们。随着大数据的增长,以及使用Fortran的守旧派即将消亡,新晋的数学黑客们有大量的机会,要更严谨的方式思考问题,为世界带来改变。

总结:程序员和数学家还是两个不同的领域,能融合当然更好。
程序员还是个低门槛的行业,进入这个行业不需要数学;数学是个加分项。

image.png

日更133天 - 小说《大染坊》
日更132天 - 西线无战事
日更131天 - (翻译)The Mathematical Hacker(中)
日更130天 - (翻译)The Mathematical Hacker(上
日更129天 - (翻译) C语言学习中的数学知识简要说明
日更128天 - (翻译) 编程是否需要数学(下)
日更127天 - (翻译) 编程是否需要数学 (上)
日更126天 - 知识付费是士力架还是人参果
日更125天 - 整理下自己的手机,别让它碎片化了我们的生活
日更124天 - 打造自己小环境
日更123天 - 杠杆
日更122天 - 收入的四个象限
日更121天 - 时光穿梭,回顾和展望
前日更120天索引

你可能感兴趣的:(日更134天 - (翻译)The Mathematical Hacker(下))