只接受发布货源信息,不可发布违法信息,一旦发现永久封号,欢迎向我们举报!
1064879863
16货源网 > 餐饮行业新闻资讯 > 软件开发 >  程序员不需要知道太多数学,你认同吗?


程序员不需要知道太多数学,你认同吗?

发布时间:2019-09-12 16:30:37  来源:网友自行发布(如侵权请联系本站立刻删除)  浏览:   【】【】【
你问我支不支持,我当然是反对的。程序员如果没有数学支持,很容易沦为码农。虽然,我承认,日常的商业编程里,确实不需要太高深的数学功底,但是:数学是成为大师的基石。天可怜见,我的数学太差。一直在恶补,一直
程序员不需要知道太多数学,你认同吗?你问我支不支持,我当然是反对的。
程序员如果没有数学支持,很容易沦为码农。

虽然,我承认,日常的商业编程里,确实不需要太高深的数学功底,但是:数学是成为大师的基石。


天可怜见,我的数学太差。一直在恶补,一直效率低。微积分并不是数学中唯一的分支。像集合论、图论、复杂度、组合数学、关系代数、布尔代数、谓词逻辑这些属于“离散”的东西也叫数学。数学家的根在微积分,研究连续的东西,比如极限。程序员的根在离散,研究离散的东西,比如编码(encoding)。离散加上计算理论加上算法(可能还有一点点数论),就是程序员的数学。

编程本身是用不了多少东西的,编程所解决的问题才会用到数学,这要看你打算编个啥。我还是秉持“用什么学什么”的观点。知识可以在短期内获得,但是代码的技巧需要千锤百炼。当初咱们都是从“五天搞定线代、三天搞定概统”的阶段过来的,领域特定的知识一个月还啃不完??“程序员不需要道太多数学”中的“太多”令它变成伪命题。
“太多”就是指多于合适量,说不需要知道太多当然是对的,但知道太多也不会造成坏影响。
而问题描述中说大部分程序员只需算数,要求也太低了吧。然而废柴们都是把“太多”等同于自己不会的那部分。
抬杠的说数学家也不需要懂太多数学。欧几里得不懂微积分,牛顿不懂群论,帕斯卡来考代数几何,成绩恐怕也不乐观。我小时候也被骗了,现在后悔都晚了
连类型论都不会还写个毛的程序(逃这个其实是站在两个角度上说的。。。

说不需要太多数学,是站在数学的角度上,其实说复杂度证明,基本的概率论,数学学生大多觉得,这很正常。。。充其量是想复杂度要多倒几次,没有什么难的。。。
然而,数学的入门课,比如抽代,实分析,复分析,这些东西你们是真的不需要。。。就算是图论数论,也是搞数学得学证明,码农记结论。。。所以这完全就不是在 “搞数学” 嘛。。。

然而说需要数学的,都是从码农的角度来说的,本以为调用 api,基本逻辑好了,养成好习惯就行了。。。
后来发现,妈的,算法题还要逻辑思维?!图形学还要算矩阵算法证明还要会基本的证明?!后来发现各种东西还要推概率,还要推收敛?!近似我还要知道泰勒展开?!
天呐,这谁说的不需要太多数学,出来我打死你。。。

至于为什么说不需要 “太多” 数学。。。因为对一部分人来说。。。你用的数学根本不够多。。。根bie本qiang不wo需gong要zuo我需要声明一点,评论里一些知友问我怎么学编程,怎么学这个那个,我真不知道,我又不是大牛,而且有一些没有工作的人问我学不学数学什么的,我想说,我虽然认为数学必不可少,但是你还没工作就先好好把技术学好,先拿到offer上班了再做其他打算不是更好么?可别说我误导人啊。

#以下为原答案
我今年初去北京面试一家美资外企,招懂开发的网络工程师,简单说就是python + CCIE。
我英语好,本以为手到擒来。但是没想到栽在技术上。他们技术面试官给我上了一课,我虽然没能拿到offer,但我非常感谢他,这件事影响我很大。
面试前,我写了几个练手小项目,远程邮件控制电脑关机啊,端口扫描啊,BeautifulSoup爬虫什么的。面试官说,这些东西都没用,他考我一些逻辑题和现实当中的问题,让我手写python代码解出来,我有点蒙,毕竟我数学确实不厉害(不是学不会,真是以前没学,都打dota了)。
最后他跟我聊很多,主要是告诉我不要放太多精力在模精品现成的项目上面,那些网课啊培训啊都是扯淡的,言外之意就是,他们只招数学厉害,逻辑思维厉害的人,不要项目经验丰富,但逻辑一般的人。
让我回去把数学好好学一学,逻辑思维也锻炼锻炼再来面试,切记不要浪费时间在一些简单调用各种库的练手项目上,这些东西体现不了任何数学思想,所以都是浪费时间。

后来我发现,自学或者培训苦学几个月,做大量练习,做各种小项目练手,但没数学基础的人,去北京能找一个8k的工作很正常,但是他们一辈子也就那个水平了。google,微软还有一些欧美外企他们这么学下辈子都没机会进去。
所以,切身体会,数学,对程序员来说,是最最最重要的!其实在一本叫《A Programmer's Ranting》的书里(我们和豆瓣合作翻译的版本(https://read.douban.com/ebook/11174020/) 以及 徐旭铭 与人民邮电出版社出版的版本:(《程序员的呐喊》([美]Steve,Yegge)【摘要 书评 试读】)),作者Steve Yegge也讨论了程序员是不是要学数学,他说了一些实际的学数学的好处:
?学习数学能提高你的问题辨识的能力,或说套路的能力;比如知道一个问题是组合数学问题,你就知道怎么用组合数学的问题去解;知道一个问题是离散优化的问题就知道怎么用离散优化去解
?学习数学能让你做出比较酷的程序在朋友面前炫耀 XDDD 比如做物理引擎充当摇奖机之类的
更不用说那些raytracing之类的了。
不过我这里说的用数学是很偏应用的,不偏证明。数学是形式化人们对世界的认识的科学,我只用到了其中的万分之一不到吧。

所以就看你想不想学啦。

p.s. 如果你看到这个答案并且对《A Programmer's Rantings》这本书的我们与豆瓣合作翻译的电子版(https://read.douban.com/ebook/11174020/)有兴趣的话,可以给我发私信,我在豆瓣阅读中赠送给你,因为现在那本书虽然已经上架,但我翻译的那部分稿子有些问题还在商讨解决中… 我觉得很不好意思让大家付钱(真抱歉!)(送到我豆瓣阅读里的钱花完为止吧大概能送一二十份,嗯)
编辑2016-07-20 21:31,还有五份
这个答案的价值没有其它几个高,所以也请不要赞了吧数学对程序员的意义和钱对人的意义类似。
钱少的,活起来就难免畏手畏脚,十分憋屈,搞不好还会因为太穷而挂掉。有钱的,就能做一些穷人做不了的事情,就能在许多事情上有更多选择。钱多了,往往不是坏事。
数学也这样。数学不好的,有些事做起来就很麻烦,有些事可能根本做不了。数学好的,能做的就更多,选择也更多。小学二年级的时候,你问老师9除以2是多少,老师告诉你除不尽,那时候你觉得,这就是「太多」数学了。

初中二年级的时候,你问老师计算器上的这个e是什么意思,老师说这是自然对数,你现在不用掌握,你觉得,这就是「太多」数学了。

高中二年级的时候,你问老师sin(x)和x轴围成的面积是多少,老师说大学的时候会教,你觉得,这就是「太多」数学了。

大学二年级的时候,你问老师是否存在无限多对距离足够近的素数,老师说过几年你问问一个叫张益唐的人,你觉得,这就是「太多」数学了。

「太多」本身并不是一个有绝对意义的概念。你现在不需要的,就可以认为是「太多」的。

因此题目的观点从某种角度说是毫无问题的,程序员绝对不需要数学家那么深厚的数学功底,数学也并不是程序员最核心的技能。

实际上,以大部分程序员水平之差,数学根本不会对他们的提升造成任何影响,自然任何数学都是「太多」。

所谓木桶效应。
就因为当年线性代数和矩阵运算没学好,到现在搞不清楚图形变换的那个矩阵参数到底怎么设置才能达到满意的效果…………
这东西已经是跨语言的API了,影响多大你知道吗?

类似的惨痛教训不一而足…………

当然,如果只是复制粘贴代码,确实不需要,但我认为那不是程序员,那叫编码操作员。
或者,高大上一点,叫程序指令粘合员(Program Instruction Gluer),常以英文单词首字母缩写的形式出现。看你是做什么的咯,如果是数据挖掘的,不会数学简直是自掘坟墓。
我实习的时候去做数据分析,终面是一个人大统计学的博士,关于数据分析的啥也没问,问了我什么是特征值,奇异值和特征值有什么区别,怎么求特征值,还有些复变函数的东西。。我还以为是考研复试呢 = =,然后他问我,有没有啥项目经验,我说没有啊,但是我参加过数学建模,虽然全国的没有获奖,但是有个校级一等奖,是我一个人做的,我把论文带过来了,您要看吗?他很诧异,然后看了下问了下我论文里写的径向基函数插值拟合的东西,然后问完了之后问我本科毕业论文写的啥,我说蚁群算法在交通路径中的应用,并且也把论文带过来了,要看吗?哈哈哈,boss估计愣了一下,估计没想到有人会带着论文来面试。然后他看了一下,问了下蚁群算法的数学实现,matlab代码啥的。总之,虽然不了解数据分析,但是懂数学还是很好找相关的实习的。
后来跳槽的时候面的别的几家公司,经常直接拿白纸推导数学公式的,写代码,拿到offer还都是很顺利的。
总之,不会数学也可以做程序员,但是上升有限,尤其是数据挖掘,你不想一辈子就做个啥也不懂的调参侠吧。虽然很多时候我们的工作也是调参,但是懂的人调和瞎调的人上升空间肯定不一样。答主个人资历:数学系本科,CS类硕士

先亮总体观点:任何面向工作的功利的学习行为都可以视为一种投资,必须考虑成本和收益的tradeoff;总体来看,个人认为计算机系本科不教的数学对于绝大多数程序员来说都是没有必要熟练掌握的数学。

数学不包括算法。算法一直是属于计算机科学领域的。数据结构算法能力是程序员的核心能力之一,而且永不过时。

当程序员做开发工作,有些方向不太需要数学,有些方向需要特定类型的数学(比如游戏开发、图形学会用到大量数值工具等);解决特定问题需要学习特定类型的数学;专门做特定领域的计算机科学研究需要用到大量特定领域的数学;既然如此,那就在碰到相应问题的需求去学习对应的知识就好了,没有必要非要计较到底哪个重要(前提是你应当知道你这个方向需要什么样的知识),也没有必要仅仅是为了提高「数学基础」而盲目不加选择的去学习所有种类的数学。

关于这个问题,最大的迷思就是数学系学生眼中的数学程序员眼中的数学是完全不同的;

  1. 在数学系学生眼中的数学其实大部分的分支对做程序员特别是做开发都没有什么用或者不太用得到,意义不大(比如复变、泛函、数论、抽代、常/偏微分方程,更不要说什么代数几何、调和分析等,尽管有些领域会有对应的应用,比如抽代、数论可以用在密码学,泛函、最优化可以用在机器学习,复变可以用在信号处理,但是总体来说还是非常少见,对普通程序员来说意义不大,对非特定领域的日常开发也几乎没有影响),而且学习数学的难度极大(远大于日常程序员所需知识的学习难度),成本太高(我就不说学习数学非常容易忘掉了,等「打好了基础」 之后结果没有马上继续在相应方向上深挖不断应用的话,一两年没有用,虽然也许脑中所谓的「数学思维」还在,但是具体的内容早已忘光了,到时候会发现自己即使「学了数学」也会感到数学根本不够用;简而言之数学根本是个无底洞);
  2. 另一方面,在绝大多数程序员眼里数学似乎只有离散数学(包括数理逻辑、集合论、图论、状态机理论等)、具体数学、计算理论还有高数线代概率论随机过程所包括的范围,有时候甚至还包括算法,这些分支的数学当然对程序员很重要,多掌握一些总是没错的(说实话,绝大多数答案都还在纠结至多线性代数、大学解析几何的层次,甚至更多人只是停留在高中数学,我估计他们本人也从未听说过更高层次的数学,他们自己都不知道自己在谈论什么东西)。

总体来说,数学是属于那种少部分情况才会用到,却需要大量精力去学习的内容;何况学了数学也不是一劳永逸,太少用到的话就难免退化了,总而言之做普通开发很难保持一个比较高的数学水平。所以要注意不必本末倒置,作为程序员,开发能力才是绝大部分时间会用到的主线能力(如果做研究,则需要多一些特定领域的数学知识,学术界比较看重数学);如果你的工作不具备让你在工作中「被动学习」掌握很多数学的话(比如做机器学习、数据挖掘类工作,也包括自然语言处理、计算机视觉等,以及专门的算法工程师),还是就维持大学甚至高中水准的数学就可以了,不然也很容易就会忘掉。首先,数学不是编程或工程项目上的需求,而是计算机科学的需求。而优秀的程序员大多有扎实的计算机科学基础和某个子领域的专精。

计算机科学经常需要的数学有:
微积分学
线性代数
初等概率论,随机过程
图论,组合数学
信息论
初等数论,抽象代数(密码学,编码理论)
复分析,调和分析(多媒体,信号处理)
凸优化,时序分析(数据挖掘,机器学习)
微分方程,动力系统(数值分析)
解析几何,射影几何(计算几何学)
范畴论(编程语言理论,感谢 @褚舒墨 )
泛函分析(机器视觉, 感谢 @十余 )

计算机科学不常需要的数学有:
实分析,测度论
高等概率论
代数数论
解析数论
交换代数
算子代数
点集拓扑
代数拓扑,同调代数
几何拓扑,纽结理论
微分几何
分形几何
代数几何

这里,我只列举must-to-have的数学领域,而非nice-to-have的数学领域。另外,很多领域我也不是很了解,欢迎大家纠正和补充。逻辑学告诉我讨论问题要先统一定义,我们来逐个分析一下。

首先“太多”是多多少?很多答案在哭诉概率论线代没学好,但是我觉得这根本不能算太多,毕竟任何一个本科院校的计算机专业都会教这些,你和我说这是太多?这明明是基本功……所以我认为应该以大学课程为准(从大学开始才有计算机专业),超出微积分、线代、概率论、离散数学(这个范围太广,可以认为是数理逻辑、图论、抽象代数、数论四个学科的弱化版)的,才叫“太多”。

我们再讨论一下“程序员”指的是什么。我认为,程序员是工程师,不是研究员。工程师的任务是把学术界的理论成果做出实际可用的产品,而不是自己在理论前沿开疆辟土。目前的工业生产中,也基本不需要超出上一段提到的数学。

所以,我们可以说“目前为止,程序员不需要太多数学”。

另外我想说一点,快速学习能力远比提前积累大量知识重要得多。不管是科研还是工程,很多时候不会给你太多准备时间,这时候如果过分追求“扎实”、“系统”,反而会拖累整体进度。能尽快的学会所需的知识,这才是最重要的。认同,因为数学学多了就不想写程序了,数学(学得懂的话)比写程序好玩儿多了……

有本很好玩也很赞的书——《算法图解》:



这本书里有一段话,说明读这本算法书需要具备的知识,里面说了对数学的要求:

这个要求,属于初中数学的范畴哦。


以我十几年做软件的经验来看,其实只有特定类型的程序员会用到比较多的算法,比如做图形图像处理的,做游戏引擎的,做科学计算的,做机器学习的,做加密解密的,而大部分的程序员,都是 API Caller ,其实用不到多高深的数学和算法,即便用,也是调用别人封装好的。

所以,如果你不是想做图像处理、游戏引擎、GUI引擎、音视频处理、数学计算、机器学习、人工智能、密码学等等领域的开发,那数学其实不会影响你的工作,你不需要知道太多。


欢迎参与我的知乎Live专题:程序员的成长课。讨论技术精进、转型管理、简历优化、跳槽、薪水、转型等等话题。

“程序员不需要学数学,因为工作中根本用不到。有那功夫,还不如认真把设计模式、计算机网络、操作系统等硬知识学好。” 这是很多人的观点,是的,作为程序员,你不需要任何数学知识,也能写代码。

但是,编程的世界不止条件和循环语句,程序员的人生应该是创造的舞台,只要想在这个领域持续深耕,学好数学就是充分必要条件,会决定一个程序员未来的发展潜力。

往大了说,数学是一种思维模式,考验的是一个人归纳、总结和抽象的能力,放到程序员的世界,就是解决问题的能力。往小了说,不管是数据结构与算法,还是程序设计,其底层原理和思路大都源自数学。

所以,很多大公司在招人时,都会优先考虑数学专业的毕业生,因为数学基础好,编程会更容易上手。在大数据和智能化的时代,学好数学更是门槛本身。

学习数学的正确姿势,听听他们怎么说?

Steve Yegge | 资深程序员

  1. 正确学习数学的方法是广度优先,而非深度优先。你要了解的是整个数学领域每个概念的名字,并知道它们要解决什么问题。
  2. 把数学当成文科来学,先不用重点看那些算法和证明,只需要了解数学概念的名字、作用、大致步骤、发明人、发明时间、局限等。
  3. 数学符号是关闭你通往另一个世界的符咒,如果你看到一堆自己不懂的数学符号,就把它的实现功能简单地当成一个原子操作好了,不要深究太多。

徐文浩 | bothub. ai 创始人

  1. 从工作相关的领域开始了解数学,可以随学随用,在工作中累计实操经验,更容易获得正反馈。
  2. 把正在学习的数学问题的解法,写一个算法程序实现出来,是非常有效的练习方式。
  3. 你可以选择追一门数学的在线课程,跟着老师的节奏系统理解数学,对学习有一个联系和反馈的过程,做到有始有终。

刘超 | 《趣谈网络协议》专栏作者

程序员是否需要学好数学?我在学数学分析、概率论和线性代数的时候,也没想过数学和写程序有啥关系,但随着研究的开源软件越来越多,我发现很多技术深入下去,本质就是数学。

程序员应该怎么学数学呢?我不建议你将大学的相关书籍拿出来啃一遍,耗费大量时间不说,关键是跟实际应用无法结合,结果往往是:该看的忽略了,不该看的费了半天劲还用不上,等过一阵字就又忘了。

我们在了解新技术时,通常会分成三个阶段,第一阶段是,怎么使用;第二阶段是,如何实现,原理是什么;第三阶段是,为什么这样实现。学数学也是这样,也有这样三个阶段,先用起来,了解原理,再知道为什么这么做。

用一句话总结,我们不能为了数学而学数学,要和具体的应用结合在一起。

△内容选自极客时间《程序员的数学基础课》专栏

综合三位老师的观点,其中的共性就是:学习数学,“实用”优先。因此,我绘制了一张“程序员的数学应用地图”,包含四个部分:数据结构、编程语句、通用算法和机器学习算法。

数据结构和编程语句,你肯定非常熟悉,这些基础的内容涵盖的数学思维毋庸置疑。例如,数组和链表就体现了迭代和递归的思想,判断语句使用了逻辑(布尔)代数。

架构在数据结构和编程语言之上的算法(为了将这些算法和机器学习的算法区分开,我称其为通用算法),除了迭代和递归,也体现了排列、组合和动态规划等思想。

对于机器学习的算法,我们更需要理解概率统计和线性代数的核心思想,包括什么是概率、贝叶斯定理、数据的统计分布、向量、矩阵、线性方程等。

在此,向大家推荐我在极客时间的专栏《程序员的数学基础课》。在专栏中,我会从数学的角度出发,逐步推进到这些知识在计算机中的应用。而在绘制这张应用地图时,我特意反其道而行,从计算机编程的角度出发,为你展示程序员应该如何看待编程中的数学知识,告诉你计算机领域常用的数学思想有哪些。

我有充足的信心,通过学习这个专栏,你会加深对数学的理解,在分析问题时能追本溯源,快、准、稳地找到解决方案。这样,今后在面对系统框架设计、性能优化、准确率提升等难题时,你就会从更高更广的角度出发思考问题,而不只是以“熟练工”的视角增删改查。

专栏推荐 | 《程序员的数学基础课》

我是黄申,目前在 LinkedIn 从事数据科学的工作,主要负责全球领英的搜索引擎优化,算法和数据架构的搭建。过去几年,我曾先后在微软亚洲研究院、IBM 研究院、eBay 中国研发中心做机器学习方向的研究工作,还负责过大润发飞牛网和 1 号店这两家互联网公司的核心搜索和推荐项目,出版了《大数据架构商业之路》一书。

在《程序员的数学基础课》这个专栏中,所有内容我都会从基本概念入手,结合工作中的实际案例,为你精讲程序员真正用得上的数学知识。

通过学习专栏,你将获得:

  1. 工程师必备的数学思想剖析
  2. 常用概率统计与线性代数精讲
  3. 数学理论在编程中的实际应用
  4. 人工智能入门必修课

《程序员的数学基础课》

责任编辑:
热门阅读排行
© 16货源网 1064879863