面试官谈游戏开发入行--技术准备
2020-08-24 09:26:15 阅读量:10

[前言:笔者在腾讯北极光工作室群工作,也做客户端通道面试有段时间了,希望写一些能够帮助有志于开发游戏的同学能够更好地入行。]

接上一篇文章,当我们选择进入行业,并尽早开始去做,接下来是一系列的准备。
这一部分也是整个系列的重点,写这个的原因就是面试过程中发现很多有热情的同学,看了各路大牛大V的高大上的推荐,结果练歪了路线,本来应该是循序渐进的一个过程,结果变成了基础不扎实却花大量时间在项目中用不上的东西上了。

这里是一个在面试过程中的“看点”,后面我们一个个来看

  • [必修]系统的计算机知识结构

  • [必修]过硬的编程能力

  • [加分]玩足够多的游戏

  • [加分]良好的领域知识积累和较好质量的游戏开发项目

本文的关键词:力所能及,有章法,有所侧重

寻找适合自己的方式
我们在网上会看到大量大牛的介绍如何学习的文章,这些大牛普遍情况是自己能力就非常的强,不是计算机专业的,知识结构比科班出身的人更厉害,中学时候已经编程实践大把,或者学习&开发能力很高。
这些大牛的做法有时候对于普通同学来说,不一定适合。
打一个比喻,这个是大牛们的天赋点:三系全满
这个是普通人的天赋点:一共就30个点,甚至更少

这种情况下,肯定要紧巴巴的使用了,根据自己的英雄特点和打法,选择最好的加点,自己是一个瑞兹,就不要把点加到打野侧去了。
实际情况中,真的遇到太多太多,一个有热情的普通同学,按照大牛的推荐走了“高端”路线,在基础的知识结构和编程测试中,缺失的非常厉害。
[必修]系统的知识结构
知识系统有点像武侠中的内力,在开发中,良好的知识素养,尤其在比较有挑战的模块中,会相当程度呈现其作用,甚至会影响我们看待开发的方式。

这个方面科班出身的人(尤其是计算机方面比较强的人)会比较有优势,其中重要的原因,学校就是按照建立系统的知识结构来设立课程,而且加入了考试大作业的方式来强化。
科班的同学无论想还是不想,不管有没有系统化知识的意识,都要学,即便当时不那么上心,过了考试,在后面工作中遇到类似的问题,看见名词总知道是什么,不大会出现直接的概念盲点。
自学的同学,比较容易出现就编程中遇不到的问题就不看了,你可能做了已经不小的项目了,一些知识不知道,依旧做的挺好的,但是计算机知识结构这个在中长期的开发中是非常重要的。

而主动去做知识系统化,这个需要颇大的努力的,这是一个非科班出身的人容易出问题的点(不是说非科班做不好,只是一个需要我们注意的点),以及科班学习不认真的同学也容易遇到,我们要更多的可以的去看。

然后从毕业生的面试角度来说,一般大家不太会有特别多的项目经历,所以基础知识的占比,会有笔试,也会在面试过程中重点考察,本身也是相对社招占比更高的点。

从客户端开发角度来看,整体计算机系的常规课程都是不错的,尤其是一些985头部学校的课程,大家可以以此来修炼,其中重点可以关注:

  • 编程语言(c,c++,java,c#等),有一个对于编程语言整体的理解

  • 数据结构和算法

  • 《操作系统》

  • 《计算机体系结构》(本科应该叫《计算机组成》)

这四个方面在客户端编程中用到的最多。

所谓的系统的知识结构,一个是纵向的对这些知识的关键点进行梳理和透彻理解,一个是横向的彼此之间关联和抽象(可以用mindmap画出关联),做到把书读薄。
就重要的概念,进行深入的了解,比如:

  • c++中类在继承,多态情况下成员在内存上都是如何排布

  • 切换到汇编看下,c++各种语言特性都是如何执行的,如何进行函数调用,如何进行虚函数调用

  • cpu的simd执行方式,分支预测的效率低到底是什么样的,

  • 内存层次中cache的作用,以及相关的cache友好的程序是什么样的,尝试写一个cache相关的运行差异很大的情况,profile一下cache的性能

  • 各种排序和常用数据结构的核心思想,他们到底是以什么样的方式解决了什么样的问题

  • 。。。

经过这样的从底层机制以及外在表现上去理解一个概念,就会从“记忆概念”到“普遍联系的理解知识”,其实反而让要学要记的东西变少了,相应的在面试中也就应对自如了。

[必修]编程能力
所谓编程基本功,就是:

  • 一个问题知道怎么去解决,

  • 能很快的把程序写对写好

毕竟我们到项目组里就是要稳定高效的把问题解决好。
面试过程还是面向学生,也不会非得有很多项目经验,但是编程过硬始终是必须的,那么各种面试编程的题目都会拿来测试。

这个在有了大量的编程量之后,普遍会做的比较好。
在实验室有大型项目的同学一般比较好,道理同科班的知识体系构建,实验室的项目总是要做好的,不需要自己太多的主动性。
而如果本科的同学可能就会遇到编程量不够的情况,这时候可以通过:

  • 自己来选择做有一定规模的大项目来提升

  • 到leetcode,acm等地方去刷题

来让自己有过硬的编程基本功。

这个在面试现场常常会有一个15到30分钟的编程测试,这个如果只是各种概念背的溜,知道怎么去解决都还是不够的,就是要稳定高效的写好。

这里在面试中发现,同学们之间的编程能力差距是非常大的,好的同学比入行5年的职业开发者写的更快更好(当然这不意味着他们开发能力更强了,毕竟开发过程中逐渐开始倾向对于实际问题的知识,方案和解决),可以在很短的时间内写的又快又好。
这是一个有着巨大成长空间的点,希望大家能够多多沉浸在编程中,磨练自己的技艺。

这里一个注意的点,如果出现自己学习的过程中,编程严重不足,意识不到这一点,就一定要警惕,这个就是对于编程积累方面的意识严重缺失的表现,要审视自己的学习渠道,学习环境和氛围。
正常的编程开发学习,会非常围绕做项目和编程来的。

==必修==
上面的两点都是必修的部分,我们需要至少在这两点做的比较好的情况下,再去花时间去做其他的,比如积累游戏和游戏领域知识等等,而不是反过来。

[加分]玩游戏
这个大家可能会觉得比较轻松的话题,但是也需要提一下。
为什么要一个编程的人去懂游戏?
如果一个开发者还是一个玩家,那么他的能力会被极大地放大。
这里的数学模型,可以借用稻盛和夫的能力模型来描述:工作结果=思维方式x热情x能力
而开发者的玩家属性就会影响到“热情”和“能力”这两项,是一个非常重要的点,展开来说:
首先就是游戏做起来更有热情,更来劲,你会和自己做的东西产生情感上的联系,这个会让整个开发过程发生质变。
其次和策划美术交流起来要快一个数量级:我们在做游戏的时候,会把一些行业里的常用做法给术语化,就像遇到一个问题我们会说这个快排以下就好,这个二叉树表示下就可以了。
谈设计的时候,策划会说这个操作方式是xx游戏里的xx技能,但是在某一个模块做一些修改,美术说这个效果像xx游戏隐身的过程,但是xx地方我们不同一些,这个时候我们如果完全不知所云的话,策划美术就要花很多时间把系统一点点解释,这个过程就慢了一个数量级。

何况,我们做游戏时候一大快事,就是了解一些好游戏的做法,可以和开发团队一起讨论,做出更好的设计实现,这个会让开发的过程从死板变成激情四射富有创意和有意思。

扩展我们的游戏库
另外面试中常常遇到的就是一些同学很喜欢游戏,但是玩的游戏太单一,LOL,王者荣耀,守望先锋这种大家都玩得游戏,玩到一定级别就好,就不要花太多时间了。
大可以多看看各个平台上的好游戏,手机自不必说,主机平台,steam平台乃至视频通关一些游戏都可以多多尝试,对各自品类中的佼佼者,都知道怎么回事。
比较要做职业开发者,了解行业里的优秀游戏是必修课了。

[加分]领域知识和编程项目
如果自己已经做了一个颇有编程挑战的游戏,对于游戏开发的领域知识有比较好的积累,那么对于我们开发的积累和面试的过程都是一个大大的加分项。
这里比较推荐的是,就自己的能力做一个尽可能有挑战的项目,并且找到自己的感兴趣的点,就几个点做到有一定深度。

做什么样的游戏?
我们先看下现在学生的能力“行情”。
到今年的实习生面试中,这块比较出色同学能做出颇有规模的游戏,可以到达使用Unity3d,做出单机的3D的ARPG这个级别,战斗打的像模像样,怪也有一定的AI,有任务装备系统;
有的是自己做策划和程序,设计出了大量的职业,有比较好的数据驱动的模式去产生变化。

相比之下,有一些很不错的学校的同学,在一开始目标就设定的太低了,只是有一些非常简单的小球碰碰,这样就不够充分了。

这里我们还是要区分好自己的情况,在自己力所能及的范围内,尽量选择有挑战的项目来做。
并且一定要有所取舍,不能编程开发基础不足的情况下,去做大量的创新设计,把大量的精力放在设计上了。
好的游戏设计,创新的想法绝对是一个好的事情,但是对于程序员开发者来说,需要在编程和领域知识过硬的前提下,这条才真正有意义。

这里在写项目的时候,推荐使用Unity3d引擎,主要是:

  • 引擎相对简单,可以让我们直接去挑战一些比较难的项目


    • 大家完全不要有学习上的心理障碍,从cocos2d开始学,用熟悉了2d在搞3d这种思维都是没必要的,直奔主题就好

  • 直接能发布到手机上,面试时候直接拿一个demo,各种方便

  • 是现在手游项目组最多的选择,也是一个非常好的加分项


编程项目根据自己的情况来,包括编程能力,喜好,可以选择对于市面上的游戏,自己能吃下来的,技术上有挑战的版本

  • 俯视角moba,塔防,射击

  • FPS,TPS等射击游戏

  • RPG,ARPG等

  • 即时战略和赛车游戏。。。不是很推荐了


美术资源:

  • 各种渠道,甚至到一些游戏中破解都可以

  • 有的学校有游戏开发俱乐部,能找到美术,也很棒


突出重点&刻意练习&github
比较推荐就一些自己的侧重点,找到行业中的比较好的技术方案,来专门的使用和实现下
这个也是面试中看demo一个常见的情况,游戏做了,但是里面的技术方案大量的都是自己随意写的,这样的开发,就只是练了下编程,熟悉了下API,意义就缩水了很多。

我们可以就一些行业常用的解决方案,放在自己的项目中
方向的选择首先了解游戏模块中都有什么,这个可以看<game engine architecture>第一章,其中这个图有很充分的覆盖:

然后自己选择比较感兴趣的方向,这里推荐是找到自己喜欢的游戏,然后如果有gdc等文章讲他们怎么实现的,那就可以以此为支点来开始自己项目的实现。

可以选择的方向举几个例子的话:

  • 实现怪物的行为,就可以使用状态机或者行为树来驱动,寻路的时候,

  • 做一个大规模地图中怎么去高效的寻路,

  • 渲染中实现一些<real time rendering><gpu gems>或者gdc中有一些力所能及的效果,比如下雨&地面潮湿,大量particle的性能,贴花,distortion等等。

甚至围绕这些东西来设计项目的侧重点。

然后把这些放在github上面,一码胜千言。

一些注意点:
同学们在学校里如果认真学习,再享受下大学生活的话,可以用来开发的时间真的不多了,所以无论读书也好,开发也好,务必在方向和侧重点上做好规划。
比如上面的提到的<game engine architecture>读的话,也是要挑自己需要读的章节来读,大量的内容了解下就好,无需深入进去。
要事优先!!!

做一些领域知识积累
毕竟实现起来速度还是太慢了,就自己感兴趣的领域,多做一些刻意的学习,GDCVault是一个比较好的切入点,这个可以给你一个每年大家游戏开发的经验,可以就这些内容知道都有那些知识,然后顺藤摸瓜,找到相关的好的介绍基础知识的文章和书学习起来。
把学习的过程放到blog上面,面试官也比较容易看到你的知识积累,也能更好的认识到你的情况。

sum
本文中,列了一些比较推荐的,有效的积累游戏开发方面能力的做法。
构建知识体系,磨炼编程技能,培养游戏素养,学习领域知识和构建项目,这些都做的比较好了的话,进入游戏行业就已经不远了。
不少东西真要做下来也颇费心思的,就已经需要一定的热情了,如果我们做这些的时候,一直非常的激情澎湃,甚至到了吃饭睡觉的时候都在想,那么真的就是一个很不错的状态,希望同学们能够保持,成长为一个优秀的开发者,做出出色的游戏。