我的大学(27):写在末日的边上

我们都好引用孔子在川上曰的一句话:“逝者如斯夫,不舍昼夜。”这不,前面我们刚考完编译原理,一转眼这就2012了。话说此时距离孔子发出他 那句著名感叹不知道已经有二千几百年了,那位当年说“未知生,焉知死”的那个“丧家犬”现在早已成了死透了的至圣先师,估计如果教他现在说些什么,如果他 还能说话的话,说的该是“既知死,犹不知生”吧?所以面对这种情境似乎有两种态度,一是既然终究要知道“死”,不如趁现在好好研究“生”;另一种是既然怎 么着都研究不出来“生”,那还不如研究毛线好了。

列位看官!不好意思,前面我扯偏了。这篇日志的本来目的是在这个特殊的时节,谈一谈已然一头扎死到历史的尘埃中去的2011,以及那个久负盛名、如 今终于“犹抱琵琶半遮面”地登场的2012。所以前面的开头的本来目的是从用第二句话同时“花开”这前面所提到的“两朵”,然后用串行的方式“各表一 枝”。可惜一不小心我的键盘就滑了一下,我的膝盖好像也顺便中了一箭。其实我似乎一直不太擅长写一篇条理清晰、逻辑顺利的文章的,这个是我从我这学期n次 做答辩和presentation的经历,以及写某些稍显严肃的文章的时候的体会中得出的。不过写文章做不到“浑然天成”似乎也不是太大的问题,也许我还 有一个努力的方向是“离题万里”,“浑然天成”。

嗯,上面那么一段话看起来似乎有废话和再度偏题的嫌疑,不过仔细掂量下可以发现,这也是我在逝去的2011年所得的诸多体会之一,所以目前还可以说 是按计划进行。昨天(仍是2011年的时候)和前天就看到有不少人在写2011年的总结,当时我就在想,这2011可是还没断气呢!所以我忍到了这个时候 才开始写2011年的总结(真的不是因为当时在预习编译原理吗?)。

前一段校内上流传这么一段话:“一花一世界,一叶一菩提。一天一本书,一周一学期。”我读到这句话的时候真想拍案叫绝,不过桌子实在是太乱了,如果 真的拍了我电脑旁边堆的那一摞才翻过和正要翻的书估计就要塌掉了。这句话真的挺形象的,不过和我们学院的真实情况还是有蛮大的差距,因为我们除了期末考试 还有各种照着你的膝盖上射箭的大作业。我猜想,如果教我现在谈起当初调MINIX调度器,写DSDV算法,还有写编译大作业的三地址代码生成部分和面向对 象大作业的某个usecase的代码时候的情景,会不会有种谈起“哥当年军训的时候”的感觉?

我觉得2011年这一年的软院生涯还是让我学到了不少东西的。但是每当我思考到底是什么让我学会了什么的时候,我却会有点茫然。比如说我似乎是从大 二下学期的软件工程课程大作业中学会了点Struts,还有些JavaScript,但是这些好像都不是那门课所教授的内容。再比如说我在这一年刚刚开始 使用Linux,而我使用的第一个Linux似乎是MeeGo,使用后者是为了参加Intel的一个比赛,可是可以说参加那次比赛的经历教会了我使用 Linux吗?好像不是的,似乎是因为后来我给自己的电脑安装了Fedora然后这么一路折腾出来的。那么从参加那次比赛的经历中我到底学到了什么?我还 真不知道怎么回答。再比如说我通过大三上学期的编译原理课程大作业里学到了什么?词法分析和语法分析部分似乎只学会了怎么使用JavaCC这个工具,而后 来的第二次大作业类型检查和三地址代码的内容我手工实现了三地址代码的生成,不过这部分我似乎没用到什么课本中的知识,就那么自己写着来实现,实现得并不 美观,而实现之后我也不知道美观的写法应该是什么样子,我依然不清楚我从其中学到了什么。

其实我根本没有想明白的还有一个问题,那就是怎样才叫学到了什么。比如我学会了使用JavaCC这种工具,但这又算学到了什么?又比如说,大二下学 期的软件测试课程,可以说我学会了(至少当时学会了)使用WinRunner这个软件对Win7自带的计算器进行一些测试,so what?雷哥常用句式里有一种“不就是XXX吗”,比如说你和他讨论“解析HTML”这么一个话题,他会说:“不就是给你一句话让你生成一些图形吗?” 或者给他看一些很炫的GUI程序,他会说:“不就是一些调用现成库的逻辑吗?”(不是原话,意思应该相差不大)每次碰到这种情况我会发现我还真不知道怎么 回答,而且说实话我还真觉得他说的是那么回事,所以我每次的回答都是“是”。当然雷哥好像并不是达到了那种视红颜如尘土、视算法以外的一切如民工活的境 界,因为我记得当初问他老人家实现shell是不是就是调用各种系统调用的时候他告诉我怎么设计这个程序的逻辑什么的也是挺难的。不过这是题外话了。

我还记得大二下学期的时候,虽然我在软件工程概论课程上做课堂演示的时候是很自信的样子(当然当时我也确实很自信,虽然现在越来越能感觉到当初那次 大作业我们的作品里有很多糟糕的东西,但是我对那个时候我们做出那样的作品依然感觉很自豪),但是其实那一段我一直有种沮丧感的。我记得当时我是这么想 的,一个人比另一个人强分为两种:一种是我比你多看了一些东西;一种是我就是比你厉害。当时的我相信我自己是比某些人(泛指)强的,但这种“强”似乎仅仅 是因为我比他们多看了一些东西罢了。换言之,如果他们也看了这些东西那么我们就没有任何差距了(毕竟在这个现实世界里阿基里斯还是可以追得上乌龟的)。我 现在会使用WinRunner对Win7自带的计算器进行测试,你现在不会,但这又如何?我现在会使用Struts,你现在不会,但这又如何?

我们前面讨论的我没想明白的问题又是一个让我非常沮丧的事情,虽然貌似在过去的2011一年里我学了很多东西,至少我可以列出来一大堆新学了的东 西,但我却很少能说出来我学到了什么东西。戴着这些轻飘飘的名词,就好象表面上看来你坐在帝王的位子上,但你旁边却站着伊尹、霍光或者曹操。不过也许我之 前对一个人比另一个人强的情形划分还是太过简单,毕竟“我比你多看了一些东西”还包含别的情形,比如说“我比你多看了几十年的东西”——换言之,至少你还 是可以比别人多学一些东西,而这些东西他可能要很久才能赶上。这似乎又是一个“术业有专攻”的范畴的问题了,只是在做过对于一个大三学生来说貌似也不算少 的项目以后,我却还没有想清楚我将来到底想在这茫茫代码地,钻到哪个坑里去。

也许可以顺带提下某些东西。其实在这学期还没开始的时候,我对面向对象程序设计与分析这 门课是挺向往的,直到这门课的第一节课,老师说这门课主要讲的是UML的时候,我就感觉好像忽然之间自己膝盖上中了一箭,那心是拔凉拔凉的。后来画各种 UML图的故事我就不多说了。大作业验收之前的一个星期我花了好几天来写某几个usecase的代码,直到某天我背后同样在写代码的舍友哀叹了一句:“写 这些东西干嘛……答辩的时候又不看……”要知道,士气低落的部队是很容易影响其附近部队导致连锁反应的,所以当时的我又一次感觉好像自己膝盖上中了一箭, 那心是拔凉拔凉的。后来答辩的时候果不其然,那许多我曾经调得蛋碎的代码没有获得一丝的登场机会。那位把我士气从绿色拉到红色的舍友又一次感叹:“早知道 验收前一个星期该写文档的。写什么代码!”

我本身对面向对象这个概念是没什么恶感的,甚至我是很想好好研究下面向对象这个东西的。我对它感兴趣的东西包括一些技术上的,比如它的实现之类的, 也包括一些理念上的,比如到底面向对象的作用是什么——我曾经以为是责任分离,但是责任分离的话名字空间什么的就够了,又何需面向对象这把包含了继承、多 态等一堆概念的牛刀,而且我觉得对这个理念的问题C++、Java和Ruby的理解好像也是不一样的(这是个感觉,我还无法回答为什么会觉得它们对此的理 解不一样;其实这里还藏着一点我相信的东西,那就是不同的编程语言真的不一样),它们中是不是有谁错了,或者甚至更进一步,是不是其实我们也一直错了?可 是讲UML这东西,呵呵。

前一段我曾尝试给增进自己代码内功的途径做总结和分类,我的结论是有四种途径:碎了一地的蛋,每天晚上格一遍天花板,号称藏着黄金屋和颜如玉的书, 以及顿悟般体验的灵光乍现。我觉得,一个没有调一个程序调到蛋碎的经历的程序员是不能叫程序员(好吧,至少男程序员是这样的),我相信即使是Donald Knuth之流也必是有许多这样的经历的;我甚至觉得一群程序员们坐在一起,每个人讲一讲自己曾调得蛋碎的一段程序,绝对是一种打发时光、增进友谊的好方 法,甚至完全可以和以纪昀为代表的一批中国古代文人那“友朋相聚,多以异闻相告”、“共闲话仙鬼事”的意境相媲美。其它的途径里,格天花板就不用说了(当 然每个人格的东西可能不一样),读书也许应该包含读源码这一部分才对,读那些好书和优秀的源码绝对是一种收益很大的练级方式,而天才式的灵光乍现,我认为 它只会光临有准备的头脑。至于UML这些东西嘛,呵呵。

当然我也是非常赞同在写代码之前一些设计工作会极大地方便后面的代码写作过程的。我赞同这一点也是因为我有从我参与过的项目的开发经历中得来的体 会。在所有这么一年的两学期的软件工程和UML课(我这么称呼面向对象分析与设计这门课估计没人有意见吧)学过的那些图里,我觉得最有用的是ER图(我会 直接说出其实ER图是我觉得唯一有用的图这种话吗)。但是对文档的过分重视在我看来只会走向“忽悠”的不归路。这有时会让我莫名想到魏晋时期流行的不谈俗 事、不问民生、更是干脆一点都不搭理自然哲学的“清谈”。拿文档替代代码,估计只有仅存在于武侠小说里以口代剑可以和它相似了吧;至于教一些连怎么写好代 码都不清楚的人UML,呵呵。

好吧,本来是要总结我自己的2011年的,竟然失言了这么多。前面几段看起来还像那么回事,后面有点扯偏了。毕竟这篇日志的题目里有“写在末日的边 上”,等到2012年世界末日过去的几千年后某个种族的考古学家万一一不小心找到我的VPS主机的硬盘并且把它成功恢复,然后发现一个人在末日边上谈代 码,这个种族如果有蛋,他们一定会觉得蛋疼。另一方面,我在这么一篇日志里在很抽象的层面上谈很多我对程序员这一行的理解,其实又何尝不是有些类似于魏晋 时代的“清谈”(当然这些东西还是确实从我的体会中得出的,还是不同于“清谈”的架空背景的)。所以这一枝还是就此打住的好,下面让我们展望一下2012 世界末日,这个美好的未来吧。

我曾在2010年12月31日的《The Final Chapter of 2010》(这个不能算是年终总结,而且这个题目注定了它适合写在2010还没断气的时候)一文里讲过,我一向是个不喜欢规划的人;不过在那篇文章里我还 是尝试着给自己定了一些短期规划,比如读些英语书(2011年里我完整地读完了Audrey Niffenegger的The Time Traveller’s Wife一书,不过后来读Conan Doyle的A Study in Scarlet只读了一半,此外我还是读了很多英文的计算机相关的书的,比如Peter Seibel的Practical Common Lisp我快要读完了),做一些有趣的东西(数据库大作业我做了一个简单的B/S结构的交大课程交易系统,结果后来答辩的时候这个业务逻辑被JBoss鄙 视了;参加Intel比赛的那个MeeGo的项目其实是我大一就想过而且想实现的;此外也许零星还有一些,但好像很多确实做了但没完成)。这次我打算为自 己的2012年列几个相比去年那些东西更具体些的任务(这个词比“规划”更合适)。这些任务并不是什么根据自己的情况量身定做的练级路线,同时我也不打算 贪心,也不求速成,仅仅是一些想做的事,希望能在这新的一年里做了它们(为什么这话听起来怪怪的):

  1. 发布一个开源软件(不管它是大是小,至少要做出来一个能用的东西)
  2. Fork一个别人的开源项目(同样,不管原项目是大是小,也不管自己的修改是大是小)
  3. 写一个用到遗传算法的程序
  4. 通读一本英文专业书籍(原版、影印版、电子版,除去语言教程和框架教程这类的)

既然一时半会儿想不起来太多,那就这么多吧,以后想到什么想做的事也尽力去做。毕竟任务是做给自己的,评分也在于自己,更多形式上的东西可能反倒会让自己产生应付的心态。在此篇文章失言了许多东西,以至于竟然写了好几个小时后,终于该来一句迟到的祝福了:

祝大家新年快乐!