“不拼搏,枉少年!”—網易游戲
寫在前面:先介紹下自己的情況,末流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內部具體是怎么排序的。
上面的那些面試題,你不要期望會遇到原題。我沒有給出答案,大家如果感覺答不上來,可以問問自己是不是自己哪方面還欠缺。這些都是基礎問題,答不上來就有很大可能那方面知識沒有掌握好,繼續努力吧。
一家之言,希望大家都通過自己的努力能找到一個好工作!
--燃燈