当前位置:   article > 正文

作为计算机专业学生,最应该学习的课程前五位是什么?【知乎】_计算机专业必修课程

计算机专业必修课程

http://www.zhihu.com/question/19628851#answer-100293


计算机专业概念有点大。我本人毕业于国防科技大学计算机科学与技术专业,个人觉得就计算机科学与技术(CS)专业而言,以下这些是必修的:

1、 计算机组成原理(包括先修课程“数字逻辑与数字系统”,简称“数电”):这是一门硬件基础课,学完后你能清楚的知道如何从用最简单的数字元件,像搭积木一样构成整个计算机系统,那就算及格了。  一门名为计算机体系结构是本课程的扩充包,对于了解近代计算机结构体系当然是必要的,但由于这里讨论的是Top 5,因此我认为计算机组成原理更为基础。
2014-07-15:在评论里有人让我推荐书目,我个人比较喜欢这本 Computer Systems - A Programer's Perspective (2rd Edition)。中文译本是《深入理解计算机系统》。在之前写的,本文最后的补充阅读中我也提过这本书。

2、 线性代数,概率论和离散数学:要知道,凡是能称之为“科学”的专业,就必须有一定的数学功底,否则难以称作“科学”。这三门课我觉得是本科时期最重要的三门数学课,比高等数学重要。如果你想在计算机科学的道路上走远点,那这三门可是必修的。

3、MIT开设的 《Introduction To algorithm》,中文版叫《算法导论》:我觉得应该学习它而不是国内习惯开设的《数据结构》。数据结构仅仅是算法的一部分,国内的数据结构课程回避了很多本质的东西,仅仅是对一些常见的数据结构的罗列,学起来总有些不痛不痒的感觉。《Introduction To algorithm》虽然有些章节夹杂着很多很让人讨厌的“数学”,但却能从本质上带你领略这门十分必要而且有趣儿的课。

4、 操作系统与编译原理:操作系统可以说是《算法导论》的实验课,最好能在学习期间自己实现一个小型的操作系统,或者操作系统各分系统的Demo。编译原理可能是普遍本科生觉得难的一门课,但是作为CS本科生或者未来的软件科学家,这是基础中的基础,学完之后所有的语言在你看来应该没有太大的区别,这门课应该是离散数学+算法导论的实验课。最好能在学习期间自己实现一个小型的编译器,语言最好能自创,或者是某个已有的你喜欢的语言的基本子集。

5、 掌握一门常用的编程语言和编程技术:能了解你用过的所有的程序内部大致是怎样的,能用你熟悉的语言编写大部分的程序,至少不能是对任何一个程序满头雾水。

以上这些不难做到,我觉得是基础中的基础,我固执地以为,不能掌握他们就不应该获得CS学士学位。 

补充阅读:

在评论中有位朋友这么说道:

一看就是典型科班好学生。人生很短,学自己要用到的就好。多花时间在2、3、5是对的,甚至任选其二就能让你受益良多、乐在其中。 1和4所起到的作用,比起它们的意义,更多的是让一部分学生从一开始就对计算机产生失望和绝望,是抹杀学生本来的兴趣的凶手。回到问题本身,既然是“应该学习”,1、4不该放在里面,即使不学它们,我想在计算机专业的大多数领域是做得下去的。

我想对此做个回应:
首先,我自认为不是典型的中国式的“典型科班好学生”。这里列出的Top 5不是为了成为“典型科班好学生”,因为光学好这5门绝不够“好”;更不是为了“在计算机领域做得下去”,我相信在某个计算机领域,比如作为Microsoft Office的金牌培训讲师,只要精通Office就能干得很棒。
这里列出的Top 5是作为一个计算机科学与技术专业毕业生该有的知识储备,是这个专业的根基。如果你对这个专业真正有兴趣,并且热爱它,那我认为学习这里列出的Top 5会是个不错的选择。

当然,对于一个计算机世界的从业人员,学好它们也会收益良多。比如对于程序员来说, 操作系统与编译原理这门课能够让你对你的程序如何在计算机里出生,运行,死亡有个好的认识,在我的编程经验中,我觉得这种认识让我收益良多。很多朋友也许知道有一本经典的书籍叫“Computer Systems:A Programer's Perspective”,里面的基础就是来源于 操作系统与编译原理
还是那句话,如果你喜欢CS,这5门课是必须的,要是在这5门课上感到失望或者绝望,我想你该考虑换个专业了。
编辑于 2015-04-26  80 条评论             
 
直接学编程。
然后,在实际运用中慢慢补充各种知识。
“学习”没有“应不应该”之分,
让兴趣当自己的导师 ~

比如,
当他发现他自己写的排序怎么这么慢的时候,他自然会去学“数据结构和算法”;
当他想做一个自动抓取网页信息的robot的时候,他自然会去学“计算机网络”里数据包里有些什么;
当他对谷歌街景里的方向识别技术感到神奇的时候,他自然会去学“计算机图形学”和“线性代数”;
当他真的想知道CPU是怎么工作的,他自然回去学“计算机组成原理”;
。。。

如果用不到,没必要折磨自己。
在你感兴趣的方面,按我说的这样学习,我不信你成不了牛人。
同意的顶!
编辑于 2012-06-16  13 条评论             
 

覃超曾经沧海难为水,Facebook工程师

1. 数学课 (概率,统计,微积分等等)
2. 语言课(java,c++)
3. 数据结构和算法
4. 计算机网络
5. 操作系统和编译原理

其实只要算法和数学牛,可以吃遍硅谷大多数的IT公司。
发布于 2011-05-30  2 条评论             
 
上面的回答都太理论,EE/BME背景的非计算机专业的小生认为实践乃是第一必修课,参考 udacity.com/ 和  coursera.org/ 的现有网上课程(包括很多计算机相关的基础课、中级乃至高级课程),推荐毕业后不以科学研究(读博士,当教授)为目的的计算机前5门课程分别为:

1.计算机基础(推荐 coursera.org/course/cs1 )每周1天,大概6周就够了,了解下计算机基本原理,懂点简单的编程,并具体实践操作,从实践中体验计算机的魅力。

2.简单具体的编程实践(项目)课(推荐 udacity.com/overview/Co 建个搜索引擎),每周1天,大概7周就够了。学计算机专业的人不懂搜索那简直就是个大笑话,计算机专业有那么酷应用,活生生的摆在现实生活中,自己若能独立或几个人合作做个小项目,比如建个学校bbs上面可以用的小小搜索引擎,那比读一堆似懂非懂的理论然后n年后再来实践有效多了。

3.数据结构或算法导论(乃至概率统计、线性代数、离散数学),有了之前2门课程基础,再学数据结构和算法相关的,就没那么抽象了,边学边实践,继续以项目实践为方法,从数学理论的角度比较系统的学习相关的经典理论,站在理论的高度上去理解计算机科学,并加于实践、深入。(暂时没有学过的好的网上课程,不过估计这门课会不错 coursera.org/course/alg )学这门课程同时结合c、java或c++等语言来做项目,理论联系实践,只要功夫身,估计就可以毕业,并找到不错的工作了。

4.计算机网络或操作系统。信息时代,互联网、移动互联网时代,学计算机的不懂操作系统,不懂网络之间的通讯、协议,那会被别人笑话的,以实践为第一方法,通过项目实践来学习。(找不到合适的网上课程,推荐稍微有点点相关的实践课  udacity.com/overview/Co )

5.机器学习、人工智能。推荐 coursera.org/course/ml 这机器学习课程是我学过的最牛逼相对通俗易懂,通过实践能收获很大的网上课程。另外推荐 udacity.com/overview/Co 跟世界上最牛逼的人工智能专家之一学点机器人应用估计再也不会觉得学计算机没用了,好好学正常前途无量,不管是在工业界还是学术界混。这应该算中高级课程了,能体现计算机与非计算机专业实力区别的好地方,继续强调实践动手(编程)能力,通过实践深入理解并掌握相关的理论知识。

最后多废话点,推荐1门以读博为目的高级课程,课程水平应该是属于研究生阶段的,但学好前面4门课程并掌握好本科概率统计基础课程的也可以开始学了,课程非常难、非常棒、也非常有用:
6.Probabilistic Graphical Models( coursera.org/course/pgm )。学了这门科,不管你是做图像分割、语言识别、还是搞生物信息学的,都大大有益。当然,这门课程绝对不是浮躁的人能学得来的,课程作业保证你累死累活的,不过若能努力坚持并完成里面的编程、测试作业,那成就感不用说,学完后,你的计算机科学水平估计超过国内99%以上的学生,甚至超过许多国内计算机系的教授水平。走工业界的话,在大数据(海量数据)分析时代,你应该很容易、有很多机会大展身手。
发布于 2012-05-08  10 条评论             
 

叶启威Hacker, Focus on problem

1.  Concrete Mathematics 具体数学,绝对是计算机科学的数学基础“之一”,国内的计算机科学跟不上国外的一大原因,我始终认为是数学上的差距。
2.  Introduction to Algorithms 算法导论,所有的程序都需要算法作为基础,所以算法是不得不学的。
3.  Introduction to Computer Science and Programming 整体的介绍了计算机,同时也让学生了解CS能干嘛,自己该干嘛。
4.  Operating System Engineering 操作系统的重要性不言而喻,同时也介绍了编译器。
5.  Network 网络编程,中国 大学的本科生们有多少能熟练于网络编程。当今又有多少程序不需要考虑到网络。

just my opinion

其实还有很多需要计算机科学学生了解的~如 @苏衡 所说的写作,交流。
发布于 2011-05-18  6 条评论             
 

pansz欢迎评论

1。英语
业界所有从基础到前沿的文档,全是英语,英语不合格的人,或者不能流畅阅读英文技术文档的人根本不适合在该专业学习。所以我把它表明为 No. 1

2。编译原理与操作系统。
上面两个是你在实际工作中基本没多少机会去学,但是又非常有用的基础知识。另外,把编译原理学通要求你至少精通一种语言,因此我就不再单独列出需要学习什么编程语言了。
3。逻辑与数学建模。
如果有这样的课的话,应学,这本是国人比较缺乏的东西,但是作为程序员来说,又是必须要有的东西,用计算机的思想去思考现实中的事物与流程。
4。测试与用户交互。
如果有这样的课的话,应学,现实中,对很多产品,测试员成为最了解这个产品的人,他也最了解这个产品在用户手中看起来是什么样子,用起来是什么样子。也最能够理解下一款产品我们可能需要什么功能。不需要什么功能。


由于多了三个“与”字,我已经超五个了,就不说了。

编辑于 2011-12-28  3 条评论             
 
本人现在是计算机专业大三的学生。结合自己学院课程的设置和个人的理解,想谈谈自己的看法,括号中是本校相关课程的教材和开设时间,毕竟学院这么多年教学,是有它开课的道理的。这里感谢张小兵同学的精彩答案。


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)


总之,计算机专业的学习还是需要一个循序渐进的过程,追求系统的学习,对某些知识一定要理解深,挖得透,用我们体系结构老师的话,你要做一个沉在水底的人,而不是浮在水面上。你用一个月学习的东西,也许只够你用一个月,你用三个月学习的东西,可能够你用一年,但是你用十年学习的东西,一定够你用一辈子。
编辑于 2012-01-06  13 条评论             
 
0.学会使用搜索引擎的正确姿势
1.眼保健操
2.护颈操
3.怎样才能减少熬夜
4. 怎么找女朋友
编辑于 2015-04-28  2 条评论             
 

饿得扶墙走现在种树也不晚

英语,汇编,c,Linux,任意一种脚本语言。

英语不多说了,国内想获取点信息,你会发现链接很多但翻来覆去都是那一篇,而英文资料众多。特别推荐stackoverflow,上面提问的响应速度简直让我惊呆了,而且人普遍nice。


推荐汇编并不是要求汇编写的多好没事就抓起一段代码优化,而是快速了解计算机体系结构和组成原理。是的,快速了解,我觉得大学体系结构和组成原理明显是架在云彩上的课程,很少有机会实践,而汇编是实践的绝佳途径。学明白汇编,好多问题就想明白了,最有名的例子就是c里的指针。


c语言是高级语言里最基础的,一切都是遵照计算机的本质来实现语句。解释一下,比如好多人抱怨,为什么c在使用数组之前必须声明好大小,有些语言都可以动态分配?其实动态分配的也是先声明大小,只是不够用了就在开辟一块内存。因为是最朴素的,所以执行效率最高,高阶的编程人员都会用c来编写一些对性能有严苛要求的模块。

Linux看似不好用,但其实对程序员十分友好,而且可以高度定制,谁用谁知道。对于命令好不方便的地方,一般发行版都会有图形界面,二者互补。


学一门脚本语言的原因是脚本语言能轻松完成各种功能,任何功能都有库支持,我记的Python的发明者对初学者的建议是:“你要会做轮子,但千万别自己做轮子。”懂你熟练运用库加上正则表达式,你会发现生活如此美好。


题主问的是前五位,并不是仅五个,这里之所以没提算法,数据结构等经典科目是因为我觉得要先用得到,才会对知识有获取的欲望,当你写的东西效率低的时候,你自然就会去找算法去看了,内碎片化严重,自然就去找数据结构看了,其他经典科目同理。


以上是我个人理解。
编辑于 2014-08-17  1 条评论             
 

明明软件工程师

想到的第一个是:表达能力训练课
俺见过不会表达(语言、文字)的计算机工程师,太多了
发布于 2012-05-08  1 条评论             
 

SangY~

计算机组成原理:了解计算机硬件是怎么跑起来,怎么让软件怎么工作的。
操作系统:了解一下整个系统是怎么管理的。
计算机网络:互联网时代,怎么也要知道网络是什么吧。
C语言:建议是C,帮你了解程序是怎么运行的,基础的写代码读代码的能力。
数据结构与简单的算法:了解一些常见的编程方法与思想

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/180241
推荐阅读
相关标签
  

闽ICP备14008679号