计算机经典书籍推荐
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3。“十分有用”的,它们是:“程序设计”、“数据结构”、“操作系统原理”。这三门课,我觉得是整个大学四年最有用的三门课了,而且是直接的有用。“程序设计”,在我们的课表上全称叫做“C++程序设计”,其实就是教会你使用一门高级语言,重要性不言而喻;而且学到后面,比如在学“编译原理”的时候,讲到各种词法分析方法时它就会用C++(我看的那本书用的是C++)来写一些例子,再接着讲,也就是说“程序设计”这门课同时也是用来学习后面很多的课程的工具。“数据结构”可以说是“编程整件事”要使用到的核心技术之一,必须要很好的理解、完全掌握这门课。“操作系统原理”包括了很多东西,都应该很好的掌握,比如“进程和线程”的基础知识如果你掌握的不好,那你以后编“多线程”程序的时候就会碰到很多麻烦;而且,只有理解了操作系统,才有可能编好应用软件,道理很简单,所用的应用软件都必须运行在操作系统之上,都必须调用它的功能。
对于这三门课,最好不要看国人写的教材。“操作系统原理”建议看《操作系统:设计与实现》(第二版),作者Anderw S.Tanenbaum等。此书中译本分上下两册,上册为原理,下册为Minix操作系统的源代码,上册必看,下册根据各人情况有选择的读一些也是好的。“数据结构”建议看《数据结构——C++语言描述》,作者William Ford等,但是裘宗燕的一本《数据结构——C++与面向对象的途径》也还行,如果你们学校用它做教材的话,那你勉强看看也就凑合了。至于“程序设计”,书太多了,《The C++ Programming Language》、《C++ Prime》、《Thinking In C++》、《Thinking In Java》都是好书。另外,说到这里,不得不提到一个问题:以前经常看到有人争论一个问题,就是C++、Java、(现在又多了一门C#)这三种语言到底哪种好?我们应该学习哪一种?这其实是一个无聊的争论,因为它们的80%都是相同的,所以你用“用来争论的这点时间”已经可以在“掌握它们其中之一”的前提下学完另外的两种了,等你精通了这三门语言后,也就不屑于这种争论了,语言本身只是表现思想的一种手段罢了,它们是何等的容易学习!
4。“有用”的课。这些课,不能算是“直接的有用”,也就是说,它们的很多内容你过几年也许就忘得差不多了,竟然也不会影响你当前的工作。但是,它们是铺垫,是基石。对于这些课,我们的态度应该是,注重基本概念,做到“弄清楚大致的框架”就可以了,但可以忽略不必要的细节(但也许考试的时候会考到一些细节,那你就自己看着办了)。。这些课是:“微机系统与汇编语言”、“计算机组成原理”、“计算机网络”、“软件工程”、“数据库原理”、“计算机接口原理”、“编译原理”、“计算方法”、“离散数学”。“汇编”还是有用的,它是你理解和学习“计算机组成原理”和“计算机接口原理”的钥匙。“计算机组成原理”和“计算机接口原理”其实是给你讲一遍计算机的硬件结构,比如CPU内部是怎么回事,它是怎么计算和缓存的,DMA传输方式是怎么样的等等,弄清楚(或者说曾经弄清楚过,毕竟它们的很多东西你以后会慢慢忘记的)这些东西心里会感觉比较有底。“计算机网络”感觉上和实际的网络编程联系不大,也是为你解释了一些原理性的东西,看了心理比较有底:)。另外“数据库原理”除了讲一些原理以外,一般还会教你SQL语法,其中最难的是各种“查询”语法了,但是到了实际用的时候你会发现,这些是不必要的,一般的“复杂查询语句”都有工具可以自动生成的,不用你自己写的,所以对此你不必担心。“软件工程”其实作为一个本科生来说是不可能很好的理解它的,它必须要有很多实践经验以后,才能体会其中的一些道理,而且国内的“软件工程”教材一般都比较“教条主义”,建议浏览一遍即可,知道个大概,了解一下大型软件的开发流程是怎么样的,就可以了(并且也是需要的),至于其中的诸多概念,重在理解,能理解多少就理解多少,千万不要去“背”,没有用的。“计算方法”这门课现在可以说是实用价值剧减,因为基本上所有的算法都有现成的程序库可以调用的,所以大概了解一下就行了,真到要自己开发算法的时候,不管你当时学得再好,肯定
还要回过头来看这些书的,因为这之间你根本不曾使用过它们,早忘记了。至于“编译原理”有人认为它很重要,我认为做个了解,大致上知道是怎么回事就行了,因为你不太可能会去开发一个编译器,但是在实际中用到的机会也是有的,比如我有一次编程时就需要用到“编译原理”的知识来做一个“词法分析程序”,用来处理用户输入的函数表达式,再调用几个库函数来做定积分,但总的来说“编译原理”只对很有限的一部分程序的编写起到了实际的作用,所以,先了解一下,等到用时,再来细看。“离散数学”是前面提到的“数据结构”的理论基础,如果“离散数学”学得好,理解“数据结构”会更容易些,所以还是花点时间看看吧。
推荐一本书:《编译原理及实践》,作者Kenneth C.Louden,此书附录中有一份Tiny语言编译器的源代码,对照着前面的理论来看就不会像清华版的《编译原理》那样不知所云(我们当时用的就是这本教材,后来我去买了Kenneth C.Louden的《编译原理及实践》来看,很多问题才豁然开朗)。
另外,我想说的是,“软件工程学”其实现在才处在一个初级的发展阶段,CMM、XP 等等的理论打得不可开交,各说各的理,几乎达到了互相对骂的程度。作为一个初学者,特别是“实践经验缺乏”的初学者,我建议你对各种理论多了解,注意我指的是“了解”,不是去“背”其中的条条框框,当你了解了大多数现在的主流软件工程思想以后,就会形成你自己的比较客观的思想了,当然还需要结合一些实践的经验,这是以后的事了。至于看哪些书,太多太多了,自己去找吧。
5。“不太有用”的。其实说这些课“不太有用”已经是客气的了,它们其中的一些其实就是“没用”。这些课是:“自动控制原理”、“通信原理”、“电路原理”、“数字电路原理”、“模拟电路原理”、“复变函数与积分变换”、“线性代数”、“概率论与数理统计”、“高等数学”。其中,“自动控制原理”和“通信原理”我感觉和实际的编程相差得实在是太远了,我学过它们可是现在全忘了,也不影响我现在的任何东西。“电路原理”、“数字电路原理”、“模拟电路原理”这三门课讲起来也是计算机学科的基础课,我只觉得“数字电路原理”对于理解比如“计算机组成原理”和“计算机接口原理”这样的课还有一些帮助,但是另两门课,我实在发现不了它们到底有用在哪里,比如“模拟电路原理”主要是教你“三极管的内部构造”之类的东西,如果你觉得这也属于“必须要掌握的东西”的话,那我也无话可说。另外,“复变函数与积分变换”是“数字图象处理”(这是一门研究生课程)的基础,如果以后想到Adobe 去工作的人,还是应该趁早学好它们,但是除此以外,好像也是别无他用。“线性代数”、“概率论与数理统计”和“高等数学”我倒觉得是属于所谓的“素质”了,这些东西不懂好像就说不过去了,但是要懂到什么程度,各人自己看了。另,“高等数学”也是“复变函数与积分变换”的基础。
6。英语。这门课很特殊,很有用,总之一句话,现在学好了以后绝对不会后悔。:)
二。关于课外的学习
首先我想说的是,如果有志以后成为“优秀的程序员”的人,应该从大学就开始自己的“课外自学”了,这是很必要的,否则你会一开始就落在别人后面。另外,不要以为“所有