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

           作为软件新手,很多人疑惑怎么去学习才能学的更好,无疑于以前问考分高的同学,你怎么学考这么高的?我觉得这是个无解的问题,每个人的学习方式是不同的,同样的道理适用于软件学习,补充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,不