前几天有同学在后台找小说君人生商谈,原问题就不再贴出来了,大意是「有意入行游戏圈,但是对自身的技术基础没信心,如何做自己的后续学习规划,以达成求职目标?」
其实之前小说君在博客园和知乎的时候,也偶尔有同学会问类似问题,提问者有的还在读书,也有已经工作的。所以小说君觉得有必要专门写一篇文章来讨论这个话题。
首先是老生常谈,一个人的命运,当然要靠自我奋斗,但是也要考虑到历史的行程。九十年代末到现在,大家都是写游戏的,怎么就有人进了业界名人堂,有人还在搭NGUI界面呢?
历史的车轮滚滚向前,游戏产业的增长不会无休无止,游戏圈程序员的平均生存状态也远没有想象中那样光鲜亮丽,说起来好像大家做的都是流水过亿的项目,住的都是带游泳池的大house一样。
还有些读书中的同学因为「图形学是程序员的浪漫」这个说法就觉得游戏开发很神圣,这点小说君更是不敢苟同,此浪漫非彼浪漫,这个浪漫的意思是图形技术的投入产出是公认的低,如果还是执意做图形的话确实有些romantic的意思。更遑论,做游戏开发的大部分程序员是不需要图形学知识的。
前几年手游刚兴起的时候,很多做企业应用的.Net程序员转行做Unity,确实很明智。但是如果现在还这么想,那么有可能最后只是从一个坑跳到另一个坑而已。
对于程序员来说,写代码是一种谋生的技术,而至于是做游戏,还是做垂直电商,做深度学习还是做什么其他现在资本更看好的项目,都是一种领域知识。你的履历,则是技术与领域知识的组合。并不是小说君泼冷水,现在的风口并不太看你的游戏领域知识。
上面的只是小说君的一些碎碎念,如果看到这里,你还是有意进入游戏圈的话,那小说君接下来就进入正题了。
国内游戏行业现状大家都懂,大家做的游戏毕竟不是工业级3A,相对来说还是比较短平快的。做游戏对程序员的要求其实跟做web对程序员的要求并没有太大区别,核心需求无非就是能写代码,逻辑清晰,认真负责,不求对游戏多有爱,只要有一定的领域知识就够了。
游戏程序分为很多种,小说君先简单列举下种类,以及每种程序的入行难度和入行建议度:
引擎程序:游戏圈历史沿革最久的职位,需求越来越少,现在只有少数大厂会有这类岗位缺口。而大厂的新引擎立项机会其实还是挺少的。即使有岗位缺口,可能也都是做一些比较独立的模块,比如维护一个粒子编辑器?
因此引擎技术的投入产出比特别低,因为你除了写代码能力之外,还需要花费相当长的时间学图形学,因此小说君个人感觉如果想转行游戏程序,是不太建议以引擎程序为目标的。
难度,三颗星;建议,一颗星。
UI程序:很多端游的UI是用scaleform做的,需要专门的写as的程序员,跟客户端程序有所区分。
端游已经是昨日黄花了,scaleform用的也只会越来越少,为自己的后续职业生涯考虑下,还是慎重。
难度,一颗星;建议,一颗星。
客户端程序:端游项目基本就是写客户端逻辑的,手游项目的话由于大家都用Unity,所以不会有单独的UI程序分出来,UI面板都会由客户端程序来拼。
在现在以及可以预见的未来,Unity仍然是一门值得投资的技术,因此小说君还是比较推荐转行从客户端切入的。
难度,一颗星;建议,三颗星。
图形程序:跟引擎程序有所区别,但是又不能算是技术美术。比如在Unity项目中,会承担客户端主程跑场景查性能bug、优化引擎API调用性能等职责。同时还负责写shader,维护打包逻辑等等。
这个也算是目前的热门职位,实际上只是跟客户端程序定位稍有不同,想写逻辑的时候理论上可以无缝切回客户端程序,因此入行难度高于客户端程序。还是因为Unity的原因,小说君比较推荐。
难度,三颗星;建议,三颗星。
服务端程序:这个自网游诞生以来就没太大变化,不同的项目会由于内部工作流的不同,服务端程序拉的战线也会有所不同。但是大体上还是写逻辑为主,而且由于游戏圈有一个专有名词叫「成功项目」,所以新项目的框架一般直接拿「成功项目」的直接用,老大放心,小弟省心。
种种原因,导致游戏服务端的底层修改必要不大,因此对技术的需求倒并不是特别高。而且游戏服务端写逻辑,其实跟web服务端写逻辑并没有太大本质区别,以后想转行倒是也可以,只不过领域知识就有点尴尬了。
难度,两颗星;建议,两颗星。
上面列举的程序工种,引擎、UI、图形就姑且不谈了,确实不太适合初入行程序切入,接下来就重点说说客户端程序和服务端程序的技能要求以及准备方式,如果有关注过招聘网站,你会发现大家招的一般也就是这两类。
技能要求,可以分为程序员通用技能和游戏程序员加分技能。
俗话说的好,不要在一棵树上吊死。转行不是一日能促成的,千万不要一开始就把自己限定在某一个小圈子里。前面也说过,国内的游戏程序并不太封闭,因此准备的时候大可优先关注程序员通用技能,游戏程序加分技能有的话最好,没有也无妨。
下面的规划前提是你有半年的不充分准备时间。
通用技能:
-
语言,游戏面试的话还是会以C++为主,即使要招写C#/Python/Lua的人。
但是不仅要看C++,还要至少看一门虚拟机语言,比如python。
入门看《深度探索C++对象模型》,进阶可以看《C++的设计与演化》。
虚拟机语言的话从头到尾看书不太现实,毕竟掌握C++已经需要花足够长的时间了,可以以网上资料为主,至少要弄明白虚拟机语言写起来跟C++有什么不同。书的话可以找找今年出的一本《垃圾回收算法算法手册》。
-
操作系统+体系结构,两个可以一起搞定。
入门看《深入理解计算机系统》或者《程序员自我修养》,进阶可以找本《深入理解Linux内核》看看。
-
网络基础+网络编程,同样可以可以两个一起搞定。
小说君倾向于入门看《TCP/IP详解卷一》,然后网络编程知识就边看书边写demo边上网查资料够了,无非就是linux epoll什么的。这里需要注意的是写demo一定不要单纯写,而是想办法集成到自己其他项目中。
-
数据库,笔试一定会出现这类题目,基本逃不掉的。
如果时间不够的话就不用看书准备了,上网找找笔试题,能边刷题边回忆起一部分自己学过的数据库概念/原理就行了。毕竟现在做游戏只用mysql的已经不太多了,如果是用mongo或redis,这些数据库概念大部分就尘封了,术业有专攻,交给DBA去好了。
-
数据结构与算法。这个不多说了,除非面资深岗,否则都是必问的。
这块的话需要经常去leetcode刷几道medium的题,而且只刷题还不够,刷到一定程度再看《算法导论》看博客总结下。
如果笔试中考起来,会涉及各种排序、二叉树的各种遍历、图的基本算法等等,大题的话大部分互联网公司游戏公司只要能搞定leetcode medium难度的题,基本也不会虚的。
-
解决问题的能力和潜力。表现形式多样,最典型的是「你遇到的最棘手的问题」。
如果是学生,就兼顾一下老板的项目,认真思考认真总结。如果是在职程序员,那就除了做好手上的工作做好总结之外,还要多看看成型的框架,消化吸收再创新,业余做一些开源项目试试水,优势大大的。
游戏程序员加分技能:
如果面试者是转行的程序,那面客户端和服务端的时候都只会被考察游戏领域知识的皮毛,面试官毕竟也不蠢,不会对一个只做过web的老程序问排行榜适合用什么做存储,会把更多的重点放在程序员通用技能考察上。
但是稍微翻一翻游戏程序相关的书是不会错的,比较推荐的是《游戏引擎架构》,大部头,不必每章都看,更不必追究细节,比如HUD、动画系统、碰撞这几章就可以直接跳过。
笔试和面试其实就没什么好说的了,网上的笔经面经一大堆,总结的绝对比小说君好。
笔试:
平时保持一个正常的刷题频率,准备面试前的两个月,提高一下刷题频率,笔试一般是不会虚的。
面试:
面试还是比较看造化的。遇到合适的面试官,就会尽量顺着你来,让你占主导,那么你只要掌握的越多越扎实,通过的概率就越高。遇到不合适的面试官,除了听天由命之外,也可以利用自己的面试技巧,把话题引导到自己想表达的内容上来。
公众号:gamedev101「说给开发游戏的你」新开通,专注游戏开发技术分享,如果对小说君的文章感兴趣,欢迎长按下方二维码识别关注或分享给你的朋友。