编程十年 (7):科班?自学?
本文地址:
作者:
既然我对计算机这么感兴趣,而在当年,计算机又是热得不能再热的学科,所以父母没有理由不让我选择计算机专业。但是,计算机专业又是各个大学录取分数最高的专业,所以,慎重考虑下,我选择北工大作为第一志愿。北工大不但有独立的计算机学院,还在这一年开设一个了“实验班”专供高分学生考虑。
谁知等开学的时候,“实验班”变成了两个,因为这一年有很多从清华北大“掉下来”的高分学生,他们是第二志愿报的北工大,虽然高考成绩比第一志愿报这里的学生高很多,但为了给那些给工大面子的学生些面子,还是把我们这帮人保留在实验班里,再单开一个实验班专门接清华北大的剩儿。当然,人家考那么多分还没上成清华北大,凭什么不回去重考非要在你这四大染缸之首鬼混啊?所以,为了再给足这帮家伙面子,他们的实验班编号是——0班。不愧是计算机学院,班级号都从0开始排。而我们——第一志愿报北工大的——原计划不变,1班。
记得刚开学不久,就开始和同宿舍的同学争论海盗分金币问题。那个时候是2001年,新千年刚刚开始,网络还不是特别发达,搜索引擎的概念也不是特别流行——所以,大家都是真刀真枪在草稿纸上演算,没人想过上网搜一把。
问题大致是这样的,有5个海盗A、B、C、D、E,偶然得到100枚金币,他们计划用这样一种方式分赃:首先由A提出分赃方案,然后大家一起投票,如果超过半数同意这种方式,则皆大欢喜;否则就把A扔到海里喂鱼,然后依此类推,由B推出方案。假设这些海盗都是极其聪明的——能够猜到其他人的想法,并且是自私的——不会牺牲自己的利益去“搅局”;问A应该提出怎样的方案才能既不被扔到海里,又能得到最多的金币。
大家都是北京各个学校的尖子生出身,所以都能确保A的活命,但在“最多”这个字眼上还是被难倒了不少。我最终以一枚之差输给了一个同学。后来聊天还得知,这个同学也在高中时候就学会了C语言。这给我上了一堂生动的“天外有天,人外有人”教育课。
于是我仔细研究了大学四年的课程(学校给每个学生发了两本小册子,上面列出了大学四年所有的科目),打算认认真真地学习计算机技术。但事实是,之后的三年多里基本上没怎么上过课。不过,通过课程设置,我终于知道了,计算机技术——或者说计算机编程技术——并不只包括编程语言,还包括算法、数据结构、编程思想等等很多内容。
这也是我在大学生活中为数不多的收获之一,虽然没有学到很多知识,但我知道了计算机领域都有哪些知识。后来我在做讲师的时候,不止一次地向学员提到,当你遇到瓶颈,不知道该学点什么的时候,就看看计算机专业的大学课程吧。
由于是计算机专业,所以第一个学期就有C语言课程,终于在课堂上,我知道了什么是Turbo C,也对开发环境和编译器有了大致的了解。接下来,因为在高中的时候纸上谈兵掌握了不少C语法和基本的结构化编程思想,所以这门课学得是顺风顺水。
最让我兴奋的是,很多课程在学期快结束时都有课程设计,跟毕业设计差不多,就是要实际地开发点什么东西。我打小儿就是个“动手能力很强”的孩子,就好上个“劳技课”什么的。后来学习编程,也是以“实践派”自居,以“理论派”为假想敌。至今也很少专门去学习一些编程思想,而设计模式也是很晚才开始学习,目的只是为了方便和同事交流。John Carmack的一句“show me the code”让我热血为之沸腾。以至于后来做讲师时,有同学提到希望讲一些设计模式,我不乏鄙夷地解释道,设计模式就是思维定式,你们不要急于学习,等自己有了丰富的经验和深厚的积累之后,再去随便看看,印证一下自己的想法即可。可谓毁人不倦。
第一个学期的课程设计题目是用Turbo C实现一个打字练习软件,从预设的一些文本文件中随机抽取一个,在屏幕上隔行显示出来,每行字符下面闪着光标,用来输入。输入正确的字符就用白色显示,错误的用红色。并在屏幕底部实时地显示出当前进度、正确率和输入速度。
这样的题目自然难不倒我,不光是我有一定的编程基础,更重要的是我有充足的时间去完成它。课设的时间是两周,但还有课要上。而临近期末的我已然堕落,根本不去上课,每天的生活就是,白天睡觉,下午起床玩吉他,晚饭后去喝酒,熄灯后去网吧刷夜,早上回宿舍睡觉。不过在做课设这一阶段,我只要戒掉吉他、酒和网吧,就能有充足的时间编程了,恰好我对音乐和游戏的兴致并不高(游戏的故事之前讲过了,而玩吉他,最初的目的和抽烟是一样的,只是为了耍酷而已),酒瘾也不大,所以这并不是什么难事。
大一一年混过来,背了一个试读,被实验班开除——别担心,不是被开除学籍——落入普通班。看来实验班还真是个保护伞,就跟某Party似的,犯了多大错误不必担心性命,只要开除Party籍就行了。(关于试读的故事,不知道是不是每个学校都有,大家可以参阅《草样年华》里北X大的试读政策。)我对此倒并不在意,因为课程压力一下轻了不少,不用学无聊之极的“数学分析”了,普通的“高数”就行了;也不用上英语口语课了,不用在众目睽睽之下为了一句“small, like a watch”而憋得满脸通红了——这句经典谚语来源于同宿舍一个哥们,口语老师让他描述一下未来的计算机时他如是说。
经过大一一年,我从一个新生蛋子彻底沦落成“老炮儿”,明白了虽然开学典礼上老师信誓旦旦地告诫我们,缺课多少多少给试读,再缺多少多少直接开除,但实际上,只要搞定任课老师、继而搞定考试,就没问题。我的试读也是因为考试不及格背上的,跟缺课无关。
得到这一结论后,我在之后的几年里就更加肆无忌惮地翘课了。不过好在,我除了计算机也没什么嗜好,所以能够把翘课得来的时间放到编程上,也算自学成才吧。但我还是要感谢我上过的为数不多的一些课,虽然当时觉得没用,现在确实也没用上,但的确让我视野更开阔了一些。比如《形式语言》和《编译原理》,虽然我一直没写出过一个像样的编译器,但后来学习工作流时,很快就掌握了“状态机”的概念。
可是对于讲课的老师,不敢恭维。我发现大学的老师大概就这么几种。
一是明显在外面有私活儿干的,来去匆匆,讲课潦草也不答疑;但这类老师的课是最好过的,否则学生追究起来他不好交代。
二是照本宣科的,这样的老师还分两小类。“二类上”老师的教材是自己写的,讲的和书上几乎一摸一样,回去自己看书就好了。但要过这类老师的科目是需要运气的,因为如果你某个知识点没掌握好,而这一点却又是他下了苦功努力展现在课本里的,就会使他觉得受到了侮辱或者至少是没得到应有的尊重,你必死无疑;而如果你恰好掌握了这样一些知识点,那么你就触到了他的G点,让他兴奋不已,即使其他地方学得跟屎一样,也有可能得到网开的一面,侥幸过关。“二类下”老师则没有写教材的实力,所以只能在黑板上抄别人写的东西——他自己都不一定理解,所以你就别指望在课上能学到东西了。这种老师往往比较低调,考前会划重点——就是他会的那些部分,所以只要注意临时抱佛脚就行了。
三是有思想有自己见解的老师,这种老师理论上是好老师,但对于以应试为目的的学生来说,是最恐怖的。他们上课的讲义和教材出入很大,出起考试题来也随心所欲。所以如果不是平时认真听讲、记笔记,还是有些难度的。不过这种老师大多不太会为难学生,只要平时表现好点,作业认真点、出勤足一点,还是很有机会通过考试的。但这类老师中,有不少是陷入另一极端的,就是太TMD有自己的见解了,讲课时天马行空不知所云,莘莘学子提起笔来竟不知这笔记何从下手,上课时一脸茫然,下课后大脑一片空白。
我后来做讲师的时候,也接受过一些职业训练,这不禁让我更加怀疑,这些大学老师当年在上大学的时候都干嘛去了?我不是想批判他们,他们里面有不少不错的人,有的是技术水平相当不错,有的是人品相当好,有的是两者都不错;但是作为传道、授业、解惑的“师”,他们可能并不称职。