“不拼搏,枉少年!”—网易游戏
写在前面:先介绍下自己的情况,末流985大学本科生一枚,全院人数200+,我的成绩排名在170左右(校招开始的时候仍有一科挂在树上,现在已经补考过了),英语4级。侥幸获得了几个游戏公司的offer,最后和网易游戏签约。“游戏”陪我走过了人生中最值得回味的时代。懵懵懂懂的童年,在面对这个复杂缤纷的世界,游戏成为我了解这个世界的窗口。《魂斗罗》,让我知道了什么是“合作”;《赤色要塞》,让我明白了什么是“任务”;《超级马里奥》,然我知晓了什么是“责任”……有太多的游戏,太多的记忆。游戏为我打开了一扇大门,一种新的方式去看待世界。正所谓人生如戏,只是我们没有机会重来。所以我很热爱游戏!
废话到此为止,写这篇日志之类的东西,是为了分享游戏求职经验给学弟学妹们(响应某人的号召,哈哈),攒RP用的。
前期准备:
按照惯例,各大IT公司会在大三下学期开展暑假实习生的招聘工作。这对要找工作的同学来说是很重要的,即使将来你不在你实习的公司工作,这实习经历也会给你加分的。有的学校会统一安排学生去某公司实习。如果你让你的简历更好看一点,那么去著名的IT公司实习是个不错的选择,传说中的BAT(百度、阿里、腾讯)。当然如果实力够强大,微软、Google、Facebook之类的国际大公司更好。在实习招聘过程中,你还能锻炼各种技能。这些技能在以后的应届生招聘中也有好处。前提是:你要有清晰的目标。你要有清晰的目标(工作岗位、工作内容、自己擅长)。你要有清晰的目标。你在实习之前了解自己的兴趣点是最好的,然后又针对性的复习知识,这样会更有效一点。当然,实习还没目标的同学也不用担心,你可以一边实习一边找感觉。但是在应届生招聘的时候,你就要做出选择了。
请用半年的时间来面试自己。如果你不知道自己努力的方向,企业的招聘要求是一个很好的参考。相信大家对应试考试已经能够应付自如了,这里的招聘要求就是一个大纲之类的东西。从它你能知道企业希望你能有什么样的技能,接下来的,就是努力了。在知乎上我看到过一句话觉得很不错,“以大多数人的努力程度之低,根本轮不到拼天赋”。下面是网易游戏的招聘要求。
第一条学历这种硬性条件我们可以忽略(本科也行,只要你达到我的要求)。网易要求你精通C++(要求应届生精通,这绝对是HR写的),很明显他要求你的C++能力要达到一定的水准。一般来说,你把《C++ Primer》《Effect C++》这两本书啃透,在面试上就不会有太大的问题。面试官也不会期望一个应届生能够“精通”C++。要对自己有信心,这很重要。接下来,你要熟悉数据结构、算法和操作系统。一般来说CS专业相关的专业学生都会学习这方面的知识。但是不要以为这样就行了,学了和会是两个概念。码农应有的觉悟就是要动手写代码。对于操作系统,课件就足够了。对于数据结构和算法,这需要真正的动手去写代码,动手去写代码,动手去写代码。《算法导论》你能啃多少是多少吧。对于非ACMer的学生来说,练习码代码的能力显得尤为重要。线上的OJ系统是个不错的选择(著名高校OJ,我就不明说了)。对于找工作的人来说,还有一个很棒的练习网站LeetCode。这上面有很多公司的面试、笔试题(我遇到过原题)。我们不要期待原题的出现,更重要的能力、思维的提升。在暑假我在上面刷了200题,收获颇丰,见识了不少好的题目和解题方法。这个网站是面向全世界的,所以有很多程序员在上面练习,他们会给出很多让人感到非常精妙的方法解题。至于后面的几点,这就需要通过一些事来体现了。比如你在学习、项目过程遇到过什么困难,你是怎么想的,你是怎么解决的?所以,好的项目经验也很重要。
关于项目,对于大部分本科生来讲是可遇不可求的。但是我们不能坐以待毙,没有项目,创造项目也要上!针对游戏,尤其如此。你说不会美术,网上的素材很多;你说你怕侵权,仅供学习之用(不用发布出去);你说你不会做游戏,学啊!Unity3D,cocos2d-x这么好的游戏引擎。不要在乎你自己做的项目有多小,感觉多幼稚,你已经比那些没有的人领先了。路漫漫其修远兮,上下而求索。
接下来就是加分项,针对游戏,那自然是程序员的三大浪漫之一的图形学了。没有捷径,啃书+写代码。其实我觉得《OpenGL 超级宝典》、《游戏引擎架构》、《3D游戏编程大师技巧》这些书还不错。
校招前最后一搏
我假设你基础已经准备好了,在真正去面试之前,你没有实战经验,怎么办?高考之前我们还有往年考题、模拟题呢!没错,就是练习重点练习高质量企业的往年笔试、面试题。从这些题中,你可以检查你知识点中的不完全的地方。以及企业喜欢检查的知识点有哪些。你就可以针对性复习了。这个时候如果你有大面积的知识点不会,那么就是你前一个阶段做得不好了。这个时候只能通过一些临时抱佛脚的方法来弥补了。详见《剑指offer》《程序员面试指南》之类的书籍。
笔试
笔试的成绩也是很重要的,不要忽略。对于微软、网易游戏这类公司,就靠难题来刷人。所以大家一定要做好准备。至于有多变态,大家可以去这个网站(www.hihocoder.com)看看。网易游戏和微软的招聘的笔试都在这个在线平台上。下面截图是2016校招的笔试的一些情况大家可以了解下。从这些中数据我们可以直接看出一道题的难度。通过率:50%-100%难度为易,30%-50%难度为中,10%-30%难度为难,0%-10%难度超难。微软笔试题为2个半小时,网易游戏为3个小时。大家可以自己去试试。
其他公司的笔试题我就不赘述了。总结:练、练、练。
面试
总的来看游戏公司对计算机基础知识,比如计算机网络,操作系统,数据结构和算法,程序的链接装载等等都会有不同程度的考查,另外就是对C++要相当熟悉。而二面的时候又会考查一些常见的游戏算法,对游戏引擎的使用和图形学基础并没有严格的要求,不过有基础的话更好。
下面是我在面试游戏公司过程中遇到过的问题,我不会给出答案(没有标准答案)。
C++:
- inline关键字是做什么的?具体说说?会对目标代码造成什么影响?它和#define 这个宏定义有什么区别?
- 什么是多态?多态在C++中是怎么实现的?说说在C++中重写、重载和覆盖的区别。
- 在C++中和C中Struct的相同和不同点。
- 什么是虚基类?有什么用?
- C++智能指针有哪些?说说他们的区别,是怎么实现的。
- 说说你知道的C++容器。vector这个容器是怎么实现动态扩容的?
- extern 这个关键字有什么作用?
- 说说C和C++强制转换有什么不同?为何?
- 如果你来实现move函数需要注意些什么?
网络:
- 简述TCP/IP协议的连接和断开状态转移。
- TCP_NODELAY和TCP_CORK这个两个选项有什么用?有什么区别?在什么情况下我们会设置这两个选项?
- Socket Server端的流程是怎么样的?什么是阻塞和非阻塞?select和poll的区别?
- 你知道哪些通信协议可以被利用来DDoS攻击?
算法:
- 将一个字符串转化为int类型(这里面陷阱很多,在面试时需要和面试官多沟通)。
- 如何快速查找40亿数据中的那些重复数据?
- 如何快速查找100万数据的最大的100项,常量空间?
- 怎么快速删除一个数组中的为0的项,常量空间?
- 在一个数组中保存的都是整数,只有一个数字出现的次数为一,其他数字出现的次数都为2,怎么快速找出这个只出现一次的数据,常量空间?要是其他数字都出现了3次,4次呢?
- 现在我们要做一个登陆排队系统,你会怎么做才能使这个系统高效呢?要是这个系统可以让VIP用户排到前面呢?需要在这个系统中快速查找一个用户,我们使用什么样的数据结构才能满足以上要求?
- 你知道哪些自动寻路算法?BFS和A*有什么异同?在什么情况下A*和BFS一样了?
游戏相关:
- 简述OpenGL的渲染流程。哪些过程是可以编程的?
- 在很大的场景中,有什么优化碰撞检测的方法?写一下空间八叉树的两个子叶节点的最低公共祖先的算法?
- 普通光照模型你知道哪些?写一写?
- 对于游戏模型的贴图,有什么优化的措施?
- 骨骼动画是怎么实现的?你知到哪些插值方法?
- 你在开发你的游戏过程中遇到过哪些困难?怎么解决的?
最后还有一个小问题,是我在学习过程中遇到的,给面试官讲过后,感觉不错。我曾经写过一个排序算法的演示程序,在过程中遇到一个问题,其他排序算法是自己写的,可以很容易的记录数据的变化过程,但是有关STL里面的sort这种排序算法就犯了难。大家可以想想怎么做才能知道sort内部具体是怎么排序的。
上面的那些面试题,你不要期望会遇到原题。我没有给出答案,大家如果感觉答不上来,可以问问自己是不是自己哪方面还欠缺。这些都是基础问题,答不上来就有很大可能那方面知识没有掌握好,继续努力吧。
一家之言,希望大家都通过自己的努力能找到一个好工作!
--燃灯