转自知乎 :http://www.zhihu.com/question/19628851
计算机专业概念有点大。我本人毕业于国防科技大学计算机科学与技术专业,个人觉得就计算机科学与技术专业而言,以下这些是必修的:
1、计算机组成原理(包括先修课程“数字逻辑与数字系统”,简称“数电”):这是一门硬件基础课,学完后你能清楚的知道如何从用最简单的数字元件,像搭积木一样构成整个计算机系统,那就算及格了。
2、线性代数,概率论和离散数学:要知道,凡是能称之为“科学”的专业,就必须有一定的数学功底,否则难以称作“科学”。这三门课我觉得是本科时期最重要的三门数学课,比高等数学重要。如果你想在计算机科学的道路上走远点,那这三门可是必修的。
3、MIT开设的《Introduction To algorithm》,中文版叫《算法导论》:我觉得应该学习它而不是国内习惯开设的《数据结构》。数据结构仅仅是算法的一部分,国内的数据结构课程回避了很多本质的东西,仅仅是对一些常见的数据结构的罗列,学起来总有些不痛不痒的感觉。《Introduction To algorithm》虽然有些章节夹杂着很多很让人讨厌的“数学”,但却能从本质上带你领略这门十分必要而且有趣儿的课。
4、操作系统与编译原理:操作系统可以说是《算法导论》的实验课,最好能在学习期间自己实现一个小型的操作系统,或者操作系统各分系统的Demo。编译原理可能是普遍本科生觉得难的一门课,但是作为软件科学家,这是基础中的基础,学完之后所有的语言在你看来应该没有太大的区别,这么课应该是离散数学+算法导论的实验课。最好能在学习期间自己实现一个小型的编译器,语言最好是自创。
5、掌握一门常用的编程语言和编程技术:能了解你用过的所有的程序内部大致是怎样的,能用你熟悉的语言编写大部分的程序,至少不能是对任何一个程序满头雾水。
—————————————————————————————————
本人现在是计算机专业大三的学生。结合自己学院课程的设置和个人的理解,想谈谈自己的看法,括号中是本校相关课程的教材和开设时间,毕竟学院这么多年教学,是有它开课的道理的。这里感谢张小兵同学的精彩答案。
1. 数学类的课程:离散数学(《离散数学教程》,北大出版社)
其实个人觉得图论是最有用的部分,无论是算法设计还是工程应用,而群论,组合学,数理逻辑部分却始终不知道具体如何应用,还得继续学习。至于线性代数和概率统计,同样重要,特别是线性代数体现了很多计算机的思维方式,不过相比于图论,个人觉得离散数学更重要。当然先修课程高等数学是必不可少的,甚至我觉得概率统计应该在高数学完后立刻学,不该拖到大三。
(高等数学:大一上下;线性代数:大一上;离散数学:大二上下,大三上;概率统计:大三上)
2. 硬件类课程:计算机体系结构(《计算机组成与设计》,David Patterson;John Hennessy著,机械工业出版社)
这门课是理解计算机内部的构造,指令体系的设计(基本是都是学MIPS的),流水线以及硬软件借口,学完该课程应该能自己模拟一个CPU或者Cache,其中的成就感是无法描述的。这门课在UC Berkeley是大一学的,从理解课程的角度,大一学生完全没有问题的,前提是改变学习的方式。
重点无疑是理解,上课时老师讲的一个例子是,我们统计数据的时候,平均数大多用算术平均数,在他博士时有一次发现算术平均数不对,需要用几何平均数才符合计算结果。虽然几何平均数我们初中就学会了,但是当时除了做不等式,我们基本从来没想过它有什么用,那次实验让他真正理解了几何平均数,也值得我们反思国内的教学。
事实上,目前从我们学院看来先修课程有数字逻辑设计和微机原理,其实内容很多重复,包括DRAM,SRAM讲了三遍等等。
(数字逻辑设计:大二上;数字逻辑设计实验:大二下;微机原理,微机实验:大二下;计算机体系结构:大三上)
3. 软件类课程:数据结构与算法(《数据结构与算法》,高等教育出版社)
事实上,如果大一开始学习的是C++语言的话,要想真正理解面向对象的部分,包括STL,容器等等,需要学习数据结构与算法。算法的学习确实很重要,也很有趣,但是对于大多数将来在企业工作的普通人来说,对于算法的追求绝不是ACM大赛上那种情形,更多的是基本知识,基本算法的掌握和应用。而学好了数据结构与算法这门基础课,对你理解C++大有裨益,最大化地发挥了C++的特点。这里补充一点,这门课和图论同时学习效果会更好。其实学好了C++之后对于其它语言的学习也会很有帮助。
(计算概论:大一上;程序设计实习:大一下;数据结构与算法:大二上;数据结构与算法实习,大二上;算法设计与方法:大二下)
PS:我们算法设计与方法课用的教材是:《算法导论》(应该是MIT那本教材),同时正好也是室友和他导师翻译的最新一版,推荐阅读。
4. 编译原理(《编译原理》,北大出版社;推荐使用:龙书,虎书)
编译原理看上去很枯燥难懂,特别是对词法,语法的分析等。虽然将来只有一少部分人会从事这方面工作,但是对于你理解各种编程语言会获益匪浅,训练的是基本的素质和能力,一般学完这课之后,能够自己实现编译器,比如我们专业编译实习课做的是一个基于Android平台的mini java编译器。
(编译原理:大二下;编译实习:大三上)
5. 操作系统(《现代操作系统》,Andrew S. Tanenbaum著,机械工业出版社)
实话说,我在上课的时候,更多的是觉得这课有点像一门科普课,但是每次的实习作业却和上课完全不同,需要自己去查API,寻找算法,一般是Windows和Linux两个平台作业。个人觉得作为一个学习计算机的人,对操作系统的理解是必须的,将来的用处也会很多。个人最大的感受就是学会查找API,并且使用,完成大量的数据处理,这和之后一系列的开发都很有关,同时增加对Linux的熟悉。学完该课应该能自己实现一个小型操作系统,比如我们专业操作系统实习要求做的是一个小型Windows。
(操作系统原理:大三上;操作系统实习:大三下)
当然,除了这些,最好还能掌握JAVA语言,其实作为一种入门语言,我一直觉得可能JAVA比起C++更有优势,毕竟漂亮的图形界面比起黑框显然更能引人入胜,当然有了C++的基础,学习JAVA相对是会轻松的,JAVA学习前期不推荐使用IDE。至于其他的语言,国外那套经典的动物书是最好的选择了,自学应该没有问题,可以考虑一下LISP这门函数语言。除此以外,像网络,汇编,数据库类的课程都是根据个人的兴趣爱好而定了,并非基础课程。
(JAVA,大二下,推荐书籍:疯狂JAVA讲义,虽然名字很俗,但是确实900页的书说的非常详细,深入浅出,很到位;程序设计技术与方法,大三上,计算机程序的构造和解释,俗称SICP)
总之,计算机专业的学习还是需要一个循序渐进的过程,追求系统的学习,对某些知识一定要理解深,挖得透,用我们体系结构老师的话,你要做一个沉在水底的人,而不是浮在水面上。你用一个月学习的东西,也许只够你用一个月,你用三个月学习的东西,可能够你用一年,但是你用十年学习的东西,一定够你用一辈子。
近期评论