FZU 一位cser && icpcer的文章,转载过来。一些感受,一份感动。
http://acm.fzu.edu.cn/phpBB/viewtopic.php?t=682
作者: cy
[连载]四年 (1)
今 天刚拿到Visa, 明天就离校了。本科四年学到了很多东西,也有一些遗憾,这里一起总结一下,希望对以后的小朋友能有些帮助。文中提到的内容,主要是针 对真心喜欢Computer Science并且没有打算马上就工作的同学。当然,这只是给大家一个参考,而且各人情况不同,大家不要一味模仿-_-
刚 进学校的时候就知道本科阶段是最后一个可以真正自己学习的时间了,因为以后即使读研究生,也必然要帮导师做事,时间安排和学习内容都会受到约束,至于工作 那就更不用说了。所以就打算在这四年里能把自己以前希望搞懂的领域至少都粗略的看一遍,这样以后不管做什么都不会有太大遗憾。现在想想,还是有很多遗憾 的,有些不该花时间的地方浪费了很多时间,有些该看的东西反而没看。这一方面是引导的问题,有些事情其实并不难,只要有人能在适当的时候点拨一句,往往结 果就会有很大不同;另一方面当然是自己还太naive,现在的小朋友都是大二就开始发paper的,差距啊……下面按近似时间顺序具体分析一下。
高 三暑假的时候刚好Knuth的The Art of Computer Programming出影印版,于是大一开学就开始看第一卷,相当的震撼,完全 没想到算法书可以写到这种高度和境界。这一看就是一年,终于把第一章看完了,习题做了大概60%……但就在这时候发现了传说中的 Concrete Mathematics,就是把Knuth第一章的内容写成一本书,讲解细致得多,很多原来不懂的习题技巧也放到正文部分来讲了,很适 合偶这种土人,但后来由于种种原因没有详细看下去,这是很大的遗憾,以后还是要找个时间好好读一下的。友情提醒, Concrete Mathematics介绍了大部分在计算机科学中广泛运用的数学知识,并且在概念的引入和表述上很有特色,特别适合学习,而 TAOCP则显得有点像习题集了……鉴于偶们大一的高数、物理、英语变态的简单,建议逃课看CMath -_-。如果逃课被抓住,偶的经验是不要理他,期 末好好考就行……
由于书选择错误,这一年能力没有太大提高,但至少开阔了眼界知道了什么样的结果才算是一流的结果,知道了所有看似深奥的内容其 实背后都一定有一个简单的想法在支撑着(否则别人也不可能想出来啊,脑袋都是肉长的嘛)。如果觉得一个问题很复杂,那一定是自己还没悟。这些认识对我后来 的学习是有很大帮助的,也算是误打误撞的一个收获吧。另外,当时网上很多人评价Knuth的文笔如何如何的好,没什么感觉,后来考完GRE,又看了几页顿 时跪拜,今后也要多多学习大牛的表达方式。寒假的时候顺便学了TeX,打算出国的同学还是要找个时间学一下这个的,以后写paper比较方便,大概一周左 右时间就够了。顺便做个广告,如果会TeX,以后写毕业论文用偶的TeX模版,就可以不用花时间排版了,偶们学校的论文格式实在是很变态啊啊啊啊……
大 一暑假的时候辅导中学生参加信息学竞赛,碰到一个高三学生,给了我很大启发。为了避免泄露网友资料,具体事件略去……但这件事给我的影响就是让我意识到没 有什么事情是不能尝试的。不赌一把怎么会知道结果,只要这个赌注自己承担的起,就值得试一试。这也更加坚定了我出国和逃课的决心。偶这里一直强调逃课的重 要性是因为,偶觉得学生的主要任务是学习,而不是上课。我们有权利自己选择合适的学习方式。最烦的就是上课点名了,一点技术含量都没有-_-
[连载]四年 (2)
接下来讨论一下计算机的一些专业课。下面的内容都是我认为应该学习的东西,而不是老师画出来的那些所谓的重点。如果只是为了应付考试,考前看两三天足够了。当然,这些介绍肯定是很片面的,但至少比天天去上课好-_-
大 二的时候开始上硬件的课,数逻、组成、体系结构。因为之前没有接触过这方面的东西,学的时候一直很迷茫,以为这个只有做硬件的人才用得到。直到最近才有点 悟了,其实这些课对编程还是很重要的(不过模电对偶们有啥用处,偶就不知道了……),但是重要的东西并不是他课上教的那些东西-_- 这个偏差源于出发点 不同。现行的教材都偏重于如何设计一个特定功能的硬件,但程序员需要关心的是给定一个硬件的实现,如何高效的利用他的特性来写程序。虽然学通了,这两个观 点本质上没什么区别,但对于初学者,如果没有意识到这点,就很难产生兴趣深入的学下去,也不知道应该往那方面学。为了说明偶的观点,举个很简单的例子。 for (i=0;i
剩下的课基本上都是应用性的课程,如果前面的基础打得好,学起来就比较轻松了。
操作系统,这个还是很重要的,如果没学清楚,写出 来程序就跟那些外系的没什么区别了。编程水平高虽然不意味着就一定能做出好的成果。但是如果不会编程,那你数学必须相当的彪悍才行,比如像姚先生那样,他 貌似就只会很简单的Pascal……OS好的教材有很多,随便到网上搜一下就行。不过我们的课本那是罕见的差,跟看政治书没啥区别了。这部分建议看基于 Linux的教材,它比Windows的介绍的会更深入一些,碰到问题至少还有源代码可以查。学操作系统关键还是实践,虽然不可能实现整个操作系统,但是 写一写自己感兴趣的部分还是有可能的,其他的部分至少要搞清楚为什么会提出这些概念,它可以解决哪些问题。有兴趣的同学可以自己写一个能处理 Restricted Function的Online Judge,这样对调试进程、系统调用的理解就很深刻了。这里再做下广告,目前网上的 Online Judge虽然很多,但是能像偶们的Judge这样支持Restricted Function Call的还是很少的,挖哈哈。
网 络,这个就是很Engineering的学科了,看书好像没什么用。其实Engineering的东西,书上基本都是提一些框架性的东西或者标准之类的, 当做字典用就可以了,这里面关键是弄清楚这些设计是怎么提出来的,能解决哪些问题,具体的协议内容并不重要。从实用的角度来说,偶认为至少要掌握 Socket编程和协议栈,有兴趣深入的,可以写一写P2P,ad-hoc network之类的应用程序,相信会很有收获的。网络是一个很大应用背景, 在这个基础上可以做很多的应用,在理论方面也有很多诸如路由、安全性问题没有解决,因此在前几年是非常热门的。不过偶导师告诉偶,在US,Network 的PhD已经过剩了,并且funding也不够充足。我想这个是学科发展一个必经阶段,从历史上看每一个很有前途的学科出现的时候,往往都会有很多人加入 进来,使得在短期内这个学科过渡饱和,然后随着学科逐渐走向成熟,那些投机的人自然会离开,从而形成一个稳定的供需关系。所以,如果你真的喜欢 network,我觉得可以不用理会这些负面的消息。
人工智能。偶一直觉得从算法设计或者ICPC的角度来学搜索算法是学不好的,只有在人工智 能当中,从状态空间的角度来学搜索,才能对它有比较深刻的认识。另外,一些软计算方法,诸如遗传算法、神经网络的程序也要写一下,貌似现在很多本科生都会 这个了。不过,偶觉得做这个方向不太踏实。软计算方法每几年就会提出的一种新的,然后原来的方法就瞬间没人关心了。最后导致的结果就是每次出了一个新的方 法,大家就把以前的问题update一下,做一个试验结果就是一篇新的paper了。这样好像很没意思。当然,要是能证明它们的收敛性那还是很牛的。人工 智能里面还有一些很有前途的分支,比如数据挖掘、机器学习等,这几年也比较热门,偶比较感兴趣的是这个跟 massive data manipulation的结合,貌似目前结果还不多。
最后说一下软件工程……我个人是强烈鄙视软件工程的那套理 论,特别是他的什么开发模型。我相信合作可以提高效率,但绝对不相信一个真正有价值的程序可以有十几甚至更多的人在那种变态模型下合作完成。Knuth在 写TeX时候完全就是一个人,虽然写了10年。但他曾经试图让他的学生去写程序,最后发现花在沟通上的时间远大于他自己写程序的时间。这个是完全可以理解 的,每个人都有自己的背景、风格,软件工程的变态模型就是希望所有的coder都能够去除个性,靠读那些很规范的文档来交流,像机器一样写程序。这个也太 没有人权了吧。这样做也许在表面上可以提高效率,但他忽略了coder的创造性,是资源的严重浪费也是对人才的不尊重。至于软件工程剩下的那些什么风险评 估、系统集成,那是地球人都知道的东西,需要他再建立一个学科来讨论么-_-想想开源软件的例子,就应该知道这个什么开发模型完全没有意义。这个是偶长期 以来一贯坚持的观点,欢迎有不同意见的同学讨论。


