自敲第一行代码起,已经十年多了,今天既不是十年整的日子,也不是一个有特定意义的日子,本来像这种大总结的文章,当择良辰吉日,斋戒沐浴三日,方可动笔。一开始计划是写一篇五年总结的,但各种原因一拖再拖,于是就变成了十年总结。光阴似箭,时不我待,转眼已经在奔三的路上了,离大叔的称呼很近了,但离大神的称呼还很远,在此谨以此文总结反思这十年技术生涯的点滴,与诸君共勉。
编程之前
大概是读初一的时候,家中有幸让我得到了一台二手电脑,那时的心情比现在让我得到一堆苹果电脑更加兴奋。但这是一台不能连网,也没有任何游戏和软件的电脑(扫雷、纸牌接龙等内置程序除外),这样的电脑能有什么用呢?只能瞎折腾,很快电脑被折腾坏了。去电脑店修了几次之后(被宰了几次),决定自学电脑维修。
跑了很多书店才买到跟电脑维修相关的书籍,也就是在这时建立了对计算机的初步认识,并掌握了屡试不爽拔插内存条、重装系统大法。还从帮我修电脑的大叔身上学到了修电脑的装逼套路,在帮别人修电脑时不论如何,一定要进一下BIOS捣腾一下,一定要在DOS的黑窗口下快速地敲几条命令,让旁人看不懂,以彰显我的技术高超。在2002年左右,像老家那种小地方,估计会重装系统的人都不多。
之后从修电脑的大叔那买了不少游戏碟,如CS、红警、帝国、炎龙骑士团等等,安装游戏是一个隐藏天赋,只要把游戏碟插入光驱中,这个隐藏天赋就会被自动激活,自己摸索着把游戏装上去。从此电脑上的内容开始丰富了起来,获得了近视成就。玩游戏的同时也对游戏和游戏的背后产生了浓厚的兴趣,那时候经常会思考游戏是怎么做出来的?实际上更多的同学比我接触电脑和游戏更早,但他们对游戏的背后并没有什么兴趣,所以他们现在很多都成了小老板,而我成为了苦逼的程序员。
初学编程
2005年的某日,应该是在信息技术或数学课上,第一次接触到了编程语言Basic,一开始用的并不是VB6.0,而是一个蓝底黄字的命令行IDE,虽然只能倒腾出HelloWorld和一些简单的数学程序,但对此仍然有着浓厚的兴趣,因为我知道了游戏是通过编程来实现出来的,那时候满脑子都是,游戏是怎么做的?但没人告诉我,我只能自己探索。
这时候对程序的了解,也只是最简单的一些语法而已,直到一个亲戚送了一套VCD,是开天辟地的视频教程,里面介绍了VB6.0,在我看来,那是非常适合新手,培养程序思维的一套教程,在大叔那买了3块钱一张的VB碟子,装上VB6.0之后,就跟着视频中的示例操作起来了。于是我写出了人生中的第一个游戏,一个猜数字的小游戏,并尝试着改变游戏的规则,制作类似石头剪刀布这样的游戏。
视频教程中的东西很少,很快就学完了,但这远远不够,我只能写出一些简单的数字游戏,寻找新的资料成了当务之急,但骑着单车翻遍了老家周围方圆十几公里的新旧书店,都没能找到合适的资料,如果是在广州深圳这样的城市或者是像现在这样的网络环境,应该可以很快地找到合适的资料,最后通过学校的上机课,上网找到了一本《Visual Basic游戏编程21天自学通》的书,学校的网速经常只有几KB,寻找以及下载这本书都相当不易,实际上这本书也不是最适合我的,中间存在严重的知识断层,但是最终我硬着头皮挺过去了。
书中的第二个例子是一个模拟细胞生存的游戏,里面用到了一些简单的数据结构和算法,但在这时候我还不知道什么是数据结构,对书中的代码尽是问号,大约经过了一周的死磕,在炎炎夏日,昏暗闷热的小房间里,汗水不断流进眼中,不为所动,因为完全沉浸在代码中了,全神贯注地做一件事情,这是一种奇妙的感觉,这段回忆很是深刻。
最后终于将细胞生存的游戏跑起来了,这是我到目前为止写过最酷的东西了,并且在这个例子中领悟了简单的数据结构与算法,贪吃蛇怎么写?飞机游戏怎么写?俄罗斯方块怎么写?五子棋怎么写?似乎都能从脑海中模拟出来了,应该用怎样的结构,怎样的逻辑?我想这就是初步的程序思维了。接下来的时间里,我将脑海中想到的游戏都一个一个地实现了,虽然实现的效果看上去惨不忍睹(使用Windows自带的画图工具绘制)。但依然是很有成就感的。细胞生存小游戏用的大概是一个简单的图结构,在做贪吃蛇的时候,依葫芦画瓢,写出了一个链表结构,然而直到后面学习c语言的时候,我才知道这是数据结构、是链表......
虽然写出了一些简单的游戏,但我想写的远不止这些,我想变强啊啊啊!!!我想写出更好玩更炫酷的游戏,就像当时非常火的游戏《大话西游》,什么代码可以写出这么炫酷的画面,什么代码可以让两个人的屏幕同步出现这么炫酷的画面呢?后来在云大组织的广州skynet大聚会上面讨论实时同步方案时,提到过在高中时就有在思考大话西游的实时同步,大家都笑了,这是一句缓解个人紧张情绪的话,但并不是信口开河。
《Visual Basic游戏编程21天自学通》介绍了DirectX,看上去使用它就可以写出更酷的游戏,但书中的代码片段无法编译,而且并不是循序渐进地介绍DirectX,挣扎了很久只能放弃。
在这之后,又学习了一下ASP、Html以及JavaScript,这一方面是因为对网页开发也略有兴趣,另外一方面主要还是没有好的学习资料,有什么资料就学什么。
当我知道,做游戏应该用C/C++语言的时候,就开始寻找C/C++的资料,那时候没有找到合适的入门书籍,不知从哪里找来一本VC++的编程书,一上来就是MFC框架的消息映射,各种控件等等,让我觉得,C++真的好难啊。
学校的上机课,我都用来找资料,下载资料。在网上找到了一些简单的C语言资料,开始自学C语言,那时候最最让我头疼的就是指针了,听很多人说指针很难,所以在这方面下了不少功夫。初步掌握了C语言之后,接下来开始学习一本《C语言游戏编程从入门到精通》,虽然没让我精通,但还是跟着写了一些简单的小东西出来,学到了不少古董级的知识,例如如何用图形模式调用哪些系统中断来绘图,这些大概是最古老的像素游戏的开发技术了。
学生的时间是最多的,上课的时间,脑海里想的都是游戏编程,偷偷地看着编程书籍。高中三年过得很快,转眼就到了高考。像我这种不爱学习不认真上课的人,自然考不出好的分数,那时候对未来的憧憬大概就是,如果考得不好,那就在一家小网吧里面当当网管,修修电脑,继续这种自学编程的日子。最后高考虽然没考好,但还是考上了位于韶关的一所没有什么名气的大专学院,在那里,由于佛祖的庇佑,我的技术迎来了一个飞跃,并结识了不少益友。
大学之路
高考之后的暑假,决定系统地学一下C++,由于家里拉上了宽带,所以极大方便了我找资料,在网上找到了孙鑫老师的C++视频,通过这套视频对C++、面向对象和MFC,都有了一个初步的了解,但对很多概念都还是一知半解。
暑假很快就过了,2008年的九月份,来到了学校报到,饱受了缺乏资料之苦后,看到大学图书馆中海量的计算机书籍,仿佛几年没吃肉的人看到一盘美味的红烧牛肉!这次的兴奋仅次于得到生命中的第一台电脑。在图书馆中找了一些VC++21天自学通之类的书籍,巩固了一下C++基础,以及如何使用C++来开发游戏的《VC++游戏开发》一书,读完后尝试着用了GDI写了一些游戏,例如《坦克大战》(这个应该是第二学期做的)。另外也巩固了一下VB的基础,使用VB做了一个简单的系统管理工具,有点类似优化大师。
由于高中阶段的努力,让我自认为在同龄人中的技术已经是很不错,开始有些骄傲膨胀的时候,蚊子和志仔的出现狠狠地打击了我的“嚣张气焰”,学无止境,一旦满足于当前的技术,那便是逆水行舟不进则退。
蚊子并不是我们学校的,是一位大学同学的高中同学,同他一见如故(其实那时候尚未见面),但相似的经历,对技术的热爱,让我们有很多的共同语言。蚊子和志仔都是从高中便开始自学编程,并且学得比我好得多,大一时蚊子已经制作了不少看上去还不错的软件作品,对游戏外挂也略有研究,蚊子推荐给我的《Windows游戏编程大师技巧》,让我受益匪浅,后来此书成为了少数几本我反复翻阅多次的书。《C++Primer》和《EffectiveC++》是另外的两本,通过这些比较经典的书,我慢慢理解了C++和VC++的区别,面向对象、泛型。
志仔是一个超级邋遢的人,发型杂乱,每次见他都穿着拖鞋和大棉袄,然后挂着一条鼻涕。但很多时候看上去越邋遢的程序员越牛逼,大一的时候他就已经在研究木马之类的东西了,不是简单地使用工具,而是开发木马,终端控制,屏幕传输,视频压缩等等,都是他自己做的。对于php等网页编程,他也颇为擅长,对于OpenGL和一些图形学算法也有研究,这两个家伙都自己写过操作系统(当然,不是大一的时候),毕业之后,他们变得更牛逼了。受志仔和凯文米特尼克的影响,那时候花了一段时间玩了玩黑客,但仅仅只是停留在表面,玩了一段时间发现,编程才是王道,于是丢下手上的黑客工具包,继续回到编程的正道上,有牛逼的对手一起前进,路上才有意思,这种相互竞争相互追赶的感觉非常地美妙。
大学前期基本都是围绕着C++游戏开发学习的。在大一的第二个学期,接触了汇编语言,这是一种与之前的语言完全截然不同的语言,需要运用新的思维方式,应该算面向寄存器编程,看了一些汇编教程之后,自己调用各种中断,用汇编写了一个打飞机的小游戏。在后面接触了面向对象的思想之后,就渐渐把汇编忘干净了。在五一的3天假期中,准备了泡面在宿舍闷了3天时间,把之前没看完的孙鑫视频看完了,初步理解了C++的类、MFC、多线程、网络编程。并制作了一个内网聊天工具,在网上断网之后可以和其他宿舍的同学聊聊天。
从大学开始就总是给自己制定着一堆完不成的学习计划,因为不想让自己有借口停止学习。特别是寒暑假,回家的行囊中总是塞满了计算机的书。
大二之后,我渐渐被两位大牛甩在了后面,因为认识了我现在的老婆,这是一段一波三折的复杂故事,这里就略过不谈了。虽然学习的时间少了很多,但大二这一年还是看了不少书,例如C++Primer、EffectiveC++等等,对C++的理解上升了一个层次。DirectX3D相关有Windows游戏编程大师技巧,精通DirextX3D图形与动画程序设计、DirectX9.03D游戏开发编程基础等等,OpenGL相关的有OpenGL游戏编程、Nehe的OpenGL教程以及计算机图形学等等,对3D编程的理解又上升了一个层次,计算机图形学一书介绍得非常深入,如果完全理解了此书的内容,几乎可以不依靠OpenGL和D3D手动实现一个软渲染3D引擎。另外由于课程需要,还系统学习了Java语言,看完马士兵的Java视频,非常过瘾,顺带学习了一下设计模式,感觉对面向对象的理解又上升了一个层次。如果说大一学习的是如何将代码写对,那么大二学习的更多是如何将代码写好。
除了看书之外,大二还做了一些兼职,例如在勤工俭学那边帮忙送桶装水,送一桶水大概能赚5毛钱。与这种苦力活比起来,赚大钱的脑力活更适合我,辅导员给我和志仔介绍了一份兼职,维护一个PHP门户网站,每个月两三百的收入在那时看来已经颇为丰厚了,做这份工作也学到了蛮多东西,例如mysql数据库,还有网页抓取,正则表达式等等。
除了看书和兼职之外,另外还做了一些小玩意,例如用自己写的简陋的OpenGL游戏引擎做了个3D的坦克小游戏(3D模型文件的加载是自己在官网研究这种文件格式,然后手写的一个模型文件解析和渲染类),另外还学习了生命中的第一个游戏引擎——HGE,在七夕的这天花了一个上午用HGE制作了一个《鸭子下楼梯》小游戏送给了老婆。其他还用Java、VB、C++写了一些乱七八糟的软件。
大三时,编程基础勉强还算可以了,对C/C++掌握到一定程度之后,学习其他语言都非常快。大三只在学校待了两个月,然后就提前出来工作了,这两个月里就做了两件事情。参加一场比赛和一场考试,学期开始时辅导员跟我说让我去深圳参加一个省里面的比赛,有很多学校参加,这让我很兴奋,大一入学时,就听到老师说某某学长在广东省的XX比赛中拿到了三等奖,那时心里满是羡慕和崇拜,而现在轮到我了。
我决定用HGE制作一款塔防游戏,和老婆组队(老婆是美术),第一个星期简单地学习了Lua和Delphi,然后用HGE搭建了游戏框架,使用Lua编写游戏逻辑,另外再用Delphi写了一个简单的游戏编辑工具,写到差不多的时候出现了一个重大事故,硬盘坏了,无法修复,是希捷的固件门,于是只能重新写过,幸好前些天去机房的上机课把代码拷过去看过,损失并不算太严重,但从此再也不敢用希捷硬盘了。
现在看来当年的这款作品实在是非常糟糕,但凭借着上台演说时的对答如流,侥幸拿了一个一等奖。如果志仔也来参加的话,一定可以拿出一个比我好很多的作品,但他总是神龙见首不见尾。比赛之后开始潜心准备软考,2010年的软考还是蛮难的,考的内容特别广,包括什么编译原理、网络等一大堆东西,考试时发现蛮多成年人来考的,学校参加这个考试的人不多,通过的就更少了,侥幸通过之后,就开始准备简历,打算到广州或深圳好好历练一番。
美好的大学生活就这样提前告一段落了,人总是在失去之后才懂得珍惜,工作之后回过几次母校,每次回去,看着熟悉的场景,回想起和同学朋友们在学校渡过的时光,心中总是百感交集。大学生活结束了,但另外一段苦逼的故事即将开始......