高中数学(理科思维)不是特别特别好,未来能做成优秀程序员吗?(转载)

作者:YY硕
链接:https://www.zhihu.com/question/26445506/answer/32864879
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我个人把写代码的工作分为五类,不一定正确和全面啊,就是个概念性的分类: 1. 第一类是结构性的工作。这类工作把特定的代码、代码段(函数)、代码库构成具有特定功能的程序,这些程序可以接受特定的数据、输出特定的数据。例子如网站的界面、 软件的界面、 软件的一些可视化功能,再复杂一些有网站前端如何与后端通信、如何分配用户请求给后端,如何处理两个并行的程序、通信过程、计算机系统等等。结构性工作需要的是经验以及对已有数据结构的了解,并不需要特别高的数学水平。我说的经验指的是对于一个特定的想要实现的功能,如何选择程序逻辑和数据结构去实现,这种选择的过程需要程序员有大量读写代码的基础,能够把要实现的功能和自己以前实现过的或者看到过的功能联系起来,设计出解决方案并实现。举个例子,比如说网页设计,通过HTML的元素构建页面,通过javascript给页面元素以动态,这个过程基本是“所见即所得”的过程。 目前大部分的互联网公司以及银行系统需求的主要都是这类工作。为了实现特定功能,程序有非常复杂的结构,必须要很多人一同参与编写和测试,因此才有了软件工程这门学科的诞生。 结构性工作的巅峰产物是计算机操作系统。计算机操作系统虽然复杂,但是其中涉及到的数学并不多,最复杂的数学就是如何处理多个任务的调度以及进行内存分配管理,都可以抽象成简单的离散数学和排列组合问题。不过,1万行的操作系统和100万行的操作系统的数学理论复杂度是差不多的,他们主要的区别是结构性的,而非数学上的。比如支持更多种CPU、硬件外设、网络协议等等。 2. 第二类是效率性的工作。这类工作把特定的工程问题抽象成数学问题,然后发明新的数据结构或者操作逻辑去优化解决问题的效率。最简单的例子是排序,用冒泡排序或者快速排序给大批量数据做整理有显著的时间差别,这个大家都知道的……计算机科学家们主要从事的就是这类工作,需要极高的组合数学和图论等知识。早期的效率性问题通常依靠较为复杂的离散数学,而近年来大部分问题都是应用图论来解决。解决这类问题需要程序员对大部分的数据结构都有深刻的理解,并且能够进行严格的理论分析,能够清楚地指出某种数据结构或操作逻辑的时间效率和内存效率。上面谈到的cqf 16岁发明的数据结构,就属于这类工作……反正我对这类工作毫无天赋,继离散数学败了以后,后来的高级算法课成绩也很差。 效率性工作的巅峰产物是一套书叫做《The Art of Computer Programming》,作者是斯坦福大学的教授Donald.E.Knuth。这部神书包含了人类已知的大部分计算机算法的理论分析和最优形式, 50年来被公认为算法领域的圣经。吃透这套书,就可以拿到世界上最好的程序员的工作了(比尔盖茨说如果谁看懂了这套书,就请把简历发给他……),当然这很不容易。我至今只认真看了第一本的前言。兼有前两类工作的巅峰产物是淘宝网,尤其是双十一前后的淘宝网。不解释太多,大家可以看文章《揭秘在淘宝买东西背后的复杂技术》。Google这两年在这方面做的不如淘宝,因为中国人实在太多了…… 3. 第三类是逻辑性的工作。指的是用计算机模拟人类的认知逻辑,这类工作包括语音识别、文字理解、信息检索、数据分析等等。这类工作最早属于高大上的人工智能、自然语言处理研究,后来随着互联网的兴起开始逐步进入大众视野。这类工作的主要基础是概率统计、机器学习和数据挖掘的模型,包含的数学知识主要有概率、线性代数和图论。由于互联网公司和金融公司对于机器学习的需求,相关的基础知识已经发展得非常成熟,如何学习这类知识也已经有很规范的教程。如今在硅谷,程序员不懂点机器学习,都不好意思出门和人打招呼。 这类工作的应用大约是这样的:通过分析用户在淘宝上买东西的数据,推测他还会买啥;通过分析股市的变化以及一些市场信息,推测股市下一步涨还是跌。还有就是分析搜索关键词给出搜索结果,分析语音信号转化成文字等等。这些不同的应用都是为了分析数据,都有类似的处理模型和数学方法。 近年来在机器学习的基础上人们发明了深度学习。这个我不是很懂,不好加以评论。但是我知道这类工作的主要目的是模仿人类的认知能力。特别地,机器学习领域最基础最出名的模型“神经网络”,已经被生物学家证明是比较好的对于人类大脑逻辑的模拟。 这类工作说简单也简单,说难也可以很难。你只需要学过大学一年级的线性代数,就可以理解神经网络、支持向量机等机器学习的模型,然后自己训练模型去分析数据了——这也是大部分硅谷公司的需求。百度新任首席科学家Andrew Ng在Coursera上有个机器学习的公开课,讲完神经网络之后他就说:“Good,你现在已经比大部分硅谷工程师更加了解机器学习了。”(真的不是黑么)然而机器学习的模型背后的数学非常深奥,比如说神经网络可以等效成一些复杂的高维拓扑结构,网络的训练实际上是这些拓扑结构做拓扑变换的过程。比如如果待训练的数据维数非常高,要选择合适的函数降维。为了理解这些东西,需要深入学习线性代数、拓扑学、数学分析等数学知识。其实我说的我也不是很懂,我没系统学过拓扑。兼有前三类工作的巅峰产物是IBM的计算机waston。2011年Waston在美国的智力问答比赛“Jeopardy!” 中击败了两位经验老道的人类选手。这件事之所以令人震惊,是因为Jeopardy中主持人提出的问题大部分无法直接理解,而是隐藏在英语俚语和双关语当中的巧妙语言。Waston在人工智能史上的地位远远超过当年击败国际象棋大师的Deep Blue。 关于Waston的一些原理,可以读文章《IBM Watson机器人算法介绍》 4. 第四类是仿真性的工作。这类工作主要集中在游戏和动画领域,其他边缘一点但是更加高要求的有飞行器设计、气象、天文等。仿真意味着在电脑的环境中虚拟出现实世界,这就需要程序员理解力学和光学等物理学理论。比如最简单的,任何3D游戏引擎开发的第一步都是学习刚体变换等力学知识,用来把模拟出来的小人或者飞船等物体进行移动。刚体变换有很多种表示方法(茴香豆的茴字有四种写法……),背后有不少数学理论。此外为了仿真毛发、浪花、溅起的尘土等等这类细小的物体,也有自己相关的物理和数学知识。可以请看《爱丽丝的发丝──《爱丽丝惊魂记:疯狂再临》制作点滴》感受一下。 不同的行业对于仿真的需求不一样,因此要求的专业知识也不同。游戏和动画的需求是尽可能地真实表现场景,而飞行器设计上用的仿真更强调空气动力学和结构力学,因为要用仿真分析飞行器飞行时的受力情况。天文、气象和其他需求仿真的行业又有各自的侧重点和知识领域,各个行业应该也都有自己暂时解决不了的问题。这些具体的知识区别我也不是很清楚,按照我对某些行业的理解,可能无非就是牛顿力学、动力学、微积分、微分方程和线性代数,因为都是在经典力学范畴内的物理,就那么点东西,从本科毕业开始算,把数学认真学个三年左右之后就能进入某个行业了。 这类工作的巅峰产物隐藏在大众视线之外。比方说美军号称在海湾战争开始之前,就已经通过仿真软件把战斗推演过好多次了,最后真打起来的时候“就像打电脑游戏一样”(语出《失控》)。再比如说,现在很多超级计算机都被用在气象预测上。2008年北京奥运会前夕,北京气象局就购买了一台计算能力排全球前十的计算机,用来在奥运会期间提供气象预测。当然,这些巅峰产物依然有很大的局限性。美国人预测不出他们会陷入伊拉克和阿富汗的战争泥潭,北京气象局预测不出几年后北京常常会有雾霾。当然我们也不能太强求,毕竟这种工作有点夺取上帝视角的倾向。这都说明了在仿真计算领域,人类还有很长的路要走。 5. 第五类是物理性的工作。“物理”指的是这类工作中产生的代码要直接与物理世界发生接触,比如从传感器获取世界的信息,控制执行器进行特定的运动等等。这类工作主要集中在航空航天工业以及机器人产业当中,是我现在主要从事的工作。 这类工作主要分为两部分,一部分是观测(如何通过传感器数据了解自身和世界的状态),另一部分是控制(如何根据自身和世界的状态规划自身的下一步运动),两者都需求很多物理学和数学的知识,控制需要刚体力学和运动学、系统理论、控制论等,观测需要信号处理、系统建模、机器视觉、概率统计、优化等等。 物理性工作的一个主要特点是,代码与硬件以及机械紧密耦合,测试很困难(想想该怎么给一颗导弹debug……),所以通常这类工作要和仿真类工作同步展开,先在仿真平台上做测试,然后再移植到真的机械上面去。而且程序员要深刻理解运行自己代码的平台的硬件和机械的性能和极限,一行错误的代码很有可能会导致严重的事故(一个小数点点错导致火箭发射失败这种故事我们小时候应该都听说过)。 这类工作近年来也开始进入普通行业,比如任何安卓手机现在都内置惯性导航元件,上面说的“观测”中的算法就可以写在手机里,用来获取手机相对于世界的位置。 这类工作的巅峰产物是Boston Dynamics公司制造的大狗机器人和Petman机器人,可以自行百度了解一下。好,接着说故事。后来我自己想明白的问题是。大学的计算机科学系主要教育人学习如何从事第二类工作,但是世界上还有其他几类程序员的工作是大学不教授的,而我的天赋和兴趣主要在第三类和第五类工作上。其中物理性的工作所需要的知识,主要是电子工程、物理和机械系才能学到。所以我后来转去了电子系,学得还不错。而且通过对控制论和机器人学的学习,我对数学也有了全新的认识。(下面是很个人的观点,不一定正确啊,请轻拍)我们高中学的数学,以及大学一年级学的微积分,其实都不是数学的本质,而是数学工具。数学的本质是建立一套严密的体系来描述世界,揭示世界本身的严格表示形式。当我在学习了机器人运动学之后,再回头去看代数与几何,就明白了人们为什么要建立种种复杂的代数结构并且去分析他们的性质。在学习了概率机器人理论以后,再回头去看概率和统计,就明白了期望和方差这些不知道是确定还是不确定的玩意到底有什么用。我感觉其实学习大部分的数学知识都不存在有没有天赋这样一个说法,目前好的数学教材非常多,而且都把知识解释得非常清楚,这本书看不懂了完全可以换一本再看。任何智力正常的人,在系统的训练和合理的时间投入之后,都可以学会数学系本科涵盖的一切数学知识。学习数学的关键在于有没有兴趣去欣赏它抽象的美,以及是不是愿意投入时间。 一开始我是不太会欣赏数学的,我高中数学很差,高考数学只有100多几分。大学一开始学微积分也学得很差。但是我在大二大三期间写机器人程序的时候发现了代数的重要性,学会了欣赏数学,于是就能学好数学了。大四的时候到美国交换,在一个还算不错的大学的数学系上了两门数学课,都比许多数学专业的同学学得好。研究生的时候项目比较多,不太专心上课,成绩都一般,但是我能感觉出自己数学水平的进步。我没有再回头去学离散数学和算法,所以不知道现在自己在这方面进步如何,不过反正我不再搞相关的工作了,也没时间去探究。借用一个名言,我觉得,以大部分程序员所需的数学的难易程度,根本没到拼天赋的时候。总而言之,我想说,题主还年轻,你既不太了解数学是什么,也不太了解程序员是什么。这个时候也不用担心太多,安心把功课学好,多了解了解技术新闻,有时间的话尝试一些编程的训练,比如去coursera上找公开课听一听。除了学写C/C++,Java这类程序之外,也可以尝试学习HTML和网页编程,两者的思路不太相同。你对数学和编程的认识会不断改变,在几年之后才完全定形的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值