自从写了上一篇文章之后,有不少朋友在下面留言想让我分享下学习的历程。其实我的学习历程也不是特别长,单单以这个主题来写,内容或许有些少,所以该文另加一部分关于工作的。在日企的这段日子让我对于工作有了更深了理解,为了让更多的人热爱工作,快乐工作,我决定分享下我在日企学到工作经验。

 

------------关于学习的历程----------

其实计算机的学习是一个循环迭代的过程(如果你了解软件工程,你应该知道迭代模型和瀑布模型)。想一口气通过学习某本书或者做某个项目就想彻底掌握其中一门领域,我觉得都是不大可能的。

打个比方来说,很多人从离散数学开始,却因为没学过数据结构而无法实现离散数学中的各种编程问题。而那些从数据结构开始的同学,却因为没学过离散数学而对其中的算法分析云里雾里。很多的知识存在的着循环依赖,所以如果你打算好好学习编程,千万不要因为某些东西学不会而气馁,很多时候,当你学习了另一个知识回头看他的时候,你会有一种豁然开朗的感觉。

 

我的学习历程是从C语言开始的,在上了一个学期课之后,能够用C写写循环判断解决一些书本问题了,那时候觉得自己已经了不得了(井底之蛙)。后来接触了数据结构,当时的教材严蔚敏的《数据结构-C实现》,上课听得一头雾水,下课以后想把书中代码敲到IDE里实践下,发现一堆编译错误而傻了眼。

 

之后学习了操作系统,组成原理等等课程,虽然考试成绩不错但是对这些东西却没有一个本质的理解。(我个人对于“本质理解”的看法是:你能随意运用这些知识解决问题或者衍生出其他的理解。)

 

之后上班以后,开始接触社会,当时JAVA很火,于是就开始自学JAVA。我自学初期主要是看书+看视频+编程练习。verycd上有许多不错的JAVA课程视频,手把手教你学习,我一开始就跟着那些视频学习。当然视频主要偏实践,要学习理论知识,书是必不可少的。因此,我就买了《thinking in java》来看。在啃完大半本书以后,我对JAVA也有了更深层次的理解。

 

很多人编程停留在表面东西上,纠结一些简单的语法。但是当你去深入理解一门语言的时候,你就会发现自己的粗浅。当我在JAVA中再次面对“链表”,“线性表”,“hash表”,“线程”,“锁”等等概念的时候,我才明白,这些“高级”的概念正是过去学习过的种种计算机知识和现实编程问题的纽带。

 

于是我决定重新学习过去的基础知识,带着有经验的程序员的观点重新审视他们。我还是从严蔚敏的《数据结构》入手,这次我在看懂书中概念的基础上,将书中的各个部分样例代码重新自己实现(C语言)。这个过程虽然是困难和艰苦的,但是正是这个过程让我对数据结构有了精确的理解(有一点不理解你的代码也是写不出来的)。

 

但是在学习数据结构的过程中,我发现自己对其中的算法复杂度分析实在是看不懂。于是之后,我又重新回到离散数学中。帮我重新拾起它们的,就是靠《离散数学及其应用》这本非常不错的书,他帮我建立了数学与代码之间的联系,抽象与实际的纽带。

 

这里补充一点,阅读优秀的源码也是一种学习,这点JAVA无疑是最好的选择,因为JAVA的语法平淡无奇,学不出奇怪的代码,所以JAVA的源码比较容易阅读。当时我仔细拜读了kent beck的Junit源码,从中学习了不少设计模式。当然,你最好结合head first那本经典的设计模式一起看会有非常好的收效。

 

通过阅读那些经典书籍,让我找到一套自己的学习方法,后面的学习就比较杂了,完全可以依照个人喜好来吧。这里我就不再熬述了。下面推荐一些学科一些书。

算法类:

《算法导论》严重不推荐,因为这本书更像是一本手册,他很难教会你什么。而且我也不明白,为什么这本书年年在销售排行上?买这些书的人都有好好看其中的数学推导么?

weiss的《数据结构》(各种语言实现)是一本不错的书,我在后来的学习中也经常参考这本书。图文并茂,代码严谨。

其他入门的话《算法概论》,《算法手册》不错。

 

计算机科学类:

基本上华章的黑封面书都不错。《现代操作系统》,《计算机网络》,《深入理解计算机系统》,《编译原理》都是经典。为他们投入多少时间都是值得的。

 

编程语言类:

《effective java》,《深入理解JAVA虚拟机》 看懂以后JAVA面试难不倒你。

《python学习手册》如果你不懂脚本语言,学下python吧,对你日常工作很有帮助。

 

 

软件杂文类:

《软件随想录》读一读,开阔下视野。(我打赌很多公司的HR都读过,读一读你会明白为什么应届生的钱会比老员工都多)

《人月神话》让你能更好的理解软件工程。

《实现模式》看看大师是怎么写代码的。

 

------------关于工作方法----------