原文:http://blog.csdn.net/dc_726/article/details/7017781
追过很多新技术,迷茫于还有太多东西要学,有些找不到方向、不知所措。常在一个叫酷壳的网站上转悠,渐渐想明白了,其实学习技术也像看电影看书一样,要看就看经典的。我们的生命如此短暂,作为程序员的职业生涯可能会更短。与其追逐各种新潮的技术,不如把有限的精力投入到经典的技术之中。
平时酷爱看各种技术书籍,但缺乏系统的梳理。读书感悟都散落在每本书的字里行间和空白处。于是借着准备从最经典、最基础知识学习的机会,开始由底向上,系统地整理以前所学。
一、计算机数学
大学时认真学习了编程相关的课程,但一些基础课程由于不知道跟编程是什么联系所以失去了兴趣、没有学好。工作了两年,才慢慢发觉大学时一些课程的用处:微积分(分析算法性能时一些求极限)、线性代数(矩阵在三维转换中的作用)、概率统计、编译原理(理解源代码是如何编译、链接,最后被操作系统载入执行的)。现在虽然没有大块时间(其实也没必要)重新复习这些课程,但计算机相关的数学知识基本可以包含在下面两本书中:
《具体数学-计算机科学的基础》
《离散数学及其应用》
可以认真学习这这两本书籍。如果阅读过程中发现不懂的,可以去翻阅大学课程中更基础的数学书。这样不会迷失在过多的理论书籍之中。推荐本微积分的课外读物,齐民友的《重温微积分》,看了一点感觉还不错。
二、C语言
学习过计算机的基础数学知识后,可以先不急于去看数据结构和算法。先静下心来,仔细学好C语言。相信对C语言更深入的学习,会加深之后对数据结构和算法知识的理解。
《C程序设计语言(第二版)》
《C专家编程》
《C和指针》
《C陷阱与缺陷》
用心做了《C程序设计语言》中的小习题,算是对C语言编程的热身了。这些书籍都很经典(据说 :),可以先仔细看一遍,以后再回过头来重读,相信到时会有更多的感悟。
三、数据结构与算法
掌握了数学基础知识,也学习了C语言,接下来当然就开始学习编程最核心的部分-数据结构和算法。《算法导论》和《计算机程序设计艺术》三卷当然很经典,但拜读之前可以先学习一些更加入门的教材。
《数据结构与算法分析 C语言版》
《数据结构 C语言版》(严蔚敏)
《C算法:基础、数据结构、排序和搜索》
要多做题,不仅有利于接下来计算机系统的学习,还对日后找工作、做笔试题大有裨益。尽管有些枯燥,但若能坚持下来,绝对能提高自己的分析设计能力。
四、计算机系统
又是有些理论的东西,其实也可以先跳过这部分,直接学习下面更为具体的技术。但要想进一步提高自己,早晚都要回过头来系统的学习这些知识。高手都是有很强的系统性知识嘛~
概述
《深入理解计算机系统》
汇编语言
《汇编语言(第二版)》
《80X86汇编语言程序设计教程》
操作系统
《操作系统概念》
《操作系统设计与实现》
数据库
《数据库系统导论》
《数据库系统概念》
编译原理
《编译原理技术与工具》
网络
《计算机网络》
《TCP/IP详解》
从大学到现在,只有两次感觉自己突破了瓶颈大幅度提高。一次是在一个项目中用了大量的T-SQL特性,解决了很多实际问题,因而对SQL有了更深的理解。另一次就是对汇编语言及操作系统知识的学习。一直使用着Java,对底层系统的知识还停留在大学课堂上。今年初,先读了《深入理解计算机系统》有了个大概了解,之后学习了汇编语言那两本书,紧接着就开始啃那本《自己动手实现操作系统》。虽然没有读完,但这一路走下来,两三个月内对汇编语言的基本语法、80X86 CPU结构、寻址方式、实模式和保护模式、进程信息块、页等等曾经课堂上的概念都有了实实在在的了解。也明白了那句话:真正的程序员是应该懂底层知识的。知道我们每天对着编程的机器是怎样运转的,才会明白对编程的本质。
五、具体平台开发
终于可以在具体平台上开始编程实践了。Windows平台有很多要学的,微软的东西更新换代很快(追的好累,让人又爱又恨),但一定要把握重点。Windows平台上主要学习图形界面程序的结构,界面是怎样布局的,消息是怎样传递的等等。还有一些比较经典的技术像MFC、COM等,也可以简单学习一下。
《Windows程序设计》
《MFC深入浅出》
《COM本质论》
《Windows核心编程》
重头戏是Unix/Linux平台的学习!Unix/Linux平台上有太多优秀的代码值得我们阅读学习。在开始学习Linux平台上编程前,可以先装个Ubuntu虚拟机对Linux有个简单了解。掌握基本的命令,会写简单的Makefile和Shell脚本,会用GCC和GDB编译调试C程序。
《Unix环境高级编程》
《Unix网络编程》
还有本个人认为不错的入门书《Linux C编程一站式学习》。
六、高级语言
最后才是Java和.Net的学习。有了前面的学习过程,此时再学习高级语言应该是轻车熟路了。可惜的是大学时却本末倒置了,学了C++和一些基础课程后都没怎么派上用场,之后就一直用Java开发,导致底层知识一点都不牢固真实遗憾~
高级语言的API、框架很多很多,当然书也很多了,就不推荐了。
N、系统内核
Linux内核源码很多,里面包含很多算法和设计,学习起来真的很难。但挑重点的学习了解一下,对提高编程水平还是有很大帮助的。比如操作系统怎样通过Loader加载,进程的切换和调度等。学习Linux四库全书:《Linux内核设计与分析》、《深入理解Linux内核》、《Linux内核源代码情景分析》、《Linux设备驱动开发》。再推荐一本《Orange’s 一个操作系统的实现》。最重要的一点:Read the fucking source code!
N年寒窗苦读后,也许可以到达这个阶段,也许吧~
看到累了也别忘了放松一下,读一些小散文:
《代码之美》、《Java夜未眠》、《Unix编程艺术》、《疯狂的程序员》...
好了,列了这么长的学习计划勉励自己,希望对看到此贴的人会有些许帮助