引子
每一年,我都给自己一个宏观的目标。
大一的时候,默默地做一个优秀者;
大二的时候,在有限的时间里,让自己拥有最大的价值;
现在我大三,希望自己像水一样,临危不乱,处变不惊。
关于当初
老实说,数媒是我第六个志愿,总共我也只能填六个志愿。
高考考完,出分,看了看高考志愿填报指南,我的分数刚刚好只能上得了华科。选专业的时候,我爸思考了很长时间,在机械、光电、电气、材料里面纠结了很久,终于决出了这四个专业的先后顺序,然后我又报了软工和数媒两个专业凑数。其实我并不知道数媒到底是什么,我只是零零星星地听说了选数媒可以做游戏,就觉得这个专业还不错。最后录取通知书发下来,王牌专业必然是选不上的,甚至因为分数太低,连软工也没有要我,就这样来到了数媒。
我妈听说我进了数媒,还有些失望。我从小就有很深的游戏瘾,我妈对我是恨铁不成钢,听说了我这一行又是做游戏的,以后还要祸害更新一代青少年,十分无奈。我自己倒是无所谓,只要不是文科,我读什么专业都无所谓的。况且,对于“代码”,我曾经多次与其擦肩而过,如今我将要与它“正面交锋”,心里还有点小激动呢。
在我印象里,我生来家里就有电脑,我经常看到我爸用电脑上网、下棋、聊QQ。于是很顺其自然的,我很早就懂得了电脑的各种操作。小学电脑课的老师,发现我对电脑“如此精通”,就推荐我去学编程。那个时候我三年级,让我去学QBasic实在是难为了我,毕竟我连英语都不会,看到满屏幕的英文字母,我是拒绝的。前两节课我都是在超级玛丽中度过。你问我第三节课我怎么样了?很遗憾,我就去过前两次课。
虽然我第一次试图踏入“代码”领域失败了,但是我与“代码”的缘分并没有结束。在后来某次与“代码”的交锋中,由于强大的自我驱动力,我坚持了很久。
我身边的朋友中,也有许多不是计算机专业的,但是程序写得66666。 靠的是什么? 显然是自我驱动力。
--引用自《码瘾少年爱编程的博客》
在高三期间,正值《三国杀》风靡,我也是它的一名死忠粉。我天天玩,课上玩,放学玩,我甚至盘算着做一套这个游戏的DIY,然后带着它去三国杀公司直接面试上班。我从网上下载了一个可以自行添加脚本的单机版三国杀,按照教程,使用源程序里提供的各种函数,写了很多游戏脚本。这对我来说很费劲,那个时候,代码对我来说是一个全新的东西,所有的变量、语句、函数、库的概念我都没有,我唯一能做的,就是根据其他人发布在网上的脚本,逐一比对其中的共性,总结出一些写脚本的方法。为了查找方便,我还特地去打印店把这些代码打印下来,它整整用了我60块钱,比谭浩强的《C语言程序设计》还要贵!那时是高三,已经高考总复习了,我却经常用掉一整个双休日,躲在电脑前面去翻阅这些脚本示例。因为我们班只有我一个住校生,所以一到双休日,我还可以独占教室里的电脑。直到有一天,我爸来学校“查岗”,直接撕掉了我的“创作笔记”。他生气地训了我一顿。等他走后,我把他撕碎的本子认真粘好,但是在剩下的高考复习时间里,我再也没有碰过它。
后来我知道,我那根本不足以称为写代码
终于开始了期待已久的大学时光,开始了最“正统”的编程学习,我认为这是我真正意义上踏入“程序界”的大门。最开始,我很光荣地跟别人说,我高中就写过代码,我写的代码叫做 lua。后来我就底气不足了。随着我编程知识的不断积累,我理解了什么是变量,什么是语句,什么是声明,什么是函数,我越来越觉得我高三时期所谓的“编程”根本就不足以称为编程,那只是把大量别人写的代码进行组合拼装。不同的代码里,同一个东西,有人用‘t’,有人用‘temp’,到底哪个是对的,哪个是错的呢?当时的我不知道。看到别人写的lua脚本里,有各种函数,我觉得很神奇,lua是专门为这些游戏定制的语言吗?为什么实现每个功能都能找到合适的函数呢?后来我才知道,这是程序员自己写的函数,而不是脚本语言本身提供的。
某天,我翻出了一本叫做《平面几何一题多解》的书,那是本封面很好看的书。我把整本书翻下来,每个汉字我都认识,但每个符号我都不懂
-- 引用自《徐宥:掉进读书的兔子洞》
不可否认,有一个老师引导实在是太重要了。我渐渐发现,我高中对于“代码”的摸索,走了很多弯路。就像一个小学生想去自学中学的平面几何一样,太难了。我一方面很佩服自己居然能在这条弯路上坚持这么久,另一方面也是对高三的懊悔。如果我先把我所谓的“代码事业”放一放,好好复习我的语数外,也许我现在就在清北,就能接受更好的编程教育了。好在我在两次和“代码”擦肩而过之后,终于最终得到了他,真是相见恨晚。
每次老师在课上提到的C程序,我都要在手机上敲一遍
大一刚开始,我没带电脑,也懒得去机房。可是对于老师上课说过的程序,我又很想亲自见证它的运行。我就在手机上下了一个C语言编译器,这下可好,我又泡在了编程之中了。像什么排序算法、杨辉三角、汉诺塔、魔方阵、八皇后、迷宫寻路,我都是在老师上课之前就自己写出来了。到了大一上学期结束后,我已经有了很强的C语言能力了。那是我听说班上还有同学不会写代码,我还十分惊讶,原来并不是所有人都会把老师上课说过的代码自己下去敲一遍。到现在,我的代码量已经很多了,从我第一个成型的程序“贪吃蛇”,第一个有界面的程序“弹球游戏”,到现在各种OpenGL、MFC框架下的程序,都历历在目。
“弹球游戏”是我做过的最复杂的软件了。对我而言,它意义特别重大。这是我第一次作为组长,与一个团队一起完成一个任务;这还是我第一次接触图形界面;同时这还是我第一次真正意义上的“自学成才”。我们学院,对于程序语言的课,跨度真的很大。大一上学完了控制台下的C语言,大一下直接就让我们做具有图形界面的C++程序。我一没学过C++,而没做过图形界面,我的组员比我还要懵,他们C语言都掌握得不咋地。可这是任务,我怎么也得硬着头皮干下去。当时项目经理推荐我用WIN32(后来我才知道WIN32非常底层,各种函数,包括碰撞检测这种,都要自己写,太坑了!!!),我就学。我在网上找学习视频,然后找配套教材,各种看不懂,就瞎琢磨,最后总算熬过来了。这个项目总共是4周多的时间,我学会WIN32的时候,时间就剩一周了。此时仍然全组只有我一个人会写图形界面,我就给他们分配了一些轻松的任务,然后我单枪匹马,奋战一周,终于做出了一个“弹球游戏”。
关于未来
除了学习知识,大学的另一个作用是让我明白了我未来到底能做什么
如果你在我大学之前问我,我上了大学以后能干啥?我只能支支吾吾告诉你:“嗯……我可能会去做游戏吧……也有可能去做动画,不不不,不是动画片的那种动画,嗨呀我也说不清楚。”但是现在,你问我我的未来,我能跟你扯上一个下午。
我的大学学习生活十分按部就班,既不逃课旷课,但也不至于每次上完课都去和老师进行一次“私人交流”,对于跟老师做项目这种事,更是一次也没有发生在我的身上。除去老师布置的作业,和我自己课后一些没有技术可言的瞎捣鼓,我可以说是丝毫没有项目开发经历。那怎么办呢?那大概只有通过读研究生来“延迟毕业”吧。成绩嘛也不算是最顶尖,要知道我们学校,软件学院,数字媒体技术,就算是全班第一,清北也未必会正眼看你一眼,况且这学期结束我能不能拿第一还无法保证。可是又不甘心继续读华科。有时我又想毕业之后直接工作。因为我对遥远的未来是很确定的:我首先要加入一家游戏公司,积累一些游戏开发经验,最后和一些志同道合的人一起写出一款风靡的游戏。至于研究生这一纸文凭,我倒真不是特别期盼,只是家里人觉得我大学两年半,成绩学得挺好的,不去读个研究生可惜了。对我而言,读不读研都是一个殊途同归的事情,我要做的就是继续保持一个好成绩,当保研机会和工作机会同时出现在我面前,选择权掌握在我手中就好。
关于当下
临危不乱,处变不惊
在这个阶段吧,我倒是十分淡定。再大的波澜,我也能很冷静地应对。这是因为我对于自己已经有了完备的认识了。我的长期目标是写游戏,短期目标是保持好成绩。成绩下滑了,我就努力一把;技术不过关了,我就自己练习练习。这不是说我没有拼劲,而是说,我对自己的目标明确,各种计划都十分严谨,不会因为一些突发事件而自乱阵脚了。对的,就像水一样,在做决定的时候,不骄不躁,不紧不慢,从容对待自己的每分每秒。
我很困惑,跟一个同样做学生会工作的师兄聊天诉苦,谈我面临的问题。他很干脆地给了一个建议:做好短期时间规划。具体而言,要把每天把要做的事情分成A、B、C、D四类:
A——紧迫且重要;
B——重要不紧迫;
C——紧迫不重要;
D——不重要不紧迫。
然后按顺序为每件事情安排一段专属的处理时间。关键的是,一定要在专属时间内专心致志地做好当前的事情,不受其他任务的干扰,这样才能提高效率。
-- 引用自《辜新星:时刻调整方向 找到人生的蓝海》
我就记得我大一上学期,经历了大学里的第一个期末考试周,为了我一向不擅长的语文,我复习到天亮。现在想来那也是十分可笑了,有什么事情一定要熬夜做呢?能熬夜完成的事情,就能够早上六点钟起来完成。现在,我更喜欢在惬意的午后,听着轻音乐,慢慢打磨出一行一行的代码。应对大学各种各样的任务,最怕的就是失去节奏,自乱阵脚。面对一些诱惑(比如:只要我今天熬夜复习到两点钟,就能把某门课复习完,然后明天玩一整天),一定要十分清醒。有时,贪了一手,失了大局,十分可惜。
输在起跑线,赢在终点线
我吧,现在大概是在还大一大二的债。我在大一的时候加入了学校的龙舟队,每天早晚的时间都要花在训练上,临近端午节,更是每周画出30个小时在湖上漂。我真的很后悔当时加入的这么一个费时费力的运动队,而不是一个技术团队。坚强的我,以一个高分完成了大一的学业,可是却在大二打算加入某个技术团队被拒了,理由是我的成绩太好了,怕我为了保持成绩,耽误花在技术团队上的时间。以致于到现在,我除了一手加权,没有什么拿得出手的技术。当今流行的游戏引擎,像什么Unity、Cocos2D,我都不会。对于一个目标明确,要在未来从事游戏行业的人来说,我至今所掌握的WIN32、OpenGL、MFC都是没用的,我着实已经输在了起跑线。
高傲的我并不会因此妄自菲薄。比起技术,我更愿意把我定位成一个能力型选手。对于编程逻辑,我既喜欢又擅长,同时我又具备极强的数学严谨性和计划性,我热爱我的专业。这个学期开始反击为期并不晚。我给自己定下的目标是:在本学期使用Unity完成一款游戏的制作、使用OpenGL写一个自己的游戏引擎、使自己有足够的实力去参加暑假各大学校的夏令营。
关于课程
表扬是最好的督促
大学里的每门课,我都认真上完了。每一位老师的容颜相貌、口音语调、授课风格,我都了然于胸。
万琳老师是我最喜欢的老师(我相信这对于我们学院的一大半同学来说都是这样),初次见面是在《C语言程序设计》上,后来还教过我们《计算机图形学》,现在是我的特优生计划指导老师。万老师总是能以同学作为榜样,激励我们学习。很多优秀学长的名字,我都是在万老师的课上听说的。我忘了是什么缘故,有一次,万老师课堂上突然表扬了我(大概是课上认真思考,课后学习积极什么的),那个时候万老师还不知道我的名字,只能用“那个穿红衣服的男孩”来称呼我。我顿时心花怒放,喜形于色,这是大学里面第一个认识我的老师。因为被老师认识,而且还作为榜样表扬了,我更加认真地听课、完成课后练习。在最后的课设中,我做的“贪吃蛇”,获得了96分的高分。那是一个没有图形界面,但是用了很多方式来丰富界面,并且玩法非常多的一个贪吃蛇,是世界上独一无二的贪吃蛇。从此,我也成为了万老师口中的“优秀学长”。后来成为了万老师指导的特优生,应她的邀请又去给17级的学弟学妹分享课设经验。
邱德红老师也是我十分喜欢的一位老师,给我们上过《数据结构与算法分析》《算法导论》。在我心目中他就是一个老顽童,特别爱笑,慈祥。给我们上的第一堂课上,他说:“我自认为我已经是一个老教师了,老教师是可以坐着上课的。”于是从此以后他就坐着上课,洋溢着满脸的幽默和可爱。在《算法导论》的上机课上,我第一个完成了上机任务,给邱老师检查之后正打算开溜,结果突然听见老师说:“好,下面数媒班的同学做好了就给他检查。”我扭头一看,邱老师还是那一副慈祥可爱的面孔。于是,我就按照他的要求,规规矩矩地检查完了每个同学的上机作业。有几个班上和我关系比较好的同学,上机作业明显是抄袭的,我没有证据,不想给他们高分,我又不忍给他们低分,就问邱老师:“能不能给他们一个星期的时间完善一下作业?”邱老师还是那一副慈祥的笑脸,说:“你来决定!”《算法导论》一共上机了四次,托邱老师的福,我本可以每次第一个开溜,结果都成了最后一个走的人。但我一看到邱老师慈祥可爱的笑容,我也就开心地笑了。
还有很多老师,他们都有很多经典的话语。比如《计算方法》李东方老师说:“你们学的知识都是有用的,你觉得没用,是因为你不会用它。”这句话在我后来的学习中被多次证实,现在我还经常用这句话去教导学弟。还有《计算机组成原理》黄浩老师,他说:“对于有一定规则的游戏,计算机是必胜人类的,但是没有规则的事物,计算机是不能替代人类的。”这一观点和我不谋而合。永远从容不迫的《微积分》金建华老师、恨铁不成钢的《大学物理》陈昌胜老师,等等等等等等,因为我每门课都认真上了,所以我对他们的一言一行,真的历历在目。
“科班”给我带来了什么
我们业内一般都喜欢嘲笑培训班出来的学生,有几个原因:
1、求职简历都写的完全一样。你第一次收到某培训班的学生的简历,可能感觉还不错,懂的东西不少,参与的项目也有点意思,说话也头头是道。然后,你发现后面 30 份简历都几乎一模一样的时候,你就会想说,简历这个样子的我一个也不想要了。
2、缺乏自学能力。很多人就是因为觉得没有自学能力而去了培训班。去了以后觉得让我学会的任务,是老师的。这样的学生,即使最后学会了老师教的一切,往往也是废的,因为稍微变化一点的东西就学不会。
3、不懂得任何的良好编码习惯、调试、调优技巧。培训班的老师们把课程全部都灌输给学生已经够困难了,这些自然就是奢谈。当然,国内大部分大学教出来的学生也是这样的。这些东西太庞杂,太繁琐,靠看书和老师教很难习得。必须看自己不断的去做东西,在过程中,不断的改进自己。
4、很多老师和培训机构为了追求就业率,传授各种简历面试技巧,甚至不惜帮助学生作弊。统一教出来,所以简历和说话都是一个味道。
5、因为无知而狂妄。
-- 引用自《我前妻的故事:一个北大青鸟出来的,如何从月薪800元到年薪40万?》
我是数媒班的,也算是半个科班出身。我认为科班给我带来收益最大的,是良好的编码习惯。沈刚老师给我们上课的时候,经常演示他的代码,我保证那时我当时见过的最漂亮的、风格最简约的代码。举个例子吧,在分治算法中,我们会在递归调用中判断递归的停止条件,会用到大量的if...else...语句。但沈刚老师不用else,而是活用了return。沈刚老师的一句话我记忆犹新:“我们那个时候写代码,一页只能写25行,所以如果一个函数要是超过了25行,就要把它分成两个函数。”这句话我一直记着,并且时刻督促着我,写代码要简约、有条理。
void quick(int A[], int a, int b) {
if (a >= b) return; //在这里直接使用return,避免了后面else的使用。
int key = A[b];
int i = a;
for (int j = a; j < b; j++) {
if (A[j] < key) {
int t = A[i];
A[i] = A[j];
A[j] = t;
i++;
}
}
int t = A[i];
A[i] = A[b];
A[b] = t;
quick(A, a, i - 1);
quick(A, i + 1, b);
}
还有一个科班出身的优势就在于数学基础十分扎实。曾经我不明白那些数学有什么用,直到《算法导论》这门课,一口气用到了级数、概率论、矩阵、图论的知识,分别对应了曾经学习过的《微积分》《概率论与数理统计》《线性代数》《离散数学》。而算法的重要性对程序员来说不言而喻。有个大一的学弟之前问我借了《算法导论》,结果翻了两页告诉我他看不懂,细问之下才知道,他缺少了那些必备的数学基础。我周围很多同学对科班学习的各种编程(看似)无关的课程恨之入骨,其实只是还没有看到这些课程将在遥远的未来如何产生作用而已。
再举一个例子,我在《OpenGL图形编程》中,为了完成作业,我需要绘制阴影。但是绘制阴影的过程十分复杂,而且需要占用许多资源,我只需要对其中一个小物体绘制阴影就可以了。于是我决定自己写一个阴影绘制的函数。这个决定可不得了,为了计算这个阴影的位置,我用到了空间向量、矩阵乘法等各种知识,最后问题处理得很好。我相信对于那些数学基础不太扎实的非科班出身的同学来说,这一步堪比登天。
其实,有些时候,我也羡慕那些非科班出身的人。现在每个专业,材料、机械、电器、经济,都要学编程,他们学编程,我们也学编程。他们学别的专业课,我们还是学编程。毕业之后,我们有一技之长,而他们可能会有“两技之长”。现在社会上最不缺的就是程序员,如果两个编程水平相近的人面试同一家公司,我是老板我无疑会录取那个懂一点材料、或者懂一点机械的人。这当然不是说我要去学其他学院的课程,而是说,我要充分利用软件学院的资源,对于开设的每一门课,都要认真对待,也许我多上的某一门“水课”,在未来就会成为面试过程中的一块砝码。
关于师生
既是老师,也是朋友
我身边的很多同学在高中之前和老师关系很好,来到大学以后,却难以和老师建立良好的友谊。我觉得根源就在于大学老师缺少互动,准确地说,是缺少一对一互动。
我心目中理想的师生关系是什么? 是 Coach / Trainee (健身教练 / 健身学员) 的关系.
-- 引用自《现代软件工程讲义 0 教学方法》
为什么可以要用健身教练来类比老师呢?因为,作为一个健身教练,不论他有多少个学员,他都必须了解每一个学员,单独和每一个学员沟通交流、制定计划。高中老师(尤其是班主任)和健身教练很像,但大学老师不行。学生太多了,而且老师还有科研任务,一对一互动不多,大部分学生因此感觉大学老师就是一个遥远的存在。《数据库系统概论》吕泽华老师上课十分风趣幽默,还说:“你们有任何方面的问题,不管是学习也好,不是学习也好,都可以来和我讨论。”可是课后也鲜有人找他讨论,原因就是老师平时并没有主动了解学生,大家还是觉得老师很疏远,谁会和疏远的老师讨论问题呢?试想一下,如果高中班主任没有主动找同学谈过话,同学会在之后主动找班主任聊天吗?
回顾大学里那些我喜欢的课程,绝大部分都是老师给予过我鼓励的课程。和老师一对一的交流,得到老师的鼓励,就是一种一对一互动。有了第一次互动,就会期待第二次,第三次,就会驱使自己一直认真学习这门课程。这也正是在学校上学和在网上找视频学习资料的不同之处。
遗憾的是,大学老师终究不能成为健身教练那样的存在,他最多只能关心很少几个学生。其实老师也很无能为力,不是吗?只有我们这些同学,通过优异的表现,来得到老师的关注。
结语
大学生活很快就要结束了。纵观我的大学生活,第一年,我认真学习,还加入了好几个组织;第二年,我当了部长,成为了有头有脸的人物,事情越来越多,但还是基本保证了日常的学习;第三年,终于认清了自我,不再迷茫,不再犹豫。我很满意我的大学生活,它丰富、快乐,也让我小有成就。也希望未来的大半辈子里,不求每个阶段都和大学看齐,只求我每个阶段能按照自己制定的路线,坚定不移地走下去。