对于想要从事游戏开发的人员而言,这将会是一份不错的指南。本文首发于知乎,作者“安柏霖”,目前就职于腾讯北极光工作室群,游戏葡萄已获转载授权。
一、选择
和以往的正常写写文章不太一样,这个系列确实希望可以让更多的有意去开发游戏学生看见。
笔者在腾讯北极光工作室群工作,也做客户端通道面试有段时间了,上个月刚刚结束了在几个城市的“巡回”面试,整个面试的过程是一个让我颇感能量充盈的过程,看到一个个渴望进入游戏行业创造精彩的年轻面孔,还有什么比这更让人兴奋的呢?
其中也看到有些同学非常的有热情,但是走了弯路,把有限的精力放错了地方,不免感觉颇为可惜,加上平时在各个渠道也收到不少这方面相关的问题,这里就自己的经验写一个小系列,来谈下学生入行。
01决定的瞬间工作也有10多年了,和很多人聊过,大家怎么开始想做游戏,怎么开始入行的。
相当多的人会经历一个转折点,那个点上你突然意识到这个就是你要做一辈子的工作,有的是到朋友家玩的时候,玩一个游戏,突然意识到自己要做这个;我是准备GRE休息的时候,在bbs上看到《doom启世录》某一个章节的时候;有的同事是已经工作了,而且根本不是编程方面,自己在家玩游戏的时候;
有的是在传统型的软件企业里,厌倦了一成不变的生活,追求一个变化剧烈需要一直学习的生活;有的一直就是对于视觉上的东西,对于绚丽的东西感兴趣。。。
丝毫不意外的是:在开发历程中,非常的有持续力,能保持专注和成长的同事,普遍的特点就是对于游戏本身有着持久浓烈的热情。
不管如何,当这个瞬间出现,你被击中了,或许你就属于游戏开发,游戏开发也属于你,不妨放下种种担忧牵挂,就开始你的探险吧。
02工作相比考研的优势对于学生来说,到了大四就是一个选择,是去游戏公司工作还是去考研,个人的推荐的是当你下定决心去做游戏,那么尽早的开始准备起来,到尽可能好的团队中去开始游戏开发。
大家会认同,如果能进好公司好项目,当然就及早去了,不然读研之后的目标不也是如此么。
只是现实种种原因不能如愿啊,比如本科玩多了,心理还没准备好,和高几届读研的师兄比有劣势等等等等。
这里很多想做游戏的同学,最终还是选择了读研之后再工作,很大的原因就是没有意识到,同样的时间点,工作的意义有多大。
a. 经验的“金山”
这里常见一个误区就是,本科进到项目组里,作为小弟,也是各种打杂,不如在学校里自己做做游戏多学习等等。
但是即便硕士毕业进入项目组也是可能从打杂开始的,这里不妨说下我研究生毕业刚刚进入育碧的时候,当时项目组里没有data manager,于是我就在一开始就变成这个data“manager”了,就是去负责处理各种perforce相关的事物,完全不是编程的工作,后来招到了data manager,我就开始做一些简单的工作,从截图开始,然后就是给各位资深程序“打杂”,大大们在做优化,相应模块有bug,我就去跟。。。第一年相当的时间就是这样度过的。
这个从项目角度来看其实非常正常的,项目组总是追求最大化的性价比,所以人力总是不足。那么资深程序去做最大化输出就是最合理的安排,如果一定要有人去打杂,当然就是输出能力最低的新人来做了,这就是骨感的现实。
之前在这个回答里《被自己写的代码美哭是一种什么样的体验?》有人留言说,一毕业就能做高端的事情好羡慕等等,其实是一毕业就一段时间不能编程了。
但是即便如此,依旧是能够获得比学校里好得多的成长,主要就是你能接触到项目组的代码,你可以看到整个项目如何一点点实现的;
看到资深程序如何写代码的,尤其是开始帮资深同事debug的时候,更是能上手去看,这个真是一个大开眼界的过程,中间不懂得地方去问问,一般也能得到比较好的解答。
说到底,有积累的团队好比一座金山放在你面前,进去就做主力培养,相当于把金子送到你面前让你捡,进去就打杂,那你完全还可以去挖,关键是要有能接触到的金山。
而像腾讯&网易这种,公司开发了n款游戏的公司,你更可以跨项目的接触到高质量资源,可以去问更多的大牛问题,这个副本掉落,真的可以有。
b. 更高级别的学习
很多时候我们会觉得,在学校里时间更充裕更自由,没有考评没有leader过来逼我加班,可以更好地学习等等。
实际情况是,实际项目中,我们更容易进入学习的更高阶段:切身知道学习的意义,以及将知识综合的用于实践。
当时刚工作时候,看老司机们的代码的时候,发现大家对于cache性能,多线程,各种编程模式,语言特性等的驾驭非常的好,可以说多个领域的知识(语言,算法,操作系统,硬件)都非常好的融合到一起,在一票代码中体现。
而我当时对于这些还是停留在书本上的概念阶段,并没有特别深刻的理解(即便在考试中分数没问题),也不可能有充分的理解,这个理解就是要这样在高挑战型项目里,综合纯熟的应用出来才能达到。
所幸当时学校的书都是非常经典的,我也带到了上海,又翻出来就这些章节反复的研读,而且这次读的时候,可以结合代码,几个科目可以联系起来,完全就是一种“I was blind, now I see”的感觉。
而且读好了之后,就有用了,能更好的理解老司机们的代码,甚至偶尔还能提出点不同的看法,到后面自己也能写出这样的代码,可以应用到实际的游戏里,带来性能和效果的提升,可以见玩家的感觉,这个时候知识的真正意义才呈现。
所以,在学校的时候,学习的第一个层次:概念性的理解到位,知道这个是什么,能够通过考试就差不多了,学生时代也算考试一把好手,再把书看几遍也就是这个水平了。
要达到第二层次深刻理解,融会贯通,在真正的需要这些东西的大型项目中去应用方是最好的方式。
相比之下,在学校里,部分可以学习到很好地研究方法等等种种优势,但是绝大多数情况,是不如在正规项目组里去磨练和学习来的更好。
c. 工作的相对优势sum
上面聊了这么多,其实也是自己的经历有关,本科时候并没有做游戏的想法,研究生才有,即便研究生所在的实验室(老板非常的强力,做的项目也给力)很给力,自己也在认真地做和学,但是工作之后才发现,这两年的成长比起实际项目来说真是微乎其微,近乎在浪费时间。
所以如果我们定下来想做游戏,大可以把工作和读研都作为一个纯粹的学习阶段来看待,在好的团队里工作中可以:
– 有更好的磨练机会,更好的学习资源
– 让我们更好更深刻的理解学习内容
这个意义是非常大的,大到值得我们去在本科的早期,好好准备,尽早到前线去开始磨炼。
话说回来,万事无绝对,这里的工作的意义是和团队水平有很大关联的,越是有经验越是严肃做项目的,对于成长来说就越好,如果种种原因,让人无法吸收和学习,那就要三思了。
03及早的有意识的进行准备前面聊了及早工作的意义,要想在大四秋季招聘的时候,就能获得工作机会,尤其是在好团队中的机会,这个就需要我们有相当的积累。
a. 成本
这里在招聘中常常见到的一个情况是,虽然我想做游戏,但是实验室老师是做完全不同的方向,但是我也ok,只要努力了,有进步总是好的。
这个就是一个典型的误区,这里大家需要对于成本有一个较好的认识。
做A事情的成本就是同样时间你能做的最有价值的事情,可能是到好的团队中去实习,可能是你专项的阅读游戏开发的书和做实际的项目。
本来你可以在同样的时间里,得到很大的成长,但是却做了“有些进步”的事情,而且感觉还挺ok,这真是太可惜了。
b. 及早&有意识
读到这里,可以说“诗和远方”少了点,“务实的比较”多了些。
就中长期来看,始终是我们对于开发的热情是最重要的,但落到实际情况来说,毕竟能够在大三时候,和研究生师兄们同场竞争,获得好的工作机会挑战也很大。
如果我们能尽早的意识到这一点,有意识有计划的进行准备,那么我们不仅更加可能获得好的就业,进而能够做自己喜欢的工作,欢快的成长,甚至也能把该打的游戏,该玩的球,该谈的恋爱都收获了,大学生活很美好,不容浪费呢。
二、技术准备
当我们选择进入行业,并尽早开始去做,接下来是一系列的准备。这一部分也是整个系列的重点,写这个的原因就是面试过程中发现很多有热情的同学,看了各路大牛大V的高大上的推荐,结果练歪了路线,本来应该是循序渐进的一个过程,结果变成了基础不扎实却花大量时间在项目中用不上的东西上了。
这里是一个在面试过程中的“看点”,后面我们一个个来看
[必修]系统的计算机知识结构
[必修]过硬的编程能力
[加分]玩足够多的游戏
[加分]良好的领域知识积累和较好质量的游戏开发项目
关键词:力所能及,有章法,有所侧重
01寻找适合自己的方式我们在网上会看到大量大牛的介绍如何学习的文章,这些大牛普遍情况是自己能力就非常的强,不是计算机专业的,知识结构比科班出身的人更厉害,中学时候已经编程实践大把,或者学习&开发能力很高。
这些大牛的做法有时候对于普通同学来说,不一定适合。
打一个比喻,这个是大牛们的天赋点:三系全满。
这个是普通人的天赋点:一共就30个点,甚至更少。
这种情况下,肯定要紧巴巴的使用了,根据自己的英雄特点和打法,选择最好的加点,自己是一个瑞兹,就不要把点加到打野侧去了。
实际情况中,真的遇到太多太多,一个有热情的普通同学,按照大牛的推荐走了“高端”路线,在基础的知识结构和编程测试中,缺失的非常厉害。
02[必修]系统的知识结构知识系统有点像武侠中的内力,在开发中,良好的知识素养,尤其在比较有挑战的模块中,会相当程度呈现其作用,甚至会影响我们看待开发的方式。
这个方面科班出身的人(尤其是计算机方面比较强的人)会比较有优势,其中重要的原因,学校就是按照建立系统的知识结构来设立课程,而且加入了考试大作业的方式来强化。科班的同学无论想还是不想,不管有没有系统化知识的意识,都要学,即便当时不那么上心,过了考试,在后面工作中遇到类似的问题,看见名词总知道是什么,不大会出现直接的概念盲点。
自学的同学,比较容易出现就编程中遇不到的问题就不看了,你可能做了已经不小的项目了,一些知识不知道,依旧做的挺好的,但是计算机知识结构这个在中长期的开发中是非常重要的。
而主动去做知识系统化,这个需要颇大的努力的,这是一个非科班出身的人容易出问题的点(不是说非科班做不好,只是一个需要我们注意的点),以及科班学习不认真的同学也容易遇到,我们要更多的可以的去看。
然后从毕业生的面试角度来说,一般大家不太会有特别多的项目经历,所以基础知识的占比,会有笔试,也会在面试过程中重点考察,本身也是相对社招占比更高的点。
编程语言(c,c++,java,c#等),有一个对于编程语言整体的理解
数据结构和算法
《操作系统》
《计算机体系结构》(本科应该叫《计算机组成》)
这四个方面在客户端编程中用到的最多。
所谓的系统的知识结构,一个是纵向的对这些知识的关键点进行梳理和透彻理解,一个是横向的彼此之间关联和抽象(可以用mindmap画出关联),做到把书读薄。
就重要的概念,进行深入的了解,比如:
c++中类在继承,多态情况下成员在内存上都是如何排布
切换到汇编看下,c++各种语言特性都是如何执行的,如何进行函数调用,如何进行虚函数调用
cpu的simd执行方式,分支预测的效率低到底是什么样的,
内存层次中cache的作用,以及相关的cache友好的程序是什么样的,尝试写一个cache相关的运行差异很大的情况,profile一下cache的性能
各种排序和常用数据结构的核心思想,他们到底是以什么样的方式解决了什么样的问题
。。。
经过这样的从底层机制以及外在表现上去理解一个概念,就会从“记忆概念”到“普遍联系的理解知识”,其实反而让要学要记的东西变少了,相应的在面试中也就应对自如了。
03[必修]编程能力所谓编程基本功,就是:
一个问题知道怎么去解决
能很快的把程序写对写好
毕竟我们到项目组里就是要稳定高效的把问题解决好。面试过程还是面向学生,也不会非得有很多项目经验,但是编程过硬始终是必须的,那么各种面试编程的题目都会拿来测试。
这个在有了大量的编程量之后,普遍会做的比较好。在实验室有大型项目的同学一般比较好,道理同科班的知识体系构建,实验室的项目总是要做好的,不需要自己太多的主动性。
而如果本科的同学可能就会遇到编程量不够的情况,这时候可以通过:
自己来选择做有一定规模的大项目来提升
到leetcode,acm等地方去刷题
来让自己有过硬的编程基本功。
这个在面试现场常常会有一个15到30分钟的编程测试,这个如果只是各种概念背的溜,知道怎么去解决都还是不够的,就是要稳定高效的写好。
这里在面试中发现,同学们之间的编程能力差距是非常大的,好的同学比入行5年的职业开发者写的更快更好(当然这不意味着他们开发能力更强了,毕竟开发过程中逐渐开始倾向对于实际问题的知识,方案和解决),可以在很短的时间内写的又快又好。这是一个有着巨大成长空间的点,希望大家能够多多沉浸在编程中,磨练自己的技艺。
这里一个注意的点,如果出现自己学习的过程中,编程严重不足,意识不到这一点,就一定要警惕,这个就是对于编程积累方面的意识严重缺失的表现,要审视自己的学习渠道,学习环境和氛围。正常的编程开发学习,会非常围绕做项目和编程来的。
上面的两点都是必修的部分,我们需要至少在这两点做的比较好的情况下,再去花时间去做其他的,比如积累游戏和游戏领域知识等等,而不是反过来。
04[加分]玩游戏这个大家可能会觉得比较轻松的话题,但是也需要提一下。
a. 为什么要一个编程的人去懂游戏?
如果一个开发者还是一个玩家,那么他的能力会被极大地放大。
这里的数学模型,可以借用稻盛和夫的能力模型来描述:工作结果=思维方式x热情x能力
而开发者的玩家属性就会影响到“热情”和“能力”这两项,是一个非常重要的点,展开来说:
首先就是游戏做起来更有热情,更来劲,你会和自己做的东西产生情感上的联系,这个会让整个开发过程发生质变。
其次和策划美术交流起来要快一个数量级:我们在做游戏的时候,会把一些行业里的常用做法给术语化,就像遇到一个问题我们会说这个快排以下就好,这个二叉树表示下就可以了。
谈设计的时候,策划会说这个操作方式是xx游戏里的xx技能,但是在某一个模块做一些修改,美术说这个效果像xx游戏隐身的过程,但是xx地方我们不同一些,这个时候我们如果完全不知所云的话,策划美术就要花很多时间把系统一点点解释,这个过程就慢了一个数量级。
何况,我们做游戏时候一大快事,就是了解一些好游戏的做法,可以和开发团队一起讨论,做出更好的设计实现,这个会让开发的过程从死板变成激情四射富有创意和有意思。
b. 扩展我们的游戏库另外面试中常常遇到的就是一些同学很喜欢游戏,但是玩的游戏太单一,LOL,王者荣耀,守望先锋这种大家都玩得游戏,玩到一定级别就好,就不要花太多时间了。
大可以多看看各个平台上的好游戏,手机自不必说,主机平台,steam平台乃至视频通关一些游戏都可以多多尝试,对各自品类中的佼佼者,都知道怎么回事。
比较要做职业开发者,了解行业里的优秀游戏是必修课了。
05[加分]领域知识和编程项目如果自己已经做了一个颇有编程挑战的游戏,对于游戏开发的领域知识有比较好的积累,那么对于我们开发的积累和面试的过程都是一个大大的加分项。
这里比较推荐的是,就自己的能力做一个尽可能有挑战的项目,并且找到自己的感兴趣的点,就几个点做到有一定深度。
a. 做什么样的游戏?我们先看下现在学生的能力“行情”。
到今年的实习生面试中,这块比较出色同学能做出颇有规模的游戏,可以到达使用Unity3d,做出单机的3D的ARPG这个级别,战斗打的像模像样,怪也有一定的AI,有任务装备系统;
有的是自己做策划和程序,设计出了大量的职业,有比较好的数据驱动的模式去产生变化。
相比之下,有一些很不错的学校的同学,在一开始目标就设定的太低了,只是有一些非常简单的小球碰碰,这样就不够充分了。
这里我们还是要区分好自己的情况,在自己力所能及的范围内,尽量选择有挑战的项目来做。并且一定要有所取舍,不能编程开发基础不足的情况下,去做大量的创新设计,把大量的精力放在设计上了。
好的游戏设计,创新的想法绝对是一个好的事情,但是对于程序员开发者来说,需要在编程和领域知识过硬的前提下,这条才真正有意义。
这里在写项目的时候,推荐使用Unity3d引擎,主要是:
引擎相对简单,可以让我们直接去挑战一些比较难的项目
大家完全不要有学习上的心理障碍,从cocos2d开始学,用熟悉了2d在搞3d这种思维都是没必要的,直奔主题就好
直接能发布到手机上,面试时候直接拿一个demo,各种方便
是现在手游项目组最多的选择,也是一个非常好的加分项
编程项目根据自己的情况来,包括编程能力,喜好,可以选择对于市面上的游戏,自己能吃下来的,技术上有挑战的版本
俯视角moba,塔防,射击
FPS,TPS等射击游戏
RPG,ARPG等
即时战略和赛车游戏。。。不是很推荐了
美术资源:
各种渠道,甚至到一些游戏中破解都可以
有的学校有游戏开发俱乐部,能找到美术,也很棒
b. 突出重点&刻意练习&github
比较推荐就一些自己的侧重点,找到行业中的比较好的技术方案,来专门的使用和实现下。
这个也是面试中看demo一个常见的情况,游戏做了,但是里面的技术方案大量的都是自己随意写的,这样的开发,就只是练了下编程,熟悉了下API,意义就缩水了很多。
我们可以就一些行业常用的解决方案,放在自己的项目中。方向的选择首先了解游戏模块中都有什么,这个可以看<game engine architecture>第一章,其中这个图有很充分的覆盖:
然后自己选择比较感兴趣的方向,这里推荐是找到自己喜欢的游戏,然后如果有gdc等文章讲他们怎么实现的,那就可以以此为支点来开始自己项目的实现。
可以选择的方向举几个例子的话:
实现怪物的行为,就可以使用状态机或者行为树来驱动,寻路的时候,
做一个大规模地图中怎么去高效的寻路,
渲染中实现一些<real time rendering><gpu gems>或者gdc中有一些力所能及的效果,比如下雨&地面潮湿,大量particle的性能,贴花,distortion等等。
甚至围绕这些东西来设计项目的侧重点。
然后把这些放在github上面,一码胜千言。
一些注意点:同学们在学校里如果认真学习,再享受下大学生活的话,可以用来开发的时间真的不多了,所以无论读书也好,开发也好,务必在方向和侧重点上做好规划。
比如上面的提到的<game engine architecture>读的话,也是要挑自己需要读的章节来读,大量的内容了解下就好,无需深入进去。
要事优先!!!
c. 做一些领域知识积累毕竟实现起来速度还是太慢了,就自己感兴趣的领域,多做一些刻意的学习,GDCVault是一个比较好的切入点,这个可以给你一个每年大家游戏开发的经验,可以就这些内容知道都有那些知识,然后顺藤摸瓜,找到相关的好的介绍基础知识的文章和书学习起来。
把学习的过程放到blog上面,面试官也比较容易看到你的知识积累,也能更好的认识到你的情况。
06sum这一节我列了一些比较推荐的,有效的积累游戏开发方面能力的做法。
构建知识体系,磨炼编程技能,培养游戏素养,学习领域知识和构建项目,这些都做的比较好了的话,进入游戏行业就已经不远了。
不少东西真要做下来也颇费心思的,就已经需要一定的热情了,如果我们做这些的时候,一直非常的激情澎湃,甚至到了吃饭睡觉的时候都在想,那么真的就是一个很不错的状态,希望同学们能够保持,成长为一个优秀的开发者,做出出色的游戏。
三、面试和信仰
前面谈及了“选择”以及“技术准备”,接下来我们就把“面试”和“信仰”放在一起聊了。
面试和简历,这方面网上文章很多了,这里就面试过程中常常遇到的问题和误区强调一些。
01简历作为面试官,希望从简历上看到尽可能全面和关键的信息,这里包括:
毕业的学校,专业和成绩(gpa和排名)
所从事的项目,项目的基本描述,以及自己工作中的关键点
自己的突出优点,对于游戏开发方面是否有明确的倾向
平时积累知识和写代码,如果能落成blog和github上就更好了
这些东西都能够方面我们在简历筛选阶段注意到你,在面试阶段也会让面试进行的更加有效。
这里正常情况下,简历能描述的信息都比较有限,都要力求精简和突出重点,但是blog和github的链接是一个把信息量一下子飚开的途径,如果平时注重积累这一块会有明显的加分。
还有一个情况就是,对于项目的介绍很模糊,这个也会造成在筛选简历和面试中,也让面试官无从下手的情况。
02面试这里就谈一点:坦诚。
能过来面试的一般都是阅历要丰富得多的人,面试人无数,在项目里也常常处理各种同事关系,不坦诚的同学,基本都会被立刻识破,看着一个同学瞪着眼睛在我面前说谎,内心是崩溃的。
我们每个人都不会是完美的,有自己的不足和不会的东西非常正常,大大方方的说出来,可以说是最好的处理方式。
至于按时到场,仪容整洁,态度端正都是基本的要求了,但是还是是不是会出现有问题的情况,不过就不展开说了。
03信仰信仰,热情等等这些东西,时不时就被滥用,一会是奇迹发动机,一会是老板压榨员工的利器,一会是忽悠人的鸡汤。
笔者从自己多年工作的经验来看,可以说信仰&热情是客观存在的事实,是人的真实情感,就是有很多人,被这些追求所驱动,成长的更好,做出了本来做不出的东西。
我们不能硬说这个就是用来骗人的,虚的,不存在的。
而游戏行业有这样的特点:比较有意思,好的项目比较盈利;所以行业里会呈现竞争比较激烈的情况,项目生生死死是常事,也一直不缺乏带着短暂热情和逐利的心态的“短跑”选手。
就大部分情况来说,在我们的社会文化下面,大家对于薪资回报,职级晋升都是比较认可的,这一点上产生的驱动大家都比较认同的。追求和热情所产生驱动力,如果我们自己天然携带或者建立的比较好的话,就会成为一个稳健的第二驱动引擎,让我们的开发生活更有意思,遇到困难的时候也更“反脆弱”。
热恋般的短暂喜欢是非常常见的,但是在面临比较多的加班,项目的艰难处境的时候,也容易出现“累觉不爱”的情况。
这种热情,也可以像知识一样,建立起一个“信仰体系”来,当你更加认同技术积累,技术进步,游戏带来的价值和快乐的时候,那么就更可能拥有一个稳健强劲的“第二驱动引擎”。
这里每个人有自己的方法,我个人经历过比较好的包括:玩游戏,看电影,当看到触动我的作品的时候,都会深深地激发创作冲动
业界各种八卦,开发历程,从最近的塞尔达的开发历程,到电影《环太平洋》的创作过程,到很久之前的各种90年代的编年史
当然其中我的最爱《DOOM启世录》要再次推荐
宫崎骏先生的各种纪录片也非常喜欢
了解技术的历史,这里推荐一个书:《创新者》( The Innovation:How a Group of Hackers,Geniuses,and Greeks Created the Digital Revolution.)讲述计算机诞生和发展的历史,当我们站在历史长河的角度去看技术给世界带来的改变的时候,在看看自己编写的程序的时候,感觉会是不一样的
这种讲述黑客文化的书都会给人非常不同的感觉
一些能探索个人智慧的书,比如卡斯帕罗夫的《棋与人生》,菲尔杰克逊(公牛,湖人的那个教练)的系列的书等等。
这些都能帮助去建立自己的信仰体系,希望对于同学们也能有帮助。
信仰与价值观的建立,虽然不像学技术,写程序和玩游戏那么直接,但是个人的看来却是最重要的也是长期的一个过程。
大家在准备的过程中,遇到一些困难和疲倦都是非常正常的,也不是什么严重的事情,just do it!