【CSDN 编者按】从沉迷于玩游戏到立志开发一款能被认可的游戏,从第一次实习面试时放下豪言称要在30岁当上技术总监再到成功圆梦,在蔡俊鸿的游戏开发道路上,其一直坚守自己的初心,用技术成就了自己,也点燃了游戏圈。

作者 | 蔡俊鸿       责编 | 张红月

出品 | 《新程序员》编辑部

经常有朋友问我,你是如何一步步走到今天?有什么秘诀和经验?回顾我的游戏人生,有快乐有遗憾,有挫折也有成就。

蔡俊鸿 北京昆仑万维科技股份有限公司技术总监。10年游戏研发经验,精通游戏服务端和游戏客户端架构、研发、优化。《Unity实战》第1、2版和《Unity游戏优化》第1、2版译者,第3版联合作者。

自由游戏的年少时光

我的故事,要从小时候开始讲起。小学与初中时期是我最自由、快乐的游戏时光。因为那时学习于我而言,几乎没有太大的压力,我一般能够在一个月内全部自习完所有课本、习题。于是,剩下的时间多数与游戏为伴,从Family Computer(红白机)、Game Boy(掌上游戏机)到PlayStation(游戏主机),我将当时市面上的所有游戏类型都玩了个遍,例如《超级玛丽》系列、《魂斗罗》系列、《洛克人》系列、《KOF》系列、《超级机器人大战》系列、《英雄传说》系列、《勇者斗恶龙》系列。不仅如此,即使很多游戏都不支持中文,我通过猜测与不断尝试,依然通关了大部分游戏。

到了初三,父母为了激励我学习,承诺“只要考上市里最好的高中就给我买电脑”,为此我开始发奋学习。初三时我的理科成绩能够稳定在年级前几位、数学稳居年级第一,最终也如愿考上市里最好的高中,拥有了我的第一台电脑。

本文节选自《新程序员004》纸刊+电子刊同步上市

疯狂沉迷PC的高中时光

一台CPU为Pentium 4、1GB内存、80GB硬盘、ViewSonic液晶显示器的计算机,是我PC游戏生涯的开端。那时正上高中,受家人的影响,我开始接触Photoshop、CorelDRAW这两款软件,也尝试进行了一些基础的绘画实践。

我常常会想:如果能让这些画动起来该多好。就这样我误打误撞地走进Adobe Flash和ActionScript 2(以下简称AS2)语言中,后又通过在网上查阅资料与学习各种酷炫的AS2代码,实现了一些简单的特效。一步步通过代码实现想法的我备受鼓舞,开心万分。

但沉迷游戏导致的另一后果就是我的成绩一落千丈。彼时的我从中考数学全市前几名沦落到高考没考上重点大学,但那时我只想快点脱离高中生活,可以更自由地做自己喜欢的事情。于是,哪怕家人劝说,我也没有选择复读。

如今回想起来,也会对高中时没有好好学习考上好大学抱有遗憾。但条条大路通罗马,只不过有的路好走一点,有的路难走一点,既然曾经已做选择,便会坚定不移地走下去。

从设计图像到痴迷编程,我的蜕变

人生的第一个网站和第一桶金

兴趣是最好的老师,从热爱玩游戏到想要自己开发、制作一款游戏,这样的梦想从大学一直伴随至今。因此,在大学时,我首选的专业便是计算机科学与技术。

大学时期,作为各大社团的网络部成员,我运用高中自学的Photoshop、CorelDRAW等技能,负责社团所有的图像、海报设计(见图 1)等工作。

图1  大学期间的作品之一

不久,一次偶然的机会下,我承接了校团委让网络部帮忙制作网站的任务。为了做好,我用了三个月疯狂学习HTML、CSS、JavaScript、PHP、MySQL等技术,成功开发了人生第一个CMS(Content Management System,内容管理系统)网站。

初尝编程乐趣的我,也因此开启深度地学习编程和开发之路。最初我从图书馆借一本PHP书籍,白天看完,晚上复现书中Demo,第二天借阅另一本PHP类书籍,周而复始,将图书馆里所有相关的书籍全部看完、所有代码复现。

还记得那时的服务器开发是基于PHP+MySQL,当时PHP流行模板引擎,但模板引擎中的很多功能都用不上,于是我便开发了一个简化版本。同时在对比Google的一些Web产品后,我认为异步交互可以极大地提升用户浏览体验,于是我在项目中使用了大量的AJAX,也模仿jQuery API开发了一个简化版的AJAX库,以此不断地提升自己的编程技能。图2是我在PHP实践过程中,参与社区征文时所获得的奖品,也是社区对我的一种认可,这种成功同样在我往后的道路一直激励着我。

图2 参加PHP社区征文所获得的奖品

后来,我周围的同学向我推荐兼职,老师让我帮忙维护一些网站,就这样,我在大学期间接了不少网站开发相关的兼职工作,也迅速赚到了第一台笔记本的费用。

Java图形编程

在熟练使用PHP后,我也了解到Java可以开发图形界面,便开始转向Java学习。学习方法与此前一样,用2-3周时间把图书馆里Java方面的书看完,Demo亲手敲一遍,就这样无障碍地完成了Java学习。

不过,很多Java书本里关于图形界面的内容覆盖太少,仅简单地介绍了一些基本的控件和界面实现。于是,我开始自己在网上查阅各种资料学习,但这时室友告诉我“Java做图形不好看,还不如C++、C#”,我偏偏不信,依旧进行自己的学习和研究,而他也依旧站在他认为的鄙视链顶端“鄙视”我。就这样,他学习SSH,而我学习着“不入流”的Swing、Java 3D等。

最后,我用Java开发出来的东西获得了同学及网友的一致好评。图3就是我用Java开发的图形程序。

图3 Swing超绚丽系列之俄罗斯方块

实践出真知,我觉得这是做技术很重要的一个特质。当年我学习Java Swing时,心里有些不服输,心想“为什么别人会觉得Swing做界面不行就是不行?”其实很多东西大家未必尝试过,只是凭经验人云亦云地传播。只有自己实践了才知道结果如何,有时候,不妨尝试一下。哪怕结果是花费大量的时间得到了一个错误的结果,也依然能从这中收获良多。

很多人往往会比较看重当下所做之事的回报,但不少值得学习的知识都需要长周期完成。眼前收益看似很低,但它会在未来的某一天,出其不意地为你产生帮助。

在此也跟各位分享,如果未来你想要从事编程开发行业,大学的数据结构、操作系统原理、网络工程、编译原理、数据库原理、线性代数、高等数学、离散数学都是很重要的学科,它们对于编程的逻辑思维、思路、架构等都具有非常重要的作用。

第一门编程语言的选择与学习

如何学习一门编程语言?对于没有任何编程基础的开发者而言,想要学习一门编程语言,我推荐大家首先从一本不太厚的基础书开始,这样更能建立自己学习的信心,同时把书本中所有示例在理解的基础上手动敲一遍代码。当这本书看完时,相信大家已经能使用这门编程语言进行功能开发。如果此时觉得基础不够扎实,可以继续重复此步骤。只有基础扎实了,后续开发才会更快速、更顺利。

当基础扎实之后,可以阅读这门语言的经典书籍,即更厚一点的图书。此时因为基础知识已掌握,阅读速度自然也会加快。

无论学习哪一门新语言,一定要重视学习、实践、思考与总结的过程。在熟悉了一门编程语言之后,再学习第二门编程语言,就会很容易些。在此,我的建议是:

  • 第一阶段,学习两种不同编程语言的共同点。如学会了Java后,想学习C#、Python,那么可以先了解Java中的类、实例在C#和Python中是否也有相关定义。当把共同点学习完成后,可以开始使用第二门编程语言将之前第一门语言开发的程序再重新开发一遍。
  • 第二阶段,学习两种不同编程语言的不同点。以Java、C#为例,如果仅用第一个阶段所学到的内容进行开发工作,其实不能算真的精通,因为其中运用的还是第一门语言的思维。此时应该继续学习C#、Java不同的部分,如C#中delegate/event、partial、operator等Java没有的特性。充分利用新语言的特性进行开发,很多时候能起到事半功倍的效果,也能打开自己新的编程思路。

回顾我的整个大学生涯,从兴趣出发自学了编程,后来带同学承接项目学会了版本管理、项目协作、基本的架构设计,这都对后来工作起到了一些结构性的支撑作用。个人认为,如果把大学给一个人带来的知识、人脉、学历比喻为路程,那么你在离开大学时的学习能力就是速度。因此我们在学习知识的同时,也要学会如何持续学习,不断提升自己的学习能力。

30岁,当技术总监去

2011年初,读大四的我也面临着就业选择。当时我手里还有很多未完的事情,比如自己正在用Java做一个3D游戏,所以一点也不着急找工作。谁知我的同学一直惦记着我,在找工作的同时也帮我留意着,经过他的推荐,我发现有个网页游戏公司还不错,自身也符合招聘需求,便投递了简历。

没多久便收到了面试邀约,如今我还对面试过程记忆犹新。那天的面试时间从下午2点到6点,面试官从HR、主程序、制作人到CTO,面试内容从网络BIO、NIO、多线程到安全问题如何解决。面试结束时,CTO对我许下承诺,“你进我们公司肯定没问题,过几天应该会发Offer,你也无需去面试别的公司了”。

果真,一周后,我成功入职该公司。还记得那时CTO也问过我一个问题,“你说自己这么喜欢写代码,你想写到多少岁?”。我回答道,“30岁”。他问我为什么只写到30岁。我说,“那时候可能我是技术总监了,就不用写代码了”。直到30岁时,我如愿成为了技术总监,而和当初的回答有所不同的是,我还是喜欢写代码,现在每天都在写,当然这些都是后话了。

第一个游戏上线

第一份工作入职后,如同大部分人一样,我比较紧张,总怕哪里做不好。第一周,项目组让我去改一下服务器列表,那时的我根本没有远程登录过服务器修改的经验,只能通过主程给我的IP、用户名、密码以及网页的位置,开始搜索各种资料。我在接到任务的半小时内,第一次用SecureCRT登录服务器、第一次用VI在服务器上修改文件。

几天后当我熟悉项目时,主程找到我询问是否想要做新项目。我自然想体验从0开发游戏的过程,于是满心雀跃地说,“想!”。

对于新项目的开发,我充满了期待与激情。争分夺秒地用一周时间,完成了背包系统的开发。那时公司其他游戏的数据存储都是同步的,但新项目会与用户交互比较频繁且需要实时,同步存储可能会出现卡顿。于是,我在开发背包系统时顺便把服务器的数据存储写了个异步的存储,后面该功能还被公司其他项目组引用。

然而,在新项目立项一个月后,主程跳槽离职了。该项目包括我在内,一共两个服务器工程师,由于我对游戏业务非常熟,编程基础也还行,因此一个人开发了70%的系统,经过半年的开发打磨,这个项目成功上线了。

当时很多人问我,公司也没有加工资,你为什么要做那么多?其实在职场中,有时候不是你在这个位置才能做这个事情,而是当你有能力、主动地去做这个位置的事情时,你自然也会成为这个位置上的人。我认为没有哪个公司会愿意付出成本让你冒险,而我有幸遇到了这样的机会,并在实现它的过程中,使自己得到了成长。

项目上线时,我成为这个项目的服务器主程。此时距离我实习才半年,而我在担当此位置时,也一直怕自己做不好,于是很努力地提升各种能力。

在实践中,写程序出Bug是常见的事情,想要减少Bug数量,要思维谨慎、业务熟悉。而想要快速修复Bug,需要对所写的东西都烂熟于心,即做到代码在心中。

第二个重量级IP游戏

2012年初,公司准备做一个ARPG(动作角色扮演)项目——《西游降魔篇》。

经过公司内部讨论,这个重磅项目落到了我们团队。起初,公司想让我担任项目主程,但我认为自己刚毕业一年,同时ARPG项目的开发难度比RPG要更高,因此我希望公司可以招一个经验丰富的主程,也能让我在学习中成长。

后来,公司招聘到一位新主程,但不尽如人意的是,新主程耗费两个月的时间也没能让游戏架构的雏形出来,整体开发进度非常慢。而后制作人表示,“要不还是你来当主程吧。”

临危受命,我带领团队用9个月的时间将项目上线。作为公司第一个ARPG项目,这时间算很快了。上线后玩的人也挺多,那时单物理服导量就有6000人同时在线。

不过随着时间的推移,在游戏的后续开发、玩法,以及新项目工具使用等层面,我与团队内部很多观点不太一致。于是在2013年8月,我决定辞职创业。

做一款成功的游戏,连续两次创业

在第一次创业,我向制作人提过几个创业想法:

  1.     一是手游上的游戏编辑器。开发者可以在手机上编辑、分享、出售自己的游戏,玩家可以在手机上购买、游玩别人的游戏;
  2.     二是云端渲染游戏流式传输到手机,让低端手机也能玩高画质游戏;
  3.     三是高达题材的横版动作游戏,支持玩家自定义各种高达部件。

可以看到,这三个也是现在很火的方向,即Roblox、云游戏、UGC。在当时由于概念超前,可能大家并没有很感兴趣。

制作人认为我们自身对策略类游戏比较熟悉,因此在两个策划、两个程序工程师、一位游戏美术组成的团队支持下,我们耗时三个月,完成了一个策略游戏Demo,然后开始寻找投资。此外,我们也用Unity3D做了一个2D游戏(见图4)。

最终,我们找到了四位投资人,确定了投资。不过当时环境下,Unity3D工程师极为稀缺,同时我们的创业资金也十分有限,想要以高薪招聘一位顶尖的Unity3D工程师极不现实。后来,我决定自己扛下战斗,肩负Shader等核心开发工作。对于初创团队而言,万事开头难,那时的我白天写服务器、教新人写代码,晚上写客户端,基本每天睡在公司,凌晨六点入睡,早上九点半起床。

在这样的磨练下,我也成为了Unity3D开发主程。起初只是想帮助公司节省成本,后来也正是因为有这段经历,使得我成为另一家百人公司的技术总监。所以我也坚信:但行好事,莫问前程!

因为团队整体的不成熟,不难想象,这一次的创业以失败告终。不过,我并没有对这次创业感到后悔,毕竟那是一次宝贵的经历,而且整个创业过程十分充实,受益良多。

创业结束后,在个人职业规划中,我想找个公司积累一下,后来便短暂地在广州多益网络任职。之所以称为“短暂”,是因为我在这家公司刚过试用期时,曾经任职的第一家公司制作人找我创业。

也许很多人可能以为我很喜欢创业,其实并非如此,我只想做一款成功且能被大家认可的游戏。不过,有些遗憾的是,这次创业依然失败了。

与其思考如何成为总监,不如学会如何解决问题

时间来到2018年4月,在一位好友的推荐下,我入职360游戏艺术担任技术总监。这时刚好30岁,正好实现了毕业时自己立下“30岁可能会当上技术总监”的Flag。

回想起来,这一路我并没有为当技术总监刻意地学习与准备,只是一直都在学习和做自己喜欢的事情,而且我的能力正好可以胜任工作。这也是我想和大家分享的,在职业生涯中,有很多人会问怎么才能当主程、总监。

我认为不管担任什么岗位,重要的是去解决问题,你能解决什么样的问题,自然就能胜任什么样的岗位。我觉得做什么都不重要,重要的应该想想自己能为游戏这个行业带来什么价值,平常应该怎么提升自我去成为行业真正渴求的人。

后来在偶然机遇下,我与昆仑万维的VP庄宏博士相识,沟通了几次后,他给我发了Offer,并承诺Offer半年内有效,入职时间可以根据自己情况决定。

我知道该公司的项目《仙剑奇侠传移动版》已经准备上线,但同时还有很多性能问题亟须解决。我当时心里想,“他能给这么大的信任让我过来,如果我不能在最需要的时候解决问题,那怎么体现自己的价值呢?”于是我决定加入昆仑万维,并且在入职一个月的时间内对项目进行了大量优化,解决了一些性能问题,将CPU和内存的关键指标提升了30%。

后来公司组建了中台部门,我当前主要在做一些架构设计、难题攻克、渲染效果、渲染性能方面的工作,也开始为公司进军元宇宙做VR相关的核心技术研发工作。

热爱与坚持

从参加工作至今,技术于我而言,除了是工作的实用工具,更是实现梦想的利器。

通过编程,可以实现自己想要的功能,这是一件令人振奋的事情。如果热爱编程,那么当你看到键盘时,会不由自主地想敲上几行代码,也会沉浸其中。

如果你无法做到热爱,那么在面对键盘、屏幕时想必更多的只会是焦虑和无助。面对无穷的代码,只会感到深不见底的恐惧,这样很难走得更远、更高,自然也无法领略更美、更远的风光。

很幸运我很早就找到了自己的兴趣——游戏编程,并且能一直从事游戏行业。从个人角度出发,我一直以来的梦想是脱离公司、平台以后依然能独立进行游戏设计、编码、画画、编曲。因为这个梦想,我也将继续在游戏行业努力奋斗!

— 推荐阅读 —

在这里插入图片描述

Logo

20年前,《新程序员》创刊时,我们的心愿是全面关注程序员成长,中国将拥有新一代世界级的程序员。20年后的今天,我们有了新的使命:助力中国IT技术人成长,成就一亿技术人!

更多推荐