五个月,从图形学一窍不通到找到游戏大厂实习
这篇文章算是给自己吹吹牛,也算是一次复盘。
五个月前,我对图形学基本一窍不通。五个月后,我拿到了游戏引擎相关的实习 offer。中间当然不是一路顺风,甚至可以说大部分时间都挺狼狈的:项目没做完、简历不成熟、笔试做不出来、面试挂、方向怀疑、继续补、继续投。
最后能拿到 offer,一方面是自己确实坚持下来了,另一方面也有运气成分。但回头看,这段经历里有些东西还是值得记一下。
♪³ 寒假
寒假的时候,网易的同学跟我说可以帮我内推,也跟我说,三年时间是可以转到游戏行业的。
于是我信了。
在那之前,我其实一直在机器人、嵌入式、AI Infra 这些方向之间来回横跳,哪个都看起来有点机会,哪个又都没真正定下来。后来想了想,既然我确实更喜欢图形、引擎、底层一些的东西,那就别再摇摆了,直接往游戏开发走。
不过我不太想走传统游戏客户端那条路,比如主要围绕 Unity、UE 做玩法开发。我不是说这条路不好,只是我自己更喜欢底层技术栈一点。再加上现在 Vibe Coding 这波浪潮冲得很猛,我也会下意识考虑一个问题:什么技术方向的壁垒会更高一点?
所以最后我把目标定在了游戏引擎开发。
寒假的计划其实很简单,主要就两个:
第一,把 C++ 基础打扎实。
第二,做一个游戏引擎相关的完整项目。
后来偶然在网上刷到了 TheCherno 的 Hazel 游戏引擎教程,感觉挺适合入门,于是就决定跟着学。他的 C++ 教程我跳过了,直接从 OpenGL 开始看。
OpenGL 大概在 2 月中旬学完,然后我就开始正式跟 Hazel。
但寒假效率确实不高。一方面是自己还没完全进入状态,另一方面课题组这边还有机械臂相关的任务,建模、调结构、写东西都占了不少时间。最后就导致一个很尴尬的结果:开学了,Hazel 还没学完。
更尴尬的是,后来我往后翻了一下 Hazel 的公开视频,发现公开部分主要是做一个 2D 场景编辑器,3D 相关内容需要通过付费订阅获取。也就是说,如果我继续一集一集慢慢跟,最后可能只是得到一个比较简陋的程序。
当时我就有点慌。
于是我开了 Cherno 的 Patreon,拿到了 Hazel-dev 的源码权限,开始直接跟源码学。这个阶段就不只是“照着教程敲代码”了,而是要逼自己去看一个更完整的工程是怎么组织的。
♪³ 三、四月份
到 3 月初,我在小红书上看到很多人说实习要开始投了,不然后面会越来越难找。
但那时候我的项目其实还远远谈不上成熟。我同学也劝我,不要等完全准备好再投,因为你永远不可能觉得自己准备好了。
现在回头看,这句话是对的。
前面几次尝试大概率就是会失败,但失败本身有用。你不去投,不去面,就很难知道自己到底差在哪。自己脑补出来的问题,和面试真正暴露出来的问题,完全不是一个东西。
于是我简单包装了一下简历,先投了一个客户端方向的实习。当时我还不太敢直接投游戏岗位,觉得自己不够格,所以想先找个客户端岗位碰碰运气,顺便积累一下面试经验。
结果也很直接。
3 月 11 日,一面挂。
挂完之后我反思了很长时间。那时候再回头看自己的简历,会发现上面写了不少东西,但很多其实都比较浅。自己写的时候觉得还行,专业的人一看就知道含金量不高。
所以我决定再沉淀一下。
这一沉淀就是一个月。
这一个月里,Hazel 项目相比之前已经完整很多了。我也补了不少图形学和渲染相关的基础知识,C++ 能力也确实提升了不少。这个主要还是归功于 Hazel 本身代码质量比较高,里面有很多工程组织、抽象设计、渲染架构方面的东西,是我自己从零写项目根本写不出来的。
到了 4 月,我赶在网易实习投递截止前,又改了一版针对网易的简历投了上去。
没想到简历初筛真的过了。
然后就到了笔试。
在此之前,我的 LeetCode 基本属于断断续续刷一点的状态。所以毫不意外,即便突击了几天,最后还是没通过。
4 月 26 日,网易笔试,基本做不来。
最难受的是它是 ACM 模式,提交之后不会告诉你错在哪个样例。我看着自己的代码觉得好像没啥问题,但就是过不了。那种感觉很折磨,因为你连自己到底错在哪里都不知道。
这次之后,我才真正开始恶补算法和数据结构。
以前不敢碰的动态规划也开始硬啃。后面刷到能自己独立写完 LC207 课程表这类题的时候,才稍微又燃起了一点信心。
♪³ 五月份
5 月 11 日,我又鼓起勇气投了一次。
这次投的是游戏客户端实习。
但面试内容跟我想象得不太一样。没有手撕算法,也没怎么问 C++ 八股,主要考察的是渲染管线基础、开发场景设计,还有白板讲解。
最后结果还是挂了。
挂完之后我复盘了一下,发现问题不完全是“我不够强”,还有一个更关键的点:岗位匹配不够。
我投的是客户端,但我自己真正准备最多、也最感兴趣的,其实是图形学、渲染、引擎底层这些东西。客户端岗位当然也会问相关内容,但它更关注的东西不一定是我最擅长的那部分。
所以这次之后,我又补了一轮。
把渲染管线从头到尾重新梳理了一遍,也开始看一些更系统的资料,比如 RTR4。别人也建议我不要只盯着 Hazel,可以看看 Games101,也可以学一点 UE、Blender,看看别的引擎和编辑器是怎么做的。
这段时间其实挺痛苦的。
一边要补图形学、补 C++、补项目,一边还要应付课题组任务。不写周报不行,但写周报又会占掉一整块时间。每天都感觉自己在赶两条线,哪条线都不能完全丢。
这次挂了之后,我也想过要不要先投投小公司,甚至想过要不要干脆改回机器人方向。
但后来我发现,改方向本身也是有成本的。
如果我现在重新投机器人,那我又得重新整理项目、重新包装简历、重新准备面试叙事。说实话,我已经没这个精力了。
某种意义上,懒救了我。
因为不想再重新打磨另一套东西,所以我只能继续沿着游戏引擎这条路往前走。
也是这段时间,我想起之前有人提醒过我一句话:不要有学生思维。
什么是学生思维?
其中一种就是觉得:只要我努力了,只要我简历上看起来很强,那我投什么岗位都应该能过。
但实际不是这样。
公司把岗位分得那么细,就是因为每个岗位要的人不一样。你会很多东西当然是好事,但如果这些东西不是这个岗位最需要的,那它们在面试里就不一定有用。
也就是说,找实习不是考试。
考试是你会得越多越好,岗位匹配是你会的东西刚好要对方有用。
这也是为什么我后来每投一个岗位,都会单独改一版简历。我前前后后改了 7 版简历。不是简单换个岗位名,而是重新调整项目描述、技术重点、表达顺序。
我开始反问自己:
既然我本来就是想找引擎,为什么不直接投引擎?
引擎岗位可能要求更高,但至少它和我的项目、兴趣、准备方向是匹配的。与其投一个看起来门槛低一点但方向不对的岗位,不如直接去投真正相关的岗位。
于是我在 Boss 上看到一个小公司招游戏引擎,就投了一下。同时腾讯那边我也重新改了简历,不再投客户端,直接投引擎相关岗位。
结果挺意外。
小公司很快约面,腾讯也很快约面。
于是我又开始了一周的备考。
小公司的面试在腾讯面试前一天,我本来是把它当成练习。但面下来发现和我预期差别挺大,问了很多工程八股和工具链细节,甚至问到创建库要用 CMake 的哪个函数。
当时我有点懵。
因为我确实一直都在用 CMake,但很多东西只是会用,没有系统整理过。面完之后我也意识到,构建系统、工程组织这些东西不能只停留在“能跑就行”的状态。
第二天就是腾讯一面。
一面结束之后,又进入了熟悉的煎熬阶段。
不知道为什么,中间泡了两周才约二面。但这两周对我来说反而也有用,因为我继续把项目、图形学基础、渲染管线这些东西又巩固了一遍。
这也是为什么我现在很认同那句话:不要等完全准备好再投。
因为很多流程本来就很长,你完全可以在流程中继续补。只要不是完全裸奔,边投边补有时候反而效率更高。
二面似乎是交叉面。
比较搞的是,我前面花了很多时间把渲染这块学熟,结果二面重点又不问渲染了,问了 ECS 和 C# 脚本系统的具体实现。
而这块刚好不是我项目里最重点的部分。
面完之后我整个人基本万念俱灰,感觉应该是凉了。
但很意外,二面居然过了。
而且没有三面,直接 HR 面。
HR 面完之后进入录用评估,又等了一周,最后 HR 联系我发了 offer。
♪³ 最后
回头看这五个月,我觉得最重要的不是“我学了多少东西”,而是我慢慢搞明白了找实习这件事到底在找什么。
一开始我会觉得,只要我项目足够多,简历足够强,就应该能过。
后来发现不是。
岗位匹配比“看起来强”更重要。
你要让面试官看到:你过去做的东西、现在会的东西、接下来想做的东西,和这个岗位是连在一起的。不是把所有经历都堆上去,而是把最相关的东西讲清楚。
所以我后期最重要的动作,其实不是疯狂海投,而是每个岗位都重新改简历。
我不知道那些一天投上百份简历的人是怎么做到的,反正我做不到。我个人还是更倾向于追求质量,而不是数量。至少对我来说,真正有效的不是多投,而是投得更准。
当然,这里面也有运气。
游戏引擎岗位本来就少,能遇到合适的机会,流程还能走到最后,确实不是纯靠努力就能解释的。
但如果没有前面几次挂掉,没有每次挂完之后去补一个具体问题,后面就算机会来了,我也接不住。
所以这段经历对我最大的意义,可能不是拿到了一个 offer,而是让我确认了一件事:
方向可以先选定,能力可以边走边补。失败也不是纯粹的失败,只要每次失败之后,你真的改掉了一个具体问题。
