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