时间很快大二已经结束了。
大二的暑假,我和往常一样,在家待的时间不长,然后就回到学校了。在这个暑假,我做了三件事情:破解了一个软件、学习了写Android应用、学习了操作系统。
首先说一下破解软件,我做的是具体实现功能,实际上是帮孙同学的忙。因为孙同学是学钢琴的,他们有一个软件叫钢琴学院,挺贵的,一套7百多。这个软件其实就是一个普通的音乐播放软件(还带加密狗),只不过它自带的音乐总量比较大,有20多G,因此买软件还附带一个小容量的硬盘,硬盘里面基本上都是wma音频文件,只不过命名方式都是数字和字母,所以你不知道每段钢琴曲的名字(在软件界面是你选择一个钢琴曲的名字,然后就会播放相应的钢琴曲),破解的任务就是把这些曲子重命名为我们能读懂的名字。孙同学之所以要破解是为了省钱。当初破解是有四个人参与的,杨老师、刘师兄、我和孙同学。我对于这类问题还没啥想法,因此主要是杨老师和刘师兄在想破解的方法。刘师兄观察出文件名很像是md5加密命名的,因为都是16进制数,后来观察软件的配置文件和自带的excel文件,刘师兄大胆地假设文件名是文件id经过加密后得到的,于是我们又借助“process monitor”来观察程序运行的过程,基本上和预期的是一样的,但是和真实效果还是有些区别的,不知道是采用哪种具体的加密方法。我们暂停了讨论,第二天刘师兄找到了一个md5加密网站又验证了一下自己的设想,又做了一些尝试,最终成功了。加密的方法是id+1然后进行hash,我们找到了破解软件的方法,很是开心。我想刘师兄之所以能找到破解方法是因为他有广泛的知识面和丰富的软件开发经验,知道一个软件是如何开发出来的,这又给我上了一课。于是我要做的就是用代码来实现这个破解,因为杨老师要把wma转换成mp3以压缩文件,并且mp3文件要带tag标签,他推荐了一个开源c#库来完成这个功能,因此我选择用C#来完成这个任务。说句实在话,我之前也只是听过C#,根本没有学过,因此又自学了一把,不过这次自学是看着官方文档学习的,效果还可以,不精通,但是完成这项任务还是没任何问题的。在做这个任务过程中,我使用了日志来记录每一次改名的过程,因为没有日志的话你不知道你的程序是否成功,我记得wma文件好像有6000多个吧,因此程序运行了一段时间,有时候日志是一个很重要和很有用的工具。
其次说一下写Android应用,这个是为了要做一个Android版的视唱练耳。除了Java其他都是全新的东西,要自学,不过我这次想挑战一下自己,学习以官方的文档为主,上网查为辅。2011年的时候官方的Api文档和教程是没有中文版的,只有英文和日文的,因此在语言上也是个小挑战,有的时候看了很久才看一两段,还要自己搭建虚拟机,用Eclipse搭建开发环境,好的是文档中有教程,挺不错的。那时候自己有一种冲劲,有一份自学的自信。看文档自学之所以快的原因是你可以随机学习,需要啥找啥学啥。在做这个项目时,我先列一个功能表,也就是需求,为了完成这些功能我都需要实现那些技术原型,然后我又列了个技术原型表 。根据技术原型表做多个原型实验,然后推进项目的进展,比如如何随机生成midi文件,如何读取文件,如何播放midi文件,播放完要把midi文件删除,按钮的单击事件等等。根据要完成的实验,找相关的api,所以这样学习会比较快。当然了,在学一项技术时最好还是先概览的看一下,要不然会很模糊的 。最终假期做出了一个技术原型,可以满足基本的需求。
最后说一下学习操作系统(OS)。这个暑假学习OS纯粹是出于偶然,因为我假期到师大FTP下载电影时无意间浏览到了OS的教学视频,顺便就下载下来看看了,我们毕业的时候FTP不知啥原因不提供服务了。现在已经记不清当初为啥会看这个视频。这个视频是哈工大的孙志刚老师录的自己上课的视频,看着很棒,激发了我的兴趣,就这样开启了自己学习OS之路。孙老师在第一课的时候推荐了三本书,《操作系统概念》影印版,《现代操作系统》英文版,《操作系统的哲学原理》。看完第一集我就去图书馆找书,第一次没找到《操作系统概念》,只是找到了后两本,因为《操作系统的哲学原理》是中国人写的,所以先看了这一本,看完这本书对OS有了大概的认识,也学了一些OS方面的专业单词,这对后面看《现代操作系统》大有帮助。看完教学视频,开始看《现代操作系统》,当然了,在暑假没把这本书看完,因为是英文的,所以才开始看的比较慢,到暑假结束把第一章看完了。看了这本书有一种高屋建瓴的感觉,同时赞叹作者的才华。
大三开学了,大三我们的课程很多,上课学习比较紧张,基本上每天上下午都有课,晚上还有实验。我的操作系统就是在这个学期学的,我也是在这个学期认识李老师的,我的另一位恩师。说一个小故事,上第一节OS课,因为我去的有点晚,后边的座位都被别的同学占了,所以我选择了坐在前排,并且是离讲桌最近的地方。因为暑假自己自学了操作系统,所以上课回答问题很积极从容,一方面是自己会,另一方面想找个会操作系统的交流一下,有时候跟有共同语言的人交流是很开心的事情。因为上课表现比较突出,所以李老师对我印象很深刻。从此每次操作系统课我都坐在同一个位置,离老师近好交流,上课的时候同学用的都是普通老式课本,我用的是《现代操作系统》,一边听李老师讲,一边记笔记,并在课本上做相应的标注。因为这个课比较难,所以越往后面,能听懂的同学就越少,甚至有些时候上课就像是我和李老师在对话,这也引起了其他同学对我的怨言,认为我是在抢风头,可能是有点嫉妒吧,不过我并不在意这些。李老师还在班上成立了两个兴趣小组,一个是Linux,一个是Solaris。我负责Solaris,程同学负责Linux,因为李老师知道我会Linux,所以为了让我多学点,让我来负责Solaris。因为是小组,所以我们就要有小组学习交流活动,我们也开展了很多次活动,多数时候是我在给小组成员分享。在这个过程中感觉Solaris是一个很了不起的Unix操作系统,特别是它的ZFS文件系统,更是超越了这个时代,现在FreeBSD用的就是ZFS文件系统,Linux之所以不用是因为开源协议冲突。这个学期杨老师还带着我们去图书馆听了一次技术部隋主任的讲课,参观了图书馆的中心机房,那是我第一次见到机房,感觉很好奇很激动,其中有三台SUN的服务器,据说当年是一百多万买的,一块硬盘都两三万,感觉那机器太值钱了。现在工作了,我们学校是一所新建的学校,也有一个中心机房,配置也还可以,由我管理,感觉自己很富有。杨老师还要求我们几个做10道ACM题,然后还要写一个扫雷程序。我记得我是用一个星期时间把扫雷程序写完了,在此之前我都不会扫雷游戏,而刘师兄当时给我们讲的时候他说他是用了一下午写完的,不过我同样还是很有成就感的。大三的下学期,因为10级的OS课调到大二下学期上了,还是李老师上课,但是实验课缺一位助教,所以李老师就找到了我。我在机房做两台Linux机器用于大家做实验用,因为大二很多学弟学妹都知道我,所以在给大家上课的时候他们还是很尊重我的,我们配合的也很好。当时为了给他们设计好进程间通信的实验,我又看了看《Unix网络编程》卷二——进程间通信,感觉这本书也是醍醐灌顶那种。
大三的暑假,其实做的事情不多,只是看了本《Unix环境高级编程》(英文版),做了读书笔记,收获很大,让我对计算机系统的认识又加深了,原来觉得很高深的东西,看完后感觉自己也能实现了,所以也推荐大家看这本书。另外,想说一点就是,你不要怕自己的英文水平不高而担心自己看不懂英文书。才开始大家都有相似的经历,觉得难,看着很费劲,但是一旦你入门后,就觉得你是能看懂的,因为计算机的专业单词就那么多,在一本书中就那么多常见的专业单词,记住以后读书就没那么困难了,其实我的英文水平很一般,六级都没过,不过我还是喜欢看英文的,因为英文的看着很直接。
说了这么多,我想总结一下。计算机专业的文献我们要读经典的,大家写的书,这种书总会给你一种醍醐灌顶的感觉。至于哪些是好书,就需要你平时多看多浏览了。
大四其实课程很少,一般都是第一学期去实习,然后找工作。我也不例外,我实习是在长春市实验中学实习,巧合的是我找工作找到了郑州市实验,而且这两所学校都是在郊区,不知道这算不算是机缘巧合。实习完就是找工作,起初我也和研究所的研究生一起投简历,参加校招会,想丰富一下自己的经历,但是我们那一年是个小年,所以大家找工作找的都不算太如意。杨老师在某一天的早上给我打电话,让我去师大对面的KFC,请我吃了个早餐,然后给我聊了聊,劝我还是别去中学教学,去个公司或是考研,然后去应化所,他为了我做了很大的努力,这让我很感动。李老师也多次给我说让我去公司,我依旧没有答应,因为我是免费师范生,不回家教学是要交违约金的,我不想再给家里增添负担,李老师还说借钱给我,但是我也不想麻烦她,所以就直接往中学投简历了,最后找到了郑州市实验。在此我要感谢我的两位好老师。大四还面临着毕业设计和毕业论文,本来我想偷个懒把以前做的视唱练耳直接交上,选择杨老师为指导教师,但是在寒假放假前和李老师道个别,聊了一会。李老师说让我做个新项目作为毕业设计,这个项目是她参与的大项目的一个子项目,因为我已经选择了杨老师作为导师,所以我答应李老师做这个项目,但是不是用来作毕业设计。而李老师担心我不会足够的重视这个项目,一定要我把这个项目作为毕业设计。因此我很不好意思的给杨老师打了个电话,说明了一下情况,杨老师当然是一位宽宏大量的老师,于是同意了我更改导师的想法(杨老师一般是不带导生的,当初答应我算是一个特例)。我至今仍然觉得对杨老师有愧。
说一下我的毕业设计吧,做的是一个小型垂直搜索引擎。之前一直使用google百度等,并不了解其背后的工作原理,因此也是零起步。搜索引擎分为两大部分——数据抓取和数据索引检索,而我自己实际写的是数据抓取部分,数据索引和检索对我来说太难了,用的是开源库Lucene。对于网络爬虫,我在做的过程中,没有参考任何已有网络爬虫的设计和实现,我只是在网上搜索有关爬虫的运行原理,我想有自己的实现。了解完原理后,我开始设计我的爬虫,我设计的就是多线程的,因为单线程的话太慢了。我用的编程语言是Java,编程环境是Ubuntu下的Eclipse,数据库用的是MySQL,web服务器用的是Tomcat。选择Java的原因是http协议要用HttpClient开源库,而Lucene也是Java写的,选用Linux环境是因为当时自己有点排斥Windows(这是个人原因)。因为是多线程的,肯定要遇到线程同步问题,因此要认真设计好才行。因为自己对Java并不是很精通,所以很多时候要看Java的Api。在做的过程中也遇到了很多麻烦,比如一个网址经过很长时间都下载不下来,然后这个线程就一直停在哪,后来加了一个限制时间才解决问题。多线程出现错误有时候你根本不知道问题出在哪,因此我又想起了日志,我做测试的时候只开了5个线程,让每个线程都分别记录自己的行为,然后运行一段时间停止,打开每个日志文件来分析问题到底出在哪了。查看比对日志也是个麻烦的事情,不过最起码这个个发现问题的好方法,最终还是通过万能的日志把问题解决了。写多线程很锻炼人,在没有完成这个项目前,觉得这个个很牛的项目,但是自己做完后也就兴奋了两三天,后来觉得其实也就那样,可能是自己的能力又上了一个台阶吧。这个项目好像用了一个多月的时间吧,做完后给李老师看,老师很开心,下面这个图是一个搜索结果图(摘自我的毕业论文):
这个项目代码量大概有1000行吧。
以上就是我大学四年的学习经历。在大牛看来其实是很平淡的,不过对于一些担心学不好计算机的同学来说,还是有一定的借鉴意义,希望看完后能给你带来点希望。只要我们努力,我们肯定会有收获,请相信自己,勇敢地向前踏出第一步!