面试软件设计人员的方法,附面试题。我的面试注重实效
前段時間招聘。因為我一直在我的部門推行一些有效卻被絕大多數(shù)中國公司忽視的開發(fā)理念,比如平級人事結構、測試驅動開發(fā)、制度化績效、設計先行、迭×××發(fā)等等,所以招軟件設計師非常困難。最終問題還算解決了吧。以下是我的面試總結。
一般來說,作為迎接面試的人,我會借著詢問路況、接引進會議室或者索要簡歷,來表達出自己的禮貌,讓對方有一定緊張感。這樣我認為有利于對方表現(xiàn)出自然狀態(tài)的思路。
然后我會根據(jù)簡歷,大概咨詢下對方工作中所做過的設計工作。 因為我在招軟件設計師,所以只問設計,看看他對設計的理解是什么樣子。通過這種詢問,可以考察對方的簡歷是否作假,如果作假那么無法明確講述其過往工作。 還需要看對方的表達能力,即主動展現(xiàn)自己思路的能力。按照我這一批面試的人看,大多數(shù)人會講述其項目經(jīng)歷的業(yè)務或者架構。只有一個人能夠把軟件設計和架構 設計、軟件開發(fā)分離出來。
然后就會開始做面試題了。面試題附在下邊。我會先讓其看第一大題,設計能力,請ta選擇一道題目作答。看題之后, 對方一般會陷入思考沉默。那么根據(jù)對方眼神不再在題目間掃動,表示對方已經(jīng)針對某一個題目思考。當然,如果是溝通能力好的人,這這之前會主動告訴我,ta 準備作答哪道題目。此時需要打斷沉默,對對方說,希望對方談一談想法,任何一點想法都可以說出來。這個時候如果對方能夠針對題目問一些具體沒表示明白的細 節(jié),或者自行設定細節(jié),都表明此人溝通能力極好,否則應該認為其溝通能力打折扣。
當對方陸陸續(xù)續(xù)講述自己的設計時,作為面試的人,需要指出其沒有 思考到的地方,或者贊揚對方想的很合理。一般來說,面試的人在經(jīng)歷了之前的客套和緊張之后,不太容易沉下心來仔細思考。凡是這時候依然能保持有序高效的思 考能力,說明這個人抗壓能力極強,至少是心理調(diào)節(jié)能力極好。通過這時的回答,就可以看出此人對設計是否了解,設計能力怎么樣。
以 1.1 為例,我隨便說幾個要點。比如說,我們應該抽象出牌局狀態(tài)這么一個類,作為傳輸給每一個玩家的內(nèi)容。比如 說,我們可以抽象出一張牌這么一類,作為出牌的玩家上報的內(nèi)容。比如說,此場景應該有一個短連接請求處理類,還應該有一個房間控制類;房間控制類里邊維護 一個個開通的房間;當每一個進入房間的請求來臨時,都應該通過房間控制類,將連接轉移到這個對應的房間編號;那么房間編號可以由客戶端通過參數(shù)傳遞上來。 比如說,每一個房間能夠維護一組長連接,這可以開一個線程來處理;線程由一個單例的線程維護器對象來啟動。比如說,房間在新線程中執(zhí)行的代碼,應該是輪詢 每個長連接看誰發(fā)來了“牌”,然后調(diào)用數(shù)據(jù)計算模塊,通過牌和原有牌局(保存在房間對象里),得到新牌局,發(fā)送給每一個連接。當然了,如果能對斷鏈識別什 么的做出設計就更好了。不過控制此題時間不要超過 10 分鐘,所以一般不可能講述出太多內(nèi)容。
接下來,要根據(jù)剛才設計方面的能力,中轉到 2 或者 3 。如果設計能力不錯,則應該轉移到 3 ;如果設計能力不好,則應該轉移到 2 。這個設計能力的好不好,是根據(jù)面試者覺得達標不達標,夠用不夠用來說的。
先來說說轉到 2 編程能力測試的情況。首先,應讓其在 2.1 和 2.2 中選一道作答。2.1 的要點,是建立合適的數(shù)據(jù)結構。最佳的是 money 與 id 雙排序的基礎對象構建的 TreeSet ,通過 NavigableSet 提供的子樹功能,以 size() 獲取名次。自己前后幾位可通過正反向迭代器取得。當然,也可以使用鏈表和散列集合的二重結構。這要慢不少,但是也還算在可接受范圍內(nèi)能實現(xiàn)功能。
此題非常多的面試者會聯(lián)想到 SQL 的 order by 子句。問題是這些人應該設計不出合適的二維表結構,配合 SQL 實現(xiàn)想要的功能。如果面試者能夠實現(xiàn),那也至少算能夠做出來一種實現(xiàn),不應苛求。
2.2 我認為用二維表傳統(tǒng)關系型數(shù)據(jù)庫很合適。應該有二個表,一個是歷史表,一個是實際操作記錄表。每次受影響玩家登錄,都會激活從實際操作記錄表到歷史記錄表的總結過程;這是一種最小型的數(shù)據(jù)挖掘。受試者能夠正確寫出總結過程,能夠正確寫出讀取歷史表的合并過程,則是滿分。
編程過程測試,可以隨時提供設計思路指導。旨在督促受試者利用短暫 的面試時間,認真思考,發(fā)揮出最強的思維能力,以檢測其通過自己思考解決問題的水平。如果能在不斷的設計方案提示下,指出語句寫法,則應該認為設計能力為 零,但編程基本功很扎實。如果算法也需要提示,則認為編寫程序的技能本身不好,但語言知識尚可。
做完 2.1 和 2.2 其中一題,應準備查資料的條件,也就是連接互聯(lián)網(wǎng)的瀏覽器,讓其做第 3 題。如果其對 Java5.0 多線 程類庫非常了解,則認為此人關注技術新聞,有很強的技術敏感性和學習能力。否則則應通過觀察其查資料選用關鍵詞的方式、查看內(nèi)容的耐心敏感度,來判斷此人 的學習能力和心性。至此,您應該對面試的人有了較全面的認識。推薦記錄下來,以便比較不同的面試者,誰綜合看來更適用。
我們再來說說直接從 1 題轉移到 3 題的情況。同樣是 3.1 和 3.2 選做一題,來測試受試者的架構能力。以和設計能力測評同樣的節(jié)奏進入互動,然后探尋受試者思路。架構的核心,在于指派分布,即指派哪些邏輯運行在什么地 方,以及這些“地方”的布局方式。非常多的受試者無法分清軟件設計和架構設計的區(qū)別。每當這個時候,面試官就應該主動給受試者講述架構的含義,同時記錄受 試者不具備可用的架構工作經(jīng)驗,但應根據(jù)接下來的思路表現(xiàn),來判斷其架構見識、思路以及資質。
3.1 的要點在于網(wǎng)絡存檔應該與應用服務分離。應用服務做負載均衡的話,應制作單獨的數(shù)據(jù)服務以支持網(wǎng)絡存檔。這樣可以保證無論是運營后臺還是玩家都能夠看到全 部的數(shù)據(jù)。如果受試者無法擺脫分區(qū)的概念,則應指出,運營后臺頁面,能夠選擇分區(qū),每次選擇,程序能夠連接到不同區(qū)的數(shù)據(jù)服務。
3.2 首先這種全球性質或者打地理范圍的系統(tǒng),肯定要使用地域分流的域名服務(DNS)負載均衡。那么也需要建立專門的用戶數(shù)據(jù)傳輸機制,以保證用戶大范圍移動物理位置之時,能夠在對應區(qū)域取得自己的數(shù)據(jù)。為此,也就需要設置統(tǒng)一的數(shù)據(jù)中心,以登記不同區(qū)域的位置關系以及服務器地址。考慮到系統(tǒng)不可能一次性完成,使用能夠自動加載的云基礎結構,應該會是一個最合理的選擇。
通過架構測評,如果受試者能夠展現(xiàn)出關于自由軟件的很多知識,則 說明此人在技術進步上有較高追求。架構這邊如果用時很短,也就是受試者表示出了對架構的恐懼和放棄,應該認為受試者面對困難問題的解決決心堅韌程度打折 扣。這時應將其引導至 2.3 題,以考察其通過查資料解決問題的水平和心性。面試完畢之后,您應該記錄面試情況,以便比較不同的面試者,誰綜合看來更適用。
最后我想說一句。很多面試官都相信自己對受試者的感覺。其實面試流程的目的,就是通過流程,讓受試者更多地表現(xiàn)自己,以豐富面試官的感覺,以防以偏概全、認識不足等情況發(fā)生。
下邊附面試題目
1 設計能力(選做其一)
---------- ---------- ---------- ----------
1.1 現(xiàn)有多人卡牌游戲,由用戶根據(jù)場上情況出牌。玩家出的牌可被其它玩家看到。每一種游戲牌將會對場上局面造成某些影響。請設計本游戲服務器端關于數(shù)據(jù)傳輸部分;其它部分如需指明,也可以指出。
1.2 現(xiàn)有某軍事對戰(zhàn)型網(wǎng)絡游戲。架構設計安排在戰(zhàn)斗發(fā)起之前,通過短連接方式進行信息處理。對戰(zhàn)為一對一,對戰(zhàn)開始之后,進行長連接,傳輸雙方對軍隊控制的操作。請設計本游戲開始建立長連接以及傳輸操作數(shù)據(jù)部分的服務器程序。
2 編程能力(2.1 和 2.2 選作其一)
---------- ---------- ---------- ----------
2.1 數(shù)據(jù)結構
有一種數(shù)據(jù),結構是
{
??? id: 38,
??? name: "Shane",
??? money: 3010.50
}
數(shù)據(jù)量大概有 100 0000 份。
請你設計一種方式,能夠支持以下要求。
首先,需要能往已有數(shù)據(jù)集里邊追加數(shù)據(jù)。如果 id 重復,則為修改。
其次,需要得到某指定 id 對應的人,全部數(shù)據(jù)按照 money 排序,其所在的名次。此過程不能太慢。
最后,能得到這個 id 對應的人,全部數(shù)據(jù)按照 money 排序,其名次的前、后幾名的 name 。此過程不能太慢。
2.2 邏輯
一個社交游戲,玩家可以互相訪問,并在訪問時對對方進行某些操作。被訪問的人在登錄時統(tǒng)一接收上次登錄到這次登錄之間被訪問的報告。
獲取記錄通過 InteractSysRecord.INST.getRecord(int userId) 方法,獲得一個 List<ActRecord> 。
ActRecord 具有如下屬性
int fromUserId
int toUserId
Kind actKind
int actEffect
其中 Kind 是一個枚舉,包括一些類型,比如“贈送禮金”、“傷害”、“偷錢”等。
玩家獲取的記錄,需要按人整理。也就是說,在一個玩家登錄之時,與其上次登錄之間,某一另外玩家多次訪問此玩家生成的多個 ActRecord ,應該合成一條。
請編程完成記錄整理。允許設計合理的 InteractSysRecord 結構。
2.3 多線程(允許查資料,希望觀點能獨特、精辟、有實效)
請簡述 Java5.0 多線程框架的機制和要點
3 架構能力(選做其一)
---------- ---------- ---------- ----------
3.1 請為如下功能需求設計架構。文字或圖示都行。
現(xiàn)有某多客戶端弱聯(lián)網(wǎng)網(wǎng)絡游戲,需要實現(xiàn)網(wǎng)絡存檔。請簡述網(wǎng)絡游戲存檔的架構方案。注意,后臺操作人員應該能任意查看、修改任何人的存檔。要求說明設計理由。
3.2 現(xiàn)有基于位置的移動網(wǎng)絡游戲。在游戲界面中,當玩家離開自己實際位置之時,就會在游戲中受到一個吸引力,吸引游戲中的角色回到玩家現(xiàn)實中的位置。此吸引力隨著距離增加而增加。所有的玩家在統(tǒng)一的世界地圖上進行對戰(zhàn)。請設計此網(wǎng)絡游戲的架構方案。并說明設計理由。
本日志也發(fā)表在我的 CSDN 主頁: http://blog.csdn.net/shanelooli/article/details/8155765
發(fā)表在我的 ITeye 主頁: http://surmounting.iteye.com/blog/1717879
發(fā)表在我的中國開源社區(qū)主頁: http://my.oschina.net/shane1984/blog/87480
轉載于:https://blog.51cto.com/shanelooli/1052248
總結
以上是生活随笔為你收集整理的面试软件设计人员的方法,附面试题。我的面试注重实效的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 霍兰德SC型如何选专业?霍兰德职业兴趣测
- 下一篇: 整合axis2到web项目中