转眼学习软件快有三年了,最近的一些事让自己静心思考了很多,也对知识做一个总结,希望它能激励和鼓励正在学习的你,祝我们共同进步。

           作为软件新手,很多人疑惑怎么去学习才能学的更好,无疑于以前问考分高的同学,你怎么学考这么高的?我觉得这是个无解的问题,每个人的学习方式是不同的,同样的道理适用于软件学习,补充W同学一句话,早知道软件这么靠天赋就不选这个专业了,事实是否如此?

           首先我简单划分下人群,准备考研的学生和不准备考研的学生。对于不考研的同学来说,最重要的就是大学毕业之后能进入一个好的企业(当然不包括创业的小伙伴),那千万不要觉得大四的结束才是毕业的到来,在大四来临之前就要开始好好经营自己,大三的时候就差不多能决定很多事了。

         首先,不从编程语言的角度进行讨论。每个人都是应该学习的,最基本的是数据结构与算法,这是万物之基,很多人觉得数据结构还好(之后我再描述)但是算法这种东西,做做搬运工,或者找找知识总可能有的,何必去在意,在进行很多项目时你发现没有用多少算法这种概念。关键就是在于你项目的内容较少,难度不大,还有就是你看的只是算法,没有具体概念,不知道算法的重要目的是训练编程的严谨性,逻辑性以及将所学知识与现实结合的能力。可能我们的代码与优秀代码相比都能实现同样的功能,但是作为一个优秀的程序员岂能容忍自己跑了一个小时出来的内容和别人跑了几分钟出来的内容是一样的,不要觉得夸张,当上升到大量数据的时候,不同级别的时间效率实现一个任务的差别让你惊讶,永远不能忘了学习软件便是为了运用于社会需求,但人们的需求永远是不能满足的。

         其次,关于算法培养思维的严谨性。比如,博文中一篇输出到N的所有数,初听之时感觉很简单,但慢慢品位,就发现可能并没有那么容易,只有多方面考虑才能将题目解答完整(关于题目解析的严谨性研究请鉴所提博文)这就是学习算法的重要性。当然学习算法不用那么拼命的达到什么程度,建议看看算法导论,和比较有趣的编程珠机或编程之美,说句比较高深的,其实这些书悟了就懂了(算法推荐使用c/c++进行学习)。

         同时操作系统和编译原理也需要学好,这二门比较难懂,甚至可能到汇编的级别,但是,不用怕!不知道你是否意识到了这二门课多么重要,里面包含很多数据结构,很多算法,很多很多概念,可能正在学的你会感觉对这门课无解,甚至搞不清楚讲的什么,不必慌张,请听我慢慢道来。

         首先,建议从操作系统入手然后学习编译原理,而操作系统,建议一本很不错的书于渊的《自己动手写操作系统》,估计你想说我了,这都听不懂,怎么去做一个操作系统,然而你可能一开始就被操作系统这个概念吓住了,想到windows几千人开发,多少亿行代码,linux又不熟悉,感觉是很高深的一个东西,实则不是,我们不用实现那么复杂的操作系统,也不用考虑太复杂,操作系统核心就是进程内容,包括进程调度,进程通信等,存储管理,虚存管理,设备管理,文件系统等等,咱们一个个来实现,可能很多代码不明白,没事,只要你能了解这个代码是为了什么而存在的就很厉害了,实模式,保护模式到底是什么过程,引导又是什么。对于操作系统的学习,我给的建议很简单,从代码级别进行对应学习,从零一步步变得完善,亲测相信其中你能学到很多很多,祝你玩的愉快。编译原理,这门课的概念感觉更加抽象,好的,这个多读多看例题,重点是写找一个顺眼的题目写一个小的编译器,管你喜欢LL还是LR,已经足够去实现一些简单的解析。编译原理这门课的重要行就是编译器实现原理所使用的方法,这种对于语言解释翻译的内容,与我们的生活也非常贴近,可能你某个项目就要实现这么一个过程,到时候能救你的就是编译原理了。

          下来说两个非常非常重要的东西,网络编程和数据库,现在社会能确缺少网络嘛?数据不存储还怎么去分析?可想而知这二门知识的重要性,每一门知识都能展开很多很多概念。首先谈谈网络,网络必然牵扯到通信,TCP/IP,socket编程,首先建议从TCP/IP入手,推荐《TCP/IP详解卷》,当然这本书很全,如果你不是致力于网络,系统部署等等,可能很多知识不用了解太多,熟悉各层的主要作用和功能。其次谈到socket,个人觉得先看看FreeBSD的Berkeley Socket 概念,可能你说语言不同(讲解内容是C语言),但是我相信你肯定能看懂这个过程,这对socket编程的帮助会很大,能让你理解很多,其实这之前你认真的看了进程通信,select模型,epoll/poll模型就能很快理解,这都是很好的东西和思想,然后做一个简单的抓包和分析包结构的小程序作为网络入门。下来说数据库知识,我觉得数据库知识分为讲解数据库的知识,包括类型,范式,分解等一些概念,还有就是某个数据库的知识,比如Oracle,MySQL,建议就MySQL入手,好的开源程序总能有很多优秀的讲解,对学习一个具体的数据库功不可没。下来讲解编程语言,这里是给不准备读研的,建议选择一门之后就走下去,不要花心。觉得自己都还可以都去玩玩,实话最后可能会害了自己,各种都没深入,只有一个简单的广度。C++发展加上述主要知识之后有很多应用,你可以转为高大上的IOS程序员,对于桌面开发,建议好好学习使用Qt编程,不要忘了认真学习C++的基础知识,C++的指针,对象都是难点,好好看几个STL源码,认真分析,建议看看《C ++ Primer Plus》 ,也不要觉得学习中重复了轮子,要自己亲自实现几个优秀的数据结构和库函数,C程序员好好结合网络的知识,建议看看Neil Matthew, Richard Stones 的《Linux 程序设计》,做好Linux下网络编程的各种应用,Java现在主要分为Android,或者Java Web,不过都还是那句,选择一个,比如选择Web,就去学习html,css,js(如果对这几个知识很感兴趣,也可以深入成为抢手的前端工程师),还有就是SSH,不仅仅是使用,最好做到源代码级别的了解,将会对使用起到很好的帮助作用。上述所有方向最好能结合一次比赛,一个有点内容和规模的项目,将会有很大的促进作用。

          相信你上述都做好了,某个语言路线也走的不错了,那你找工作什么的,将会非常开心。不要觉得这些很困难,或者抱有某种侥幸心理得到一个好的机会,没有去尝试,没有去钻研个人觉得就没资格去抱怨,错的可不是知识。那读研的人要看什么知识,个体觉得语言对你来说,将不是个事,就是主要语言你差不多能轻松的互相转换来实现一个功能,这意味你会比别人累,了解和学习的更多,当然你可以选择一个自己喜欢的语言深入下去,为何说考研的人语言不要挑剔,甚至多试试,个人觉得这将对读研时候所学内容有很大帮助,既然已经选择读研就不要后知后觉的研二了才“被”课题,提前了解先进知识,了解现有企业级别的人关心的是什么领域,不要盲目的跟风云计算,大数据,人工智能,数据挖掘等等概念,先了解了解,相信了解花费的精力不会那么大,然后在了解的过程中,你就明白很多领域内容不是某种语言的发展,它可能是不同模块不同语言。云的Paas,nginx,App Engine等等硬件虚拟化,大数据的分布式hadoop,google三大宝,GFS,BigTable,MapReduce,人工智能,机器学习,深度学习,数据挖掘,关联分析,分类,聚类,异常处理,推荐系统… 当你了解的越多越能发现自己的无知和对这个行业的敬畏,也让你明白有些人是我们毕生都可能难望其项背的,也能让你有个虔诚的心,不断去学,这个过程中最重要的莫过于找到自己的所爱,自己研究生阶段将要为之付出的领域,有目标的人的能量是可怕的,这个时候你就明白,语言只是工具,你需要在适当的时候找到合手的,前提是你已经拥有了多把工具,所以建议多玩玩编程语言,对于打算读研的本科生是有好处的。再简单说说别的语言至于C#,可以分为ASP.NET,和winphone开发,加上上述都要学的基础课程,依旧,最好能结合某次比赛和项目,专心到一定的深度,足够。php不用说,做好应用,学会一些框架Yii之类的,ruby之流没碰过,就不说了。嵌入式c开发,建议多烧点程序,把Linux内核和操作系统,汇编等等认认真真反复深入,并且做一些很不错的实用东西。还有二个大的知识领域没设计到,一个是安全,一个是游戏开发,这二块我知道的太皮毛,实在不敢拿出来说,欢迎大家补充。

最后再总结下:

非读研:某门语言(深入到细节技术)+数据结构和算法(建议用c/c++学,再结合自己语言)+网络编程(建议看Linux下socket编程再结合自己语言)+数据库(基本知识+某一个数据库)+一次比赛和一个优秀的项目,我们的目的不是会用,是懂!
读研:多语言(建议最好能达到同层次平均水平以上)+数据结构和算法(用c/c++学)+网络编程(Linux下socket编程,TCP/IP,HTTP)+数据库(基本知识+某一个数据库)+有比赛有项目+关注企业级别需要什么人才+检索并了解比较有发展前进的领域,找自己所爱。
还有对于大神同学:...你们就放过我们吧  :)

          老是说别人不要花心,其实发现自己最花心,上面提过的都是接触之后的经验总结吧,连单片都玩过,现在想来也只过了不到三年时间,还是有点感慨的。有人问我学了这么多,学的深入吗?自己将要致力于什么领域?我想说的是自己对待一个知识还是很认真的,不敢说到精通,但是很多内容都算是掌握并且可以应用了,每个学习的知识,都有一定的实际内容或者小作品做支撑,而且我发现知识的基础部分很多都有共通性。我喜欢多学,有自己的目标,有自己总结的知识图,但是依旧会认真从底层学习,我认为我现在多写点代码才是正事。三年时间,自己的进步也是因为有那么多人的支持和帮助,实在太多了,我表示最衷心的感谢,这就是别的长故事了,总之路还很长,我还在路上,希望你我共同成长。
do IT,do it!

------------------------------------------------------------------------------------------------

PS:本文特别感谢梦晓同学的修改和意见,并且希望大家多多指正,相信再一个三年之后又会有不同的感悟

7.混合高斯模型(Mixtures of Gaussians)和 EM 算法

这篇讨论使用期望最大化算法(Expectation-Maximization)来进行密度估计(density estimation)。 与k-means 一样,给定的训练样本是{x (1), … ,x (m)},我...

阅读全文

6. K-means聚类算法

K-means也是聚类算法中最简单的一种了,但是里面包含的思想却是不一般。聚类属于无监督学习,以往的回归、朴素贝叶斯、SVM等都是有类别标签y的,也就是说样例...

阅读全文

10 条评论

  1. 我是从C开始学编程的,后来学C++,我以为我会C++一条道路走到黑,结果半路杀出来一个java web 。不得不感慨。

欢迎留言