Posted by 宝水 on 10th 十二月 2007
C++ 的沉迷与爱恋
侯捷 1998.09.28
每年的 09/28 於我都是一个特殊的日子 — 不只是因为教师节。今年很特殊地没有普天同庆,那麽我就写篇文章自己庆祝一下好了。
我於今年七月发表了一本着作《多型与虚拟》和一本译作 <深度探索 C++ 物件模型> ,获得很大的回响。这些作品都不是针对 C++ 的完全初学者所写,但从初阶到高阶为数众多的 C++ guy,热情地表达了他们对这些主题的喜悦。
在许多来信中,我看到一些有趣的现象,也感受到一些值得整理下来的想法。所以,根据我个人的学习过往、我的教学经验、以及周遭朋友的心得交流,写下这篇文章,或可为後学者戒。
●《多型与虚拟》序言节录
首先让我节录《多型与虚拟》一书序言:
《多型与虚拟》序 节录(侯俊杰/松岗/1998/07)
一般而言,C++ 是一个难学易用的语言。
C++ 的难学,初始在於其重重的布幕,布幕之中编译器对我们的程式码做了太多的手脚,使我们惯於循序思考的工程脑袋一无所措。及长,又面临新的思维模式,使我们必须扭转惯常的思考习惯。
C++ 的易用则在於其巨大的弹性,能够以多型(polymorphism)、虚拟(virtual)、模板(template)、泛型(generalization)等种种型式,让既有的码去处理未知的、未来的资料型态。
当然,易用必须先能用。用不好或不能用的话,「写 C++ 程式」最後就成了只是「使用 C++ 编译器」,这是大家常拿来彼此调侃的笑话。
在「难学」的背景下,「易用」是使我们依然前仆後继的动力。愈来愈多的大学资讯科系把 C++ 开在大一课程,这虽然说明 C++ 是多麽地重要,可也苦了资讯新兵们。
其实「难学」的最大症结在於,很难得有一本书,能够一针见血地指出多型与虚拟的重要性;在我们粗具语法基础之後,直接把我们导引到最核心最重要的思想,并且在建立这个思想的过程中,提供足够的必要基础。
●困难度之一
「C++ 是个难学易用的语言」,这句话相信很多人心有戚戚。C++ 的学习难度,一在於语言本身太多的「幕」,一在於 “paradigm shift” (思考模式的移转)。
传统循序语言如 C, Pascal, Basic, Fortran…,除了模样看起来稍有不同,基本上都是函式 call 来 call 去,大同小异,很容易掌握。你想做的动作,在 code 中都看得一清二楚。你所看不到的,荦荦大者也不过就是编译器为你的函式加上用以处理堆叠的一小段码(prologue 和 epilogue),这一小段码基本上做的是 housekeeping 工作,你没看到也没有关系(更好),并不影响你对程式逻辑的思考。
C++ 不一样,C++ 有太多和程式逻辑息息相关的动作是编译器为我们加上去的。换句话说 C++ 编译器为我们「加码」。如果不识清这一节,学习C++ 有如雾里看花,雾非雾,花非花。
编译器为我们的 C++ 程式加了什麽码呢?很多!物件诞生时 ctor 会被唤起,物件死亡时 dtor 会被唤起,这都是加码的结果。ctor 中设定vtpr 和 vtbl,这也是加码的结果。new 单一物件时会产生 memory block cookie,new 物件阵列时会产生一个内部结构记录着 object size 和 class ctor…,这也都是布幕後的工作。可以说,程式码中看不到而却必须完成的所有与程式逻辑有关的动作,统统都是 C++ 编译器加码後的结果。
当「继承」发生,整个情况变得稍微复杂起来。「多重继承」又更复杂一些,「虚拟继承」再更复杂一些。
这些布幕後的主题,统可归类为所谓的 C++ object model(物件模型)。如果不知道这些底层机制,你就只能够把 “make destructors virtual in base classes”(<Effective C++>, item14)或 “never treat arrays polymorphically” (<More Effective C++>, item 3)这类规则硬背下来,却不明白它的道理。
用一样东西,却不明白它的道理,林语堂如是说:『不高明』。只知道 how,不知道 why,侯捷如是说:『不高明』。
●困难度之二
C++ 的第二个学习难度在於 “paradigm shift”(思考模式的移转)。别说自己设计 classes 了,光使用别人的 classes,就都是一种思考模式和行为模式的移转。MFC(或 OWL 或 VCL)programmer 必然甚能够领略并体会我的意思。
使用所谓的 application framework(一种大型的、凝聚性强的、有着物件导向公共基础建设的 class library),你的码和 framework 之间究竟是怎样的关系呢?framework 提供的一大堆可改写的虚拟函式的意义与价值究竟在哪里呢?为什麽 framework 所设计的种种美好性质以及各式各样的演算法竟然可以施行於我们自己设计的 class types 身上呢?framework 被设计时,并不知道我们的存在呀!
这正是物件导向中的多型(polymorphism)的威力。
稍早所说的 C++ 物件模型,偏属程式设计的低层面;这里所说的思考模式移转,则是程式设计的高层面。能够把新思维模式的威力发挥得最淋漓尽致的,当推物件导向的 polymorphism(多型)和 generalization(泛型)。如果你没有使用这两项特性,等於入 C++ 宝山而空手返。
●反覆 炼,循环震荡
想像 C++ 是一把用来解决程式问题的刀,要它坚轫,要它锋利,就必须经过多次的回火,在高热和骤冷之间 炼。
初学 C++ 语法(syntax)之後,你应该尽快尝试体验 polymorphism (大致而言也就是虚拟函式的运用)。等到对 OOP 的精神有了大局掌控的能力,但对 C++ 的许多小细节不甚清楚,就是回到C++ 物件模型 炼的时机。
成长,是在高阶(polymorphism)和低阶(object model)之间反覆震荡,才能够震荡到更高的位阶,而不是平平庸庸於中阶(C++ syntax)的一滩死水。
●不要沉沦於 C++ syntax
100 个人跟我说他懂 C++/OOP,只有 10% 不到可以让我认为他没有胡吹大气。太多的人,上嘛上不到 polymorphism,下嘛又下不到object model。就这样不上不下地卡在 C++ 语法层面。大一学了C++,到大四快毕业了,连 virtual functions 是怎麽回事都期期艾艾支支吾吾说不出个道理。
有时候我觉得,太苛责同学也於心不忍,因为同学们事实上处於一种无知的状态,既不知道 C++/OOP 该怎麽学,也不知道哪些书可以教他们那麽学。所以,苛责同学,不如责怪老师。
众所周知,大学教授泰半是动口不动手,普遍的心态是「论文第一,升等为要;程式语言?哎,末流!」。「末流」课程通常由教授们轮流教,谁倒楣谁来教;於是就常常有「下学期要教 C++ 语言了,这学期寒(暑)假赶快去要本书来恶补」的情况发生。偏偏程式语言这东西,只动口不管用,一定要动手,而且要常动手。老师自己没有摸到C++/OOP 的精神,学生又能学到什麽?
有些学校资讯系并不教特定的程式语言,老师们的态度是「语言是一种自己学就好了的东西嘛,拿到大学殿堂来,哎,不入流」!於是应该好好为学生打下实际基础的课程,却天马行空地腾云驾雾起来,大谈抽象意念。饱读经书的老师们可能忽略了,一个完全没有技术基础的学子,要的不是形而上的道,而是形而下的器。
我们是先能够欣赏具象画,还是先能够欣赏抽象画?我们不都是先对毕卡索的画大骂「这是什麽东西」,直到自己的艺术涵养够丰富了、人生阅练更饱满了、能够举一隅以三隅反了、能够接触类旁通左右逢源了,才转而能够欣赏甚至进入毕卡索的抽象意境吗?
老师们各有专长,要老师们来教非彼专长的大班课、基础课,我又觉得似乎也太为难老师了。那麽,苛责老师,不如责怪学校当局。如果学校当局能够聘请经验老道又有教学热诚的工程师来教这类实务学科,不是三方皆大欢喜吗?不要说什麽制度僵化啦,难以突破啦,大学是高度自治区,礼聘几位兼任老师,不全都是系上的权责范围内吗?
当学子们在课程上学不到他要的东西,就只好闭门自修。但是,循序性(sequential)语言尚有自修学会的可能,物件导向语言嘛,以大学生的程度来讲,我认为自修实在困难,只会修出个四不像、半瓶水。
管不到学校!管不到教授!自求多福的情况下,希望看到这篇文章的你,知道 C++/OOP 该怎麽学。
●不要沉迷於 C++ object model
对於底层知识有浓厚兴趣的朋友,下探到 object model 领域,一定会非常开心地在 object size、object layout、vptr/vtbl、以及许多布幕後的技术之间玩将起来。了解这些东西,当然是好的,但是由於一探究竟得其奥秘的快感与成就感,使得一些朋友们在这个层面里「玩」起来了,小地方玩得很精,玩得不亦乐乎,玩得忽略了 C++/OOP 的最终目标。
最终目标是 polymorphism!
我要说,在 C++ syntax 以及相对低阶的 C++ semantics 里,不要玩得太过火。过犹不及,会伤身的。C++ 经典名书内附的一些习题,在我看来颇有点玩得过火的味道。至於什麽百题精选、题库大成,除了修练基本功之外,都满无趣的东西。
Programming 应该是一种天马行空的想像力与创意的组合;如果你能够自己想题目,譬如说实作一个天体运行的 class 体系、或是实作一个生物分类(界门纲目科属种)体系,不是很有趣吗?准备资料的过程中,查查百科全书,你也因此查到了太阳系九大行星的几何资料,哈雷慧星的轨道周期,或是黑面琵鹭的「界门纲目科属种」英文名称,这难道不比钻研於 ++++i 或 —-i 或 *&*&p 之类的头脑体操题目有趣吗?(看过不少这类好笑题目,没一个记下来,只好胡乱写几个运算式。诸位应该知道我说的那种头脑体操题目)
固然,在科学与工程的领域里头,无技术无以为立,但别把自己弄得过於僵化,过於匠气。僵化与匠气是我们教育体系的最大沉疴。到了高专层次,败象显露无遗。
●名书推荐
如果没有介绍几本好书,我就是为德不卒。
让我再节录《多型与虚拟》的二刷感言:
… C++ 相关书籍,如天上繁星,如过江之鲫。广博如四库全书者有之(如 The C++ Programming Language、C++ Primer),深奥宛如山重水复有之(如 Inside The C++ Object Model),独沽一味者有之(如 C++ Programming Style、More Effective C++),独树一帜者有之(如 The Design and Evolution of C++),另辟蹊径者亦有之(如 STL tutorial Reference Guide)。…
以下是我认为你应该要拥有的书籍。有趣的是,我才在自己班上做了一个调查(我教的是物件导向 Windows 程式设计,学生应该要有良好的 C++/OO 基础),拥有以下 1~5 本书的人举手。举手人数都很少,而且老是那几位(最高记录是拥有四本)。这让我感觉,强者恒强,弱者恒弱。悲夫!
1. C++ Primer (3/e), Lippman/A.W./1998
听说 1999 将有中译本

2. The C++ Programming Language (3/e), Bjarne/A.W./1997
听说 1999 将有中译本

以上两本书是 C++ 经典百科。就内容水平而言,我认为同为瑜亮。 普遍的印象是,第一本较易接受,第二本涩味稍重。第二本书 作者 Bjarne 是 C++ 语言的创造者,所以有其权威性。我认识的多 位 C++/OOP 高手,都是两书齐具。
3. Inside The C++ Object Model, Lippman/A.W./1996
中译本《深度探索 C++ 物件模型》

此书全册讲解 C++ object model,上穷碧落下黄泉。内容很好,层次也高, 可惜原文书大大小小的错误繁如晨星,阅读时需小心。
4. Effective C++, Meyers/A.W./1992
印象似有中译本,名称忘了,谁可补充说明?

5. More Effective C++, Meyers/A.W./1996
有中译本吗?我不知道,谁可补充说明?

以上是同一作者的两本书,专讲 C++ programming 的重要观念,使你的程式更稳健更有效率。书中许多观念涉及 C++ object model,与 (3) 混合看将如鱼得水。
6. Polymorphism in C++ <多型与虚拟> 侯俊杰/松岗/1998
没有中译本 — 它本身就是中文书

在语法粗具的基础上,直接把读者导引到最核心最重要的思想,并且 在建立这个思想的过程中,提供足够的必要基础。
我只列出一本中文书,是因为这方面的中文书我看得少,英文书看得多。「恐有遗珠之憾」这类「八方得体」的话,还是说一下好了 :)。
注意,这些都只是强本固元用来扎基础的书籍而已,要观摩大型程式经验,还有诸如 Large Scale C++ Software Design(John Lakos/A.W./1996)可以阅读。
OO 的世界,不止 OOP,还有 OOA/OOD,那又是一缸子的学问和一缸子的书。
— end
Posted in CS | No Comments »
Posted by 宝水 on 10th 十二月 2007
计算机考研常见问题解答-考研励志贴(新手必看)
作者:不详 来源:互联网 ithao123收集 2007-08-09
摘要
IT经验网
问题一:我想参加计算机专业考研,请问我该看些什么书?考研的考试科目分为公共课和专业课。公共课包括英语和政治,而专业课包括数学(数学分为四个等级,计算机专业一般院校指定考数学一)、专业课一、专业课二。
问题一:我想参加计算机专业考研,请问我该看些什么书?
考研的考试科目分为公共课和专业课。公共课包括英语和政治,而专业课包括数学(数学分为四个等级,计算机专业一般院校指定考数学一)、专业课一、专业课二。
公共课的英语和政治以及数学,这三门课的考研书在每个城市的正规书店一般都有卖的,书籍种类繁多,选购时可参照kaoyan.com各公共课版的讨论购买。
专业课一和专业课二,对于各个不同的学校而言,他们的这两个科目可能会有所不同。具体为哪两个科目,请查阅各个院校的对应系的招生简章。
如果网友还没有选定某所学校,那么在以下的科目是经常作为专业课一和专业课二来考核的:数据结构(包括至少一门编程语言,C或PASCAL),操作系统,离散数学,编译原理,组成原理。这几门课的先后顺序即为被大多数学校选作考试科目的选考频率。对于特定的一所学校而言,其考试科目一般不会经常变化的,即其专业课一和专业课二的考试科目一般是比较固定的,当然,也不排除个别学校在个别年份发生变化,这一点请大家一定要注意查看各校简章。
问题二:公共课的考试题型都有哪些?
在公共课的英语中,考试题型分为英语基础知识,英译汉,听力,作文,阅读理解等;
在公共课的政治中,考试题型分为单选,多选,简答,论述,辩析等。由2003年开始,文理合卷,文科与理科考生采用同一张卷子,最后两道大题中可选作其中之一。
关于公共课的考试题型及分数分布的更详细信息,网友们可以参照每年的考试大纲,那上面有很详尽的说明。需要指出的是,考试大纲是网友必备的参考书,英语、政治、数学的考试大纲是必不可少的。
问题三:专业课的考试题型都有哪些?
由于专业课一和专业课二是各个学校自己出题,所以考试题型不一而足,很多学校有自己不同的考试题型。比较常见的有单选,判断,简答,计算,设计等题型。需要指出的是,这里列出的专业课一和二的考试题型只是对大多数学校的考试题作出的总体型评论,不代表任何学校的专业课一和二都必然会考这所有的题型。但,绝大多数的学校,其考试题型应该不会超出这个范围。
问题四:专业课何时开始复习?
这是一个我经常被网友问起却经常难以回答的问题。这里面有太多网友个人的因素在内,不好统一回答。一般而言,专业课基础较好,且对所报考的院校有所了解的人,在3到8月底的这段时间,更多关注的是英语,政治,数学三门科目,而到了9月才真正开始专业课的备考。当然,个别专业课学得非常好的朋友,可能会比这个时间更晚,而把更多的时间用于前面的三门科目的复习上。与此相对,也有计算机专业课学得不好或跨专业考计算机的朋友,他们的专业课复习时间就必须提前进行,否则后面的复习时间可能无法合理分配,复习进度可能要受到严重影响。至于提前到什么时候,还要看你差到何种程度。不过,如果你的基础差,且现在还没复习专业课的,那么你现在已经不能犹豫了,应该立即开始复习专业课了。
问题五:数据结构应该如何复习?
作为绝大多数院校计算机考研的几乎必考科目:数据结构的复习无疑是一个重点。数据结构科目的特点是:思路灵活,出题角度多,概念联系紧密。从线性表,树到图以及后面的查找和排序,是一步套着一步的。没有学好线性表,后面图中的深度和广度优先遍历就很难一下子弄明白。所以,给网友的建议是首先按步就班地一章章弄懂教材上的基本概念,并同时辅以适当的练习(何谓适当?以你确信已经掌握这个概念和算法为准)。在完成了一些基本题的练习后,你可以适当找一些具有代表性的题(多次出现的题型),试着寻着多种不同的解法,或者对自己以前的解答予以更加的精简化和广义性(使算法能尽可能地健壮,尽可能适应不同的输入场合)。我推荐给大家作练习用的数据结构练习题是清华大学严蔚敏老师的数据结构题集。这套题集的C版答案在本站有资料下载页面内有下载。至于复习用的教材,依各个学校的招生简章而定,不过,大多数学校采用的是严蔚敏的那本蓝色或绿色的数据结构教材,蓝色的是C版,绿色的是PASCAL版。
问题六:数学分为哪4级??
在考研的数学中,数学共分为四个等级。现在,国家教育部划分出了34所高校,这34所高校有权决定自己专业题的出题权,注意此处的专业课包括数学。因为在新大纲中,数学已经划为专业课范围,而所有计算机初试待考的专业课程则统一被放在一张满分为150分的试卷内。数学的四个等级划分如下:
数学一:包含线代,高数,概率。适用的学科为:
1.工学门类的力学、机械工程、光学工程、仪器科学与技术、冶金工程、动力工程及工程热物理、电气工程、电子科学与技术、信息与通信工程、控制科学与工程、计算机科学与技术、土木工程、水利工程、测绘科学与技术、交通运输工程、船舶与海洋工程、航空宇航科学与技术、兵器科学与技术、核科学与技术、生物医学工程等一级学科中所有的二级学科、专业.
2.工学门类的材料科学与工程、化学工程与技术、地质资源与地质工程、矿业工程、石油与天然气工程、环境科学与工程等一级学科中对数学要求较高的二级学科、专业.
3.管理学门类中的管理科学与工程一级学科
按此划分,绝大多数院校的计算机专业都会选择考数学一,这也是从事计算机所必须的最低数学功底。
数学二:包含线代,高数。适用的学科为:
1.工学门类的纺织科学与工程、轻工技术与工程、农业工程、林业工程、食品科学与工程等一级学科中所有的二级学科、专业.
2.工学门类的材料科学与工程、化学工程与技术、地质资源与地质工程、矿业工程、石油与天然气工程、环境科学与工程等一级学科中对数学要求较低的二级学科、专业.
数学三:常被称为经济数学,包含线代,概率,高数。适用学科为:
1.经济学门类的应用经济学一级学科中统计学、数量经济学二级学科、专业.
2.管理学门类的工商管理一级学科中企业管理、技术经济及管理二级学科、专业.
3.管理学门类的农林经济管理一级学科中对数学要求较高的二级学科、专业
数学四:包含线代,概率,高数,但是考核内容要不同于数学一,具体可参见大纲。适用学科为:
经济学门类中除上述规定的必考数学三的二级学科、专业外,其余的二级学科、专业可选用数学三或数学四;管理学门类的工商管理一级学科中除上述规定的必考数学三的二级学科、专业外,其余的二级学科专业可选用数学三或数学四.管理学门类的农林经济管理一级学科中对数学要求较低的二级学科、专业.
以上数学历年试卷,本周末,我会把它们统一作成电子书供大家下载。
问题七:计算机网络主要考哪些专业课?
计算机网络在硕士研究的众多专业方向中,是与其它学科密切相连的,比如:网络与数据库,网络与信息安全,网络与分布式计算等等。根据大多数学校的考试课程设置来看,以下两门被多数学校考到:数据结构和操作系统。其它在初试中没有考到的科目如:编译原理、系统结构、组成原理或计算机网络等,都有可能在各自不同学校的复试中考到。请注意,以上信息只是对于多数学校而作的统计,并不代表任何学校都依此来开设开考课程,报考前或复习时,请一定亲自查看各校的招简。
问题八:我本科学了四年计算机,但直到现在还不知道自己喜欢哪个方向,更不知道该报考哪个学校哪个方向,可以介绍一下热门方向吗,或者可不可以帮忙推荐一下?
这个问题其实是因为你本科四年没有真正学透计算机造成的,当然,目前国内众多的高校提供给我们的学习环境也不是很理想,总之,原因是多方面的,从而造成了我们对自己专业的迷失甚至对最新技术的一无所知。我是从大二时就确定了自己的研究兴趣的,那时我喜欢研究计算机病毒,后来网络流行起来后就是网络安全,那时自己就在想如果有机会我一定要好好系统学学这些安全方面的东东。这几年,信息安全方向越来越热,很多院校也一窝疯似的搞起了信息安全方向,我都不知道他们那里的导师自己到底懂不懂信息安全,这样子培养出来的研究生又怎么可能产生多么大的研究成果?好了,话说远了,我们说回来。现在比较热门的专业方向非常多,虽然现在IT业不景气,但是,它毕竟还是一个热门专业,它的几乎所有研究方向都是值得去探索的,很多领域还是有很多空白等待着我们去添补,比如:信息安全,模式识别,分布计算,嵌入式系统,还有新近流行起来的电子政务等等,所有的这些方向都是值得一搏的。当然,前提是你要选择一个可以真正让你去专心研究学问的学校,而不是一个名不符实的学校。我推荐大家尽可能地去报考名校,不管国内的研究生教学水平如何,至少在名校,我们学到的会比在普通学校的要多得多。如果你只是为了追求一个研究生学位,对于你我不作任何推荐,因为你选择任何一个你能上的学校就行了,无所谓选择哪个。
问题九:我想报考XXXX学校(研究所),请问他们的专业课都考些什么?
这是计算机版最常见的一类问题,也是版主们最不愿意回答的一类问题,因为这些问题的答案很容易获得,但就是有很多网友不愿意在IE里多输入几个地址去找一找。现在,我给大家介绍几种打探这些消息的门路,并急郑重声明,如果以后本版再遇到类似问题,将一概不予作答,敬请谅解。
获得诸如考试科目的信息的门路有:
1.通过GOOGLE查找学校网站,找到指定系后查找他们的简章,他们的简章应该把该说的问题都说了的。
2.如果通过他们的官方网站没有很好解决自己的疑问的,请直接打电话到对应的院系,直接向他们的招生负责人咨询(对方态度再不好,你也得问清楚,为了考研,放下面子,要知道,等你考上后,这一点根本算不了什么)。
3.如果你觉得打电话不太好意思(脸皮薄),你可以给他们发邮件咨询,态度尽量诚恳,多说对方好话,一般只要这个邮箱还在用,他们一定会回信的,只不过,有的院校回信的速度离奇的慢!推荐直接打电话。
问题十:我是一名自考(成教或专科)毕业的学生,请问我报考的时候会受到不同的待遇吗?如果有不同的待遇,我该如何作?
据我所知,凡计算机专业自学考试本科毕业的学生,只要你本科已经毕业且获得了毕业证书,那么你的报考是与普通本科生同等对待的,一般不存在什么特殊的要求。在有的学校,对成教毕业的本科生,可能有其它方面的一些特殊要求,比如:必须在某一级的学术刊物上有数篇学术论文发表方可报名参加初试。而对于专科考研者,这一点就不好说了。应该说,在大多数学校对于专科考研者都会有不同程度的“不同待遇”,有的学校就公开声明不招收专科考研者。但对一般院校来说,工作满两年时专科生可以参加初试,如果初试合格,那么对于专科考研者,一般都会在复试时加试两门以上的专业课程,以考查你是否真的已经具备研究生学习所必须的专业功底。不可否认,在自考、成教、专科考研的情况中,不少学校是存在一定程度的歧视的,但是,事在人为,你唯一可以作的不是怨天尤人,而是尽自己的全力考出高分,这样,你才有更大的把握,无论如何,你要相信,上帝不会白白让你多吃这些苦,这些苦是你一生的财富。
问题十一:我是一名跨专业报考计算机的考研者,我的所学专业原本不是计算机,可是我对计算机非常感兴趣,请问对于我这样的跨专业考者来说应该注意些什么?
首先,我作为一个计算机科班出身的人,对众多这样的报考者表示钦佩,我钦佩大家的勇气。随着国内近年来众多高校逐年扩招,越来越多的计算机科班毕业的本科生加入了考研大军,而你们作为非计算机专业的人在此时仍然选择为自己的理想而报考计算机专业,这种精神让我钦佩。这里,我要给计算机版众多的后来之人介绍一位老大,他是我们计算机版的前任版主,虽然有很多的人没有机会再次与他在这个版讨论DS题目,但由他一手写作并由众多网友合力审查的严蔚敏数据结构题集答案(C语言版)却成为网上计算机考研的一份重要参考资料,他的名字叫:一具。这份资料的重要性,我想只有无数彻底研读过它的人才知道。而可能很多人都不知道,一具版主也是一位跨专业计算机考研者,他原来的专业并不是计算机。但靠着自己的才智和努力,一样顺利考取了国内重点大学东南大学的计算机研究生,并在研究生期间成绩一直十分优异,在研二时就能带领程序员们开展团队开发。说这个例子,是想跟大家说,跨专业并没有什么,关键的是自己平心静气地努力,踏踏实实地看书,不要心浮气躁,光靠头脑发热是完成不了考研这件大事的。按说,以下的话也许由一具对各位跨专业报考者来说更为合适,因为我不是跨专业者,所以很多的感受我没办法了解。我还是站在我这个角度给跨专业者几点建议:
1.不要畏难,一切难题,在我们的刻苦攻读之下都是纸老虎
2.不要盲目自信,计算机知识博大精深,千万别以为自己会作几个题就是比尔-盖次了,不然,吃亏的是你自己
3.不要心浮气躁,要踏实。一章章看过去,一道道题作过去,不懂就来问。
4.抓好自己的专业课复习的同时,尽可能扩大自己的专业阅读面,因为对于跨专业报考者,导师在复试你时可能会更严格,所以广博的专业知识此时显得就比较重要了。
问题十二:什么叫初试?什么叫复试?二者是什么关系?初试考那些课,没门都多少分,是初试通过才能复试吗?复试考几门?又多少分?最后录取是看复试分还是和初试一起算??
初试是指每年元月份的全国研究生入学的统一考试,复试是指春节后初试成绩已经上了学校的分数线被学校的复试通知书召去的那次考试。初试是笔试,复试时一定有面试,多数学校还有一定的笔试。
复试当中的笔试所考查的科目一般是与初试时所考查的科目不同的,复试的笔试一般会考一些与所报专业方向联系比较紧密的专业课程(而这些专业课程在初试时很可能是没有考的)。复试中的面试,一般分为两方面内容(注意,我说的是一般,不排除你所报考的院校的复试不在我这个“一般”中的情况),这两个方面分别是:英语口试与专业课面试。英语口试一般是用简单的英语对话问考生一些简单的问题,这些问题不会太难,语法结构不会太复杂。专业课面试则主要是由你未来的导师或相关导师来问你一些所报考的专业方向上的一些专业问题以及试探性的问一些专业基础课程方面的知识。
而初试的科目前面我已经作了介绍,在此简单的重述一下,初试分为:英语,数学,政治,专业课。英语:100分,数学:150分,政治:100分,专业课:150分。而数学多考数学一。
据我所知的,中国科大最后的录取分数是这样确定下来的,初试的500分,加上复试的300分。总分是800分,然后择优录取。也就是说复试与初试的分数比例是:3:5。当然,其它的院校很可能不是这个比例,具体情况请查询所报学校的招办。
问题十三: 是考研好还是高程好?
这个问题几乎成为每一年计算机版新的考研者必问的问题,今年也不例外,就在近两天,这个话题又在版里被大家重新提起。
首先,我跟大家说说我自己考高程的经历。我第一次考高程是99年(大二还是大三我记不清了),上午成绩超过分数线五分,下午分数低于分数线3分,虽总分过线,但仍然因为下午的考试不及格没有通过,那一次,我用的复习时间是:一个星期!
之后的两次报考,每次考试,都因为种种原因与高程失之交臂。今年,我没有报考高程,而是直接报了系分,因为我觉得自己再学高程的那些知识,已经不会再有什么大的长进了,从中学不到什么东西了,根据我对自己专业知识的把握,我今年选择了直接报考系分。
对于技术职称的追求,是中国知识分子长久以来的传统。而高程对应的是软件工程师的相应职称,通过了高程,不仅仅是一种能力的说明,也是一种身份的象征,但所有的这些,也许仅仅只存在于高程刚刚出现的那两年。而如今,谈起高程,我们头脑中又同时浮现起一些很不愉快的记忆。比如去年的高程考试,在当天考试的中午,竟然在CSDN上出现了下午的考试试题,这是多么荒谬的事情,如此严肃的事,竟被某些人这么来糟蹋。另外,高程的考试试题,从众多网友的反馈信息来看,并不具有广泛检测应该者实际编程水平的能力,高程考试的形式和内容,都急需改革,以适应国内当前的发展速度和发展水平。综合以上来看,高程在贬值。另外,需要说明一点,高程尽管在有的地方被炒的很热,但是,随着它的贬值,很多地方已经不再单单地凭一纸高程证书而接纳你了,用人单位更关心的是你的实际工作能力。
说到贬值,你会说,研究生教育不也在贬值吗?是的,连年的扩招,已使研究生队伍中鱼龙混杂,难辨真伪,本来属于精英教育的研究生教育正在
迅速向大众教育过渡,这是值得高兴还是值得担忧的事情呢?我无力回答,只有选择。
的确,在贬值这个问题上,考研和考高程,是同一种性质的。但是,对于大四的学生而言,他们到底是该选择考高程找个好工作还是考研再找个好工作呢?
应该说,不管你是考高程还是考研,如果没有真正掌握知识和技术,都不会有好工作等着你,即使有了,也不会长久。高程和研究生,说到底,仅仅是一种手段,一把钥匙,一块敲门砖。二者的区别是,高程是一种短期投资行为,而考研是个长期投资行为。如果你没有耐力去走完考研这段路,你可以全力准备高程,考研即是勇敢者、又是坚强者的游戏。高程所付出的脑力和精力以及时间都远远低于考研的付出。在任何行业,从来都是付出总有回报,付出的多就得到的多。从付出的时间和精力来看,就可以明显看到,考研因为付出得多,必然也得到的多,说得再明白一点,高程是无法与考研相提并论的,这不是一个数量级的问题。你考高程,最多也只是对知识熟悉了点,对那些书本又研究透彻了些,但是,考研会让你熟悉更多的知识,研究更多的书本,更重要的是,考研可以让你在更高一个层次上去看待世界、看待社会、看待身边的人,这绝不是什么大道理。你读研究生的过程,知识的学习与对社会的学习,二者中,后者可能对你来说意义更加重要。有时候,一个人成功或者失败,并不是因为他的智力高低,而是在于他的眼界高低,也就是说他有没有从更高一个角底去看待同一件事情。
问题十四: 白天复习好,还是晚上复习好?
近来计算机版,由mythss网友发起的一个以“晚上学习,白天睡觉..”为主题的贴子引来了不少网友的讨论。在此,我也想以一个过来人的角度谈一点自己的看法以及对所有“夜猫子”型网友真诚的建议。
“我越来越喜欢晚上了,更喜欢早上六点出来散步的感觉,想想晚上的充实和收获,看着正在升起的太阳,享受着清凉的晨风,真的很爽。”这是mythss网友的原话,让我产生了强烈的共鸣。
曾经有两到三个月的时间,我都是晚上看书,早晨八点左右休息的,下午三点左右起床后到教室转一圈,吃完晚饭接着开夜车,因为我那时的情况可能也与诸多夜读者的情况相似:旁边的邻居阿姨新来了个宝宝,白天总是很闹,而且,夏日的重庆,白天热得难以想像,晚上既凉快又安静,可谓一举两得。但是,随时时间的推移,我的作息没有变,考试的日期却将近了。在考试的前两天,我还仍然是这种作息时间,最后的情况可想而知。生物钟的颠倒,不会因为考试时间在白天,而给予你特别的照顾。
之所以说这些,是想跟夜读者说:如果你觉得现在这段时间内夜读对你来说是效果最好的,那就可以采用这种方式。但是,一切的前提是一不要损害身体(其实晚上弄了个通宵,白天再怎么睡都会觉得没休息过来),二不要临阵前才调整。在最终考试前一到一个半月左右的时间,你就应该试着调整生物钟了,一定要把休息时间调整到晚上,不然你所得到的可能跟你想要的会有很大的差距。衷心希望大家能够按照正常作息时间来复习迎考,说白了,这只是一场考试,没必要在里面耗费这么大的生命和精力,一切照常,以平静的心态来面对它,日子还很长,要作长期打算,切不可多进行这种短期行 为,否则得不偿失就不太好了。
问题十五: 我是一个很普通学校的很普通的计算机学生,但我想考名校,这现实吗?我有没有希望考上?
我不止一次收到诸如此类的网友来信,而我,面对这样一次又一次的疑问,有时是无言以对的。说到底,回答这个问题,你首先得自己回答自己一个问题,那就是:我为什么要考研?我是为了继续学习而考研,是为了更好的谋得生计而考研?还是为了逃避某种生活状态而考研?不同的原因,决定了我们选择不同的目标。不可否认,在大多数的考研者中,都是高估了自己的能力的(说得好听一点是自信),如果没有考研,我们可能本来并没有承受如此强压力的能力,如果没有考研,我们可能本来吃不了这么多的苦,如果没有考研,我们可能并不知道我们原来可以这样承受别人的鄙视,如果没有考研…………….。不能再如果了,如果再如果,我们会最终得出一个结论:因为考研,我们成熟了(这是好的方面,但坏的方面也许是我们变得世故了)。
如果你是为了更好的学一点东西,那么我强烈建议你尽己最大努力去报考名校吧。众所周知,中国普通高校的计算机教育不是在塑造人才,而是在毁灭人才,在糟蹋人才。当然,我们不能一概而论,那样会犯经验主义的错误,但是,这个道理是非常明显的,我想用不着我多作说明。
如果你有比较好的关系,就是为了一纸研究生文凭才能方便跨入某单位的门,研究生毕业后,可以凭着自己的关系,凭着自己的这个文凭获得一份比较体面的工作,那么随便找个学校吧,只要能给你毕业证和学位的那种就行。
如果你没有什么关系,没有什么背景,没有什么资本,也没有什么信心和水平考名校,那么你选择普通高校吧,不过,记住,读了研究生,你的路远没有结束,你还仍然要好好学习,天天向上,以真正挣得一些自己将来可以混天下的资本,不然,研究生三年混混中走过后,你会发现与本科四年走的路几近相同,不同的是,研究生时班里的学生少了,与导师的关系好了(也许是因为常被他们无偿剥削的缘故),而自己的年龄也大了。时间如流水,稍纵即逝。在这种学校里,千万不要横向比较,要拿自己跟外面名校的学生比,千万不要固步自封。同学,好好珍惜。
问题十六:我是一名学计算机的女生,我学了计算机后,觉得计算机要学的东西很多,更新的很快,我也想考研,但是我觉得考计算机挺难的,也觉得女孩学计算机挺累的,而且就算学出来可能就业的地方也少。我想跨专业报考法律、心理学我知哪一个好,我这样想对不对?
在计算机版,我们遇到的很多情况是:外专业转考计算机专业,但同时,也有越来越多的朋友放弃自己的计算机专业而改考其它专业,就与提这个问题的朋友情况类似。由于其自身的行业特点,计算机的知识更新太快,以致于如果我们一个月不看业界报纸或杂志,很多的新概念就会不知道,很多的新名词就会不认识,而如果三个月不接触新知识,就会感觉自己的专业知识已经明显老化而跟不上潮流了,所有的这一切,带给我们的好处是随时都可以接触到新知,以满足我们在知识追求上的刺激感。但是,人毕竟是人,在了无止境的高压下不断逼迫自己去学习越来越多的新知,总有一天会累的。有的朋友,可能会选择休息一段时间,调整自己的心态,以迎接新一轮的竞争和求索;而有的朋友,在这样不断追赶的过程中,可能会发现自己原本不太适合在这个行业作下去。对于后者,选择转行,是比较明智的。
兴趣是我们作事的最大源动力,当你在这个行业看不到自己的兴趣所在,那么毅然决定离开是最好的选择,你可以选择自己有兴趣的行业去作下去。但是,转行是有前提的。那就是,你的兴趣和理想根本就不在这个行业,否则不要轻易转行,不然到头来只能闹得在哪一行都作不好。决定转行之前,问问自己,自己对计算机还有兴趣吗?或者,对其它某行业的兴趣是否远远超过对计算机的兴趣呢?如果是,我支持你转行。但是,我还是不得不告诫一句:千里之行,始于足下。不要只看到某一行业的光明前景,而忘记了踏踏实实地走好每一步。抬头望路固然是好,但关键的还是望好路之后要坚定地迈出自己的步伐。
问题十七:怎样选择报考的学校、城市地点、所学专业,也就是说对于报考的学校主要考虑哪些方面,是先选学校,还是先选专业,还是学校城市???
每个人的考研都会有不同的目的,不同的目的让我们有了不同的选择。总体来说,名校比非名校好,大城市比小城市好,热门专业比冷门专业好。但是,事实上,我们不太可能让以上各个方面的好处全让我们一个人占了。毕竟,还是有太多的同学可能无法进入理想中的学校,他们基于这样那样的考虑而选择了非名校,小城市或冷门专业。选择时,你要想清楚自己是为了什么考研?同时,要结合自己的实际情况,不要贬低自己,也不要过高估计自己(当然,我说的是不要“过高”,而不是一点都不“高估计”,这同样也是不对的)。如果是为了学习知识,开阔眼界,选择名校、大城市和热门专业当然是首选,如果是为了毕业证和硕士学位,选择非名校、小城市或冷门专业则相对容易考一点。如果你的要求是:既是为了进名校学习真知识,也想比较容易考取拿到学位,我想这样的机会不会太多。如果在学校,专业,城市上作个选择,我推荐首先选择学校,其次是在理想中的学校中选择一个自己喜欢的专业,因为就目前来说,每个学校开设的研究生专业方向重复率是比较大的,好一点的学校,基本上包括了你想学的那个专业方向。最好是选择城市了,一个环境不管对于我们学习或创业,其推动作用都是不可低估的,不然,也不会每年有那么多的考生选择报考北京的学校和专业方向,好的环境给了我们更多的机会,也让我们有更多机会接触到高层次的人才。可能大家会担心,如果名校不在大城市呢?呵呵,这一点,在中国的土地上,还不太可能发生,有名校的城市,一定不会是小城市。其实,这一点,归底结底,就在于一点,对于真正想学习知识的同学而言,报考名校是首选。
问题十八:我大学学的是计算机科学与技术专业,如果我以后不是学这个专业,而是与此相近的专业,比如计算机应用专业或网络方面的专业,还要不要再复试中加试其专业中的两门主要的课程啊 ?
提这个问题,在于你还没有搞清楚计算机学科的课程和专业结构。计算机科学,是一个整体性的学科,在国内,它一般包括:计算机软件,计算机应用和计算机系统结构(或计算机硬件)三个专业。而网络,根据其研究的主要方向的不同,则分别被放到这三个专业里作为一个专业研究方向,比如你要研究的是网络的硬件设施,则可能被放到系统结构(硬件)里作为一个专业研究方向。计算机网络本身很少有被直接作为一个专业的。复试中加试科目,是针对于特定的考生群体而言的,这个群体是:专科生考研者、成教生考研者、跨专业考研者等同等学历考研者。凡计算机相关专业毕业,且是本科的学历,一般不用加试任何专业科目,除非所报院校有特殊规定。另外,需要搞清的是,在考研改革前,有两门专业课被放在复试中考了,所以,这个要分清楚。正常的复试科目和复试中的加试科目不是一回事(不过,有的学校可能将他们设置成相同的科目进行考核)。
问题十九:如果我以后不搞计算机了,选哪一个专业好一点啊??
可以学的好专业多的是,老实说,计算机现在已经没有前几年吃香了,正处于低潮期。MBA、法律都是很好的专业。不过,从目前国内的发展来看,能读一个国外的MBA是最好的了,读MBA和计算机考研,我奉行的是同样的原则:在国内,要么不读,要读就读好一点的学校,不仅叫得响,更重要的是可以真正学到东西,而不是靠混日子度过三年美好时光最后只弄到一张纸。
Posted in CS, Research, Study | No Comments »
Posted by 宝水 on 3rd 十二月 2007
http://www.yeeyan.com/articles/view/888888/3275
程序员应该学C语言的十个理由
每个程序员都应该在他的编程生涯中学习C语言。它的好处多到你不能忽视。不仅是因为它能带来很多工作机会,而且它也从整体上让你认识电脑。
- C比其他的编程语言 (C++, Java)更底层一点。在底层编程会使你从整体上更好的理解电脑。
- 设备驱动和操作系统都是专门用C写成的。现在你可以再也不用写一个设备驱动程序和操作系统了,但是如何你要修改一个这样的程序你怎么办呢?
- 如果你想要找一份微控制器编程的工作你怎么办呢?它们是用C写的。你要放弃可能的工作机会,只是因为你不想学一门新的语言吗?
- C程序你其它任何不同语言产生的程序都要更小更快。有时候你的程序需要那一点点速度提升,只能C能给你。
- 如果你学过C,你能学其他任何现代编程语言。这后面的原因是,所有现代编程语言 (Java, C++, C#, 等)都是基于C的。
- 因为C已经发发展了很多年,它有巨大的社区和集体代码基础。这能让你快速有效的实现先前已经编好的新算法和函数。
- C是开源社区的语言。开源的榜样,Linux,是用C编写的。如果你了解C,你能参与和贡献到大量开源社区中去,比如Source Forge。
- C是唯一一门告诉你指针到底是什么的语言。C#和Java完全跳过了这个主题。指针赋与了C强大的能力。
- C仍然是编程工作最普遍要求掌握的语言。在你的领域下绝对值得花去时间学C。
- 任何带有微处理器的东西都支持C。从你的微波炉到手机,C 提供强大的技术动力。
http://www.jubuu.com/?id=14
Ten reasons why every programmer should learn C
Every programmer should learn C during their programming career. Its benefits are too numerous to ignore. Not only will it open many more job opportunities, but it will teach you more about computers as a whole.
- C is lower level then other programming languages (C++, Java). Programming at a lower level allows you to further your understanding of computers, as a whole.
- Device drivers and operating systems are written exclusively in C. Now, you may never write a device driver or an operating system, but what if you are ever required to modify one?
- What if you ever want to get a job programming microcontrollers? They are programmed in C. Are you going to limit your possible list of jobs because you didn’t want to learn a new language?
- C programs are smaller and faster then any other program created in a different language. Sometimes your program needs that speed boost that only C can give it.
- If you have learned C, you can learn any modern programming language. The reason behind this is that all modern programming languages are based on C (Java, C++, C#, etc).
- Because C has been around for many years, it has a large community and collective code base. This allows you to quickly and efficiently implement new algorithms or functions that have been programmed before.
- C is the language of the Open Source community. The Open Source poster child, Linux, was coded in C. If you know C, you can participate in and contribute to numerous Open Source communities like Source Forge.
- C is the only language that teaches you what pointers really are. C# and Java skip the subject completely. It is pointers that give C its power.
- C is still the most commonly required language for programming jobs. It is well worth your time to get C under your belt.
- Anything that has a microprocessor in it has support for C. From your microwave to your cell phone, C powers technology.
Posted in CS | No Comments »