行者无疆 始于足下 - 行走,思考,在路上
七忆
终于有时间坐下来,喝杯茶,咬个苹果,听着许巍的歌,梳理下自己的生活。而就在一个月前,我还在为了我的毕业大业而殚精竭虑,为了准备最后的两门考试而通宵达旦、焦头烂额……
整个毕业季就像杭州六月的梅雨,连绵不绝,阴郁沉闷。毕业设计一路山寨,一路顺风;计算机网络、计算机组成、计算机体系结构三门专业课都是重修,采用各种非常手段完成课堂作业,经过两周的艰苦努力,最后有惊无险顺利通过;电路原理清考,看书看得想吐,也不知道是老师手下留情还是我运气不错,最后也顺利通过;还有三门不痛不痒的通识,上交了几张照片、一篇影评、一篇代写的伦理学论文。
我没有去参加任何学校组织的毕业活动,甚至没有去参加本科生毕业典礼——那天天气不好,我睡了半个上午的懒觉。我也没有参加任何班级活动,一方面我在准备考试,另一方面我也确实不太想去——我对这个班级并没有多少感情,感情不是靠生硬地组织几次活动、玩玩三国杀、吃几顿饭就能培养出来的。所谓最后的毕业旅行,也不过是认识的不认识的同学一起见个面说声再见而已。既然如此,不去也罢。
我甚至连传统的学位照也没有,那个时候我还有考试,哪有心情拍这个?而我自己也对符号化象征性的仪式逐渐丧失兴趣。可悲的是,我的一个同系同学,为了拍一张疯狂一点的学位照片,跳进西湖游泳,结果不小心挂掉了……
我收拾了十几包的行李物品,其中一半是书籍、三箱户外用品、剩下的都是衣服杂物,邮寄费就花了一千大洋。可是最后还是丢了一箱书籍,像掉了一块肉,痛了许久。没错,书是可以再买的,但是书上的笔记、指纹和纸张微黄的颜色怕是再也买不到了。
7月1日结束最后一门考试,去了趟天台妞妞的家,不幸游泳晒伤,掉了一层皮;4号回到学校等待学位审核结果,5号通过,6号拿到毕业证和学位证,却因为成绩的原因与CKC的荣誉证书失之交臂。晚上还是站票,18个小时后的下午,在北京,在承德,在我的家乡,我又看到了不一样的蓝天。
在家的日子更多的是无聊和喧闹,想读书只能躺在床上或者坐在沙发上,还要忍受网吧里面日夜不停连绵不绝的叫骂喧闹声。伴随着父母的抱怨唠叨,弟弟的不争无言,十几天的日子,看了一部《士兵突击》,一套《青春如茧》,还有半本《纽约摄影教材》。
20号百度入职,提前一天到北大,见到zhhh,他还是老样子,一点没变,沉浸在自己的学术世界里。入职的时候看到了很多新面孔,我不在的半年,队伍壮大了不少。不过点背的是,由于baidu发展势头凶猛,导致人数招聘过多,工位不够,实习的时候我还能有一个正式工位坐坐,到了正式入职,却只能去坐临时工位了,也不知道要坐到何年何月。
找房子还是一如既往的纠结,几日的奔波劳累,最终在清华西门找到了一个2000/month的独卫小单间,住了两天,感觉还不错。特别安静,晚上睡的很好。回想起来,自己离家七年,从一中的宿舍、到大里路小区、zjg丹阳宿舍、zjg蓝田宿舍、望月小区、yq 30舍、yq青芝坞,清华西门,平均一年就搬一个地方,这个成绩应该算不俗了吧,嗯,行者本色也。^_^
我曾经热切地盼望着毕业,因为毕业后就有大把大把的money;
我曾经热切地盼望着毕业,因为毕业后就不用再去准备各种各样恶心的考试;
我曾经热切地盼望着毕业,因为毕业后就意味这自己真正的独立;
只是不知道为什么,
我开始怀念紫金港启真湖的夜和月、月下的杨柳和拂过杨柳的风、风中两只攥着的小手;
我开始怀念华家池冬天冷如地窖的图书馆和池上10元自由驰骋的船;
我开始怀念玉泉遮天蔽日肆意生长的法国梧桐;
我开始怀念之江的绿、虫,还有情人桥;
我开始怀念在西溪北园每个夏夜和布袋畅谈的夜晚;
你所要失去的,正是你即将开始怀念的。
最后的最后,我的思绪又回到了竺可桢校长的两个问题:
诸位在校,有两个问题应该自己问问,第一,到浙大来做什么?第二,将来毕业后要做什么样的人
毕业后要做什么样的人?这个问题我至今没有明确的答案,唯一可以确定的,就是希望自己不要在未来的生活中被磨平了棱角。人没有自己独立思考的能力是最可怕也最可悲的事情。
我曾经信誓旦旦的下定决心一定不会再去深造,但是工作几天我又开始怀念学生时代的自由,和大把的业余时间。是工作就要有流程报表这些很程式话的东西,更何况是在Baidu这么一家知名的大公司里面。下决心不深造是因为受够了恶心课程和低水平教学的折磨,而对于读书一事我还是非常享受的。最理想的情况是,什么都不要让我干,就让我泡几年的图书馆就好。回想一下,高一高二搞竞赛的那段时间,真的是少有的专心读书的时光。当时没有觉得有什么大不了的,现在却非常怀念。因为那个时候简单,甚至有些单纯,有些傻,每做出一道题目看完一章书独立完成一个证明理解生活中一个日常现象,都能给自己带来莫大的快乐,乃至于几个月不洗澡都感受不到自己身上的味道……。
绝大多数人在毕业后的几年内都找不到北。我也是。不过我始终记得旅行者的那七个字:行走、思考、在路上。
毕业大业
一场雨过后,午后阳光慷慨的洒下来,图书馆的空间溢满温暖,还有,春的味道。
半个上午以非常手段完成了《计算机网络》的6章作业后,内心已极其疲惫,就像一场长长的火车硬座长夜,一旦结束,想做的,无非就是找一张舒服的床,开一瓶美味的饮料,躺下来看一场轻松娱乐的电影。虽然内心里有一种声音在不断提醒我:“嘿,boy,计算机组成作业已经三次没交啦,数电过几天要补考啦,导师说下周要看你做的怎么样了哦……”。
累,很久没有感到这么累了。累到什么都不想做,想想要是生场大病就好了,这样就什么都不用管,躺在床上专心看书就好了。也不用像现在这样,上午看Objective-C,下午看C++设计模式,晚上去下载OpenGL红宝书,睡觉前还要想着八竿子打不到的时序逻辑电路;明天又要去看MIPS/ARM,还有拐弯抹角的LR(1)语法分析,以及900多页的《计算机网络》——Tanenbaum可真是能唠叨啊。
我以为我能搞得定,就像大一期末2天时间复习完《数学分析》那样,又或者像高三竞赛前夕一天复习完400页《基础有机化学》并且还能做几十页的笔记那样,但这次似乎有些不同。想毕业,我得:
- 4.20 编译原理(考试)、数字电子技术(补考)
- 4.22 毕业设计中期检查报告
- 4.24 计算机组成期中考试
- 5.13 数字电子技术毕业清考(如果补考不通过的话)
- 5.16 电路原理(甲)I毕业清考
- 5.30 毕业设计检查
- 6.10 毕业设计答辩
- 6.25-6.31 编译器设计、计算机网络、计算机组成、计算机体系结构考试
编译原理的期中考试混了下,作业用非常手段最后时段补齐了,LL(1)/LR(1)分析还模棱两可,两天时间希望能搞差不多吧;至于夏学期的编译器设计,8周,仅仅8周,你觉得8周来写一个编译器,这个Project如何?数字电子技术三进宫,一点没看,我就不明白了,我一个靠Linux/Script混饭吃的Programmer,干嘛非要去学什么狗屁触发器和时序电路?干嘛非要让我去学楼道灯开关的电路设计?我又不是Steve Wozniak。真的需要了解这方面的知识,一本《编码的奥秘》足矣;电路原理,不是我学不会,永远记住,这个世界上我学不会的课程不多,只是我不想学而已;计算机组成/计算机体系结构,MIPS,作为上个世纪80年代的恐龙,你还在不停地折磨你的学生,你好意思吗?计算机最重要的设计思想在于抽象、分层,我写我的C/Python/Bash,至于你CPU指令怎么流水怎么冲突,那是Intel/AMD工程师的爱好,和我无关。
至于毕业设计,在Windows上用VMware运行Mac OS X,里面开XCode用C++来封装Objective-C代码然后在狗日的慢的要死的iPhone/iPad Emulator上测试Win32-Style的C++程序,所有的一切让我想起来两个字:山寨。何苦如此呢。不是有Qt吗,干嘛要自己重新写一套,reinvent the wheel?怕开源,怕别人看到你的代码?可是为什么作为国内顶级学府的浙江大学的计算机学院,要用盗版的Visual Studio在盗版的Windows上写“版权保护”的程序呢?
至于Mac OS X,引用Linus的话,“简直是个十足的废物”,除了极致的工业设计,和Linux相比,简直一文不值。整个系统,图形界面自成一套,目录结构、命名风格和传统Unix的FHS完全不同;软件包管理系统,要么是Macports,要么是Homebrew,前者在系统中也是自成一套,往往会造成重复的程序库版本,后者的功能以及资源和众多Linux发行版相比相差太多;至于Mac产品设计的哲学和风格,我只能说,美观、人性,同时,霸道、专横、跋扈。怎么最大化一个Finder或者Safari窗口,让它布满全屏?不要告诉我这是苹果的哲学,以及对人性的关怀考虑,我所想到的,就是霸道,专横,自作主张。
至于XCode,和VS、Eclipse相比,简直是处在史前时代:没有代码补全、多窗口设计、无法调整窗口布局;Interface Builder,对于一个初学者来说,用Interface Builder拖来拖去,最后到底生成了怎样的代码?不知道——因为Interface Builder不生成代码,生成的是一个二进制的nib文件,序列化的Object。什么叫序列化?I don't know。对于一个拿了Baidu Offer的人,尚且不知道什么叫做对象序列化,Interface Builder的存在,是不是背离了最初“让开发变得简单”的目标,适得其反了?总而言之,我觉得用Interface Builder来写程序,就像用Dreamweaver来写html代码一样,甚至比那还糟糕,最起码在Dreamweaver里面你还可以看到底层的html代码,但是在Interface Builder里面,你什么都看不到;Objective-C,当所有的类要靠NS-、CF-等前缀来避免命名冲突,和C++的namespace相比,是不是有些原始和不雅观?Why Objective-C?除了一个专横霸道的Mac,还有永远也不会成熟的GNUStep,Objective-C几乎毫无用处。
吐槽归吐槽,连日来的压抑也让我开始明确自己的未来之路:
- 我不适合搞学术:没有天赋、本科阶段也没有良好的基础
- 我讨厌写Paper:就像我不会为了谈恋爱而谈恋爱一样,我也不会为了写Paper而写Paper。有人说学术研究就是“大牛挖坑,大众灌水”,为了发Paper去搞学术,有了Paper才能升职,不可否认,在没有找到一个更好的评比办法之前,量化评比就像中国的高考一样,确实是最经济最有效相对最公平的方式了,但是,我不喜欢,也不想去适应;
- 我讨厌Deadline:我始终认为好的东西是雕琢出来的。Deadline压身,往往会分散人的精力,给人施加很大的压力,进而又会影响人的发挥
- 我讨厌别人在后面催着赶着我去做事:那感觉就像一头牛被鞭子抽着闷头耕地一样。
还有三个月。三个月后,无论能否毕业,我要开始做一个差生。在也不为了一些名头上的东西,强迫自己做自己不喜欢的事情。即便是没有了Vi/Emacs,没有了Linux/C++,没有了[tex]\TeX[/tex],生活也可以是美好和令人期待的。不是吗?
zoj 1314, 1278
两道题目表面上看起来很相似,解法是不一样的。
1314的本质是给定数[tex]x, y[/tex],问[tex]ax (\bmod y), a = 1, 2, \cdots [/tex]的周期是多少。依稀记得同余理论和不定方程的某些结论,我猜测周期应该是[tex]\frac{y}{gcd(x, y)}[/tex],自己验证了下也是对的。具体证明涉及到同余和不定方程,高中的基础全忘了,叹。
程序ac一波三折,先是TLE,后来发现scanf()后面没有写!= EOF,可是这题也没说啥时算输入结束啊……看来是经验不足了;后来又是Presentation Error,仔细检查发现是四个空格输出成了五个空格……叹……
代码:
#include <stdio.h> int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } int main(int argc, char *argv[]) { int step, mod; while (scanf("%d%d", &step, &mod) != EOF) { printf("%10d%10d", step, mod); if (gcd(step, mod) == 1) { printf (" Good Choice\n"); } else { printf (" Bad Choice\n"); } printf ("\n"); } return 0; }
zoj 1278和zoj1314很像,于是我尝试着用zoj1314的方法去解决,我甚至求出了通项公式:
[tex]y_n = (Z^{n-1}L + \frac{Z^{n-1} - 1}{Z - 1}I )\bmod M[/tex]
后来发现不行,因为这个式子的增量不是线性常数,需要另觅他法。很无耻的参考了这篇博客,难得体会到了代码之美,用数组做标记(我不知道是不是该这样说,或者hash table?)的手法,某些时候确实很管用,需要进一步熟悉。
代码贴一下吧……虽然是抄袭的^~~^:
#include <iostream> #include <cstring> using namespace std; int main(int argc, char *argv[]) { int z, i, m, last, next; bool judge[10000]; int count; int n = 1; while (cin >> z >> i >> m >> last) { if (z == 0 && i == 0 && m == 0 && last == 0) { break; } memset(judge, false, sizeof(judge)); count = 0; while (true) { next = (z * last + i) % m; if (judge[next]) { break; } last = next; judge[next] = true; count ++; } cout << "Case " << n++ << ": " << count << endl; } return 0; }
加油加油啊。
总结下上半年的课程
好久没有更新了。上次更新还是三个月之前。那时的算法课程,昏天黑地地写了三天的代码,bst, avl, splay,稀里糊涂。
转眼已到春至。回想前面几个月的生活,百感交集。12月份1月份以学习为主。专业课究竟是专业课,颇有力不从心的感觉。好在通过自己努力,成绩还不错 ,这么一来压力少了很多——我可以顺利毕业了,呵呵。
说说去年的课吧。
计算几何:唯一挂掉的课程。54分。主要是自己太过自信,秋学期考试前几天一直在看图形学,忽略了这门课的复习。我想我平时作业交了,期中考的还成,期末再怎么差也不会太难看。但事与愿违,老外的课不留水分。期末考试我觉得很难。很多人都弃考了,我也没有做出来几道题。考完了就有种不详的预感。最终悲剧的挂了。不过还是有所收获。除了一些入门知识,了解了latex tikz/pgf宏包的使用,还有geogebra软件。
计算理论:学过的所有课程中最为抽象的一门课程。半年就讲四章,中文书100页的内容,第四章图灵机的很多内容到现在还是不太明白,什么NP,原始递归,判定性等等。DFA,NDFA,CFG等,也是费了好大的力气才理解的差不多。作业占10%,期中占20%,期末70%。算上期中考试,我就上过3次课。作业最后补了不少,打算考试时候交给老师,可惜老师没有收。这么算了我作业分0分了。最后的几天都在复习,期末感觉还不错。最后总分80。比较满意了。现在想想这门课应该是蛮优美的一门理论,尤其是又穷自动机和正则语言、下推自动机和上下文无关文法、图灵机和文法之间的对应和转换关系,以及图灵机对很多问题的判定,都是非常抽象非常晦涩但是理解后又会使人感叹的东西。由此可见,本门课程的祖师爷Alan Turing先生的伟大之处。他在人们还没有搞懂什么是计算机的时候就发明了这套理论。
操作系统:78。比预期的要低。大概是自己太过自信,没有复习的缘故。14次小作业完成的都不错,presentation满分,期末考的不咋样。客观的说,这门课只能算作科普课程。通过这门课学习,知道了进程、线程、DMA、MMU、死锁、进程同步、CPU调度、文件系统、磁盘结果等概念。主要收获还是自己参与的三次Presentation。第一次写了基于浏览器的操作系统,第二次写了二十页英文的关于进程和线程的论述,第三次是linux系统调用深入研究。
汇编与接口,重点了解了x86 intel 汇编,我对接口部分没啥兴趣。大一时买的清华那本《IBM-PC汇编语言程序设计》总算派上了用场。最后自己编了一个200多行浮点数运算四则运算模拟的汇编程序,深入研究了IEEE 754浮点数标准,了解了汇编程序的结构,一些重要的指令和伪指令。最后考试不咋样。没怎么复习,接口部分不熟,总成绩66。
汇编与接口实验,多数实验是糊弄的……人家前脚做完实验,我后脚开机,开始“做实验”,最后参考别人程序,修修改改,蒙混过关……整个过程极其痛苦……发誓以后打死也不过电路芯片等硬件相关的东西。最后糊弄个80分了事。
计算机图形学,科普课程。课上只讲原理,不讲编程,作业却是用OpenGL编程,编六个大程序。结果考试却又完全不考OpenGL,真是无语的一门课程。最后考试题目大体如下:
- 扫描线填充和种子填充算法概述,优缺点比较。
- Phong模型和Gouraud模型概述,比较。
- 画家算法和z-buffer消隐算法概述,比较。
- 光线跟踪算法和辐射度方法。
- 如何用深度缓存生成影子。
我答的还不错。最大的收获是OpenGL编程、OpenGL Pipeline、3D几何变换,还有一些常用算法。不过说来容易做起来难,本身图形学对数学的要求极高,我这种水平也只能高山仰止,调调OpenGL函数糊弄了事。最后的程序搞了600多行,很是崩溃。尽管学的比较辛苦,但是成绩只有72分。大概是自己没上过几次课点名没到的缘故吧。
数值分析:很难的一门课。当然如果你有好的数学基础和扎实的编程基础,学起来还是蛮又收获的。讲到切比雪夫多项式的时候大家都晕了,只有老师一个人在台上无奈的叹气。实验要求是8个大程序,网址在这里,共30分。坦白的说,我一个人搞不定。最后的办法是借来了别人的程序,参考课本仔细研读,加上自己创造,终于在deadline之前搞定。考试也不简单,最后老师特地延长了时间。总成绩80。比较满意了。收获是以后遇到此类问题知道去哪里查书了。
高级数据结构和算法:8次课,在zjg,去了3次。和两位大二的学弟组了队。编了大程序——见我前一篇日志。最后80左右。收获:没啥收获。这么短的时间,所谓高级算法,就是一个噱头。
逻辑与计算机基础:极其痛苦的一门课。本身对电类课程过敏。而这么课又是讲什么全加器、选择器、译码器等数字电子电路相关的东西,加上课程在zjg,所以我也没怎么上。最后和别人组队,弄个文职,长者自己latex略有小成,弄了份精美的文档过去。四次quiz也是糊弄,期末考试也是糊弄,老师照顾,60分。总算过了。
逻辑与计算机基础实验:极其痛苦的一门课。13次实验+期末考试,只给一个学分。其实关于Verilog,大家都不会,也没几个感兴趣的。实验课就是前人栽树后人乘凉,好在我们在下午上课,上课的内容就是找到别人编好的程序,鼠标点点,运行下,最后糊弄下老师,签字走人。收获:看过了FPGA开发板,知道了XILINX这个软件bug多多,比较恶心。
操作系统实验:就是linux的相关操作。四次实验,依次是Linux API,编译内核,系统调用,文件系统改造。收获不小。看了部分《Unix环境高级编程》,亲自动手编译了内核——以前不敢的。进一步熟悉了Emacs、latex,还有强大的cscope的初步使用。最后91分。
马克思主义原理:没怎么去。只有60多分。收获:基本上复习了初中政治的内容,觉得资本主义本质、商品使用价值和价值的分析是最精彩的。课比较恶心,分比较低,老师比较不厚道。
游泳:60分。其实本不该这样。理论考考试系统出问题,一分钟刷出来一道题,做不完。体质测试又出问题,本来由于场地原因,我们这半年就上前面几周的课程,最后老师说我的体质测试成绩没有给他。可是我根本不知道那个时候该到哪里上课。结果60分。令人愤慨。
工程训练:暑假上的,科普课程。最令我感到震惊的是学医学的也要学这么课程,和我们这些工科男一起去打铁。最后自己做了个小锤子,送给mm了。82分。收获:开阔了眼界。
Linux程序设计:77分。作业都是在贵州做的,点名没到,貌似扣了5分。收获:进一步熟悉了各种命令。
还有一门弃考的计算机组成实验,今年再修。两门补考没去,分别是计算机组成和线性代数,都是大二挂的课程。大四再说了。这半年课程也不少,开学两周我还没怎么去上过课,惭愧。
今天先写到这里。去吃饭了。昨天搞gentoo到四点多,今天中午才起,午饭还没有吃。肚子饿了。以后把一些重要的资料传上来。^_^