答应给一位刚上大一的小盆宇指点一下,所以我这里简单的说点吧。有砖家看了觉得可笑的话,请勿发表高见。谢谢。
首先还是要推荐Sir前辈的《胡侃》(点击可传送),将近20年过去了依然是经典。然后,我对各种课程的理解是这样的:
首先简单说下英语吧。大学是没有人“教”你英语的,英语课很扯淡,英语全靠自学。好在讲语法的地方高中都讲完了,大学基本就是词汇量,实际应用等等。英语的重要性在于:四六级、 考研、还有原版专业书。其中原版专业书是最重要的。你将来要接触的计算机的资料,英文的比中文的要管用的多。
然后是数学,数学的重要性不亚于计算机的专业课,在某种意义上说,要比某些专业课更重要。大学计算机专业的数学课大概有这么几门:高等数学,线性代数,概率与统计,离散数学,数值分析。
高等数学:大学数学的基础,从学分也能看得出来它的重要性。绝大多数学校工科学生都学高数,而理科(尤其数学专业)学的是数学分析。二者内容差不多,都是极限微积分之类的东西, 但是高数的重点在于求出式子的解,而数分的重点在于证明公式。换句话说,高数偏应用,数分偏理论。不好说哪个更重要,二者的思维方式是不同的,我觉得这个东西的重要性就在于对自己逻辑思维的锻炼,从这点上来说,二者是同样重要的。因此,有空都看看无妨。推荐高等教育出版社的《高等数学》(一般学校的高数教材),北大出版社张筑生的《数学分析新讲》,sir前辈推荐了南京大学出版社的《数学分析教程》,还有余力的话,可以做一下吉米多维奇的《数学分析习题集》(简直恐怖!)和李永乐那本厚厚的考研数学手册(叫什么我忘了)。
线性代数:另一门数学基础,跟高中以前的数学长得都不一样,上来就是一个大方块行列式。但是学着学着你会发现,其实就是外观上不一样,做起来还是套定理套公式。这就无聊了。想不无聊的话,可以看看高等代数。按sir前辈的说法,高代就是线性代数加上一点多项式理论,不过他推荐的书倒是比较厉害的(从吉米多维奇开始那两个自然段,我就不摘抄了)。
概率与统计:还是套公式,而且比起高数和线代来说套的更机械,更容易一些,只要能分辨出来这是xx分布就可以了。不过呢,希望学过之后能记住这些分布,因为将来如果深入学习计算机的话,这是一个坎。比如以贝叶斯同志命名那些算法,像什么贝叶斯网络,贝叶斯分类器……将来接触到数据挖掘、模式识别、人工智能领域的时候,概率与统计会或多或少的发挥一些作用。
离散数学:这才是正统的计算机数学。所谓“离散”的意思就是“不连续”,因为计算机中的数都是不连续表示的,所以离散数学中的算法更像是针对计算机发明的(当然这句是胡扯,只是二者有些相似,很多计算机的算法还是出自离散的,数据结构中的树和图几乎照扒图论)。离散数学是个合集,包含了集合论,图论,代数学,组合数学,数论,谓词逻辑这些,其实每一门数学都可以研究得很深。对离散数学整体推荐北大出版的《离散数学教程》,还有机械工业出版社翻译的《离散数学及其应用》和《具体数学》(这本只有英文的)。下面分别就每一门课程简单的讨论一下:
集合论:相对简单一些(除了古典集合论以外),我是简单过了一遍没有深究;
图论:图论是很难的,按sir前辈的说法,“全国真正懂图论的人不到30个”,可能最近20年多了一些,但是应该也不到100个吧(口胡。图论难在没有固定思路,似乎每个题目都有独特的证明方法,还有一些根本就还没有证明出来,比如旅行商问题。推荐王树禾的《图论及其算法》。
代数学:群环模域的性质,是很好玩的,有些时候很抽象,变幻莫测,但是仔细研究会觉得这个东西令人着迷。前面学过的高等代数,只是代数学中的一小部分。有些代数不建议过早接触,像什么李代数、交换代数之类的,容易入魔。
组合数学:就是排列组合那堆东西,但是要深好多。本科离散很少有讲到的。有余力看一看。推荐清华卢开澄卢华明写的《组合数学》,还有机械工业出版社翻译的《组合数学》(这本建议读英文原版,应该已经到第5或第6版了,中文翻译还是第3版)。
数论:这个最初接触的时候是更久以前了,应该是在小学,学习整除还有质数、最大公约数这些东西。这在数论中叫做初等数论。此外还有代数数论、超越数论什么的,也是不建议过早接触。推荐陈景润的《初等数论》(薄薄的一本几天就看完,小学生也能看),还有北大潘承洞潘成彪的《初等数论》。
谓词逻辑:也算相对简单一些的吧,初中学过的。推荐科学出版社的《面向计算机科学的数理逻辑》。
数值分析:其实我也不知道怎么介绍,当初没好好学,到现在也没怎么用得着。sir前辈那边写的是“计算方法”,介绍的也比较简单,可能计算机用到的比较少吧。
研究生阶段还有两门数学课:随机过程和泛函分析。都是比较恐怖的课程。听说哈工大计算机研究生挂率第一的是随机过程,第二是泛函,中科院计算所挂科第一的是泛函,第二是随机。早有人说“随机过程随机过,泛函分析心犯寒”……
除了上面推荐的书,还要严重推荐一套美国研究生的教材GTM,一系列有200多本,涵盖各门数学。像《线性代数》《线性代数与抽象代数》《代数学》《图论》《概率论》等等,都很不错。
然而……需要硬着头皮啃英文。
接下来说说计算机吧(终于到正题了)。
外面疯传的“xxx是世界上最好的语言”根本不用听,用心学好几门最基础的语言:c,java,c++。个人觉得,就语言的难度来讲,c和java加起来都比c++要简单的多。c是偏底层的语言,面向过程,着重于精细控制内存,学的时候应该让自己“站在内存的角度”考虑问题;java是标准的面向对象语言,能教你用对象的角度去看待问题。c自顶向下编程,java自底向上。都学完了能理解很多计算机的“禅意”。c++包罗万象,既可以写成c的面向过程,又可以写成java的面向对象,各种灵活,然而,这种“包含一切能力”的想法毁了这门语言,它太复杂了,几乎不可控制。说“毁”有点夸张了,但是它的复杂程度确实是c和java无法相比的。推荐《c primer plus》《how to c program》《java核心编程》《疯狂java讲义》《c++ primer plus》《c++ primer》,effective系列,《c陷阱与缺陷》……严重不推荐谭浩强的书,容易误入歧途。
顺带推荐下编译器吧,c/c++推荐visual studio,如果嫌太大可以用MinGW,DevC++,codeblocks,拒绝TC2/3以及VC6;java推荐Intellij Idea,Eclipse,Netbeans,不建议MyEclipse。
如果有人推荐其他语言的话,他们说的对,但是,不用听。比如,C#拥有宇宙最强编译器visual studio的支持,语法跟java类似但写起来就是舒服,开发图形界面so easy;js是动态语言,不讲类型,而且适应各种平台;php轻松写网站,想要什么功能只要去网上查查函数就好;go轻松写大规模并发,抛弃了java里面那堆冗余的东西;我是写python的,万能型语言,开发效率极高,什么库都有……no,打好基础才是最重要的。很多学python踩坑无数一脸懵逼的人到最后还是老老实实的去看里面的内存分配原理,要是早会了c这些都是小儿科。
语言是入门,在入门过后,进来之后,别急,还有一道门,首先会遇到的是数据结构和算法。数据结构就是数据在内存中的表达方式,算法是数据在cpu中的处理方式,二者是相辅相成的。所以就有了那句著名的式子:程序=数据结构+算法。我个人觉得数据结构和算法应该是计算机专业本科最重要的课。希望在学习的时候,不是想当然的在纸上写一堆伪代码,那样基本上是白写。要把讲过的数据结构和算法用语言实现出来,这样才算掌握。推荐清华出版社严蔚敏的《数据结构(C语言描述)》《算法导论》《算法》,如果都看完了,可以试着看一下那套令人闻风丧胆《计算机程序设计艺术》。
数据结构和算法过后,就是计算机的专业课了,大概有这么一些:编译原理、操作系统、数据库、信息论与编码理论、计算机网络、计算机组成原理、计算机体系结构、嵌入式、计算机图形学、软件工程、计算机安全学。本科大概就这些了,如果还有其他课,基本都是讲座性质的,都是研究生阶段主要的研究方向了。
编译原理:有一门课叫形式语言与自动机,大概可以算这门课的先行课程,跟数学里的计算方法也有些关系。讲的主要是一些文法,怎么把我们的自然语言一步步的变成计算机能听懂的逻辑和过程。很惭愧的说,这课我是没听懂。不过,学完之后,编译原理的前面一半都很轻松了。推荐蒋宗礼先生的《形式语言与自动机》以及机械工业出版社翻译的《编译原理》(龙书)。
操作系统:可不是简单的讲讲linux和windows了事的。操作系统四大块:进程、内存、IO、文件,这才是要学的。当然,学的时候推荐装个linux系统,你会发现越用越爽,从开发角度来说,比windows舒服的多。现在比较流行的是centos和ubuntu,估计两年后有变化的可能性不大。推荐书机械工业出版社《现代操作系统》,高等教育出版社《操作系统概念》,还有个两大厚本的《Linux内核源代码情景分析》。读linux类操作系统源码,对操作系统的熟悉有很大帮助。如果想实际读源码,可以直接读一些小的操作系统,比如Minix和斯坦福的教学操作系统Pintos。
计算机网络:这门课程可不是*和如何百度神马的,讲的是Internet协议的概念,原理,以及协议内容。比如网络层次的概念,每一层的作用,当前层的主要协议,还有协议的内容,如何传输等等。推荐清华大学翻译的《计算机网络》,作者Andrew S. Tanenbaum(刚才说的Minix也是他的写的),《TCP/IP协议详解》一套三本。还有一套日本作家写的书《图解xxx》系列,据说简明易懂。
数据库:会讲ER图,关系,范式等等内容,当然也会讲SQL。仅仅只是SQL的话,那不叫数据库。但是讲SQL的时候,最好装个数据库练练手。推荐使用mysql或postgresql,当然要是统一使用别的数据库那就跟大家一起吧。我当年使用的是sql server。所以我对这个数据库印象一直不好(明显的个人偏见)。推荐机械工业出版社的《操作系统概念》。
信息论与编码理论:这门课应该属于算法课向某一方面的延伸,同时又属于计算机网络、密码学的前提。
信息安全与网络安全:这两门课一般是“信息安全”专业的学生学的。讲的东西不一样。信息安全主要是密码学和可信计算,讲的是“什么样的数据和计算方式是可靠的”,里面大量的数学知识;而网络安全重点在于协议、漏洞、入侵等等,要对操作系统和计算机网络更熟悉一些。
计算机组成原理:现在学校基本上不会单独讲汇编了,都是放在计算机组成原理里面讲。这两个东西真的是让人恶心到吐血,你中有我我中有你,剪不断理还乱,藕断丝连骨肉相连。大概就是这么个情况。计算机体系结构可以算是它的后续课程,在讲内存分配的时候,还能跟操作系统有点关系。推荐《计算机系统结构:量化研究方法》《深入理解计算机系统》。
软件工程:大学里基本属于故事课,没有代码,没有考验智商的东西。不过,对于以后整个项目的理解还是很有帮助的。从需求、设计、到开发、测试、再到上线、运维,你会对项目流程有个完整清晰的认识。从此以后,软件不再是你写的那三两行满是bug的小玩具,而是许多人团队配合的作品了。
其他几门课,嵌入式、图形学,我也不是很懂,就不介绍了。都是倾向于某些方面的。高端的课程我不想介绍了,一是本科学不到,二是我也没多少了解。在研究生课程中,有几个非常热门的领域:人工智能,数据挖掘,机器学习,模式识别,云计算,物联网,自然语言处理,搜索,等等等等。需要把本科那些数学和计算机知识都掌握得很扎实才行。
有几门课程我一直是觉得莫名其妙的,大学物理,模拟电路,数字逻辑(数字电路)。没感觉学完之后用到了。还有什么计算机导论,编程基础之类的课,应该不是给计算机专业的人开的,随意听听就好。还有不得不学的政治历史类课程,呃。。。我能不能说我马哲还挺厉害的。。。嘛,扯远了。
这篇文章大概也就写成这样吧。等我再想起来什么,可能随时补充点。