今天非常幸运听到了harry的讲座(更幸运的是,和harry坐同一趟电梯去会场,途中还给我们讲了stanford的徽标的真实含义……)
刚 刚上研究生的时候就在网上看到过harry的一次讲座,标题也是同样的how to do research,内容也大致相同。从这个方面看来,其实做研 究也没有什么独门蹊径,方法总是那些方法,就看个人是不是真正领悟病付诸实施了。略加增删后的笔记整理如下,以便日后查阅。:)
1 what is research?
research大致分为三个阶段,明确方向、找到课题、深入研究。research和其他的劳动从本质上没有什么区别,有着朴素的方法论,即:
2 what are the methods?
2.1 挖洞法
这招就是在深入调研前人对于某个问题的研究的基础上,找到别人忽略的部分,进而做研究。
个人评价:这是找问题的最简单方法了,可以不用考虑问题本身是不是值得研究(这个是牛人与普通人的分水岭),但是往往这样的问题有时候也颇有一些难度,因为简单的洞大多早就被填了,剩下的洞往往很深,不容易填。因此这种方法比较适合于在问题的早期参与进去,越往后越被动。
2.2 枪扎一条线
这招就是一定要下决心,一条道走到底,不但要想到别人能想到的,还要想到别人想不到的,总之,把一个问题做到力所能及的最完整为止。
个人评价:这是一名博士生所应该采取的方式,要在某领域有所建树,有深刻的理解和造诣,才是一名合格的博士。
2.3 棍扫一大片
这招就是吃透一种方法,充分挖掘这种方法在不同领域的应用。
个人评价:这是典型的应用型方法,要求在领域的结合方面有比较独特的办法和创造性。
3 得奖之道
representation&redifine problem,不多说了,因为我对获奖目前没有什么兴趣:P
4 吸星大法
要想做好研究,闭门造车并不可取,要想方设法扩大自己的学术圈子,洋为中用,古为今用,就是这个意思。
5 how to do from now on?
5.1 set up a goal (which may be a big goal) but
5.2 think small, think simple at the beginning
5.3 build a prototype and
5.4 keep documenting (2 big good: know what i am doing and let advisor know what i am doing)
6 what is research life?
reading->thinking->talking->hacking->…
个 人评价:做研究的生活很枯燥么?可以说是,因为每天都在重复同样的步骤;也可以说不是,因为每天的思想都有新的变化。Harry说,bill 的绰号是野 兽般的读者,可见reading对于一名研究者来说多重要。idea不是拍脑袋拍出来的,而是通过大量的阅读沉淀出来的。孤独的读者往往是可怕的,因为他 们有可能被浩如烟海的paper淹没,所以我们必须找到朋友和我们分享阅读的苦与乐。即便是批评和责问,也是有价值的。Harry建议,我们要力争让 advisor成为我们的第一个牺牲品:P
7 总结
7.1 motivated
7.2 ask new
7.3 propose small idea from the beginning
7.4 have one thesis in mind all the time
7.5 set up buddy system
7.6 patience
个人加一条:
脸皮要厚,换句话说,把自己的位置降低,在科学面前,牛顿都是个娃娃,更何况我们呢?:)
How to do research from MIT AI lab (English version)
http://www.cs.indiana.edu/mit.research.how.to.html
***关于阅读***
1. 很多研究者花费一半以上的时间用来阅读。在研究生开始两年,出了应付功课,其余的时间阅读有关于你topic的课本和journal articles。
2. 了解自己相关topic最为核心的杂志。每年去图书馆翻阅过去一年相关大学的研究者做出的引起你兴趣的technical reports.
3. 不要详细阅读每一片paper。第一步,看看哪里是引起兴趣的地方。顺序为abstract,table of contents, conclusion section and introduction。如果还是毫无发现,那么放过它。第二步,一旦发现你感兴趣的地方,看看这个 paper有什么good stuff。这个往往因人而异,也许对你来讲很好的point并不是作者的重点。第三步,重读整个文章,评判它的价值。
4. 带着问题阅读。“我可以怎么用?”“作者的claim是否经得起推敲?”“如果……会怎样?”搞清作者的motivations, 做出某种选择的原因,假设和建议的方向。
5. 随时编程。看到paper中陈述的idea, 做simulation.
6. 如果有人递给你一篇paper,询问他们推荐的原因。也许在他们脑海里,某些他们认为对你有用的idea已经春光乍现,而你始终不知所云。
***关于networking***
1. 加入一些你认为活跃的论坛和email list.
2. 如果和其他领域的人讨论问题时,听到他说:“你有没有读过XXX?”那么“书非借而不能读也”。
3. 发现自己感兴趣的paper, 发给你觉得可能会感兴趣同仁,告诉他们你感兴趣的地方,你可能同样因此受益。
4. 看看你的同事办公桌上正在阅读的paper,询问他们原因,这样比自己查图书馆要效率高的多。
5. 写出自己idea的draft,或者你写好的paper,分发给你觉得可能会感兴趣的同事包括老板,并且要求他们的评论。
6. 尽可能和不同领域的人讨论。
7. 做reference log。这样也许通过树图,你会通过引用率勾勒出目前占据这块山头的几组大佬。
8. 参加会议时,记得带上名片,给别人介绍一种牢记你名字的办法。也许你会看到大
多数会议的paper实在是boring and silly,所以你参加会议的目的是认识不同的人。他们会给你传播信息,邀请你去talk,给你一个summer job。认识他们很简单,走近他们说“我对你的paper很有兴趣。”然后问一个问题。
9. 夏天的时候不要呆在自己的实验室,走出去认识新的朋友。他们也许会给你展示另一种不同的看待事情的眼光。寻找summer job的方法,询问那些正在找工作的毕业生吧。
***关于相关的领域***
1. 选一门这个领域的研究生课程。
2. 阅读一本这个领域的bible
3. 你知道这个领域最好的杂志么?
4. 知道这个领域的翘楚和他们的必杀绝技么?阅读兵器谱。
5. 查看这个领域的公告牌,看最新的announcement。可以的话,找一个美女或者帅哥拍拖。
6. 从查看自己学校的department开始,近水楼台先得月。
7. 在“尚能饭否”前,永远不要忘记数学。不要只做听众,不惜找一个死党用枪逼着你做题。
8. 问自己一个问题:“如果我知道x,是不是问题会变得简单一点?”如果回答“是”,go to 1.
***关于笔记***
没有航海日志的船长是失职的。
1. 无论你觉得你现在的idea多么垃圾,给它一个墓志铭。
2. 给出问题可能的解,考验直觉的时候到了!
3. 总结引起你兴趣的reference,向图书馆套磁。
4. 时而不时的回头读你的笔记,莫做无情郎。
5. 按照title, abstract, section headings, fragments of text的格式组织你的笔记,即使你不打算发表,或者很快就变了心思。
***关于写作***
1. 写下idea的过程是debugging的过程
2. 不要指望你的读者做你看来显而易见的推论,写作的目的是让别人容易看懂。要求你的同事对你的paper的反馈。
3. 寻找这个领域的范文,吸收作者的写作风格。
4. 罗马不是一日建成的。从outline开始,对着屏幕随意涂鸦崩到脑海里的词语,然后细化。开始写作时不要过于拘泥于文章的顺序,空中楼阁建筑初期也是允许的。
5. 没有必要做一个完美主义者。过分对词句雕饰的巴洛克风格并不是很popular,而且是一种变相的浪费时间。你的文章是和同仁的对话,不要指望每个词都成为圣经。
6. 以写信的风格把你的idea娓娓道来。前提是明白自己在说什么。
7. Put the sexy stuff up front, 仔细你的abstract, 它可是“第一眼美人儿”至关重要的部分。
8. 写文章如同外交,请不卑不亢。
9. 写出你觉得不好的地方和自己无从改进的地方。这意味着你可能转进一个牛角尖,或者local minimum. 那么请重整山河。
10. 请确定你的文章里有一个idea。如果你在10ms中解决了一个问题,除了给出你的解决方法外,请解释为什么。
11. 写完初稿以后,删去第一段。可能从第一段最后开始,一切才make sense.
12. 开始做项目时请养成一个写informal paper的习惯,解释清楚你打算干什么,已经做了什么。最多花两天时间,超过两天,请设闹钟。和你的同事包括老板分享。
13. 学会写有价值的comments:
a) 在做comment以前请至少阅读文章两次,一次用来获得main idea,一次用来标记评论对象。
b) 如果一个人一而再,再而三的犯同一个错误(尽管赫拉克利特曾经告诫我们“人不能两次踏进同一条河流”……),劳神分析一下他的错误类型、揣测一下原因,再善良一点点——想想你怎么替他打扫残局。并且请诚恳的告诉他。
c) 避免一些恶劣的词语“garbage”,想想你作为作者看到这样评论的感受。建设性的意见是永远受到欢迎的。如果你不准备好铁锹帮别人挖土,就可能有铁锹朝你的脑袋拍过来。
d) 有价值的评论意味着不断给出具体的原因。
e) 给初稿的评论主要在于结构和内容,对于终稿的评论越具体越好。
14. 不必采纳所有的建议,但是要认真的对待。不采纳某个建议,给自己一个完备的解释。学会忍痛割爱,因为这往往意味着在旁观者看来,某些“卖点”的确毫无吸引力。
15. 关于发表文章
a) 保证自己要发表的paper有新的idea,而且值得推敲。
b) 投稿以前保留draft一段时间并评论,避免急功近利。
c) 请在投稿以前,弄清journal或者conference的文章风格。不要穿运动衫去鸡尾酒会。
d) 阅读information for authors。
e) 阅读这个会议的prize paper。
f) 给会议发一个短的、初期的结果,给journal发最终的长篇大论,这样作总是适合时宜的。
g) 遭到rejected,不必灰心。
h) 和会议不同,如果被journal据了,要学会argue。反水的余地还是有的。
i) 重视journal的referee,你往往可能得到非常好的意见。如果不采用他们的意见,请礼貌的解释为什么。无论你在review中扮演如何的角色,永远不要忘记游戏的规则:在你未来学术生涯里,角色交换在不断上演。
j) 一篇要发表的文章往往会改的让你吐血三升。一个原则:除非你有足够的passion,否则不要尝试去研究并发表一个其实你兴趣不大的东西,这其中的痛往往比你能想象到的糟糕的多。
***关于交谈***
基本原则就一条,就是要死撑。不停地说不停地说不停地说不停地说不停地说不停地说不停地说不停地说…… 要甘愿做早发的种子,不管在什么场合,都要不甘 心的在各种疑惑、鄙视、甚至赞赏的目光火力交织下主动跳出来,哪怕马上把寒冬的气温当头两个结实的耳光打的找不到北,说!(你小子说还是不说?!)当然这 样做的好处总还是有的,因为修改一个人的讲话远比修改一篇paper要容易的多。据前辈风清扬同志说,他的剑谱中最最牛的几招的文字组织工作就是来自于给 别人过招做报告、展示自己的brain storm时,不断的说不断的改中修炼出来的。
在一次对话中,只讲一个idea。(象令狐冲 那样一点就会,一个时辰就拿定好几招的观众少而又少,大多数观众还是象石破天那样期期艾艾的)。在一个20分钟的talk里面,你的任务就只是把idea 本身讲出来。30或者45分钟可以多罗嗦罗嗦背景知识。在一个小时的报告里可以讲讲细节甚至一些你发现的不那么曼妙的东西……STOP SIGN (不停 下来可是要有ticket的)。不要做递进式的推导,要记住永远不要讲的超过1个小时。不然你会听到他们讨论去那个餐馆解决今天的晚饭问题,如果是在大 学,没准儿你还可以听到勺子和饭盒敲击的“逼宫”进行曲。
***关于编程***
1. 头两 年花点时间来读读一些前辈的剑谱。当然必须明白的是也许读懂他们的程序可能要比你自己编程所要花费的时间还要多,不过一些你永远在课本里学不到的眼花缭乱 的tricky的东西在里面的某个角落闪闪发光,知道“读读读,书中自有颜如玉”的道理,关键是你自己看不看得到佳人回眸、三笑留情。
2. 红颜自有老去时。不要以为你一度极其得意的作品,你会认识她一辈子。Comment your code。但是不要过分修饰。米兰的大教堂外观就是因为过分修饰而丧失了整体轮廓的清晰感觉。
***关于牧首***
在你刚刚进入研究生生涯的时候,一个最重要的决定就是选择自己的老板几个问题你需要问一问自己。
你想要做单干户还是打算过集体农庄式的生活,你需要老板对你多少指导?你希望老板天天跟在身后不断talk talk还是打算给他来一个米兰·昆德拉式 的“三三”定律(如果要让一个女人迷上你,那么约会三天,而后三个月不要见面,再约佳人。如果要让一个女人厌倦你,那么三个月日日厮守,再小玩一把3日失 踪,然后自己乖乖回来)?你需要多少压力?多少情感支持?你希望你的老板给你一个中规中矩,总会解决但是不那么 exciting的idea?还是一个看 起来疯狂到可以把你抛进名人堂,但是也可以让你几年一无所获只想和撒旦亲密交谈的idea?
当然选择老板的同时也在被老板选择,看看他们实验室主页的介绍,和他的新、老学生交谈(注意这里的收获是不同的)还有单刀赴会直捣group meeting的黄龙府,有些猛人也不是做不出来。
不要过于依赖牧首的智慧。经常找不同的人来review你的工作,这往往会让你逃离这样的错觉:你觉得你有进展、但是其实还是在原地打转。
***关于论文***
Master 和PHD的论文区别在于,对于master来讲,你只需要在1到两年之间了解自己所在area的发展行情,和最为fashion的技巧, 然后搞一套行头来自己穿穿。一个需要注意的事实是,通常在一个领域之内认真的混两年以上,你才可能有对自己的领域有所贡献。这样听起来是不是 relieve了很多?时间过得是很快的……
怎样选择一个topic?首先就是你的热情,如果用来追窈窕淑女的话,基本就是诚意。 (跑题的说,诗经里面所谓的窈窕淑女,其实远不是上层阶级的大家闺秀,她们一般都被锁在深闺,而真正能够出来调情,吃饱了哼哼几句词句的倒是自由的平民女 子。)但是无论你是要做整个领域的救世主,还是只是撞撞擦边球小打小闹,让别人能明白你在做甚么是自己义不容辞的责任。
靓汤在手,总 是要一口一口的喝。把问题分割成一步步可解的步骤也会让自己在年终总结时候多有些成就感。冒险的精神是必须要的(我们热烈欢迎唐吉诃德的登场,请看大战风 车),就像汤可能会烫了嘴,泼洒一身,决无所得,这时候你必须要象一个职业赌徒那样的敬业,对自己的全盘颠覆有足够handle的能力。
在paper 的further work中寻找你的topic是一个很好的主意。无论你打算做什么,你需要保证你在做一个以前没有人做过的问题。同 样,和别人同时进行同一个idea也是不明智的选择。一个非常正常的现象是,你在马上就要进入phd工作尾声的时候,看到一篇发表的文章看起来似乎解决了 你正在做的问题时,悄然战栗。通常看起来类似的地方可能只是表面现象,那么把你的工作和那片文章一起show给你的族长Mr. wise man裁决,和 他们讨论,争取他们的意见。
最后要注意的是,在你决定你的topic之后一定要和你的老板获得共识。如果你和他有不同的期待值,而你没有明白,你可能付出及其惨重的代价。
***关于心态***
这恐怕是最为重要的部分。
Research可能让你成为在云端歌唱的天使,也可以让你成为倍受烈火烤炼的地狱中的罪人。正如《洛丽塔》的开篇所说,它是生命之光,欲念之火。它可以成就你的罪恶,也可以铸炼你的灵魂。
所有的研究都是有风险的。如果你的项目永远不会失败,那么它是development,而不是research.。难得的是如何面对你的项目的失败。直陈你的失败,至少说明你有足够的勇气去面对。当然这并不是说你会在你的老板那里获得一个如魏征一样的名号。
极少数人在他们的工作中看起来是不断的在成功,不断的在发paper,事实上他们也和其他任何一个人一样在不断的失败。奥妙在于你会发现他们同时在做很多的project,而且只有其中少数有所结果。套用一句入门的招术:失败乃成功之母。不妨把它作为自己的一种信念。
Research中同样也有墨菲定律。那就是它要比你所想象的花的时间长的多。经验规则来说任何一个小的任务都要花费三倍以上你所期待的时间,当然人也有些加上,甚至在你考虑了这条经验规则之后……
比较残酷的现实就是你必须要把你的research 变成你生活的一部分。也许你会发现一些突破性的idea正是在你淋浴(据说这个世界有两种人,一种 是洗澡时候唱歌的人,一种非也。我不确定奇思妙想会对那种人更加青睐有佳。)、或者在地铁站、或者逛街的时候(so MM们找帅哥逛街更有一条强而有力的 理由了)灵光乍现、柳暗花明。当然品味是很重要的,这就需要自己能够区分什么时候肤浅的什么是天才的构想了。
你会发现你的进展程度变 化很大。有时候势如破竹,有时候停滞不前。这个时候你往往在怀疑自己的能力。需要问自己的问题是:是不是自己的目标设置的太高?如果你一再怀疑自己的能 力,就会陷入到不能继续作出什么东西的恶性正反馈中。需要明白的一点是:RESEARCH ABILITY IS A LEARNED SKILL, NOT INNATE GENIUS.减少你的工作时间到每天一个小时,过一段时间,也许你会找到感觉。如果还是觉得自己不能够突围,那么去寻求心理医 生的帮助。
一个常见的现象是看不到自己的成就。你往往会对自己说:如果我能做的到,那它是显而易见的。也许这些idea 对你来说如 此,但是别人其他人来说并非如此。你需要做的就是和陌生人不断交谈你的工作,也许从他们敬畏的眼光里,你可以找到自信。事实上可以用来安慰你的事实是,在 最近的一项对Nobel laureates的调查中显示,大多数人并不能意识到自己的工作是震撼世界的成就,而且在工作期间他们始终在怀疑、不安中徘 徊。有大贼如此,况使君乎?
通常会有两个做研究的心态。一种是别无选择。除此以外你不能够靠其他方式生活,事实上大多数好的 research都来自于这个门派。一种是觉得有趣,但是在大多数时间确实苦不堪言,关键在于自己能够享乐其中。如果你真的在反复考虑后决定走 research的钢丝,重要的是如何端起这两种心态的横杆从中寻找平衡。
推荐书目: Gregory Gateson, “Advice to a Young Scientist”
Freeman Dyson, “Disturbing the Universe”
Richard Feynmann, “Surely you are joking, Mr. Feynmann!” 这本书的中文名称是《别闹了,费曼先生》,非常有趣。
George Hardy, “ A Mathematician’s Apology”
Jim Watson, “The Double Helix”
Alan Lakien, “How to get control of your time and your life” 这本书据说深受甚至于反对self-help人士的欢迎。
Question Answering
- factoid
- list
- definition
Chinese Word Segmentation
Named Entity Recognition
Document Summarization
- Single-Document Summarization
- Multi-Document Summarization
Information Extraction
Pattern Match
- KMP
- BM
- WM
- AC
Machine Learning
- HMM
- CRF
- Kernal
- EM, Boosting
- SVM
- MEM
Probability theory and statistics
Linear Algebra
book: Foundations of Statistical Natural Language Processing by Chris Manning
book: Pattern Classification
Complete Security Center 242 Project
Reading Lucene Source
Reading Hadoop Source
Python Useage
Apache Useage
CLRS: 两周之内
-Amortized Analysis
-Linear Programming
-Number-Theoretic Algorithms
-Approximation Algorithms
Special:
-DP Special Training(30problems) 两周之内
-interval tree, tree array, mergesort tree. 两周之内
-more about NP-Completeness(paper+problems) 一周之内
Books:
-<AI> 一个月
-<Concrete Mathematics> 一个月
Contest:
-争取两天一套
Vocabulary:
-1天一个list
nod,就这样了,闲了大半年了,该拼拼了。
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的创造性,是资源的严重浪费也是对人才的不尊重。至于软件工程剩下的那些什么风险评 估、系统集成,那是地球人都知道的东西,需要他再建立一个学科来讨论么-_-想想开源软件的例子,就应该知道这个什么开发模型完全没有意义。这个是偶长期 以来一贯坚持的观点,欢迎有不同意见的同学讨论。
