计算机学习[转载]

 

注:此文不是大学感悟,也不是人生感悟,只是对计算机本科不全面也未必正确的的学习感悟.


记得刚上大一时,一次经验交流会,有学长向我们推荐一篇文章,叫《计算机科学与技术学习心得》,当时看了看,觉得很妙,于是下定决心好好学数学,大一时间也多,于是花了很多时间做高数的题。但是却一直不知数学分析为何物,只认为那是数学系对高数不同的叫法,虽然在做积分练习时把能做的题都做完了,就去买了本吉米多维奇的分册做,但是却还是与数学分析擦肩而过。


大二,我开始学习C++,学习很多软件方面的东西,当时我再看《计算机科学与技术学习心得》时,我的感觉是,这样学是数学系了,不是计算机系。所以我把那些丢到一边。


大三时,由于面对C++过于繁杂的过于庞大的知识体系的渐渐失望,我又重新拾起C语言,于是把时间放在操作系统的学习上。我想编写一个操作系统,这件事花费了我大三大量的时间去学习,现在回过头看,写一个简单的操作系统并不困难,只是一个时间问题,因为前人已经做了大量的工作,无论是源码还是书籍,都随处可得。其实操作系统课重点学习的东西(比如进程管理)在代码里体现得很少,写操作系统真正的问题是对目标硬件体系结构的理解,BootLoader和设备驱动的编写才是更要花时间的。但是现在我放弃了这个计划,一个是因为我研究生放弃了一系,选择了三系,我觉得有更重要的东西等着我去学习,二是我不想跟那个说我写不了的教授斗气了,三是我脑海里受Minix和Linux影响太深,如果我花几个月写出来,那很可能是个又像Linux又像Minix的东西了,或者说,我的行为很可能只是种类似于研究生写论文的行为。那样就太可悲了。


当我现在大四时,找的导师是做语音的,于是我开始学习模式识别,了解HMM的 基本原理,但是当看到关于概率论的东西时,我总是很难理解为什么会这样,虽然从常识上说许多公式是能接受的,但是又不知道如何严谨的去证明那是对的。这是我才意识到自己学习的概率论是没有根基的,所以当问题深入时,我就会陷入困境。其实在当时学习这些数学课时,就有这种感觉。我们是工科院校,数学只是作为 工程上的工具,所以许多基础都省去了,而高数,线代,概率,复变中学的不过是一些可用的定理罢了。只要去认真做下作业做完前几年的套题,考试考到99也是不难的,但是似乎考满分不容易,我就从来没考过。


其实,如果只是满足于结论,只是在写Paper或 者做项目时直接调用别人给的结论,那就不必深究背后的原理。但是如果我们只是满足于应用,满足于实用工具包,那很难把东西做的深入,也许在一些算法上有改进,但却很难有实质上的突破,很难寻找到革新的方法。所以我就去了解了下如何学概率论,这时才知道要学好概率就一定要学好测度论,也就是要学好实变,而学 好实变的基础还是要学好数学分析,最近我在看Apostol的《数学分析》,才明白了为什么一开始就要学好数学分析,如果最初这座大厦的地基就没夯实,建到高处还是要把一切打倒从地下再来一次的。


前几天,我又看了一遍《计算机科学与技术学习心得》,这时的感觉是很后悔,没有按照其中的去做(数学学习方面),那篇文章真的讲得很好,当然那文章还因版权问题闹过一阵子,那个作者大多是在引用别人的话,唯一自己写的那段软件工程的没什么参考价值可以略过不看。但是那篇文章对于实变和泛函只是稍稍一带,而把重点放在计算机中很重要的其他数学领域,包括数论,图论,集合论,代数等,如果经历足够,当然要把那本离散数学分开学,我们学校的离散分为离散1和离散2,1是必修,2是选2系才会学的,而1中连无限集合论都不会讲的,所以如果有时间,非2系的同学一定要去听一下这门课,是吴健老师上的,讲的大概是我大学听到的最好的了..当然,我大三由于课很紧,没能坚持听完,最好大二去听一下吧。说到2系,2系的课最有含量,除了离散2外还有形式语言与自动机(康慕宁老师讲的,康老师还是很敬业的),数据库原理(注意,不是概论,概论那门课不学都可,自己在宿舍看看就够了)。我是1系的,除了现在张凯龙老师讲的嵌入式还不错,别的都..3系的课,虽然课本身有价值,但是讲课老师嘛。。机器学习和模式识别都被糟蹋了。


我看到过一些学长写的心得,总觉得言之无物,或者说有些和我意见不同,关于大学活动,有人曾说,什么社团都不要参加,要参加就参加什么什么什么的,其实在我看来,如果你想保研,或者想去米国,参加一下某些竞赛团体还是可以的,不然就不要参加了,连那些什么什么什么都不要参加了,纯粹是骗人的,不过机器人足球有个3D仿真组,现在队长应该是朱文,在那你还是能学到不少的,就是拿奖不太容易..那个仿真几V几的,额,如果你喜欢吃西瓜喜欢打Dota(说到Dota,我真的有些后悔,如果少打1000盘Dota我就能多看几十本书呢。)然后还想不劳而获就去吧...模联我不好多说,因为模联老大跟我一个大班..对我也很客气,数模,额,我一直觉得这就是中国学术腐败的根源..我这个人比较偏激,各位看官大可不必理会我,因我而发怒。说句过来人的话,本科还是要打好基础的,不要忙着投入太实际的东西,也许你一辈子都是在做那些实际的东西,所以着什么急呢。请至少给自己3年积累的时间吧。如果真的耐不住寂寞,那就去找个老师做东西吧,不要觉得教研室离本科多远,老师那叫boss不是teacher,不用给钱白干活,哪个老板不愿意要。


很多同学可能对学习语言感兴趣,当计算机学深入后很多事都是水到渠成的,不过,有时先学一门语言对于很多课程学习确实是很有帮助,在我看来,本科只要学好C语言就足够了(如果你到了大三结束发现自己什么都不会,成绩也不好,又不想考研考公务员,还想找技术类的工作,那就别学C了,学Java吧),C语言并不是那本谭浩强,计算机系对C语言的学习是别的专业无法比的,因为在我们手里,用C是要和计算机打交道的,而不仅仅是在行为上提供一些数值算法,我们学C是要往两边学。别的专业只要往上学,学好数据结构和算法对别的专业来说就算学好C了,但我们想学好C不光向上要学好这些,向下还要学好汇编,学好编译原理,学好操作系统,学好系统结构。举个简单的例子,非计算机专业写程序,他只在C语言语法本身考虑,他点一下编译按钮或是输一个编译命令,得到一个可执行的文件就行了,不会去管之后的事,他们做的优化是在算法层的,而我们计算机专业写C语言,我们要清楚程序是如何被编译器处理的,如何被系统链接和装载的,符号表是怎么存在的,怎么消去的,我们做优化不光在算法层,也许我们要对编译后的汇编码直接做改动,我们要考虑如何展开循环体使其能在目标体系结构的流水线上得到最大的优化,以及Cache,虚拟内存换页对性能的影响。


所以,学好C与更好的理解计算机系统是相辅相成的。C语言的书最好的还是K&R的那本经典了,不论你的C是什么水平都一定要反复研读,至于C专家编程,在我看来并不像一些学长评价那么高,但是也可以看看。汇编一定要认真学习。关于链接装载可以参考《Linker&Loader》或者最近浙大两个人写的《程序员的自我修养》,另外,阅读操作系统源码对于C的学习很有帮助,赵炯对0.12版Linux内核的注释非常详细,而且对于X86的架构也有介绍,那本书真的是中国的Linux Kernel初学者的福音,而毛徳操的分析看起来的话虽然能懂,但是对于初学者(比如我这种)不利于把握整体。于渊的那本《Oranges》是仿的Minix,也是比较容易的。另外,《深入理解计算机系统》这本书非常不错,大三之前一定要看看(越早看越好)。


关于C++,因为我还是花过不少时间学的,所以还是提一提。如果你是想学MFC,那就看侯捷的《深入浅出MFC》再加孙鑫叔叔的视频就行了,学QT也是类似。但这些都是在学使用基于C++的一些架构,不是C++本身,如果学习C++本身的话,过程还是很艰辛的,值不值呢,也不好说,虽然我现在后悔应该早点把时间给C,但是也许没学C++现在也会后悔,关于大学是否该花经历学C++,孟岩和云风几个人几年前在C++危机时有过讨论,自己可以去CSDN上看。C++的学习是很漫长的,因为他不像C那么直观,与硬件那么近,所以你要在较高的抽象层上考虑它,而C++为了让程序员可以充分发挥,并没有像Java那样提供各种功能,只是提供了能实现功能的机制,所以他虽然比C抽象的多,但是直接能用的东西却不多,不过只要你够牛,什么都可以自己来实现,举个最简单的例子,Boost里的智能指针C++并没作为标准提供,而Java里这点对程序员是透明的,但是C++不可能这样做,因为那违背了它的宗旨。所以C++的技巧变得越来越繁多,多到你一生也学不了。可能在你初学C++时并不能意识到这一点,但是当你深入模板编程时,就会体会。随着你学习的深入,有一天你会看到这本书《Modern C++ Design: Generic Programming and Design Patterns Applied》,当你在阅读它附带的Loki库时,可能你会对C++的神奇感到兴奋却又有点伤悲,当然这本书的作者
Andrei Alexandrescu已经放弃C++了,他干什么了呢?他去开发D语言了。言归正传,如果真的还是想学C++的话,那就请再三思然后下定决心吧。C++里核心就是两个,OO和GP,即面向对象和泛型编程,我觉得这两个概念对于程序语言学而言是非常重要的,通过C++是可以帮助深化这种概念的,特别对于想从事软件学研究(是研究不是做软件)的同学,把这两个概念理解透彻是很有帮助的。至于书籍,基础自然是《C++ Primer》和BS的《The C++ Program Language》,当然这两本作为入门书籍还是难了点。但是坚持下去反复研读几遍就会有奇功异效。侯捷译了很多C++的书,都可以用来作为后续学习,STL可以配合着数据结构的课程学习,若是想深入了解,可以看侯捷的源码剖析。Boost库源码太庞大,里面的高级技巧也很有杀伤力,可以先学习Loki。如果能走到这一步,你的泛型编程知识基本就没问题了。面向对象的学习主要是概念性的,在于对事物的抽象分析能力,理论上的东西很多,但是非软件学专业的研究起来就走偏了,只要你能抽象出类就可以了,剩下的就要靠编程经验了,另外可以学一下UML和设计模式。UML我个人觉得不必太多花功夫去学,学也学不深,需要实践中体会,了解下就好,设计模式是要学的,可以帮助你在设计时登堂入室,最好的还是GOF的那本书,但讲的有些太精炼了,我只看过一遍,是雾水重重,入门的话弄本大话之类的吧,这几年图书馆关于设计模式的书比我入学那时多多了,但我没翻过,不知道质量。另外,《Think in C++》第二卷里也有一章讲到设计模式,虽然我不喜欢《Think in C++》这本书(可能是翻译的原因),那一章看看还是不错的。


至于别的语言,Lisp和Prolog是值得学习的,另外时间允许的话可以学习一门脚本语言,比如Perl,Python,gawk,有时它可以很方便完成一些手工做起来很繁杂的任务。Lua是一个最近游戏产业里比较火的,我曾经试图推广给沉迷于玩魔兽世界游戏的同学,不过似乎他们对编写插件的兴趣远没有玩游戏的兴趣高。


至于计算机学习别的方面,我觉得没什么大问题,《计算机科学与技术学习心得》大部分说的都很好。另外,学院开的课程,大部分都是合理的,只有一点问题,Java不需要开,数据库应该把概论和原理放到一起作为必修,计算机导论需要换一个对计算机理解深入的人来讲,如果能让沈院士来讲这门课那很多同学之后几年的生活可能就不一样了,形式语言与自动机应该作为必修课,然后把编译原理作为其后续的课程(4周左右即可),咱们院大一的课太少,大三的课太多,没安排好,如果数学课可以跟着数学系学的话学生素质会好很多。对于学院,很多人肯定会抱怨,但是到了大四也就不再说什么了,大家各有难处。


还有一点,为什么我本科选择1系研究生选择3系,我想解释一下,因为也许对大三同学选方向有点帮助。大三时我开始对计算机硬件有了兴趣,虽然它也是计算机的范畴,但是却在很高级的抽象层。因此没有硬件的根基只顾及软件就像在建空中楼阁。大三上学期我和几个同学准备在ARM上做一个操作系统(我之前说看操作系统源码时没提ucos,因为它的源码太简单了,所以作为学C语言帮助不大,但是作为学习操作系统还是有帮助的)

另外我当时也想上一下樊院长讲的体系结构,所以就选了1系。但是当面对选导师时,却很难选择一系,因为现在1系 做的事大部分都不像是大学里该做的,那里更像一个嵌入式公司。虽然出的学术性论文很概念性,却掩盖不了事实。那个老年人的项目尤其让我不能接受。
不过想 在系统结构上创新也不是随便说说的,不说创新,能够仿照去做已是不易,当初沈康二老还是很厉害的,做研究需要太多时间,必须心无旁骛,一心向学,不求名利,这对于现在的教授而言太难了,1系教网络得张凡老师虽然课讲的不清楚,但是为人比较客气,吴晓老师的汇编接口讲的不错,很细致很清晰,董老师是我大学遇到的第一个老师,当时的离散课让我们所有人以为大学之后的每节课都是这样上的——把书做成PPT,然后再低着头把PPT念一遍,幸好,还是有不少老师不是这样教学的。再说2系,在我看来,2系真正该干的是研究计算理论,软件方法学,数据库理论之类,但是似乎2系跟科信公司渊源无比之深,李战怀和陈群现在做的东西我也不明白,也不好说,但是钱肯定不少赚。我本来也有报吴健老师的想法,但是最后还是选了3系。2系 的老师如吴健,真是一个好老师,上课能做到教书育人,没有愧对教授一称,康慕宁老师,思维敏捷,看上去挺严肃,实际很有趣,有次上形式语言还唱了两首歌,陈群老师,你看他的头发就知道他多聪明多努力了,他说话总是说不清,原因大概是他的思想实在太快,以至于面部和舌部的肌肉难以跟上那种速度。3系嘛,虽然叫做应用,也做了很多应用,但是还是在算法上有所研究的,也许现在1系更适合应用这个名号吧,所以我还是放弃了我很感兴趣的系统方向。3系有些我觉得不错的老师,比如教图形学的林曾刚老师,我们私下都称其刚哥,或许他名气不大,没有头衔,没有论文,但是C++的 功底还是很深的。教多媒体的郑江滨老师,长得很可爱,软硬件都很扎实,讲课生动易懂,连多媒体这种根本讲不出东西的课他都能讲出道道来。这学期模式识别前两次课李映老师出差,他帮忙代课,讲的我基本没瞌睡,后来李老师回来了,我听了一次,就再也不去上那门课了。谢老师,我的班主任,就不多说了。付中华老 师,讲数字信号处理讲的很认真,很细致,以至于最后课时结束了还没讲完。别的像王庆老师,张艳宁老师啦,我都没接触过。对了,还有一个老师要提一下,就是 艾丽蓉老师,虽然她带的人工智能课十分乏味,但是作为何老先生的弟子,理论功底应该还是很扎实的,记得有一次学院搞了个老师推荐书目,大部分老师推荐的书都没什么价值,但是她推荐的两本《深入理解计算机系统》《计算机程序设计艺术》都是非常值得读的,从那一次之后我对她就充满敬意。有一次上课,我在看一本 叫《人工智能哲学》的论文集,她下课走过来翻了翻,说这本书很好,要好好看看。当时我觉得她内心不是像她上课时那样不苟言笑,可能是对人工智能学的太深了,在哲学层面上对于科技思考的太多,所以她不像别的老师那样忙于一些事情吧。人工智能就是这种学科,你很可能在其中渐渐的自我矛盾,找不到出路。4系我就完全不知道了。

 

 

这篇东西内容不多,我花了大篇幅在说明程序语言学习上了,虽然我还可以再写一些,但毕竟很多都是我的观点,可能一些学弟学妹接受不了,我想找了几个朋友来做些补充,顺便再重点谈谈关于算法和硬件的学习。如果这篇文章有人看的话,我就催他(她)们赶快些写出来,要是没人看的话...那就不急了。

你可能感兴趣的:(杂谈)