关于学习计算机的一些想法
so you wanna be a programmer.回想自己学习计算机的经历,整理现有的知识经验,对于应当如何学习计算机有了一些想法,供你参考。 显然,你不只是想学会操作计算机完成一些文字处理之类的工作,就象学会使用电视机那样。虽然如此,仍然有多个方向可供选择,比如成为一名程序员,成为一名Hacker,成为一名CG美工,成为一名网络管理员,成为一名自动控制系统工程师…… 所以,首要的任务是扪心自问,你想往何处去?
是否有些茫然?哪一个方向才好呢?让你的兴趣引导你吧,别忘了你可以随时转换方向就象转换兴趣一样,千万不要画地为牢。
初步先定了最感兴趣的,那么从何入手又该学习些什么呢?有点瞎子摸象的感觉?让瞎子了解象是什么样子的动物,最好的办法是让目光锐利且心灵手巧的人为他做一个模型,一个小到可以在手上把玩的模型。所以到图书馆找一本计算机导论之类的书当小说读是首先应该做的,抽空把阅览室的相关书籍迅速的翻一遍也是很有帮助的。
我学习计算机之初的想法是成为一名高手,能够很好的控制我的计算机,比如可以自如的操纵dos fat16文件系统。这个想法令我系统而粗略的学习了计算机及系统软件的原理,并花费了大量的时间学习各种小技巧,耍各种看上去很酷的玩艺。而现在则想成为一个合格的程序员,在我看来这需要深入细致的学习计算机机及系统软件的原理并熟悉几种主流的产品实现,研究开发方法学,积累各种项目经验。如此,对于其它的发展方向自然就没有什么发言权了,还是扯扯程序员方向。
作为一名程序员,当然要理解所操纵的计算机系统。所要在计算机原理方面应该打下扎实的基础。计算机原理的最核心部份当然就是CPU的工作原理了。值得注意的是,不要被涉及到的许多细枝末节淹没,要学会存疑,就是虽然不明白但先记到本子上并权当明白,日后再想办法弄懂。另一方面,时刻清醒的知道自己正在干什么是非常重要的。
对CPU工作原理的理解又可分成两步:首先是理解存储计算模型,对应的产品实例是一些早期的CPU及intel x86 cpu的实模式。然后是现代CPU模型,主要是多了内存管理支持、各种缓存、流水线、调试支持等,对应的产品实例是intel 386+ cpu、sun ultra sparc、ibm powerpc等,其实alpha是一个蛮理想的学习对象,不过考虑到市场前景不妨到需要的时候再了解吧。 学习的方法我觉得到图书馆找本教材先建立观念,然后到intel 的网站把它的cpu手册当下来看看,重点看第一卷和第三卷。
理解了CPU的工作原理,对指令系统有所了解之后,对于程序的本质应该有相当好的了解了。如果为了尽快开始写程序,进一步的计算机原理学习倒也不妨稍后进行。不过,进一步了解总线、中断、DMA、I/O设备是非常有好处的,对于稍后的操作系统学习也是完全必要的。所以,我认为这个时候学习一下基本的汇编程序设计,安装一个类似于dos可以直接访问硬件的操作系统,熟悉一套可以在该操作系统上运行的汇编程序,然后将各项设备用程序折腾一遍。
到sf.net上用dos及asm分别查一下,可以找到许多有用的东西,汇编程序的话ms masm或者borland tasm可能是更好的选择。如果装上ms dos的话,里面有个debug.exe,可以直接填写汇编指令,用法在图书馆那些老旧的dos书中肯定是可以找到的,这对于当前的学习来说是最理想的方式。
这个时候可能会想搞台机器以便随时折腾,我觉得弄台pentium mmx级别的机器足矣,价钱嘛不妨去卖二手货的地方打听打听,如果已经有一台不错的机器了,那么不妨装个vmware之类的软件在虚拟机里折腾。当年我在学校读书的时候,7人合资800元买了一台处理的286,1年多后买了新机器就600元转手了,真是值呀。
整个计算机原理学习最好在一个月里完成,时间太长有可能会厌倦。然后不妨庆祝一下,休息一阵。
现在可以开始正式开始写程序了。当然是学习C语言,教材当然首选 The C Programming Language,当然到图书馆找一本觉得读起来不累的也是很不错的,谭浩强老师那本就免了,太厚。以我的经验来看,有计算机原理知识背景后学这个应该容易,也就记记数据类型、操作符、流程控制和子程序在概念和语法,估计3天至多1周足够看完了,然后再动手实际写几个程序,先用一个hello world熟悉一下所用编译器的操作,然后写一个会做简单四则运算的计算器,也就差不多了。我认为在linux下用gcc是比较好的选择,dos下用turbo c是更容易的选择,但过早的使用IDE会让你学到很多重要的东西,不过turbo c的编译器和链接器同样可以在命令行上使用。
再下来就该学习数据结构和算法了。 前面的学习只是让你知道什么是程序,离“会写程序”还有一大段距离呢。编程本质上是从问题和想法变出解决方案的过程,数据结构和算法是把握这个过程的第一步。数据结构和算法是紧密关联的,算法是解决问题的逻辑步骤,数据结构则要为解决问题有效的组织数据。看什么书蛮难选的,最好选薄而易懂的,http://ciips.ee.uwa.edu.au/~morris/Year2/PLDS210/ds_ToC.html看上去简洁的,不妨找一本中学奥赛讲算法的书,这种书里的例子和练习通常比较理论联系实际。看的时候要注重领会精神,个人感觉在一到两周看完比较好。然后做练习,坚持每天写,注意一定要养成想清楚再写的习惯,不要边写边想,可能会困难些,但值得。至少写那么几十个完整的程序。
好吧,下面学习操作系统原理。操作系统是一组相当复杂的程序,其各部份关系盘根错节,所以先关注一下引导过程,了解一下创世纪的过程是大有帮助的。同样是先看操作系统原理的书,再看实际例子。到图书馆找尽可能薄的操作系统原理书建立完整的概念,然后去啃ms press出的《inside windows nt或者2000》及o'reily出的《understand linux kernel》,有时间的话浏览一下源码,linux的好办,windows的不妨去www.reactos.com。最好是尝试写一个简单的操作系统,当初linus读着《unix 操作系统设计》写了linux,建议仿效。退而求其次有时也是必要的,特别是时间安排不过来的话,做做《linux操作系统实习》、《windows内核实验教程》书上的练习是很合适的。
在我看来,以上的学习会销耗一个大学生一学年的大部份业余时间,显然学计算机专业的会好很多,但希望你不会因为考试而厌恶原本充满乐趣的课程,最好它看成检验和展示自己水平的机会。考虑一下,在不专门复习的情形下轻松搞定期末考试是不是很好的说明你已经完全掌握了这些内容?我喜欢这种感觉,可惜当年从来没在专业课上找到过。
然后学什么呢?编译原理。这门课非常重要,非常非常重要。怎么学呢?相信从前面啰嗦的文字中你能看出来:理论联系实际。在学习理论时要以在脑中建立清晰完整的结构为目标,没有完成意义建构的记忆只是一种负担。
再然后呢?关系数据原理(《数据库系统导论》或《数据库原理、编程与性能》)、网络原理(Rechard Steven的三卷本TCP/IP详解)、计算机图形学、面象对象编程(面象对象分析、面象对象设计)、软件工程……
如果在读完大学的时候,动手做过一个基本的操作系统、简单的编译器、初步的关系数据库引擎,那么具有真正扎实基础的程序员诞生了。但他在市场上的竞争力还很弱,太多新潮的东西不知道,太少项目经验。最生要的是,上面主要讲了知识的方面,实际上写程序更是一种技艺,除了熟能生巧外,学习前人的经验,保持良好的习惯也是很重要的。所以kernighan的《编程实践》,Steve McConnell的《代码大全》、《快速软件开发》,Peter Codd的成名小册子《面象对象分析》、《面象对象设计》,Kent Bech的《解析极限编程—拥抱变化》,Frederick P. Brooks的《人月神话》(其实我更习惯称之为《神秘的人月》的,不知道出版商是什么想法)最好常必案头。
计算机科学虽然还很年轻,但毕竟积累无数天才半世纪的心血,已经有相当庞大的一套知识体系了。所以时间很宝贵,不仔细统筹规划是很难完成必要学习和练习的。
最后的一点建议是关于买书的,基础理论及教材通常都有久经考验的名作,不难找到。关于编程语言及各项技术的书籍,如果买的话,请尽可能买主要创立者的著作,比如C++的书认准Bjarne Stroustrup, Stan Lippman,另一方面出版社也很关键,我感觉O'reilly的书基本都属精品,MS Press的inside系列也不错。华章/机械工业出版社的第一批计算机经典教材(深色大理石纹封面的)非常好,总体说来华章这个品牌也挺不错。
看书总归是看别人整理过的,其中最有价值的是作者独特的理解或丰富的经验。就了解技术本身而言,直接去读规范是最彻底全面的方法,一般说来成本也较低。终有一天,你要追逐最新的技术,往往只有规范可读。
及早养成看英文资料的习惯是非常有益的,反正迟早会碰到只有英文资料可看的。事实上我个人现在不大相信国人写的计算机书,对于译的也心存疑虑。
pinxue 2003-4 (http://pinxue.yeah.net pinxue@@hotmail.com)