面試

企鵝
 
筆試:
因爲武漢的筆試是第二批城市,所以參加筆試之前,就先看了下第一批城市的筆試題,出的既有難度又有廣度,涉及了方方面面。但是第二批城市的筆試題卻略水,估計這應該就是企鵝簡歷不怎麼刷人,筆試也不怎麼刷人的原因。
 
一面:
面試官是一帥哥,看了下我簡歷,我簡歷上寫的大大的應聘遊戲後臺開發幾個字,就先讓我談了下對遊戲後臺開發的理解。我當時也不瞭解面試官是做SNSGame的還是MMO,所以就談了下對MMO的理解,client的主循環,server的主循環,網關,邏輯節點,數據服務等等。
然後問了下我的專業主要是幹嘛的,我簡單的說了下,他說那也就是說主要是做client的,我一聽不淡定了,連忙抓起簡歷指着之前做過的GIS工程項目說了下里面的架構,以及對後臺的理解,抽象出了交互層,將交互層描述爲client,之後的節點其實都屬於後臺等等,可以無縫遷移到其他物理節點上去。順水推舟的就按數據流講了下整個項目的架構,用到的各種設計模式等等。
接着就開始對簡歷技能一項項問了。
先是TCP方面的,問了下我讀過的TCP相關的書,問了四次握手的詳細過程,不過這時對內核理解還不夠深入,幸好沒有問內核中協議棧的相關實現。只回答了四次發包以及內核buff中的對應狀態改變流程。
問了TIME_WAIT狀態,答了兩個點,又問了下TCP頭長度,我就完全憑直覺的說出來20字節。
然後開始問linux內核方面的。
問到了slab層,我講了下里面對每個kmem_cache維護的相關聯的三種鏈表,最後總結下就是一個稍微複雜點的內存池,在之前提到的項目裏也用了比較類似的理念。
問了linux中的線程比傳統unix的線程特殊在什麼地方。我詳細講了下clone系統調用時根據傳參的不同確定的是線程或進程。
問了C進程地址空間的結構。分別講了下內核空間和用戶空間,用戶空間從高地址到低地址依次說了下佈局,看得出面試官對回答還是挺滿意的。
又問了問常見的同步問題,這塊因爲平時接觸的不多,當時挺擔心讓手寫個生產者消費者代碼的,所以我就大概說了下常見的幾種情境,讀寫者,扯了扯哲學家問題。
然後開始問socket編程。
先讓解釋了下非阻塞I/O,怎麼設置,設置了之後socket層的緩衝區怎麼操作,這塊當時理解還不透徹,簡單的說了下我的理解就算pass了。
問了send調用返回小整數表示什麼,底層機制如何,這個答的我自己都不知在說啥了,哎。
socket緩衝區的大小怎麼設置,這個忘記對應的參數了。
問了我一些linux常用的命令和參數。
然後問了個開放性問題,海量用戶login_logout數據,統計畫出在線人數曲線圖,這個挺扯的,不展開說了。
最後寫個coding題,寫strstr函數。
 
二面:
面試官一口廣東口音,上來先看我演示了下我的某個項目,因爲是.Net寫的所以也沒想多講,就趕緊關掉演示了。然後面試官開始出題。
先讓我設計一個魔方遊戲的數據結構。當時狀態不佳,沒想明白要考察什麼,所以就說一個三維數組直接簡單粗暴了。
然後給了一個場景,如果某個遊戲不允許多個id同時登錄,後臺應該採取什麼策略。這個其實每個id存個session,接到相同id的登錄請求時給原先的id對應的socket發個包踢掉即可。
問了下反作弊系統如何實現,說實話問到這裏我感覺這個面試官像是client出身,因爲client會考慮反作弊多一些,我對這些完全不太瞭解,只能嘗試性的說協議加密做好,client做響應策略blabla。
面試官似乎對答案不太滿意,然後又問了外掛的實現方式,我先說了個抓包,解析,然後僞裝一下簽名發包。然後他問我具體的流程,這我完全不瞭解,就pass掉了。
然後面試官說看我也瞭解不少的clientGUI庫,講一下共通之處。我大概講了下我的理解,包括分層的理念,包括模型的取捨方面。
之後問了一個問題是不能用腳本的情況下,client怎麼樣可以在運行時動態地執行一段server傳來的代碼,這種開放性問題我感覺是完全不用考慮邏輯的問題,只要給一個方案就可以。我直接的想法就是client這邊直接匿名映射一塊可執行虛存,然後在一個虛擬機中直接跑這段字節碼。
最後又講了下項目。
 
HR面:
忽略掉。

之後在企鵝實習了三個月,拿到offer,回到學校調整下自己,順便抱着試試的心態投了幾個公司。

阿里

筆試:

難度雖然不是很難,但是也不算簡單。並不側重C++的高級機制的考查,原因想必是因爲阿里大部分業務都是java主打的。

一面:

先讓我進行了自我介紹,講實習講項目。問了一個很無聊的題,一個成員函數聲明的語句中,const可以出現在哪裏,各什麼作用。我先講了參數前面的,成員函數末尾的,返回值的猶豫了下沒講,因爲修飾返回值的印象中只能修飾指針類型和引用類型。然後問了linux頁表機制,詳細講了下兩級頁表的底層實現,講的有點問題,不過馬馬虎虎過了。然後問了紅黑樹,當時完全忘掉。問了下數據庫的事務概念,我大概講了下,然後面試官讓我想一下如果要讓我實現一個事務應該怎麼做,我先是提出了打log,然後他說這樣不行,每個原子操作還是有可能失敗,我想了下說記錄狀態,並且引申到我在學校做的GIS工程的緩衝層的實現trick,到這裏他對這個回答還算是比較滿意了。
最後問了個coding題,從1到n拿出來1個,找出這一個,直接給了一個遍歷的方案,然後問拿出來兩個,這個我考慮了下給了位圖或者hash,他問有沒有更優的,想了一會兒沒想出,後來仔細研究了研究,上套了,跟第一種方法一樣再構造一個方程就行了。最後讓我寫了下位圖方式的代碼。
 
二面:
完全是看簡歷聊天,問了rpc的看法,給我推薦了個框架叫ICE。又問了問我對各種比賽對自己的影響的看法。問了各種blabla,總之沒問太多技術問題,比較蛋疼。
 
阿里的效率真是出奇的高,沒幾天就通知籤offer去了,籤offer現場還發了以前一直想看的一本書《淘寶技術這十年》,之前是在子柳的blog上零散的看着,瞭解了些號稱國內最牛逼的分佈式基礎設施,只可惜我到的太晚了沒拿到書,遺憾。
 
人人
 
筆試:
有一定難度,涉及到很多算法,智力題,並且筆試刷人的標準應該是高於BAT的。
 
一面:
首先自我介紹,講實習,然後面試官讓我詳細講了做的某個東西。
然後給了個題,實現帶min接口的棧,一開始我只給了一個帶緩存的實現,然後在面試官的提示下才寫了一個記錄每次插入刪除min狀態的棧,如果再壓縮下就是再開一個棧來實現狀態的維護。
接着又給了個題,最大子數組和,向面試官確認了下空數組是否算子數組之一,也就是全負數組的最大和是最大負數還是0這個特殊的case。然後就寫了下狀態轉移式,得到肯定後開始code。
然後提問階段,問了幾個關於人人那邊的情況。
 
二面:
上來先給了個題,兩個不嚴格遞增單鏈表歸併爲一個嚴格遞增單鏈表。
當時狀態不佳,不知怎麼的腦抽了直接用了二級指針,寫着寫着發現自己把自己坑了,要從頭開始改代碼,直接自暴自棄了,硬着頭皮寫完讓面試官看了下,給找出了N多錯誤。。無奈了。。
面試官這時說了幾句,面試中問到的coding題都是非常簡單的,準備下完全沒問題,coding題的答題質量直接決定了最終的offer錢數,當時心裏咯噔一下,哎。。
讓我講一個有意思的項目,因爲我一面剛講實習的時候做的某東西,所以這次打算講講學校裏的,這時被他鄙視了番。我最終還是講了GIS工程的作品,重點講了緩衝層,包括不寫穿策略,在該層基礎上做撤銷回復,以及抽出緩衝層的目的是建立公共服務,服務多個client節點等等。這時面試官提出了一個比較深入的問題,那就是緩衝層假設爲一個節點的話,容災如何做,因爲以前從來沒考慮過這個問題,只能給出打log這種低級策略,掛的時候按log還原,他對此表示很不屑,說硬盤掛了怎麼辦,我說那可以主備,但是具體的沒用過所以詳細的也不知道了。
然後又開始問Redis的問題,問我用了多少,我說基本沒用多少。。問怎麼做序列化,我說沒了解過,自己寫的demo屬於非常簡單的那種。。哎
但是最後說還是會有三面,我驚訝代碼寫這麼爛還有三面,他說這是他綜合考慮的結果。
最後提問階段問了人人那邊的存儲主要用什麼,回答比較令我驚訝,居然是淘寶的tair,也是基於GFS那篇經典paper實現的。
 
三面:
有種壓力面的感覺。
上來先氣勢洶洶的讓我講dijskra,講完嫌我說的比較囉嗦,還說描述的有問題,讓我回去好好看看書。。上來直接壓過來。然後讓我講基數排序,我直說忘了,又讓我說堆排序,我blabla。然後開始問TCP的一些機制,CLOSE_WAIT狀態,一開始沒什麼印象,問了下面試官是不是問的TIME_WAIT,顯然被鄙視了,所以又想了下,關閉連接的四次握手就兩個狀態是被動的,TIME_WAIT是主動關閉,那CLOSE_WAIT就是被動關閉方的狀態了,嘗試說了出來,這個問題算是過了。後面問滑動窗口協議和keepalive機制都比較基礎,直接答出。
然後開始問C++的問題,讓我直接解釋什麼是隱藏,一點提示都不給,我想了半天只好說不知道,後來查了下是非虛函數的標識符污染相關的,確實之前沒關注過。然後問了一些比較經典的問題,構造函數調虛函數,構造函數可不可以是虛函數等。
然後讓我解釋多態,這點我就直接說自己也算是玩過了很多種範式的語言,總結一下,多態就是運行時向同一實例發送同一消息產生不同響應,他對這個回答比較滿意。
又問我關於boost::ASIO的問題,我直接說沒用過。
面試官這時看到我簡歷上提到了分佈式系統設計,就開始問分佈式相關的問題,讓我畫一個遊戲的架構,然後以數據流向爲線索問每個節點的作用,節點怎麼做容災,當時對容災完全沒什麼概念,所以答的較爛,有些基本概念還搞錯了。
又問了一些我對社交網絡和遊戲的看法blabla。
最後提問環節,我重點問了下分佈式相關的問題,包括人人那邊狀態節點如何在,他也回答得很直接,全做成無狀態。其他還有一些問題blabla。
 
人人的效率比較一般,三輪面試每天一輪,然後三面當天下午offer面。
 
網易雷火遊戲
筆試:
分成兩卷,一卷有各種數學問題,智力題,計算機基礎知識題。涉及到計算機組成原理,操作系統,編譯原理,數據結構與算法,TCP/IP,C和C++的一些語法細節。
二卷有四道coding題,一道編譯原理的,一道bloom filter。
總共三個小時,我估計是沒有人能做完的。
 
面試:
一面是三個工程師交叉面試,應該是爲了公平起見。
 
第一位面試官,首先讓我做了自我介紹。我重點強調了暑假的實習中做的某三個靠譜一點的東西,然後提到我前幾天剛看了網易的pomelo,並且重點關注了其中的aoi、rpc、sync模塊的實現blabla。
 
這時面試官似乎來了興趣,讓我解釋下里面的aoi算法。pomelo中的aoi算法實現的還是很簡單的,就是傳統的燈塔算法,我就大概解釋了下,包括一個PC從一個aoi區域移動到另一個aoi區域時,aoi對象狀態的變化等等。本來還打算表達下我還知道有一種十字鏈表的aoi算法,後來想想也沒研究過說出來估計被虐就作罷了。
 
然後面試官重點關注了下實習中做的某個東西,我就從節點、協議、cache狀態、災備等幾個方面先簡單介紹了下,接着說了下跟這個業務相關的一些邏輯的流程,然後重點說了下我自己做的部分。
 
之後面試官就開始對着簡歷一個一個問了,先是看到了之前做過的一個.Net項目,直接讓我說c#的gc如何實現。我這直接傻眼了,之前經常一看到講javaGC的blog都是直接關,沒想到栽這上面了。記得之前看的gc的英文wiki頁面,掃了一遍完全不懂,只記得有種算法的名字叫mark&sweep,而且當時也不太確定引用計數算不算gc的一種。不過稍微穩定了一下,我試着問面試官可不可以給一個自己在實現一個gc的時候會用到的簡單算法。得到了面試官的肯定之後,我就想了下怎麼構思一種gc,並給出了一個很樸素的方案,定期執行如下過程:堆中內存每一字都解釋爲一個指針,如果有一個字沒有被任何其他字指向,就進行回收。這樣的漏洞很明顯,面試官直接就指出循環引用的情況,我只好回答避免循環引用泄露的方法我忘記了。
接着又問了C#和c++泛型的區別,這個不瞭解,只是猜測了下C#會對泛型具現化的類型的維護更多的運行時信息。後來回來查了下,差別確實不小
又問了有沒有做過一個server,epoll循環的問題,epoll的內核實現的問題,我就從文件系統的poll接口到epoll的回調模型講了下,又問觸發模式,就講了Edge Level blabla。
 
接着又看到了某個win32的項目,讓我介紹下這個項目中的亮點。我先是講了下里面參考.Net的實體框架做出來的一個db-logic之間的cache層,記錄狀態,方便進行操作的撤銷恢復等等。感覺面試官好像沒太大興趣的樣子,面試官問了下這個GUI用的是什麼,我說MFC,同時抓住這個機會開始介紹這個項目的UI層的抽象的設計。我介紹了這個交互邏輯層是利用狀態模式進行的抽象,交互部分的邏輯完全與UI框架分離,點一個按鈕只是改變了系統交互模塊狀態機的狀態。面試官一針見血的問道,那這個交互過程中會有數據的改變造成UI的狀態發生變化的情況嗎,我思考了下,直言這部分是不能做到UI框架無關的,只能每種UI框架進行單獨適配,面試官聽了也表示了認可。
 
然後面試官注意到了一個rpc的項目,我也介紹了下背景並表示這個目前還只是一個初步的想法。
 
又問了我瞭解不瞭解一些圖形引擎,我說我之前基於Ogre寫過一個小東西,面試官讓我說下Ogre引擎的啓動流程,我嘗試性地回憶今年初搞Ogre時的印象,也只想出個大致,給他描述了下,加載渲染接口,加載插件,加載配置,初試化根對象,然後根據場景樹依次初始化等等。他又問了插件都有哪些,我說了只記得一個地形渲染器blabla。然後又問如何在win的主循環中嵌入Ogre的主循環,這點還是印象比較深刻的,於是就對win32的事件主循環展開說了blabla。
 
又問了下我平時的編碼環境,我回答win下寫好代碼,同步到跳板機上,make+gdb+vim調整。面試官又問了下gdb相關的問題,我說了下我常用的指令,並且舉了個編譯hello_world並調試的例子,然後又問我core文件,我就直說進程地址空間的快照,又問了常見的core的原因,我答了遇到某些無法處理的信號的時候會core,典型如段錯誤。
 
最後給了道代碼題,讓把一個遞歸轉成循環,先跟面試官確認了下不用考慮溢出的問題,我就直接給了一個O(n)的實現,寫完代碼給面試官看的時候順便提了一個對數實現的。
 
然後是問問題環節,我重點問了下面試官項目裏的aoi和rpc的實現,沒想到他們還真是用的十字鏈表,並給我大致介紹了下他們的團隊是怎麼評估十字鏈表的方案和燈塔的方案的,感覺收穫不小。
 
第二位面試官,似乎對我簡歷中看過上百本計算機經典名著這個槽點比較感興趣,先讓我講了印象最深的一本書,我講了CSAPP,並表示這是我linux的啓蒙書。但是比較驚訝的是面試官說他不怎麼看這本書,還問我看的是不是英文,說看中文會被鄙視的,又問了問有沒有看過其他書。我說了Stevens的UNP和APUE,他笑着說這些都是老掉牙的技術了,現在誰還用這種同步模型。我又無奈,說我還看過Stevens的TCP/IP詳解第一卷,他對這個來了興趣,說這個還不錯,肯定又看的中文吧。。(已崩潰..)然後又問我看了什麼語言相關的書,我說我C語言這塊看的是TCPL,C++primer則是我的碼農生涯啓蒙書,他除了吐槽我看的中文版外對看書的選擇倒是比較認可。他給我推薦了代碼大全,我說我買了但是還沒來得及看。同時我還說我大四打算看下SICP,他直接來了句我境界肯定沒到,讓我最好先看了龍書再說。。。
 
接着開始問項目,又講了一遍實習的東西。又說了一遍rpc的東西,講了我的將打包-發包-收包-解包的流程利用協程的語言級特性轉爲同步寫法的願景,結果他直說了這東西前途不大,並說每個遊戲程序員都在做這樣的嘗試,但是目前進展不大。然後我們又討論了一番,他的focus似乎還是在MMO的數據併發寫問題上,我因爲沒接觸過MMO也只得作罷,只闡述了下我的觀點。
 
又問到AI,我就講了講之前寫的一個小demo裏面的AI怎麼用的組合模式,怎麼寫的目標驅動,然後還提了下行爲樹,這時面試官就開始給我介紹他們隔壁的杭研院的同事寫了個可視化編輯行爲樹的東西,很方便blabla。
 
然後他問了一些c++的高級機制相關的問題。
上來先是一道這樣的題:
Class A{
//...
};
A *pa = new A();
A *pas = new A[NUM]();

1.delete []pas; //詳細流程
2.delete []pa; //會發生什麼
3.delete pas; //哪些指針會變成野指針
 
第一個問題回答的還可以,首先調用NUM次析構,然後直接一次底層的free,同時提到了delete過程中發生異常的情況。
第二個問題,我印象應該是有超出範圍的內存會被回收,具體的還沒查閱資料
第三個問題,答錯了,面試官給我詳細講了下,目測應該是他剛踩到了一個類似的坑-_-#!!
 
然後面試官問爲什麼不建議經常手動new和delete而以內存池取代。這個問題我上來直接說內存碎片和內存管理算法的複雜性,面試官不太滿意,後來直到我提到malloc調用本身的耗費,他才比較認可。讓我詳細講了下malloc函數本身涉及的幾種系統調用,我就從brk、mmap各種blabla,然後面試官說這時候可以開始講算法的複雜性了。。我就又講了兩種malloc可能的分配算法,一次適配二次適配等等,以及根據申請的塊大小的不同,分別是在堆的reserve中取還是直接mmap一個匿名內存映射,他還是不太滿意,我只得說我還了解一種內存分配的算法,夥伴算法,他似乎比較感興趣,讓我繼續講,我blabla,感覺面試官還是比較滿意的,直言面試到現在基本沒人能說出來夥伴算法這東西。
 
接着問了四種typecast操作符,當我說到static_cast類似於舊式的C強轉時候,他直接鄙視的說一句,教科書看多了吧。然後我說我看Ogre對static_cast操作符的重寫就是直接用的C語法強轉,然後他提示要從編譯器理解,看我一直沒回答到路上,就直接開始給我講解了,static_cast可以靜態決議出類型的轉換可能性,即使是在繼承體系中,即使包括了多重繼承和虛繼承,只要可以進行靜態決議就可以轉換成功。然後我又開始解釋dynamic_cast,安全的downcast和crosscast,不過好像忘記提對指針和引用的區別了,面試官也沒提,繼續說了const_cast,reinterpret_cast(提到這個的時候面試官說我是目前唯一一個發對音的。。)。
 
然後面試官就說虛表、對齊這些基礎的就不問了。然後就問我對圖形引擎瞭解不瞭解,我說了解不多,還是想從server做起,他說那server的競爭比較激烈啊,目前面試的基本都是做server的,只有幾個有client基礎,並且很鄙視的說了句server是個人都會啊,我直接無語了。。然後他說除非像xxx是內核級的(應該指的是旁邊一個面試官),我覺得還是得充個胖子就說我覺得我也是內核級的。然後他就說內核這些東西,不宜多看,裏面很多東西都是體系結構相關的,很多甚至是歷史遺留的,幫助不大blabla。
 
接着也順便問了下內核的問題,問線程與進程,面試官直接說你也不用說區別了,直接說linux裏分別怎麼實現的吧。我這點組織的比較亂,從POSIX規範規定的各種線程進程的概念,一直到內核裏對線程的特殊實現,clone系統調用指定的創建線程的參數等等,共享的、獨有的東西等等,講的還算比較全面。問了linux的兩級頁表,怎麼樣實現各進程的進程地址空間獨立的全部機制,相關的數據結構都聊了,page,vma,zone等等。
 
然後又問我linux中進程/線程的結構體結構,存放位置等等,我就大概講了下task_struct,thread_info等等的關係以及在進程地址空間中的位置。
 
面試官又注意到我在某個.Net項目裏面提到了fp,就很鄙視的問.Net還能fp,我就說用的lamda,然後他讓我解釋尾遞歸怎麼消除,我說我看過推導直接忘。。然後他用一種很通俗的方式給我講解了下,我豁然開朗,原來以前理解錯了。。最後他又跟我說學fp最好從haskell,lisp,erlang學起,其他的容易走入歧途。
 
最後直接告訴我他這邊我通過了,讓我去找第三個面試官。
 
第三個面試官,跟前兩個不一樣,屬於壓力面,一直在問問題從來不給提示或者反饋。
 
還是先自我介紹講實習講項目,然後他對項目提了一些問題,不知爲什麼他特別糾結於回包是怎麼回的,我直到面試快結束的時候才知道他是想了解這個協議的包結構怎麼確定,當時告訴他是通過一種DSL的方式在client和server兩邊各生成結構體進行解析。
 
然後注意到了我的某個win32項目用了postgreSQL,就讓我當場寫一個表達JOIN的SQL查詢語句,N久沒寫過SQL語句,實習以來接觸的完全是cache,都是NoSQL的,這直接無力了。。壓力面的情況下我直接放棄了。然後面試官直接開始後面的提問。
 
讓我寫一個包結構體,包的head和body都要包括進去,我就寫了一個帶union的struct,然後他問到怎麼樣根據body的類型算出後面多少字節的,我這時也算是明白過來直接他爲什麼糾結於回包問題,就多附加的講了下,說client和server兩邊生成的meta文件維護這些關係。
 
這位面試官對我的任何回答完全沒有反饋,讓我心裏很沒底。
 
後來開始問c++問題,問了下面代碼的輸出:
class A{
public:
int m;
void print() {cout << "A" << endl;}
};

A *pa = 0;
pa->print();
這點很明顯是c++的一些底層實現原理,可以理解爲這樣的C代碼:
void print(A *this) {cout << "A" << endl;}
A *pa = 0;
print_A(pa);
 
這樣顯然是不會發生段錯誤的,所以我就說了下c++的mangle以及以上提及的幾個編譯器轉換。
 
然後又在這題的基礎上改動了幾下問了一些關於虛表的問題,比較基礎。構造函數調虛函數的問題,也很基礎,從語義上和語法上分別闡述就可以了。
 
後來讓我寫一個頭文件,內容包括對一個數組的定義,同時保證該頭文件能被無限多次include,並保證程序不會出現問題。
 
這涉及到鏈接過程的強弱符號問題。
一個對數組的具體定義是一個強符號,而一個符號只能有一個強符號,可以有多個弱符號。
這樣的話,只要在頭文件中讓數組的定義只出現一次,而其他情況只要extern即可,具體的就不寫了,利用#ifndef來保證只有第一次#include的時候纔會定義強符號,其他情況弱符號就ok。
 
這樣一面就結束了。
 
下午的時候進行二面,三對一。目測應該分別是一個手遊組的主程,一個端遊組的主程,一個主管或總監級別人物。
 
首先還是自我介紹,講實習,講項目,講pomelo。
 
問了實習的一些問題,問了對pomelo的一些看法,我直說pomelo是前幾天纔看,之前完全不懂nodejs,感覺對nodejs感觸很大,事件模型,以及一些語法糖對程序員非常友好等等,並表示了pomelo的我重點關注的幾個模塊都採用的是最基礎的算法做的實現blabla。
 
然後問了對雲風的blog怎麼看待,包括對c的看法和c++的看法,我不知道這個問題的具體意義,猜測一下應該是看我簡歷上寫經常看大牛blog有沒有產生一些自己的思考有沒有盲從之類的。而且很明顯,雲風對c++一直持消極態度,非常偏向於c和lua,但是很明顯,做遊戲server的完全拋棄c++並不太現實,而且從之前面試的情況看,網易遊戲應該是c++爲主的,所以這裏我就表達了c++還是很有優勢的觀點,表達了自己還是比較偏向於c++的觀點。
 
接着旁邊一個更像是端遊主程的面試官問了幾個問題,關於STL的iterator都有哪些,紅黑樹的性質,這時中間boss又接過來問紅黑樹這種實現的意義何在,我就講到是一種工程中用來簡化AVL的trade-off,blabla。
 
然後又是慣例一般問我圖形學的東西,我說我大二看過OpenGL紅寶書,但是太久遠了早忘了,面試官讓我說說渲染管線,我憑着印象講了一點就放棄了。
 
後面是連珠炮的幾個關於分佈式問題,關於我簡歷上寫的protobuf和zmq,問了各種底層實現,我也直說pb的底層代碼一直沒看,但是瞭解到底層的編碼協議庫是pb高效的重要原因,並且說了句pb有google的光環加身所以顯得牛逼一些。。zmq只是說自己簡單用過一些,說了請求響應模型和發佈訂閱模型並模擬了幾種在mmo中可以應用的場景。被問到zmq可能應用在哪些方面的時候,消息隊列這玩意已經到嘴邊了但是因爲沒把握就是沒說出來有點後悔,消息隊列可以說是分佈式系統中的一個最基礎的設施。
 
又問了下對MMO的server如何理解,有哪些主要關注點,我就表達了最近的研究感悟,對比了下SNSGame和MMO的節點的區別,災備怎麼做,通信的關注點,協議方面,數據共享方面,還有單節點內的算法選擇。等等。
 
又問了下這次來面試的基本都是研究生,然後我作爲本科生有什麼優勢。這點我思考了下回答,暑假的實習具有遊戲開發的background,這裏他們都點頭表示了一定程度的認可,然後就是我對遊戲開發很有熱情,講了自己從小到大與遊戲開發的關係,包括帝國的地編,war3的地編,然後玩過的遊戲等等。最後強調了下學習能力,這個還是必須得強調下的。
 
最後端遊主程提了一個開放性問題,如果發現某塊代碼有bug,但是目前在運營中還沒出現錯誤,向PM申請排日程失敗,應該怎麼做。說實話,完全不明覺厲,隨便想了下,只好回答自己會先拉個tag,先嚐試重構一下,同時強調了下模塊編寫的測試驅動理念,每個模型應該具有可測試性,這樣的話就可以自己重構的時候保證原來的用例通過而bug解決,然後關鍵的時候作爲patch發佈。
 
網易雷火遊戲的面試就結束了,上午的一面持續了兩個半小時,中間完全沒有休息的進行車輪戰。下午二面就是終面,之後回武漢等通知。
 
 
總體來說的話,網易遊戲的筆試難度非常難,基本是完爆BAT的level,簡歷和筆試刷掉了很多同學,筆試題二卷有三道難度一般的coding題,和一個略有難度的算法題,這可能也是面試中不太重視coding的原因,因爲筆試已經進行了很好的篩選。面試的話比較關注skill-set是否和遊戲開發match,C++是主打語言,各種高級特性自然要爛熟於心,網絡的面試中沒怎麼碰到,應該是因爲暑假實習的原因,問網絡其實意義不大了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章