作为一个程序员,数学对你到底有多重要?!
作为一个程序员,数学对你到底有多重要?!
作者: Xu Wenhao 发布时间: 2018-02-21 16:17 阅读: 36411 次 推荐: 133
原文发布于 2011 年
每个计算机系毕业的人,大都学过不少数学课,而且不少学校的计算机系的数学课,通常比一般的其他工科专业的数学要难一些,比如不上高等数学,而是学数学分析;不上线性代数,而去上高等代数。但是,大部分毕业了后去做程序员的人,即使是所谓的名校计算机系毕业的,大都工作中也基本完全用不上学的那些数学,基本上,一半时间在CRUD(crud是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写),另一半时间在处理各类字符串、链表、Hash表,知道在面试中回答各种排序的时间复杂度是他们需要的数学的上线了。
而在念书的时候,虽然上大学之前,有不少内行的外行的,年老的年轻的人告诉你,数学很重要啊!但是,通常来说,各个学校的计算机系的同学么,爱好学习的,可能重视的也是《Thinking in Java》,《C++ Primer》之类的语言书,或者设计模式之类的架构书,抑或是算法与数据结构这些玩意儿;而像我这样天天偷懒放羊的,也不会把数学当作是什么重要的课程好好学习。所以,“数学真重要”,这句话,似乎对于大家来说,始终只是飘在天上的一句话,随风飘逝了。
于是,五年过去了,程序员们都有了不少的工作经验了,如果不是对工作毫无追求混吃等死的程序员的话,对于天天干活的语言,不论是Java还是C++应该都熟能生巧了,所谓的设计模式、重构、自动化测试等等也手到擒来了,大部分人的title上都加上了Senior(资深)了,牛一点的后面大概还跟上了一个Manager(经理),然而,大家都开始考虑一个新的问题 — — “30岁以后怎么半?”。于是,转PM的转PM(项目主管或项目经理),考公务员的考公务员,像我这样仍然抱定 — — “你看人家美国Rohit都50了还不是天天写程序,别人想请还请不到的”的单纯想法的人越来越少了。然后,就算这些人,时不时也会觉得,自己天天干的超越CRUD的,所谓写点OOOO(Object Oriented:面向对象)的框架,不也是很无聊的体力活么,写程序的人干两年谁都会干。于是,又有不少人下海创业了,多年以后,这些人中的大部分都会和我一样悲催的没有挣到钱后继续回来给大大小小的公司写程序。
其实,杯具往往发生在一开始,其实,要是咱们当年好好学习,才会发现,也许数学对于你当个不错的程序员来说,没那么重要,但是要再往上走一步,有一点点技术上的创新,就都是数学的事儿了。两年前,我在T公司,用Configurator(配置器)处理某个程序的时候,开始有点儿意识到这一点了,于是,那阵子还花了不少时间重新翻了翻数理逻辑。今年,换了新工作后为了工作看点儿机器学习的东西的时候,终于发现,这全都是数学啊。当你要超越CRUD,做任何一点点有创新性的技术的时候(不说产品),最有机会遇到的问题,其实是数学问题。虽然从Spring到Hibernate到Rails之类的框架,或者Hadoop,HBase之类的分布式计算框架,也都是技术上的重大革新,但是这些框架类的程序,完善都是阶段性的,一旦出现后,很快都会有相应的Best Practice(最优方法),又会成为熟练工种的活。而真正针对问题域的解答,反是每天都可以有些新鲜的想法、思路和方案的,这些,往往有个数学的门槛。所以如果你真是挺喜欢写程序的,而且希望自己一直能写更好玩更难的程序,总有一天,你要过了这一道坎儿。
所以我很是同意不知道是谁说的,如果你只想当个good programmer,那么数学不重要;但是如果你想当个great programmer,那么数学很重要。在你手里只有锤子的时候,你看什么东西都会是个钉子,想想你如果没有学过算法和数据结构,可能你的大部分程序需要自己写排序的话,都会是傻傻地冒泡吧。反正对于大部分程序来说,在现在这么快的PC下,这点时间差别,大部分情况下,也就是让你等程序执行测试的时候,多个倒杯水的时间。但是很多新鲜、好玩、有挑战的问题,很多数学的概念没有的话,恐怕不是多等个倒水的时间了。而如果你过了这个门槛,你又会发现,一个崭新的世界,又到了你的面前。
回过头来,我说数学重要的话,那么重要的是哪些呢?大家常说的通常是离散数学,不过最近比较热门的机器学习这个方向,我目前看到的相关资料都大量依赖于线性代数和概率论,以及一点点微积分。所以,如果你和我一样,希望做点有追求的技术工作的话,开始花点时间学习数学吧。其实万事开头难,也许你和我一样,对着一堆公式符号,感到头晕眼花,但是如果真得按下心来,看上一个小时,这么坚持个一周,其实就会发现,这没啥难的,就当学门新的编程语言得了。
原文链接:https://kb.cnblogs.com/page/590141/
学好数学我的建议是:在大学里首先尽量好好学习高等数学(1)/高等数学(2),有余力的再学习高等数学(3),其后是线性代数、概率论。之后参加学校组织的数学竞赛。到了大三,一定要参加考研,因为考研可以全面系统的复习你所学过的所有数学知识,考上研究生固然可喜,考不上的话也要好好学习下数学,也许学的不够好,但是基本的数学概念、框架你有所了解,也很有用。以后的工作中,若是需要数学的地方,再去听课学习,就不会那么懵逼了!
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JAVA学习笔记--类型转换(父类子类 Object 基本类型 String) 拆装箱 包装类
最近一段时间忙着学习JAVA,本来net学的也不怎么好,趁着这个机会转下方向学习JAVA。 不过.NET core的开源还是有点搞头的,微软了解一下。 接下来几天我也会陆续写一些内容关于线程和集合等方面,现在让我来讲一下类型转换的内容吧。 衍生知识: 1.基本类型比较用== 而对象比较用equals 如果改写了equals 那么也要顺便改写 hascode 别问为什么,只是习惯。 equals是比较引用是否指向一个对象 hasCode是返回对象 地址。 2.System.out.println(对象); println方法里默认调用了toString() 而toString()默认是返回对象的完整类名+@+地址。有些对象会改写toString() 比如ArraysList对象的toString()就是输出数组的每一个元素外加[] 3.当 "=="运算符的两个操作数都是 包装器类型的引用,则是比较指向的是否是同一个对象,而如 果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程) 5.基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上; 引...
- 下一篇
Java中如何通过一个类名来调用另一个类的静态方法?
Java中可以在一个类中调用另一个类的静态公有方法。 首先是公有方法:表示其他类是可以被访问的。 调用静态公有方法的语法是:类名.方法名(参数...); 所以,比如另一个类叫OtherClass,它的静态公有方法是 public static int MethodA() {...} 那么在你自己的类里调用的方式就是:int result = OtherClass.MethodA(); 另外,调用非静态公有方法(也叫成员方法),比如方法叫 public int MethodB() {...} 就必须先创建这个类的对象再调用其方法, 例如:int result2 = new OtherClass().MethodB(); 我的GitHub地址: https://github.com/heizemingjun 我的博客园地址: http://www.cnblogs.com/chenmingjun 我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun Copyright ©2018 黑泽明军 【转载文章务必保留出处和署名,谢谢!】
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,CentOS7官方镜像安装Oracle11G