对于想要从事游戏开发的人员而言,这将会是一份不错的指南。
本文首发于知乎,作者“安柏霖”,目前就职于腾讯北极光工作室群,游戏葡萄已获转载授权。
和以往的正常写写文章不太一样,这个系列确实希望可以让更多的有意去开发游戏学生看见。
笔者在腾讯北极光工作室群工作,也做客户端通道面试有段时间了,上个月刚刚结束了在几个城市的“巡回”面试,整个面试的过程是一个让我颇感能量充盈的过程,看到一个个渴望进入游戏行业创造精彩的年轻面孔,还有什么比这更让人兴奋的呢?
其中也看到有些同学非常的有热情,但是走了弯路,把有限的精力放错了地方,不免感觉颇为可惜,加上平时在各个渠道也收到不少这方面相关的问题,这里就自己的经验写一个小系列,来谈下学生入行。
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[必修]系统的知识结构
知识系统有点像武侠中的内力,在开发中,良好的知识素养,尤其在比较有挑战的模块中,会相当程度呈现其作用,甚至会影响我们看待开发的方式。
这个方面科班出身的人(尤其是计算机方面比较强的人)会比较有优势,其中重要的原因,学校就是按照建立系统的知识结构来设立课程,而且加入了考试大作业的方式来强化。
科班的同学无论想还是不想,不管有没有系统化知识的意识,都要学,即便当时不那么上心,过了考试,在后面工作中遇到类似的问题,看见名词总知道是什么,不大会出现直接的概念盲点。
自学的同学,比较容易出现就编程中遇不到的问题就不看了,你可能做了已经不小的项目了,一些知识不知道,依旧做的挺好的,但是计算机知识结构这个在中长期的开发中是非常重要的。
而主动去做知识系统化,这个需要颇大的努力的,这是一个非科班出身的人容易出问题的点(不是说非科班做不好,只是一个需要我们注意的点),以及科班学习不认真的同学也容易遇到,我们要更多的可以的去看。
然后从毕业生的面试角度来说,一般大家不太会有特别多的项目经历,所以基础知识的占比,会有笔试,也会在面试过程中重点考察,本身也是相对社招占比更高的点。
从客户端开发角度来看,整体计算机系的常规课程都是不错的,尤其是一些985头部学校的课程,大家可以以此来修炼,其中重点可以关注:
这四个方面在客户端编程中用到的最多。
所谓的系统的知识结构,一个是纵向的对这些知识的关键点进行梳理和透彻理解,一个是横向的彼此之间关联和抽象(可以用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!
关注微信公众号“游戏葡萄”,每天获取最前瞻的游戏资讯