原文发表在五色土BBS

楼主的帖子: 我是数学系本科生,现上大二。其实我感兴趣的是计算机,从第一次接触的时候,就已经很感兴趣了。不过高考报考的时候也没想太多,太幼稚,就进了数学系,貌似这个系将来转什么都不困难(而实际上这个系的知识太难学)。

现 在考虑得很清楚了,我决定学计算机。不过没有转专业的机会,但无所谓,我想尽量听计算机系的课程,或者尽量知道该学什么,所以在这里向大家求助了,希望能 得到一份下学期计算机系的课表,多认识一些计算机系的朋友,也想去旁听一些课程。另外,我主要想往程序员方向发展,想搞网络程序或手机程序开发。

目 前我的计算机功底很薄弱,只学了一个计算机基础(个人认为没太大用),C语言(期末分数是满分,但个人认为考的太浅),MATLAB(都不能算计算机专业 的课程吧,期末90分)。知道应该学的有,数据库,计算机原理,汇编语言,计算机网络,计算机系统,java语言。下学期也选修了数据结构和计算机网络的 课程。不过还是觉得自己自学太业余,想向专业的人士靠拢。

假期也想自己努力把该学的东西补上,便于开学直接去旁听计算机系的课程。所以更想知道计算机系的课程开设是怎样的。就是说想知道大家大一上学期学了什么,下学期学了什么等等。

另外在数学系学了离散数学和数值分析,那些应该对计算机有点帮助。本人数学功底还凑合,成绩能混在系里前几名,不过咱学校数学系不行,这是实话。

我的回复:

我也不是学计算机的,也是对计算机比较感兴趣(特别是黑客技术^^很cool)。大学三年下来,也积累了不少经验了,我也谈下我的想法,不对之处请大家指正。

和 zengjing说的一样,学习编程最首要的任务是掌握其思想,一旦掌握了思想,那么就一通百通,你会发现所谓 C,C++,JAVA,Assembly,Python等等语言都是按照那些思想方法设计出来的,你所需要做得就是记住下简单的语法就行了。所以,如果想学好计算机,大学期间就先把OO和FP这两个思想彻底弄清楚,再精通一门语言,就足够了。 而看你考试的分数,就知道你具有很好的学习计算机的潜质(虽然考100分不是很难,但是真考到100也是很不容易的,需要细心和较好的分析能力),而且你又是数学系的,那么自然就在数学功底上要高人一筹:) 我觉得你首先要把自己的优势——数学,充分发挥出来。

在计算机学习方面,国外MIT的学生以前大一一上来要学习一门叫做计算机程序的构造和解释的课程(Structure and Interpretation of Computer Programs 简称SICP),这门课程讲解了一门语言--Scheme(类似于Lisp的一门语言),之后就是大量的FP(Functional Programming 函数式编程)的内容,这本书很经典,读它也需要很好的数学功底,现在北大数学系已经给本科生开设了这门课程。我建议你能去买下这本书(中文版资料及评论:http://www.douban.com/subject/1148282/),另外网上有MIT的英文教学视频,你可以下载下来,有空的时候先看视频再自学,网上也能找到所有的习题答案。如果把这本书看过一遍,那么可以说你已经初步掌握了FP的思想了。千万不要小看FP,现在有门叫Erlang的语言,其使用的就是FP的思想,而它在并行式计算上面占据着举足轻重的地位。你看现在Core2的双核 四核多核CPU的普及程度,再看看现在的程序开发——大多数程序只能调用一个CPU,而缺乏并行处理的能力。具体的资料请自己google,然后自己判断下是否有必要学习它。

其次,就是C++或者是JAVA的OO(面向对象的)思想。OO 思想很重要,也是现在最常用的思想。似乎你还没有学习过C++或者JAVA,因此学习这两门语言也是很重要的——不要一上来就着急学会全部,而是先掌握 OO思想,掌握了OO思想,你就会发现你可以看懂几乎所有的目前流行的程序代码了(即使你不懂那些语法的细节)。OO的具体学习方法我建议你自己网上搜索,自己安排。我是在大一的暑假学习VC++,接触了一点OO的思想(看得是孙鑫那本书和视频),但是没有彻底理解(我比较笨^^),之后大二第一学期我选修了雷宏洲的JAVA课程,再次学习了一遍OO思想(感觉这次有点领悟了),最后大二第二学期我们有门C++的必修课,于是....我就又把类和对象再次学习了一遍——这次算是真的学会了(被考试逼得 呵呵)。你可以参考下我的经历,但是强烈建议不要一上来就学VC++。

至于书籍,JAVA 的我推荐孙卫琴的JAVA面对对象编程这本,C++我推荐..恩...谭浩强的《C++程序设计》囧 (高手不要鄙视..我确实没看过C++ Primer)..注意谭那本是比较薄的那种,这本书我觉得写的很不错,特别是谭爷爷他没有重复你之前学过的C语言的内容,而是直接让你直接进入OO的世界,而不是再重新学下int long double...(我们的C++课就是这么干的,一半以上课程讲C++/C语言的基础知识,过程式和面对对象式的混着讲..初学者要是能学会就见鬼了)

书籍相关地址:

JAVA:http://www.douban.com/subject/1837608/

C++:http://www.douban.com/subject/1174290/

说完了两种重要的思想,再说下如何发挥你的数学特长。数学和程序相连的结合点我理解为数据结构和算法,因此这两部分应该是你主攻的,也是你未来要比别人更强的地方。数据结构建议提前自学,因为我觉得这门课开课的可能性很低(我选了三个学期,最后还是因为电院有几个人恰好要学才终于开课了,最后就11人,学校险些要把我们的课给停了,当然老师讲得还不错,不过上课时我老犯困 呵呵)。数据结构的课本我看的是这本:http://www.douban.com/subject/2013616/

里面使用C++讲的,用到了STL,如果你没学过C++那么看起来会比较困难(里面用到了范型的知识)。其实还有很多不错的数据结构的书可以参看,很多都是比较纯粹的(不依赖任何库),我觉得也不错,数据结构可能比较枯燥,不过确实很重要。

算法部分,我是个彻底的外行(我数学不好),不过我最近很想学好它。

推荐几本书:

算法导论:http://www.douban.com/subject/1885170/ 不喜欢,太厚了,买来砸人还不错:) 不过是最经典的,也是最后必须要看的..

算法基础:http://www.douban.com/subject/1671885/ 薄一点,不过我也不知道怎样,我刚看了几页 程序算法与技巧精选:http://www.douban.com/subject/3076937/ 里面都是C代码,很有趣味性,可以说比较实用而不枯燥。

新编实用算法分析与程序设计:http://www.douban.com/subject/3070758/ 进阶的书籍 复旦还是浙大用这本作为ACM内部培训教材

学习算法最有效率的方法不是埋头苦读,而是开动脑筋解决实际问题。我强烈推荐去这两个地方注册帐号做题。

浙大ACM:http://acm.zju.edu.cn/onlinejudge/

北大ACM:http://acm.pku.edu.cn/JudgeOnline/

这两个地方有大量的题目,做完每道题后你都可以将你的代码发送上去进行评判,看是否能够通过。做完这里面所有题目,才能算是算法牛人,慢慢练级吧:)

最后再多说几句,没什么条理,也不一定正确:

  1. 要想学好计算机,要用linux,具体内容去linux版块转转。一定要装个双系统,而不是虚拟机安装。平时编程要安排在linux下面。

  2. 网络时代,一定学习网页制作部分知识,很重要,是展示自己的重要一环。要掌握HTML+CSS+PHP。要有个人的blog或者网站。
  3. Python这个语言很不错,能做很多事情,特别是帮你快速开发一些小工具,建议学习下(很简单的语言)。
  4. 汇编没有那么重要——如果你不想往系统底层方面发展或者做硬件或者成为Cracker的话。如果需要学习,那么王爽的《汇编语言》是我第一个推荐的,“计算机3级 PC技术”是我第二个推荐的(呵呵 这个是个考试,不是一本书),《The art of assembly language》是我第三个推荐的。 不过建议简单了解下就好,术业有专攻,这部分不是你的强项,不要花太多时间在这部分~
  5. 手机程序开发是JAVA,不过我对这个不感兴趣,也不太了解。另外,我不看好它:)
  6. 数据库会用就好了,那东西深入了又是另外一个领域,你要是致力往DBA发展就深入学习,否则的话,大学期间学会增删改查的语句我觉得够用了~
  7. 学校的老师水平良莠不齐,不要把自己的学习计划都压在选修相关课程方面,计算机是门学问,而不仅仅是一个专业。书、网络视频、网络资料、动手编程是最重要的,老师顶多只能领你往门那边前进(注意,不是入门~),入门和深入都靠自己
  8. 如果不相信我说的这些,想想自己现在还记住多少MATLAB语句:) 你能自信的说你学会MATLAB了吗? 看书很重要,实践很重要。

zengjing(另外一个牛人的回复): 呵呵,其实计算机科学需要很好的数学基础,特别是你往深处学,比如理论计算机可以算是数学的分支了,可以google一下图灵机,递归函数之类的关键词,你会发现很多有意思的事情,如果你想学的是计算机应用,那么,也许你不需要学那么深,一般的计算机主干课程包括:操作系统,编译原理,数据结构和算法,程序设计语言(比如C语言,C++语言之类,目前比较流行的快速开发所用的Java语言),离散数学,网络基本原理之类。很多所谓从事计算机的大多都是干着编码民工的日子,其实很辛苦,也拿不到什么钱。个人认为,你还在读大二,需要学习的东西很多,也是打基础的时候,这个时候千万不要浮躁,跟风,学好数学分析,高等代数,抽象代数,实分析,复分析,泛函分析,拓扑学这些主干课程,你会一辈子受用,计算机行业在很多人看来好像很时髦,变化更新貌似也是很快,各种“新”技术层出不穷,但是我可以负责的告诉你,这些所谓的新技术根本就是换汤不换药,不管今天流行什么语言,计算机语言在本质上书图灵等价的,就是说你用什么语言都可以干活,所谓的区别是语言设计理念的不同和针对不同开发需求而做的优化之类,所以学好看起来不是那么时髦的C语言也能干活,而且C本身就是系统开发语言,很基本,需要下功夫,至于面向对象的Java,说实话,掌握面向对象的思想很重要,胜过语言本身,另外就是所谓的泛型编程,框架阿之类的东西,说起来很玄,其实本质不难(你搜索一下),而且java提供大量的函数库,可以大大减轻人民负担,让我们变得更傻,呵呵,这里不得不提到重复发民车轮的重要作用,比如在java,排序之类的函数一大把,更本不需要你去写,可是,你若没自己实现过这些基本的算法,那么你的能力就提高的很慢,最终你学会的也就是简单的搭积木而已。不得不提到的,不管做什么,千万记得动手实践,不管你学的是数学还是计算机,道理是一样的,不实践学不好。现在网上牛人很多,比如这个http://blog.youxu.info,这个blog的主人就是学计算机科学的博士,当年他决绝了Google的offer毅然去美利坚学习,你看看他的文章的深度就知道他对他所学的热爱,人学习需要激情,不是被动去接受,而是自己主动去学。最近比较火的一个事情是:最小曼哈顿网络问题的进展,这个是由复旦大学一个计算机大三的学生作出的,值得我们思考。豆瓣也是好东西,至少让你知道大家在关注什么书籍,可以参考一下。

哦,忘记说了,我们天天用的网路,说实话就是个图论和优化算法的应用,学会用数学的眼光看问题将是你一生的财富。

PS: 你在帖子说想学习网络编程,恩,可以参考:TCP/IP详解的第一卷和第二卷打基础,然后找本windows网络程序设计的书,去china-pub或者 amazon去看看。还有,计算机组成之类的课程,初学很枯燥,你找本《编码的奥秘》来看看,会比较容易接受,汇编语言是搞代码优化,逆向工程的武器,说实话,我不在行,你看看csdn上的推荐吧。

苍蝇的回复: 楼上的大虾们说的很好,先把基础打好最重要。

数学是基础,计算机上用的多的数学有线性代数,计算机图形学方面用的多;离散数学,数据库、结合论、图论上用的多;数值计算方法,算法优化、科学计算上用的多;高等数据,地球人都知道它重要;最后还有概率论,用到的地方太多了,安全、加密是个地方就用到。

英语要学好,因为是篇文章就是英文写的,最前沿最先进的技术一般都是英文的,中文的落后一大截,不求能说能写,至少在金山词霸的帮助下能看懂。

下面列一些本人觉得很不错的书籍以供参考:

汇编:大学里的那本教材写的很好,可惜俺是看不懂,这里有一本《Professional Assembly Language》,研究此书前有c语言知识最好。

c:谭浩强那本就很好了,看个十遍八遍的,没事就拿来翻翻,这里再给一本参考的《高质量C++/C 编程指南》,这是本看了让人汗颜的书。其次可以研究下API,《POSIX Programmer's Guide Writing Portable UNIX Programs with the POSIX.1 Standard》《The GNU C Library Reference Manual》《c99》

java:现在排行第一的计算机语言,用的地方很多,找个java程序员工作很容易。推荐两本《Core Java 2 Volume》《java与模式》

操作系统方面:本人觉得linnux、unix是程序员的方向,所以推荐的都是些类unix的。《Understanding the Linux Kernel, 3rd Edition》《Linux Kernel Development Second Edition》《unix环境高级编程》《UNIX设计与实现》《操作系统—线程:+Optimizing+threaded+MPI+execution+on+SMP》《操作系统—线程:Implementing+Lightweight+Threads》《深入理解Linux虚拟内存管理》《PRENTICE_HALL- Understanding_The_Linux_Virtual_Memory_Manager》《LINUX内核源代码情景分析》

网络方面:现在网络与学好计算机分不开了,所以很重要啊。学校里的教材太老了,最好从外面找资料学习。像cisco的网络教材很全面,《IP高级路由》《tcp/ip详解》3卷,第三卷上的T/TCP可以不用浪费时间了,《unix网络编程》上下册。

学一门脚本:python、 perl、php等随便一门就可以了,python是现今最快的脚本语言;perl有点老了,语法也很怪异,但只要掌握了却很方便,可以花最少的工作做大量的事情;php在网站方面用得多,当然用作脚本也相当好用。学会使用sh很重要,推荐一本《advance_bash_scriipt_progaming_guide》

数据结构与算法:这东西很重要,也不好掌握,不过掌握了受益终生的,下面推荐几本.《数据结构》看彭波的那本就可以了,虽然里面有很多错误,但与不失一本好教材(看个十遍以上,没事就翻翻)、《算法导论》俺也没看完,因为俺的数学不怎么好

其他:《模式设计》、《软件工程》等等。

当然这些主要是课余读物,那些必修的选修的都得认真掌握

要看的书太多了,要掌握的知识面太广了,建议边学边用,可以给自己找个工作做。比如做做小网站、找个兼职什么的