以前我也觉得数学和编程关系不大,而且确实感觉用不到。所以学数学的时候总是抱着考过就算了的心态去学,反而专心去搞什么设计模式,架构,软件工程,而且即使学数据结构和算法的时候,也没觉得数学有多少用到。(后来知道是我看的数据结构算法书都属于比较简单,虽然有些名气很大。比如《算法》)
虽然学了一些数据结构和算法,但是总觉得用起来没有得心应手的感觉,做一些算法优化的时候,基本上也是只能现搬书里的算法,遇到不太一样的问题,就不知道怎么解决了。就比如那些什么排序,快速排序堆排序希尔排序。。。只能记住他们的时间复杂度和空间复杂度和写法,却从来不知道这些算法是怎么设计出来的,这些算法为什么是正确的。
数据结构也是一样,虽然一般写几个书里讲过的数据结构还是很得心应手的,但是你叫我针对某项任务设计一个更高效的数据结构,就往往无从下手了。
直到后来看了算法导论,才知道是因为我的数学训练太欠缺了,之前看的算法书也根本没有数学推导。没有办法从根基往上理解这些东西,所以才导致学了之后无法变通。
然后又听到网上说,算法导论的推导基础是线性代数,高等数学,概率论,离散数学,我又把这些以前学过但现在基本忘光的东西拿出来学。
以前学的时候,总是觉得这些东西串不到一起,比如离散数学,那些什么谓词量词,集合,数论,文法语法,图啊树啊,各种一堆一堆的定理,看的头都大了,最后就是强行记下来应付了下考试,感觉自己没理解到什么东西。
离散数学里也讲到了图和树,不过但是看的时候就觉得数学的定义太多了,看的眼花缭乱,当时根本没理解到东西,后来学了数据结构,才知道是什么东西,不过反而觉得和离散数学里那些定义定理离的好远,感觉即使不学那些什么数学推论。图啊树啊也可以学的会。
虽然我有段时间确实是这么觉得的,但是后来渐渐的,就觉得图啊树啊,自己搞不出来什么东西,只会重复的写书上教过的算法(什么二叉树搜索啊,红黑树啊),根本不会变通,图更是用的少,貌似实际应用就就只写过一个寻路的算法。
最近重新看了离散数学后(我看的是《离散数学及其应用》),才发现,哇塞,图和树有这么多应用啊,有这么多种变通的用法啊。这时候才知道以前的想法太局限了,其实非常多的问题,都可以用图表示。可以做非常多有意思的东西。
这个时候,我才觉得那些数学定义有点意思了起来,比如图分为多重图,伪图,无向图有向图,完全图等等等等,以前根本不知道分这么多类有什么鸟用,现在慢慢的知道,分这么多类是因为需要对不同的问题进行建模,然后那些各种以前看似乱七八糟不知所云的定义,其实都是为了更好的规范,然后更好的推导,设计算法。
然后那些图和树,它的基础还是数学中的集合论,然后又会牵扯到其他各种各样的数学,从最底层,一层一层的搭上来,这样学过之后,理解自然透彻。
算法导论里的很多算法,也都涉及到了很多数学,例如概率论,代数,然后各种微积分,通过纯数学来学习算法,可以对该算法看的更加透彻,之后就不仅仅受限于只会写写过的算法,而是可以自己根据原理,设计新的算法了。
现在再想想,确实,一般人做的工作,即使你是在bat,大部分职位估计工作中都不会直接用到数学,反而使设计模式,架构设计之类的更加受用,但是这些数学知识,会使你的思维更清晰,让你的视野更加拓展。
而且一些工资更高的职位,估计就涉及到很多数学,算法了,例如编译器开发,搜索引擎开发,游戏引擎开发等等,目标远大的人,还是现在就把数学搞好吧。而且确实,就算你进个BAT,天天写什么应用逻辑,有啥意思?
现在大热的什么机器学习,数据挖掘,不还是数学里的统计学吗,你如果没有坚实的数学基础,这玩意怎么搞?你没看到这些领域的牛人数学都很厉害吗?所以说数学真的是很重要。
而且当初真的是傻啊,觉得数据结构算法只要能过公司面试就可以了,那种程度真的是远远不够,你自己学到了啥,自己心里还是要有点数的,学习要为自己学,不能说为了进某个公司学习
经常在一些群里,看到一些人说一些言论,什么编程不需要知道多少数学啊,之类的。确实,你要写一些应用逻辑,不用数学。就像我现在的水平,什么网站啊,APP啊,基本上做起来都没什么难度。遇到一些东西还可以调用API,例如人脸识别语音识别。
甚至还看到有人说去培训班学编程,出来之后薪水和大学毕业的出来差不多,所以不用上大学了这种奇葩言论。确实,大学学了很多一下子看不出来效果的基础课,甚至很多人学了也不知道有啥用,刚出来薪水确实和学了怎么写应用的培训班出来的差不多,不过大学这些基础理论课都是培养潜力的,过了几年后,工资自然是泾渭分明。
还遇到很多人, 认为编程就是调用API,做界面。我看过很多人用别人的浏览器内核糊了一层界面说自己做了一个浏览器,用别人的操作系统内核糊了一层界面说自己做了一个操作系统,用别人写的黑客工具以为自己是个黑客了。你做个屁啊你做。你做这些东西你能学到啥你自己心里没点B数吗?要做就自己写内核,自己从头开始造轮子,尽管最后做出来东西可能看起来烂一些,但是真正能学到东西。
然后还有不少大学生,大二大三,学了一些APP开发,j2ee,就急不可耐的想接外包赚钱,我就想问问你真的有那么缺钱吗?你现在就做什么外包,而不好好学习基础,你现在虽然赚到钱,但你几年后估计就和好好学习基础的人,工资天差地别了。
我还是觉得人要有追求,不能说你为了学编程就是写点应用逻辑,这样多没意思。什么编译器,操作系统,浏览器,数据库,游戏引擎,大学期间都可以自己试试造轮子写一写,学习过程中不要老是用别人的API,老是用别人写的库,你又没工作,你着急啥呢,调用别人的API做出个东西有啥可自豪的?就是在外行人面前装装B而已。
然后基础课,特别是数学,一定要学好,而且要一直学,不能说只是过了考试就好,而且学的时候要多思考,多变通思维,不能说只是死记硬背。
临时有感而发,写了一些东西,写的有点乱,自己也不知道在写什么。现在我也还在重修数学的过程中,不过慢慢有种把数学和编程串起来的感觉了,等过一些日子,再写篇博客说说。