研究生的课程学习主要在研一和研二上学期,这段时间是打好专业课基础的时期。
1.选课
研究生的课程设置有必修课、学位课以及选修课。必修课和学位课是不用自己选的,要拿够学分的话,大概需要再选修七、八门课。我觉得选修课最好是选择那些自己比较感兴趣的,如对编程感兴趣,可以多选一些软件工程、C++程序设计、计算机网络等课程。但是不知为何,我当时竟然没有选修一门与编程相关的课程。
2.上课
刚上研究生时导师告诉我,研一的主要任务就是上课,先不用着急做课题。我只能谨遵教诲,其实我想早点做课题,因为可以编程。我发现对于一些需要编程实现的课程,我就特别感兴趣,我觉得通过自己编程来解决一些问题挺有意思的。对于导师的课程,我是加倍用功,可以说是做到了课前预习,课后复习,考试时更是用心准备。
3.考试
研究生课程的学习与本科最大的不同就是许多课程不用考试,大部分只需要你在结业时交一篇学习体会。因此,研究生学习的压力不像本科时那么大了。我感觉这样挺好的,因为可以在自己感兴趣的科目上,多花些时间。对于我感兴趣的课程,我写学习体会所花的时间比应付一次考试都要多。研究生阶段最重要的一次考试应该算是英语了,幸运的是我顺利通过了。
关于研究生的课程学习好没有什么太多好说的。
关注开源与*软件的编程爱好者,我觉得有必要向大家介绍几个很NB的人,这几个牛人是:
(1)Richard Stallman:有史以来最伟大的黑客。(2)Linus Torvalds:也就是那个写了Linux操作系统内核的人。GNU计划原本是打算开发一个与Unix兼容的操作系统,但是一直没有一个比较好的操作系统内核,后来Linux出现了,而且Linux非常优秀,所以GNU采用了Linux内核,现在我们通常说的Linux应该是GNU/Linux,因为 Linux只是一个内核(这句话我好像说了好多遍了)。
(3)Eric Raymond,开源社区的布道者,领军人物。
2.2.6 软件设计师考试
计算机技术与软件专业技术资格(水平)考试(简称计算机软件考试或软考)是国家人事部和信息产业部组织的国家考试,其目的是科学、公正地对全国计算机技术与软件专业技术人员进行职业资格、专业技术资格认定和专业技术水平测试。软考每年举行两次,改革后划分地更加详细了,分了5个专业类别:计算机软件、计算机网络、计算机应用技术、信息系统和信息服务。每个专业又分了三个层次:高级资格(高级工程师)、中级资格(工程师)、初级资格(助理工程师、技术员)。我刚考过中级资格,也就是软件设计师,准备考高级资格,也就是系统分析师。
2.2.7 看书
我在本科阶段,看的编程书籍太少,而且看的都是诸如《C++教程》,《21天学会C++》之类的。现在书店里有各种各样的编程书籍,各大出版社好像已经展开竞赛,相继推出C++系列,Java系列,.NET系列,Linux系列,软件工程系列…。出版社一方面忙于引进国外的著作;另一方面又在国内找名家写书、译书。
研究生期间看了一些编程书籍,有一部分是比较经典的,有一部分是比较烂的。有些书我看完后觉得很有收获;有些书我看完后甚至完全记不起来书里到底讲了什么东东;有些书我看了不只一遍,有些书一遍也没看完。那些我看完后不知所云的书,其中也有一些是很经典的,一方面是因为我当时没有用心看,另一方面可能是那本书对我来说太深了。下面,介绍一些我看过的或者基本看过的书籍,给出书籍的中英文名称,以及简短的介绍和部分书的价钱(以人民币为单位),并且只给出那些名家的大名,出名的程度是相对于我来说的,可能还有很多知名人士,但是我没听说过,这里就对不起了,排名不分先后:
1. 《代码大全》,英文名《Code Complete》,作者Steve McConnell,据说他在IT界的影响力与Bill Gates和Linus Torvalds相当,只是我太孤陋寡闻,见其书才始知其人。
2. 《C++ Primer》,作者Stanley B.Lippman。
3. 《Effective C++》与《More Effective C++》,作者Scott Meyers。
4. 《C++编程思想》,英文名《Thinking in C++》,作者Bruce Eckel。
5. 《Applied C++》。
6. 《C++ FAQS》,FAQ—也就是常见问题解答,适合闲着没事时看上两条。
7. 《C++ Gotchas》。
8. 《Inside the C++ Object Model》,作者还是Lippman。这是一本相当有难度的书,令人费解的是我当初买的还是英文版,我怀疑当初买这本书时,脑子有点大了。这本书给我的印象也很深,因为它讲了一些对象模型方面的东西,这是我在其它书里边没有见到过的,有些章节我看了好几遍,才开窍,但是还是有很多内容我“七窍开了六窍 ”。好像侯捷先生已经把该书翻译成了中文版,叫《深度探索C++对象模型》,有机会一定要看一看。价钱:42元。
9. 《VC 技术内幕》,英文名《Inside Visual C++》,作者David Kruglinski。该书的知名度极高,估计使用VC的人都看过该书吧,最好还是自己买一本吧,不算太贵,绝对物超所值。如果能够认认真真地照着书上的例子自己敲一遍代码,估计VC可以入门了。建议买潘爱民老师翻译的第四版。价钱:96元。
10. 《MFC深入浅出》,作者侯捷。我认为侯捷老师是国内最好的技术作家。他写了不少好书,而且他的敬业精神、对读者认真负责的态度以及对知识掌握的精深程度都让我叹服。另外,他写的一些小品文、生活随想也很有意思。价钱:**,不知被谁借走了。
11. 《Word排版艺术》,作者侯捷。
12. 《高质量C++/C编程指南》,作者林锐。林锐博士的“大学十年”在校园里很有知名度。我现在只记得该书后面好像有几道测试题,我得了40多分,你感兴趣的话可以试一试,得分肯定比我多。价钱:**元,我看的是电子版。
13. 《面向对象分析与设计》,作者Grady Booch。其实,我感觉只看C++语言的书是学不好C++的,或者说学习的速度要稍慢一些,因为C++是一门面向对象的语言,而大多数人一上来就开始学习C++(其实更多的是使用VC,因为大部分人认为VC=C++),并不知道什么是OO,不理解OO的思想。最好是学习C++语言(Java、 Python也一样)的同时,也学习一下OO。价钱:**元,是我从图书馆借的。
14. 《设计模式—可复用面向对象软件的基础》,英文名《Design Patterns》,作者“*”,写这本书的四个牛人,通常被称为“Gang of Four”,而不是*时代的“*”。该书是设计模式的开山之作,也许正因其是开山之作,所以有些难度。。
15. 《设计模式精解》,英文名《Design Patterns Explained》。“*”的《设计模式》理解起来确实有点难度。这本书对于理解设计模式,并运用设计模式有很好的帮助。价钱:**元,好像也是从图书馆借的。
16. 《重构》,英文名《Refactoring:Emproving the Design of Existing Code》,作者Martin Fowler。该书与《设计模式》齐名,好像它们被称为“软工双雄”吧。这本书我只看过一部分,但是根据网上的反应,应该是一本好书,而且我也觉得它是一本好书,因为作者Martin Fowler是软件行业的绝对权威。我是研一时才知道有“重构”这个概念的,有点晚。价钱:**元,我看的是电子版。
17. 《Unix编程艺术》,英文名《The Art of UNIX Programming》,作者Eric Raymond,开源软件的领军人物。该书没有讲解过多的编程技巧,主要是介绍Unix/Linux的文化,历史等内容。你可以把它当做课外读物,我挺喜欢读这本书的,我买了中、英两种版本。价钱:中文52元,英文52元。
18. 《UNIX环境高级编程》,英文名《Advanced Programming in the UNIX Environment》,作者Richard Stevens。UNIX/Linux环境下编程的必看宝典,可惜我只是看了一部分。价钱:**元,我看的是电子版。
19. 《人月神话》,英文名《The Mythical Man-Month》,作者Frederick *s。该书主要讲的是有关软件开发中团队管理的问题,是一本很经典的软件工程书籍。该书出版于1975年,在计算机书籍日新月异的今天,应该算是老古董了吧。但是,经典就是经典,这本书的销量一直很好。可惜这本书我只是大概地浏览了一下,到现在只是记得几个名词而已。价钱:**元,我看的是电子版。
20. 《OOD启思录》,英文名《Object-Oriented Design Heuristics》。一本讲解OO的书,我现在记不清书中讲的到底是什么内容,但是我确实看过这本书。价钱:**元,也是我从图书馆借的,其实军校的图书馆还是有些经典编程书籍的,但是往往在角落里,没人看。
21. 《解析极限编程:拥抱变化》,英文名《Extreme Programming Explained: Embrace Change》,作者Kent Beck。看完之后,我大概知道什么是极限编程了。价钱:**元,是我从图书馆借的。
22. 《UML 风格》,英文名《The Elements of UML Style》,作者Scott Ambler。封皮上写着口袋里的236条UML实作准则,该书假定读者已经具有UML的基本概念,告诉读者在绘制UML图时需要注意的一些细节。价钱:18元。可能是我买的最便宜的书了,因为它很小,适合装在口袋里。
23. 《Java编程思想》,英文名《Thinking in Java》,作者Bruce Eckel。这本书我看过一遍,并且大部分的例子我都练习过,在Java方面我就看过这一本书。Bruce Eckel擅长写“Thinking in”系列,好像最近又出了一本《Thinking in Python》。
24. 《程序员修炼之道》,英文名《The Pragmatic Programmer》。本书原名是“The Pragmatic Programmer”,即“注重实效的程序员”,中文版翻译为《程序员修炼之道—从小工到专家》,书中主要讲述关于编程的各种话题:如个人责任,重构、测试等等。价钱:48元。
25. 《编程之道》,英文名《The TAO of Programming》,作者是Geoffrey James。这本书比较另类,它没有讲解任何编程技巧,而是用富有哲理的故事和短小精悍的语言来启发我们思考。Geoffrey James酷爱东方哲学,尤其是太极拳。这本书很小,而且是中英文对照,以前我基本上每天看一篇,直到看完为止,有些内容挺有意思。有几期的《程序员》上还引用了该书中的部分章节。价钱:28元。
26. 《程序员》。这不是一本书,而是一个期刊,我几乎每一期都买,大概有三、四年了吧。它好像是CSDN(国内最好的IT业网站)出版的刊物。以前的《程序员》比较注重编程技巧,现在好像更注重对IT业整体信息的介绍,感觉更像是新闻刊物。不过我觉得这样的风格也挺好,因为它让我的眼界开阔了,有很多新知识我是从《程序员》中了解的。价钱:10元/期。我合订版也买的。
27. 《OpenGL编程指南》,英文名《OpenGL Programming Guide》。
28. 《Java 夜未眠》,作者蔡学镛。蔡学镛是另一个我比较喜欢的技术作家,但是他的书我只看过这一本,因为我不怎么学Java,而老蔡好像主要是整Java的,其实我觉得以他的程度,语言只是工具。这本书也不是讲解编程的,而是一个技术人员的散文集,写作风格很幽默,我喜欢。书中有一篇介绍知名技术作家及其作品的书,对于我们看书很有帮助。我发现我喜欢的两个技术作家—侯捷和蔡学镛好像都是*的。价钱:**元,我看的是电子版。
29. 《人性的优点》,作者戴尔.卡耐基。没错,虽然它是一本讲解成功学的励志书籍,但是《代码大全》一书中曾专门推荐程序员看一看。其实,我觉得每一个渴望成功,追求幸福的人都应该看一看这本书。我买了《卡耐基经典全集》,包括《人性的弱点》,《美好的人生》,《人性的优点》,《快乐的人生》,《语言的突破》。每次看这本书,我的心就会平静些。价钱:45元,全三册,好便宜呀。
30. 《世界是平的》,英文名《The World Is Flat》,作者托马斯.弗里德曼。
1. 《计算机程序设计艺术》,英文名《The art of Computer Programming》,作者Dongld Knuth,据说他还有个中文名叫“高德纳”。《计算机程序设计艺术》是一系列书,作者原本打牌出7卷,现在出到第3卷了,但是已经很震撼了,它们都很经典。我听说这本书很有难度,所以如果可以的话我希望能够在10年之内把它们看完(如果我还有机会编程的话)。Dongld Knuth是个传奇人物。
2. 《…》。《…》代表侯捷先生写的所有的书,读先生写的书是一种享受。
3. 《The C++ Programming Language》,作者Bjarne Stroustrup。作为学习C++的人,如果不看看“C++之父”的书,好像有些说不过去。
4. 《Algorighms in C++》,作者Sedgewick,Knuth带的博士生。一直想好好再学一学数据结构与算法,我感觉我的数据结构和算法的基础太差,甚至在VC上 Click了两三年以后,还不知道什么是数据结构和算法。其实我感觉对于编程来说,最重要的就是数据结构和算法,而语言或者说语法则在其次。
5. 《编程珠玑》,英文名《Programming Perals》,作者Jon Bentley。我感觉这是一本好书,因为它在我眼前出现的频率太高了,我有这本书的电子版。其实,我有很多书的电子版,因为我比较喜欢上网,喜欢上网疯狂地下载电子文档和源程序。但是,我感觉还是看书好,因为看书很有感觉,而且老是看电子文档对眼也不好。
6. 《UML Distilled》,作者Martin Fowler。想再好好学一学UML,把它Distilled下下。
7. 《大规模C++程序设计》,英文名《Large-Scale C++ Software Design》。我没有设计过什么大规模的C++程序,很想学习一下怎么设计。
8. 《软件测试艺术》,英文名《The Art of Software Testing》。代码大全上推荐说这本书很经典,虽然它出版于1979年。平时我也看了一些测试方面的书,感觉没有太经典的。我发现叫“The Art”的书好像都挺经典的。
9. 《Writing Solid Code》,作者好像是Microsoft的一位资深程序员。该书主要讲如何编写商用软件,也就是那种比较Solid的软件。其实有一次在书店,我打算买这本书的,只是当时已经买了200多元,没钱了,现在想想应该买它了。
10. 《代码大全》。已经介绍过了,但是我觉得这本书真的很好,所以如果以后有机会的话,打算多看几遍。
研究生期间看了一些书,所以关于如何看书,我还有几句话想说说,算是关于看书的几点建议或想法:
(1)看书对于提高编程水平,扩宽知识面挺有帮助的。建议大家还是多看看书吧,整天上网、打游戏、看碟会烦的。
(2)每个研究生有2000元的经费可以用于买书,建议你把这些钱都用在买书上。当然如果你有一个很可爱的GF,那么用这2000元中的一部分给她买个小礼物也是可以的。对于我来说,用在买书上的钱远大于2000元。
(3) 买书不是为了向其它人炫耀,装点门面,比谁买的书多。有很多人确实买了很多书,甚至是很经典的书,但是买回来之后就将它往书架上一放,或者只是看看目录和前言,然后束之高阁,并没有发挥出好书的作用。我也是这样,现在还有几本经典书被我扔在书架的角落里,如果不是整理东西,我甚至不会想起它。也不要把买来的宝贝书都放在书架上,舍不得翻一下。如果一本书你看过一年之后还能记得这本书讲得是什么内容已经不错了,所以好书要多看几遍。
(4)我觉得看书其实还是很有方法的:首先,看书最好是有选择的看,买那些比较经典的,作家确实有水平的书,如果看了质量差的书,即浪费钱,又浪费精力;其次,看书也要分阶段,不要一开始就看那些太难的书,最好是看那些自己能够看得懂或者基本看得懂的书,如果让一个刚刚接触C++的人看《设计模式》是不合适的,虽然它确实是一本好书;最后,我觉得同一类型的书最好只看个一两本,因为不同书籍的侧重点不同,有的是注重语法,有的是注重实用,有的是针对某一主题,有的是参考书性质的。
2.2.8 学习编程的一些感受
(1)做总结
我觉得在学习编程的过程中最好多做些总结。学的多了,自己的想法也就多了,经验也就多了,可以写点文章,在论坛里发发帖子,挺有意思的。我以前每一次发帖子之后,就守在那,过几分钟就看一看是不是有人回帖了,是不是有人“顶”我了。不过,现在我很少发帖子了,人变懒了,也可能是没什么体会了,因为我有半年时间没有怎么编程了(我整天都在发呆),我也不太在乎有没有人“顶”我了。如果你的体会比较多,感触比较深,也可以把自己的编程感受好好总结一下,往期刊投一投,一般期刊和电子期刊都可以。我在研一时搞图像处理,于是我就把我在编程时的一些感受总结了一下,写了几篇文章,没想到还成了一个系列在一个杂志上发表了六、七篇文章。其实无非就是如何读图,如何对图像做变换之类的,现在看看,确实浅了点。当时那本杂志的一个编辑还给我发邮件,说很欣赏我的编程能力以及写作能力,让我构思出一本书,我当时有一种千里马得遇伯乐的感觉。我赶紧回复他,并且“谦虚地”说自己的编程能力尚浅,不足以成书云云。后来我发现,另外的一个同学只在那本杂志上发了一篇文章,也收到了同样的邮件。但是,当时我发表的那一系列文章让我高兴了好一阵子,毕竟这是我通过自己的编程知识掘到的“第一桶金”,我赚了2000多元的稿费,每月去邮局领300多块钱稿费也挺爽的。
(2)看代码
学习编程的一个比较好的方法,就是多看一些比较优秀的代码,这就像练书法的人都会先去临摹那些名作一样。这一方面我差的太远,有些代码我只是粗略的看一下它的设计结构,然后找一些自己需要用到的代码Copy一下,并没有对代码进行深入分析,因此得不到精髓。
(3)自学
最好不要老是发一些求助帖。如果你遇到好心人可能给你指点一二,一般都是没人理的。我见到的“大虾”几乎从不在论坛上发这种帖子。我觉得大部分的时候还是自学效果好,好多东西自己学反而快一点,效果好一点。现在资源特别丰富,只要想学,有什么不懂的先Google或者Baidu一下,入门应该不成问题。如果是在用VC,大部分的问题MSDN就可以解决了。实在是搞不定了,再问吧。
(4)编程习惯
最好从编程一开始就养成良好的编程习惯。也许这是一个大家都知道的事情,但是却很少有人把它做好。多写注释,养成一致的变量名、函数名命名习惯,写程序时多考虑一下容错性、可维护性和可扩展性。我编程时往往只是注意实现功能,而等到程序拿给客户,人家测试时就是一阵乱点,要求不出问题,而我的程序一般是要按照我的操作方式才不出问题。
(5)语言
最好是精通一门语言,我指的不是英语或者韩语,而是像C++、Java、Asp和Python之类的编程语言。编程语言有几百种,关键是看你需要哪个。其实,选择哪个语言一般不是我们自己决定的,要看课题与研究方向的需要。在你决定学习一门编程语言之前,最好先了解一下,听听导师和师兄/姐的意见,看看课题组在用什么语言。我感觉现在军校研究生以学习C++和Java为主,有的好像也在搞点C#、.NET。要到什么程度才叫做精通,我还真不知道,反正一直学就对了,只会语法肯定是不够的。我在这方面就没有做好,没有一样东西是学的比较精的。这是我的一个毛病,有些浮躁,虽然我很早就知道,但是却很难改掉,我喜欢学习新东西,但是大多数都是浅尝辄止。
在精通一门语言之后,最好能再学习一门其它语言。如果你擅长C++,请看看 Java;而如果你一直使用Java,请你也看看C++。这个世界没有谁是老大,能够一个人说了算,多门手艺,就多条吃饭的门路。你不一定非要用它搞开发,但是看看书,写几行代码也挺有意思的。而且不同的编程语言有不同的编程思想,对提高编程水平很有帮助。
(6)编辑器或IDE
最好是熟练使用一种编辑器或者说是IDE(集成开发环境)。比如C++中的VC,Java中的JBuilder或者Eclipse。我说的熟练是指能够控制 IDE,而不是让IDE控制你,要清楚IDE在背后都帮你做了什么。以前VC用了几年,Setting里的好多选项我都不知道是干什么的,因为从来没有考虑过。有时VC老是出问题,其实就是Setting的问题。
(7)软件工程
重视软件工程吧,写写文档,画画类图。
(8)Windows与Linux
如果你一直在使用Windows,请你装个Linux吧,你不一定非要用它搞开发,但是你会发现许多好东东。当然,这个发现不是指你装个 RedHat9.0,就立即发现宝藏了,而是需要你去查资料,去看书,去写代码的。另外,如果你是Linux的忠实拥护者,一直摒弃Windows,鄙视微软,鄙视“Bill Gates”,视用Windows为耻辱,那么请你也装个Windows吧。毕竟,我们还需要听歌、看碟和打游戏。
(9)编程与课题
最好把编程和课题研究以及毕业论文结合起来,也算是做到学以致用吧。我学VC一段时间后,刚好加入了个课题,做了一阵课题后,我觉得进步很快。后来因为有个项目需要建个网站,刚好我学过些Asp和Html,就趁着做课题的时机,又把他们深入地学了一下。Linux对我来说就更有用了,我毕业论文中大部分的实验都是在Linux环境下做的。由于要在Linux下编程序,所以我就逼着自己学习Linux的知识。但是像Java和Python还有.NET编程,虽然我下载了很多资料,却没有认真地学习过,基本上都是看一遍书然后就放下了,因为我没有用到他们。
(10)坚持就是胜利
编程其实不是一件容易的事,但是只要你坚持,不断积累,应该不是难事。这句话应该是从一个编程高手嘴里说出来才有份量,而我只是一个初学者,说这些话实在有些不合适。不过,写在这里也算是对自己的一种鞭策吧。我一直很欣赏侯捷先生,他像“阿甘”,像“许三多”,因为他们都比较执着。侯捷说自己27岁才学习C 语言,30岁才初次接触C++,36岁才开始认真学习C++,他原来是土木工程专业的。我今年才24岁,而且我所学的内容和IT还沾点边,真的沾点边。
关于编程我要写的就这么多了。我有半年时间没怎么编程了,如果半年以前写这篇文章的话,我想我可以写得多一点。
热爱编程,热爱生活。
2.2.9 推荐的一些资源
我以前比较喜欢上网到论坛去看看帖子,那些有关编程的文章写得很幽默、风趣,调侃中带着智慧。另外网上有许多好的资源,下面是我觉得比较好的网站或者程序,只列出名称和网址,并简要介绍之。
(1)常用网站
1. Sourceforge(开源): http://www.sourceforge.net。SourceForge网站提供了大量的C、C++、Java等程序,可以免费下载,它现在好像有几千万个项目了,有许多不错的代码甚至都被埋没了,没人知道。我觉得不管你是研究哪一个领域(工科),几乎都可以在Sourceforge上找到一些不错的代码,真的。
2. CodeProject(VC/C#): http://www.codeproject.com。有好多介绍VC的技术文章,代码。
3. Codeguru(VC/C#): http://www.codeguru.com。跟CodeProject差不多吧,记不清了。
4. Slashdot(Linux):http://www.slashdot.org。上边有好多Linux的东东。
5. Csdn(国内论坛): http://www.csdn.net。国内最好的技术论坛。
(2)程序
1. GIMP(≈Linux+Photoshop):http://www.gimp.org/。Linux下等于Photoshop,开源。
2. ImageMagick(Linux/C):http://www.imagemagick.org。不错的图像处理软件。
3. ImageLib(Linux/C):http://www.dip.ee.uct.ac.za/~brendt/srcdist/。读图的开源软件。
4. FreeImage(Linux/C++): http://freeimage.sourceforge.net/。又一读图的开源软件。
5. CxImage(VC):http://www.codeproject.com/bitmap/cximage.asp。还是读图,只不过是用VC编的,喜欢吧!
6. Netpbm(Linux/C):http://netpbm.sourceforge.net。提供了几百种图像格式之间进行互相转换的软件,其实国外作实验时的图像一般都用PGM,而我们一般都用BMP(微软的格式)。
7. WAILI(Linux/C++): http://www.cs.kuleuven.ac.be/~wavelets。整小波变换的,很好用,我一直在用它,是在Linux环境下的。
(3)代码
1. CJlib60,一个帮助设计VC界面的好东东,这个我用了好久,后来就用XTreme了。
2. Boost,一个正则表达式库,据说新的C++标准里用的就是它,我打算看,但是没看。
3. loki,一个C++库,包括一些常用的设计模式,我看过很少的一点点。
4. STL,就是STL源码,我打算看,但还是没看。
5. Linux内核,曾经加入了一个内核阅读组织,当时大家分了一些内存管理部分的代码阅读。但是后来我才发现,自己还不够资格读内核。