程序員面試介紹項(xiàng)目經(jīng)驗(yàn)
程序員面試介紹項(xiàng)目經(jīng)驗(yàn)
在面試中,考官通過(guò)看你的簡(jiǎn)歷或者你的介紹來(lái)了解你所做的項(xiàng)目,那么考官肯定想更詳細(xì)的了解您的項(xiàng)目,看是不是與你的簡(jiǎn)歷寫(xiě)的項(xiàng)目經(jīng)驗(yàn)一致。也就是考核你是否具有真實(shí)的項(xiàng)目經(jīng)驗(yàn)。一般來(lái)說(shuō),在你的簡(jiǎn)歷至少有一個(gè)重點(diǎn)項(xiàng)目,放在簡(jiǎn)歷項(xiàng)目經(jīng)驗(yàn)欄的第一位。把項(xiàng)目的業(yè)務(wù)功能描述清楚。在這里你就是重點(diǎn)談一個(gè)項(xiàng)目就可以了。學(xué)習(xí)啦小編教你如何從下面幾個(gè)方面來(lái)進(jìn)行陳述
程序員面試介紹項(xiàng)目經(jīng)驗(yàn)
1. 用一句話簡(jiǎn)述項(xiàng)目
2. 詳細(xì)的列出項(xiàng)目實(shí)現(xiàn)的功能
3. 說(shuō)出項(xiàng)目實(shí)現(xiàn)的技術(shù)和架構(gòu),能說(shuō)出項(xiàng)目的不尋常之處,比如采用了某項(xiàng)新技術(shù),采用了良好的架框等
4. 能讓別人感覺(jué)出項(xiàng)目的規(guī)模
5. 說(shuō)出你在項(xiàng)目中的責(zé)任
通過(guò)這些來(lái)證明你是的確開(kāi)發(fā)過(guò)了這個(gè)項(xiàng)目,并且這個(gè)項(xiàng)目是一個(gè)真實(shí)的。還有就是你是真正具有項(xiàng)目經(jīng)驗(yàn)的。合乎企業(yè)的用人需要。
特別注意要把項(xiàng)目所實(shí)現(xiàn)的功能描述得越詳細(xì)越好。當(dāng)然用詞要簡(jiǎn)潔,表達(dá)要流利。其次要盡可能采用專業(yè)術(shù)語(yǔ),顯得你的專業(yè)。不要犯低級(jí)錯(cuò)誤。
請(qǐng)記住,你要描述的是整個(gè)項(xiàng)目而不僅僅是你做的那一個(gè)模塊。有些項(xiàng)目你只參與了其中一個(gè)模塊,但是你要把整個(gè)項(xiàng)目描述出來(lái),不要僅僅描述你參與的那一個(gè)模塊。
說(shuō)出你項(xiàng)目采用的技術(shù)及架構(gòu),還要能說(shuō)明你在項(xiàng)目中的責(zé)任。
回答實(shí)例:
面試官:令狐沖,能介紹一下你做的大宋俠士綜合管理平臺(tái)吧!
令狐沖:好的,大宋俠士綜合管理平臺(tái)是為大宋武林聯(lián)盟開(kāi)發(fā)的,實(shí)現(xiàn)武林聯(lián)盟管理的自動(dòng)化。大宋俠士綜合管理平臺(tái)能夠自動(dòng)收集大宋各路俠士,英雄好漢,隱居高人信息并對(duì)他們的個(gè)人信息及所作所為進(jìn)行跟蹤管理,實(shí)現(xiàn)俠士信息維護(hù),查詢.俠義事件維護(hù),俠士等級(jí)管理,俠士獎(jiǎng)懲管理,俠義活動(dòng)發(fā)布,抗災(zāi)募捐管理等。
系統(tǒng)基于B/S三層架構(gòu),采用Spring + Hibernate + Spring MVC框架.使用Oracle 數(shù)據(jù)庫(kù).
本項(xiàng)目只投入15個(gè)人,開(kāi)發(fā)周期為6個(gè)月。本人在項(xiàng)目中進(jìn)行了前期的需求分析,系統(tǒng)架構(gòu)實(shí)現(xiàn),數(shù)據(jù)庫(kù)建模,及部分編碼工作。
問(wèn)題之三、談?wù)勀銈兪窃趺磳?duì)這個(gè)項(xiàng)目進(jìn)行開(kāi)發(fā)的?(談?wù)勀銈兪窃趺催M(jìn)行項(xiàng)目開(kāi)發(fā)的?)
分析:這個(gè)問(wèn)題是考核你是否熟悉軟件開(kāi)發(fā)的流程,同時(shí)也是考核你的項(xiàng)目經(jīng)驗(yàn),你的專業(yè)素養(yǎng),從這里可以判斷出你參與過(guò)多少項(xiàng)目,可以判斷你對(duì)軟件工程的理解和熟悉程度。這個(gè)問(wèn)題是十分關(guān)鍵的,你需要準(zhǔn)備的知識(shí)點(diǎn)有:軟件項(xiàng)目的生命周期、軟件項(xiàng)目的開(kāi)發(fā)模型、面向?qū)ο蟮姆治龊驮O(shè)計(jì)、軟件質(zhì)量保證等。
軟件項(xiàng)目的生命周期:
項(xiàng)目計(jì)劃
需求分析
設(shè)計(jì)(概要設(shè)計(jì)和詳細(xì)設(shè)計(jì))
編碼
測(cè)試
發(fā)布
維護(hù)
項(xiàng)目計(jì)劃階段:走訪客戶,進(jìn)行交流溝通,獲得客戶原始需求。
對(duì)客戶的需求和市場(chǎng)等進(jìn)行調(diào)研,分析,編寫(xiě)可行性分析報(bào)告。
通過(guò)不斷的與客戶溝通,找客戶不同環(huán)節(jié)的用戶進(jìn)行交流來(lái)獲取需求。召開(kāi)評(píng)審會(huì)議,報(bào)告可行性分析,報(bào)告用戶原始需求,報(bào)告項(xiàng)目遠(yuǎn)景規(guī)化。
需求分析階段:
在客戶原始需求的基礎(chǔ)上不斷與客戶溝通,充分的熟悉和深入客戶業(yè)務(wù),獲得充分的業(yè)務(wù)需求,完善用戶需求和功能性需求,了解客戶的相關(guān)約束而獲得非功能性需求。最終編寫(xiě)《需求規(guī)格說(shuō)明書(shū)》;召開(kāi)需求評(píng)審會(huì)議,客戶確定需求,并簽定合同;編寫(xiě)項(xiàng)目計(jì)劃說(shuō)明書(shū);編寫(xiě)測(cè)試計(jì)劃;召開(kāi)項(xiàng)目啟動(dòng)會(huì)議,項(xiàng)目正式啟動(dòng)。
概要設(shè)計(jì)階段:根據(jù)《需求分析說(shuō)明書(shū)》,進(jìn)行用例分析,獲得充分而有效的用例。編寫(xiě)界面原型,編寫(xiě)編碼規(guī)范和界面風(fēng)格規(guī)范,數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范。用uml工具畫(huà)用例圖,編寫(xiě)有效的用例規(guī)約文檔。劃分項(xiàng)目功能模塊.評(píng)審用例及用例規(guī)約文檔。
詳細(xì)設(shè)計(jì)階段:根據(jù)完整的用例及需求進(jìn)行分析,獲得數(shù)據(jù)庫(kù)所需的相關(guān)信息,畫(huà)數(shù)據(jù)庫(kù)E-R圖,編寫(xiě)數(shù)據(jù)設(shè)計(jì)說(shuō)明書(shū).進(jìn)行數(shù)據(jù)庫(kù)建模。進(jìn)行詳細(xì)的分析,用uml工具畫(huà)類圖,確定每個(gè)功能模塊的子功能,抽取項(xiàng)目的公共部分成為一個(gè)公共模塊。確定項(xiàng)目的架構(gòu)基礎(chǔ)。確定需要用到的類及類成員和方法。確定一些輔助類及方法。對(duì)每一個(gè)用例都用uml工具畫(huà)出順序圖。編寫(xiě)詳細(xì)設(shè)計(jì)說(shuō)明書(shū),評(píng)審詳細(xì)設(shè)計(jì)說(shuō)明書(shū), 進(jìn)行基礎(chǔ)框架搭建。列出任務(wù)清單,進(jìn)行任務(wù)分配。
編碼階段:以小組的形式進(jìn)行代碼編寫(xiě),編寫(xiě)單元測(cè)試用例,每完成一個(gè)類都要進(jìn)行單元測(cè)試。每完成一個(gè)功能點(diǎn)和模塊都要進(jìn)行集成測(cè)試。確保每一個(gè)功能點(diǎn)和模塊完成后都是一個(gè)可以看得見(jiàn)、摸得著的產(chǎn)品。而不是等到最后才進(jìn)行統(tǒng)一的調(diào)試和搭配。每天都要對(duì)代碼進(jìn)行檢查和優(yōu)化,也就是所謂的重構(gòu)。
測(cè)試階段:根據(jù)測(cè)試計(jì)劃對(duì)項(xiàng)目進(jìn)行系統(tǒng)測(cè)試,以及用戶的驗(yàn)收測(cè)試
產(chǎn)品發(fā)布:交付完整的產(chǎn)品和設(shè)計(jì)文檔。把產(chǎn)品布署到客戶的計(jì)算機(jī)上,確保產(chǎn)品的正常運(yùn)行??蛻艉炇?。
維護(hù)階段:為客戶提供技術(shù)保障,對(duì)產(chǎn)品進(jìn)行相應(yīng)的維護(hù)和升級(jí)工作
軟件常見(jiàn)開(kāi)發(fā)模型
瀑布模型:最經(jīng)典的過(guò)程模型,適用于需求明確,規(guī)模較小的項(xiàng)目
噴泉模型:迭代,無(wú)間隙特點(diǎn),適用于面向?qū)ο蟮能浖_(kāi)發(fā)過(guò)程
螺旋模型:
MSF模型:微軟解決方案過(guò)程模型
什么是極限(XP)編程:極限編程是對(duì)敏捷軟件開(kāi)發(fā)方法的一種實(shí)現(xiàn)。它強(qiáng)調(diào)測(cè)試先行,也就是在編寫(xiě)代碼的時(shí)候先編寫(xiě)測(cè)試用例;循環(huán)迭代,每一次迭代都是一個(gè)可用的產(chǎn)品;重構(gòu),不斷的對(duì)代碼進(jìn)行優(yōu)化;結(jié)對(duì)編程,兩個(gè)人為一對(duì)共同進(jìn)行代碼編寫(xiě);它強(qiáng)調(diào)團(tuán)隊(duì)之間的知識(shí)傳播,讓團(tuán)隊(duì)的每個(gè)人都能熟悉軟件開(kāi)發(fā)的各種技術(shù)。如:支持熟悉數(shù)據(jù)庫(kù)的人去做界面,做界面的人去做數(shù)據(jù)庫(kù)等,通過(guò)不定期的角色轉(zhuǎn)換來(lái)增強(qiáng)團(tuán)隊(duì)的能力。要求客戶參與到軟件開(kāi)發(fā)中來(lái),開(kāi)發(fā)出最適合客戶需求的產(chǎn)品。
單元測(cè)試一般是在編碼的時(shí)候同步進(jìn)行的,一般是以類為單位進(jìn)行測(cè)試,當(dāng)一個(gè)類完成了編碼,并編譯正確后才進(jìn)行的測(cè)試,測(cè)試這個(gè)類是否已經(jīng)能夠?qū)崿F(xiàn)指定的功能。一個(gè)類能夠正常的編譯成功并不意味著這個(gè)類就已經(jīng)完成了,還要通過(guò)測(cè)試,設(shè)置斷言來(lái)確定他是否已經(jīng)達(dá)到了預(yù)期的效果,實(shí)現(xiàn)了特定的功能。調(diào)試,編譯通過(guò)只能證明代碼的語(yǔ)法沒(méi)有錯(cuò)誤。
單元測(cè)試由程序員自己來(lái)進(jìn)行,也可以在項(xiàng)目小組內(nèi)交互進(jìn)行。單元測(cè)試是采用白盒測(cè)試
集成測(cè)試一般指實(shí)現(xiàn)了一個(gè)功能點(diǎn)或一個(gè)模塊后,為了測(cè)試這個(gè)模塊是否已經(jīng)實(shí)現(xiàn)了需求要求的功能。集成測(cè)試可能需要對(duì)多個(gè)類進(jìn)行組裝,也可能需要與以前已經(jīng)測(cè)試通過(guò)的模塊進(jìn)行組裝,是對(duì)產(chǎn)品組件的系統(tǒng)整合和執(zhí)行。集成測(cè)試可以根據(jù)模塊的大小分不同的級(jí)別,在現(xiàn)行的軟件開(kāi)發(fā)中,每完成一個(gè)功能模塊都必須要進(jìn)行一次集成測(cè)試,使得你完成的模塊是一個(gè)可以運(yùn)行的產(chǎn)品。集成測(cè)試一般可以由項(xiàng)目小組的負(fù)責(zé)人(或指定一個(gè)小組成員)來(lái)完成。集成測(cè)試采用白盒式測(cè)試和黑盒測(cè)試
系統(tǒng)測(cè)試一般指項(xiàng)完代碼已經(jīng)全部完成,交給測(cè)試小組來(lái)進(jìn)行測(cè)試。進(jìn)行系統(tǒng)測(cè)試的人員獨(dú)立于開(kāi)發(fā)小組,系統(tǒng)測(cè)試人員把完成的產(chǎn)品布署在相應(yīng)的計(jì)算機(jī)環(huán)境中,按照測(cè)試計(jì)劃進(jìn)行測(cè)試,驗(yàn)證系統(tǒng)是否滿足了指定的需求。系統(tǒng)測(cè)試除了測(cè)試產(chǎn)品應(yīng)滿足基本的功能需求外,還要對(duì)產(chǎn)品的性能,用戶界面,安全性,壓力,可靠性,安裝和反安裝等幾個(gè)方面進(jìn)行測(cè)試
系統(tǒng)測(cè)試采用黑盒測(cè)試
驗(yàn)收測(cè)試一般指產(chǎn)品交付給客戶,負(fù)責(zé)把產(chǎn)品布署在指定的計(jì)算機(jī)環(huán)境中。由用戶根據(jù)需求文檔,進(jìn)行的總體測(cè)試。驗(yàn)收測(cè)試的內(nèi)容和系統(tǒng)測(cè)試一樣,只是執(zhí)行者不同。都是除了測(cè)試系統(tǒng)完成基本功能外還要對(duì)性能,安全性,可靠性等進(jìn)行測(cè)試。驗(yàn)收測(cè)試也是采用黑盒測(cè)試
為什么需要測(cè)試?測(cè)試是對(duì)軟件質(zhì)量的保證,只能通過(guò)嚴(yán)格測(cè)試的軟件才是合格的軟件,測(cè)試并不是說(shuō)讓軟件能夠編譯通過(guò),測(cè)試是讓軟件產(chǎn)品最大程度的滿足客戶的需求度。
回答實(shí)例:
考官:令狐沖,能談?wù)勀銈兪窃趺礃訉?duì)這個(gè)項(xiàng)目開(kāi)發(fā)的嗎?
令狐沖:首先,我們這個(gè)項(xiàng)目已經(jīng)有了一個(gè)基本的用戶原始需求。但這是不夠的,我們都知道需求分析是十分重要的,所以我們?cè)谟脩粼夹枨笪臋n的基礎(chǔ)上,再次進(jìn)行了分析,通過(guò)不斷的與客戶溝通,充分的了解和熟悉用戶的業(yè)務(wù),完善了業(yè)務(wù)需求和功能需求。還對(duì)用戶業(yè)務(wù)需求和功能需求分析完善為實(shí)現(xiàn)軟件的必須的非功能性需求。得出項(xiàng)目需求規(guī)格說(shuō)明書(shū),經(jīng)過(guò)評(píng)審會(huì)議確認(rèn)通過(guò)。
根據(jù)需求規(guī)格說(shuō)明書(shū)進(jìn)行用例分析,通過(guò)分析和討論找出充分的有效用例,并用Rose畫(huà)用例圖。對(duì)每一個(gè)用例進(jìn)行詳細(xì)的分析,完成每個(gè)用例的用例規(guī)約文檔,并編寫(xiě)界面原型。劃分項(xiàng)目模塊。最后對(duì)用例及用例規(guī)約文檔進(jìn)行評(píng)審驗(yàn)證。編寫(xiě)”代碼編寫(xiě)規(guī)范”及界面風(fēng)格規(guī)范,數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范,編寫(xiě)概要設(shè)計(jì)說(shuō)明書(shū)。
根據(jù)需求規(guī)格說(shuō)明書(shū)和分析各個(gè)用例規(guī)約文檔,獲得數(shù)據(jù)庫(kù)的基本信息原型。也可以說(shuō)是數(shù)據(jù)庫(kù)表的草稿,根據(jù)數(shù)據(jù)庫(kù)表草搞進(jìn)行分析,進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)和優(yōu)化。編寫(xiě)數(shù)據(jù)庫(kù)設(shè)計(jì)說(shuō)明書(shū)。采用PowerDesigner進(jìn)行數(shù)據(jù)庫(kù)建模,并生成SQL腳本。確定項(xiàng)目框架,設(shè)計(jì)公共模塊和輔助類。根據(jù)對(duì)數(shù)據(jù)庫(kù)模型和用例規(guī)約文檔的分析,列出對(duì)象清單和理清對(duì)象關(guān)系。用Rose來(lái)畫(huà)類圖。對(duì)每一個(gè)用例都用rose畫(huà)出時(shí)序圖。編寫(xiě)詳細(xì)設(shè)計(jì)說(shuō)明書(shū)。列出任務(wù)清單,分組進(jìn)行代碼編寫(xiě)。
在代碼編寫(xiě)階段,先統(tǒng)一完成所有的實(shí)體類。對(duì)于非實(shí)體類則先完成類的框架,也就是只寫(xiě)方法和注釋文字。具體方法的實(shí)現(xiàn)暫時(shí)為空。然后再進(jìn)行代碼填寫(xiě)。每完成一個(gè)類的代碼編譯通過(guò)后都要進(jìn)行重構(gòu)和單元測(cè)試。每完成一個(gè)功能和模塊都由會(huì)由小組長(zhǎng)進(jìn)行集成測(cè)試。使得完成的模塊是一個(gè)真正可以運(yùn)行的,可見(jiàn)的功能實(shí)現(xiàn)。
在各個(gè)小組都完成自己的模塊后就進(jìn)行模塊整合,進(jìn)行一次大規(guī)模的集成測(cè)試。然后把產(chǎn)品產(chǎn)給產(chǎn)品測(cè)試小組進(jìn)行系統(tǒng)測(cè)試。
問(wèn)題之四、你們是怎么保證軟件開(kāi)發(fā)的質(zhì)量的?
分析:這個(gè)問(wèn)題其實(shí)上面的講解已經(jīng)給了答案了。軟件質(zhì)量是軟件實(shí)現(xiàn)對(duì)需求的滿足度。開(kāi)發(fā)的軟件越滿足客戶的需求,說(shuō)明軟件的質(zhì)量越高。反之就是質(zhì)量越低。盡管你開(kāi)發(fā)的軟件使用了新的技術(shù),良好的設(shè)計(jì),豐富的功能;但是這些功能都不是客戶需要的,客戶需要的功能沒(méi)有實(shí)現(xiàn)或者是很多沒(méi)有實(shí)現(xiàn)。這樣的軟件也是失敗的軟件。為了保證軟件質(zhì)量,也就是讓開(kāi)發(fā)的軟件最大程度滿足客戶的需求,只有兩個(gè)方法。一個(gè)是獲得充分完整的需求,二是能過(guò)測(cè)試,以需求為中心編寫(xiě)測(cè)試計(jì)劃。來(lái)保證軟件合乎需求。
回答實(shí)例:
考官:你們是怎么來(lái)保證軟件的質(zhì)量的呢?
令狐沖:要保證軟件的質(zhì)量首先就要獲得完整的需求,在需求分析階段做了大量的工作與客戶各個(gè)環(huán)節(jié)的代表性用戶進(jìn)行溝通,充分了解和熟悉客戶的業(yè)務(wù)。并且從需求到設(shè)計(jì)階段都保持與用戶的溝通和交流。讓用戶的業(yè)務(wù)專家一直參與我們的需求,分析和設(shè)計(jì)工作。
其次我們會(huì)在需求分析后就編寫(xiě)測(cè)試計(jì)劃,在開(kāi)發(fā)的每個(gè)階段都進(jìn)行相應(yīng)的測(cè)試來(lái)保證代碼是乎合相應(yīng)需求的。在代碼編寫(xiě)過(guò)程中,每完成一個(gè)類都由程序進(jìn)行單元測(cè)試,每完成一個(gè)功能點(diǎn)或模塊都要進(jìn)行集成測(cè)試,每一次集成測(cè)試都對(duì)上一次的已經(jīng)測(cè)試通過(guò)的產(chǎn)品進(jìn)行迭代, 也就是以前測(cè)試成功的都會(huì)加入到本次測(cè)試中來(lái)。使得每個(gè)完成的功能和模塊完成后都是一個(gè)可以運(yùn)行的,可以看得到的產(chǎn)品;同時(shí)也歡迎用戶來(lái)見(jiàn)證我們的集成測(cè)試結(jié)果。代碼編寫(xiě)完成后進(jìn)行最后一次集成測(cè)試,然后交由獨(dú)立的測(cè)試小組對(duì)項(xiàng)目進(jìn)行系統(tǒng)測(cè)試。
問(wèn)題之五、你為什么離職的?(你為什么離開(kāi)以前公司的?)
分析:這個(gè)問(wèn)題幾乎在任何場(chǎng)合的面試都會(huì)有,有時(shí)是在技術(shù)面試的時(shí)候問(wèn),有時(shí)是在人事面試的時(shí)候問(wèn),有時(shí)會(huì)在技術(shù)面試和人事面試的時(shí)候都問(wèn)。其實(shí)也比較好回答,回答的抽象一點(diǎn)比好。切記不要說(shuō)以前公司的壞話,如果你這樣做。人家會(huì)想,你以后離職后同樣也會(huì)說(shuō)這家公司的壞話.一般都是說(shuō)為了某求更好的發(fā)展空間。讓人感覺(jué)你是經(jīng)過(guò)深思熟慮后才選擇他們公司的。
回答實(shí)例:
考官:你為什么離開(kāi)以前公司的?
令狐沖:以前公司對(duì)我很好,我在以前公司干得也很愉快。我因?yàn)楹贤狡?,為了獲得更好的發(fā)展空間及謀求對(duì)自己能持續(xù)發(fā)展的環(huán)境。并向公司辦理了離職手續(xù),完成了工作交結(jié)。(后面這句也可以不談)
問(wèn)題之六、談?wù)勀愕穆殬I(yè)規(guī)化
分析:企業(yè)都希望他所招聘的人是潛力股,看你是不是一個(gè)追求上勁的人,還有想看看你能夠在企業(yè)長(zhǎng)期干還是僅把其當(dāng)著一個(gè)跳板??偟恼f(shuō)來(lái),回答這個(gè)問(wèn)題要讓人覺(jué)得你是一個(gè)可培養(yǎng),有潛力人。記住要看是什么樣的人來(lái)面試你。如果是項(xiàng)目經(jīng)理來(lái)面試你,你就不要說(shuō)你以后的職業(yè)規(guī)化是項(xiàng)目經(jīng)理。你就可以說(shuō)你的職業(yè)規(guī)化是成為架構(gòu)師,或者是技術(shù)專家等。否則他可能會(huì)認(rèn)為你是一個(gè)對(duì)其有威脅的人。就算他內(nèi)心知道這不算什么,可能心理總會(huì)有一點(diǎn)點(diǎn)不爽。如果是老總面試或人事問(wèn)你這樣的問(wèn)題,你則可以說(shuō)項(xiàng)目經(jīng)理也無(wú)妨,不過(guò)要給人有一種覺(jué)穩(wěn)的感覺(jué)。
回答實(shí)例:
考官:你的職業(yè)規(guī)化是怎么樣的呢?(考官是項(xiàng)目經(jīng)理)
令狐沖:我思維能力比較強(qiáng),擅于邏輯分析。在之前的工作中積累了一定的架構(gòu)經(jīng)驗(yàn),以后就想成為一名架構(gòu)師和技術(shù)專家
程序員面試什么最重要
目標(biāo)
相信和不少朋友一樣,有了幾年工作經(jīng)驗(yàn)成為Senior后就開(kāi)始了面試別人的經(jīng)歷。我在最初這個(gè)階段只是按照自己的想象把”找到基礎(chǔ)好的程序員“,”找到算法能力優(yōu)秀的程序員“,”找到有Android開(kāi)發(fā)經(jīng)驗(yàn)的程序員“等作為面試的目標(biāo)。但是,實(shí)際的經(jīng)歷告訴我,尤其是按“基礎(chǔ)好”,“算法好”這些目標(biāo)招到的人最終效果并不好。比如,有的面試者基礎(chǔ)知識(shí)和算法掌握情況不錯(cuò),進(jìn)程、線程、內(nèi)存等概念清晰,基本的Hash,二叉樹(shù),快速排序等數(shù)據(jù)結(jié)構(gòu)和算法也比較熟悉,但是進(jìn)公司后在實(shí)際工作中表現(xiàn)得很糟糕。后來(lái),我才發(fā)現(xiàn)原來(lái)是我的面試目標(biāo)出了問(wèn)題,我原先的面試方法更像是大學(xué)的算法或操作系統(tǒng)期末考試,按照這種方法讓許多并不合適的人通過(guò)了面試,同時(shí)也可能錯(cuò)過(guò)了許多合適的人。
后來(lái),我的反思是,從公司的角度講,面試的根本目的是找到“能夠干好工作”的人,而“高學(xué)歷”,“算法好”,“基礎(chǔ)好”,“有經(jīng)驗(yàn)”這些都是表象而不是根本,它們并不能直接和“工作好”劃等號(hào)。
方法
目標(biāo)明確了,但接下來(lái)的問(wèn)題是假設(shè)面試者是一個(gè)黑盒系統(tǒng),“工作好”不是直接可觀測(cè)變量,你所能直接觀測(cè)的變量是基礎(chǔ)、算法、經(jīng)驗(yàn)、學(xué)歷、性格、談吐、年齡等等。所以,實(shí)際上,你只能從“基礎(chǔ)好”,“算法好”等可以直接觀測(cè)的量去推測(cè)“工作好”的概率,這就是一個(gè)在“X好“條件下”工作好“的條件概率問(wèn)題:P(工作好 | X好)。
根據(jù)這個(gè)模型,面試所應(yīng)該考察哪些方面就很明顯了,那就是選擇那種最具有區(qū)分性的方面來(lái)考察。比如,考察面試者的體型特征沒(méi)有太大意義,因?yàn)镻(工作好|高),P(工作好|矮),P(工作好|胖),P(工作好|瘦)的概率都差不多;所以,體型特征不具有區(qū)分性,這不是面試所應(yīng)該關(guān)注的內(nèi)容。
面試官應(yīng)當(dāng)結(jié)合職位的要求明確哪些因素具有比較好的區(qū)分性。比如,如果要招一名技術(shù)門檻比較高的3D游戲引擎開(kāi)發(fā)工程師,面試者A具有3D游戲引擎開(kāi)發(fā)的經(jīng)驗(yàn),但是在基礎(chǔ)知識(shí)和算法面試方面表現(xiàn)一般;面試者B相反,基礎(chǔ)知識(shí)和算法面試表現(xiàn)很好,但沒(méi)有游戲開(kāi)發(fā)經(jīng)驗(yàn),而你只能選擇其一。你選誰(shuí)呢?其實(shí),這就是兩個(gè)條件概率問(wèn)題P(工作好|經(jīng)驗(yàn)好,基礎(chǔ)一般,算法一般)和P(工作好|沒(méi)經(jīng)驗(yàn),基礎(chǔ)好,算法好)。這個(gè)問(wèn)題就留給面試官來(lái)判斷了,就我個(gè)人而言,對(duì)于技術(shù)門檻較高需要技術(shù)積累的職位,經(jīng)驗(yàn)更加說(shuō)明問(wèn)題,因此,我更傾向于面試者A。
下面,我再結(jié)合自己的經(jīng)驗(yàn)談?wù)剬?duì)面試中常見(jiàn)方面的看法。
算法
算法是Google和MS等大公司面試所重點(diǎn)考察的內(nèi)容。我個(gè)人很喜歡算法,曾經(jīng)參加ACM/ICPC拿過(guò)北京賽區(qū)的13名。但是,就個(gè)人經(jīng)驗(yàn)來(lái)看,我所接觸過(guò)的絕大多數(shù)開(kāi)發(fā)職位而言,算法都不適合作為考察面試者優(yōu)劣的主要因素。對(duì)于普通的非算法性開(kāi)發(fā)職位,考察面試者的算法就相當(dāng)于考察他打乒乓球好不好一樣,與目標(biāo)“工作好”的相關(guān)性太低。就我個(gè)人的經(jīng)驗(yàn)來(lái)看,差不多P(工作好|算法好)=50%,也就是算法面試沒(méi)有太大的區(qū)分性。
甚至,還有一種很不好的情況特別多地出現(xiàn)在算法好的面試者身上,我稱之為“只磨刀,不砍柴”。什么意思呢?有類人只對(duì)什么A*算法,異步編程,JVM類加載機(jī)制這種純技術(shù)問(wèn)題感興趣,對(duì)實(shí)現(xiàn)用戶需求毫無(wú)興趣。這類人看起來(lái)有一定的技術(shù)能力,但是對(duì)公司來(lái)講貢獻(xiàn)十分有限,甚至不如技術(shù)一般但認(rèn)真負(fù)責(zé)的人。所以,一旦遇到面試者算法好,我就特別留意考察會(huì)不會(huì)是這種“只磨刀,不砍柴”的人。
另外,雖然我個(gè)人不了解Google和MS,但我對(duì)于其特別重視考察算法能力的面試策略是持懷疑態(tài)度的。即使在這樣的世界級(jí)大公司,算法雖然重要,但可以想象在項(xiàng)目實(shí)施過(guò)程所遇到的各種各樣問(wèn)題中,算法問(wèn)題絕大多數(shù)時(shí)候不會(huì)是主要瓶頸,沒(méi)有到那種需要每個(gè)人都是算法高手的情況。實(shí)際上,絕大多數(shù)項(xiàng)目真正難點(diǎn)并不是一兩個(gè)算法瓶頸,甚至也不是單點(diǎn)的技術(shù)瓶頸,而是系統(tǒng)性的組織、協(xié)調(diào)、設(shè)計(jì)、開(kāi)發(fā)問(wèn)題,有大量的看起來(lái)不是那么有技術(shù)含量的臟活累活,也有許多問(wèn)題是由于信息不足,并不是技術(shù)能力強(qiáng)就能克服這些困難。一個(gè)團(tuán)隊(duì)最好優(yōu)勢(shì)互補(bǔ),有人算法強(qiáng),有人業(yè)務(wù)分析能力強(qiáng),有人擅長(zhǎng)后端服務(wù),有人擅長(zhǎng)前端界面,有人聰明,有人踏實(shí),這是最好的。如果按照“算法好”的單一標(biāo)準(zhǔn)選材,必定會(huì)把許多優(yōu)秀的人才拒之門外。
基礎(chǔ)
基礎(chǔ)面試是指考察諸如指針使用、進(jìn)程線程概念等基礎(chǔ)知識(shí)的面試,十分類似于大學(xué)期末考試題。我曾經(jīng)以為基礎(chǔ)面試十分重要,但是現(xiàn)在不這么看了。在工作中基礎(chǔ)的確是重要的,但是在面試過(guò)程中,它必須具有區(qū)分性才有意義,也就是說(shuō)P(工作好|基礎(chǔ)好)的概率要高,那么考察指針使用,進(jìn)程線程區(qū)別這樣的基礎(chǔ)題目才有它的意義。我的實(shí)際經(jīng)驗(yàn)是,基礎(chǔ)面試并不具有很好的區(qū)分性,和算法一樣, 差不多P(工作好|基礎(chǔ)好) = 50%。同時(shí),基礎(chǔ)面試是最容易準(zhǔn)備的,中國(guó)人有長(zhǎng)期的應(yīng)試教育經(jīng)驗(yàn),要準(zhǔn)備幾個(gè)把玩指針題目太容易了。
我曾經(jīng)遇到過(guò)這樣的面試者,他的C語(yǔ)言基礎(chǔ)和編譯、鏈接等原理掌握得非常好,給我留下了深刻的印象,我給的面試結(jié)論是:知識(shí)面不寬,只會(huì)C語(yǔ)言,但基礎(chǔ)很扎實(shí),建議錄用。后來(lái)的事情證明了那個(gè)結(jié)論的前半部分是對(duì)的,但是”建議錄用“錯(cuò)了。他在實(shí)際工作中表現(xiàn)得一塌糊涂,不理解需求,不理解整體架構(gòu);同時(shí),上班時(shí)間不是花在項(xiàng)目上,而是花在閱讀諸如《程序員的自我修養(yǎng)》之類的書(shū)籍上。最后,這位同事由于長(zhǎng)期“不出活”離開(kāi)了公司。
基礎(chǔ)不是不重要,而是“基礎(chǔ)好”不足以說(shuō)明面試者能干好工作,因?yàn)榛A(chǔ)是屬于局部性知識(shí),而實(shí)際工作需要綜合性能力,二者有天壤之別。C語(yǔ)言、操作系統(tǒng)能考高分,但是不會(huì)寫(xiě)程序的人在大學(xué)我們還見(jiàn)得少嗎? 軟件開(kāi)發(fā)就像蓋房子,綜合能力是設(shè)計(jì)和搭骨架,基礎(chǔ)知識(shí)是碼磚。張小龍?jiān)菷oxmail是Delphi開(kāi)發(fā)的,他它不懂C#,你如果要招聘一個(gè)開(kāi)發(fā).NET Email客戶端的人,你考察他對(duì)CLR掌握得好不好有意義嗎? 讓張小龍來(lái)開(kāi)發(fā)一個(gè)C#版的Foxmail真的會(huì)有困難嗎? 你招一個(gè)精通C#但沒(méi)有Email客戶端開(kāi)發(fā)經(jīng)驗(yàn)的人來(lái)真的比張小龍靠譜嗎?
我說(shuō)基礎(chǔ)知識(shí)不重要,和古人說(shuō)的“不積洼步無(wú)以至千里”是不是矛盾呢?不矛盾!“洼步”與“千里”是一種可累加關(guān)系,但再多的“基礎(chǔ)知識(shí)”都累加不成“綜合能力”。學(xué)習(xí)軟件開(kāi)發(fā)要像持續(xù)集成一樣,一開(kāi)始就是一個(gè)完整的系統(tǒng),雖然規(guī)模不大,問(wèn)題很多,但它麻雀雖小五臟俱全,從小系統(tǒng)到大系統(tǒng),從簡(jiǎn)單系統(tǒng)到復(fù)雜系統(tǒng)逐步演化。
所以,基礎(chǔ)好本身不足以說(shuō)明太多的問(wèn)題,必須進(jìn)一步考察綜合能力。對(duì)于基礎(chǔ)面試表現(xiàn)不好的面試者,如果時(shí)間允許也要進(jìn)一步考察,有的面試者其實(shí)是有能力的,只是沒(méi)有進(jìn)行充分的準(zhǔn)備。最理想的狀態(tài)當(dāng)然是基礎(chǔ)和綜合能力俱佳,若不能兼顧,應(yīng)當(dāng)綜合能力優(yōu)先。
經(jīng)驗(yàn)
這里所說(shuō)的經(jīng)驗(yàn)不是通過(guò)工作了多少年來(lái)衡量的,而主要是指面試者的經(jīng)歷,比如,是否完整地實(shí)現(xiàn)過(guò)一個(gè)軟件,或作為主要開(kāi)發(fā)者完成過(guò)一個(gè)項(xiàng)目。經(jīng)驗(yàn)的重要性在于它能說(shuō)明一個(gè)人的綜合能力。從項(xiàng)目的性質(zhì)、規(guī)模和難度,面試官就可以大致判斷出面試者的綜合能力。如果一個(gè)面試者一直在大公司負(fù)責(zé)一個(gè)小模塊的開(kāi)發(fā)維護(hù),那么基本可以判斷他不具備獨(dú)立或作為主要開(kāi)發(fā)者承擔(dān)一個(gè)項(xiàng)目的能力,只適合在另一家大公司做類似的事情。對(duì)于門檻較高需要長(zhǎng)期技術(shù)積累的職位,相關(guān)經(jīng)驗(yàn)更顯得尤為重要,比如,Linux內(nèi)核開(kāi)發(fā),JVM開(kāi)發(fā),游戲引擎開(kāi)發(fā),數(shù)據(jù)庫(kù)實(shí)現(xiàn),高級(jí)UX等。對(duì)于這類職位,沒(méi)有經(jīng)驗(yàn)的面試者即使綜合素質(zhì)不錯(cuò)也是需要長(zhǎng)時(shí)間的學(xué)習(xí)和積累才能勝任。所以,基本上如果確定了你的職位屬于此類,那么相關(guān)經(jīng)驗(yàn)毫無(wú)疑問(wèn)應(yīng)該成為首選因素,換句話說(shuō),P(工作好 | 相關(guān)經(jīng)驗(yàn)好)的概率是非常高的。
通過(guò)項(xiàng)目經(jīng)驗(yàn)判斷面試者的優(yōu)劣比通過(guò)基礎(chǔ)和算法測(cè)試更加靠譜,所以,面試過(guò)程中面試官應(yīng)該花比較多的時(shí)間聽(tīng)面試者介紹項(xiàng)目經(jīng)驗(yàn),并進(jìn)行深入地探討交流,了解面試者的知識(shí)面、思維能力、表達(dá)能力等。同時(shí),可以結(jié)合項(xiàng)目提一些基礎(chǔ)知識(shí)和算法的問(wèn)題,比如,如果面試者做過(guò)C++相關(guān)的項(xiàng)目,那就可以問(wèn)他如何進(jìn)行內(nèi)存管理?是否熟悉智能指針?如果面試者的回答不能令人滿意,那么就基本上可以判斷他的項(xiàng)目做得不是很好。
要注意的是,經(jīng)驗(yàn)也是一個(gè)多維度的事物。比如,C++股票交易中間件系統(tǒng),這就涉及(C++,中間件,股票) 3個(gè)維度。假如面試者A做過(guò)C++股票交易客戶端,面試者B做過(guò)C的股票交易中間件。從語(yǔ)言角度看,A最匹配,從項(xiàng)目性質(zhì)看,B最匹配,你如何選擇?這就是在多個(gè)維度中,哪個(gè)維度更重要的問(wèn)題,就這個(gè)例子而言,我個(gè)人更傾向于B,因?yàn)槲艺J(rèn)為中間件開(kāi)發(fā)經(jīng)驗(yàn)是主要矛盾,而從C切換到C++并不是問(wèn)題。所以,面試官需要判斷哪一種經(jīng)驗(yàn)是主要的,而哪一種經(jīng)驗(yàn)是次要的。比如,我們招聘Android應(yīng)用開(kāi)發(fā),這個(gè)職位的Android技術(shù)門檻并不高,它的真正難點(diǎn)在于做出好的用戶體驗(yàn)(UX)。所以,如果一個(gè)面試者沒(méi)有Android的經(jīng)驗(yàn)我們是可以接受的,但是我希望他在UX方面有經(jīng)驗(yàn),至少做過(guò)其他平臺(tái)的移動(dòng)應(yīng)用開(kāi)發(fā)。
性格
現(xiàn)在,我來(lái)談我認(rèn)為最重要的因素:性格。這可能是許多初為面試官的朋友所難以想象的,怎么會(huì)是性格最重要呢?說(shuō)實(shí)話,當(dāng)我意識(shí)到這一點(diǎn)時(shí),我自己也很驚訝!說(shuō)白了,還是 P(工作好|性格好)的概率最高啊。我的實(shí)際經(jīng)驗(yàn)是,如果一個(gè)人的性格好,他能把工作做好的可能性是最高的,性格好遠(yuǎn)比基礎(chǔ)好、算法好要靠譜。
一個(gè)人如果技術(shù)上有缺陷,經(jīng)驗(yàn)上有不足,但性格好,在團(tuán)隊(duì)中是很容易由其他人來(lái)補(bǔ)位的,他自己也很容易逐漸補(bǔ)起來(lái);相反,如果一個(gè)人的性格不好,所有的技術(shù)優(yōu)勢(shì)經(jīng)驗(yàn)優(yōu)勢(shì)都發(fā)揮不出來(lái),甚至還會(huì)起到負(fù)作用,而且性格缺點(diǎn)很難改變。我一直談到實(shí)際工作所需要的是綜合性的能力,這種綜合能力的發(fā)揮中性格是至關(guān)重要的。項(xiàng)目中不止會(huì)遇到技術(shù)問(wèn)題,要涉及溝通、協(xié)調(diào),不同的人不同的部門既有合作又有磨擦,如何處理這些事情都需要一個(gè)良好的性格??梢哉f(shuō),在開(kāi)發(fā)團(tuán)隊(duì)里讓你與眾不同的不是你從哪個(gè)學(xué)校畢業(yè),也不是你過(guò)去的經(jīng)驗(yàn),而是你的性格。
當(dāng)然,性格是一個(gè)復(fù)雜的東西,它包含了很多的方面,并非所有方面都是程序員面試所需要關(guān)注的。我的經(jīng)驗(yàn)是可以重點(diǎn)考察這些方面:
1) 態(tài)度積極還是消極。有的面試者在談吐中就會(huì)自然給你一種積極上進(jìn)的感覺(jué),或者你可以在他的經(jīng)歷中發(fā)現(xiàn)他積極的因素,這些都不是太難看出來(lái)的。相反,有的面試者你能明顯感覺(jué)到他的消極情緒。積極性在工作中是十分重要的,積極的人能給團(tuán)隊(duì)帶來(lái)朝氣,也更易于合作?;旧?,如果確定面試者屬于態(tài)度積極的,他通過(guò)我這一關(guān)的可能性就會(huì)大大增加;相反,如果確定屬于態(tài)度消極的,即使技術(shù)能力不錯(cuò)我也會(huì)十分謹(jǐn)慎。
2) IQ。我的經(jīng)驗(yàn)是,總體來(lái)看,聰明的人在工作中的表現(xiàn)更為優(yōu)秀。在面試中要考察一個(gè)人是否聰明并不一定要像Google和MS那樣找些專門測(cè)試IQ的智力題,其實(shí),你只需要看他討論問(wèn)題是不是很有邏輯性,思考和說(shuō)話是不是反應(yīng)敏捷就可以做出大致的判斷。另外,眼睛是人心靈的窗戶,一個(gè)人聰明與否,眼睛是會(huì)說(shuō)話的。不過(guò),聰明也不完全是優(yōu)點(diǎn),比如,當(dāng)公司或項(xiàng)目遇到困難時(shí),往往是聰明人先跑掉了,堅(jiān)守的往往是IQ一般的人。
3) 語(yǔ)言表達(dá)能力。語(yǔ)言表達(dá)能力也是程序員十分重要的一項(xiàng)素質(zhì),它關(guān)系到項(xiàng)目中的溝通是否順暢。面試官可以看看面試者能否用簡(jiǎn)明的語(yǔ)言介紹清楚曾經(jīng)做過(guò)的項(xiàng)目,能否抓住要點(diǎn),能否考慮到聽(tīng)者的相關(guān)背景。一般來(lái)講,語(yǔ)言表達(dá)能力強(qiáng)的人綜合能力都不會(huì)太差。
4) 是否具有用戶意識(shí)。有人說(shuō)程序員是做研發(fā)的,哪來(lái)什么用戶?只有銷售、市場(chǎng)人員才會(huì)和用戶打交道。其實(shí),這是完完全全的錯(cuò)誤認(rèn)識(shí)。你寫(xiě)一個(gè)模塊,甚至一個(gè)API,只要有別人用,他就是你的用戶。有的程序員設(shè)計(jì)一個(gè)模塊或是一個(gè)軟件總是習(xí)慣于從使用者的角度來(lái)考慮,盡量地方便使用者,這就是一種良好的用戶意識(shí)。具有良好的用戶意識(shí)的人更能考慮別人的感受和整體的需要,而不是單純地從自己和局部來(lái)思考問(wèn)題。當(dāng)面試者談及過(guò)去的項(xiàng)目經(jīng)驗(yàn)時(shí),面試官可以常常站在用戶的角度對(duì)其進(jìn)行提問(wèn),從這個(gè)過(guò)程中觀察其是否具有良好的用戶意識(shí)。
5) 如何應(yīng)對(duì)質(zhì)疑和壓力。面試官應(yīng)該對(duì)面試者的回答以及以往項(xiàng)目進(jìn)行合理的質(zhì)疑,看看他如何應(yīng)對(duì)。曾經(jīng)有一位面試者談到做游戲登錄服務(wù)器的經(jīng)歷,我就問(wèn):“如果登錄服務(wù)器掛了,怎么辦呢”?他說(shuō)原先雖然沒(méi)有考慮這個(gè)問(wèn)題,但是可以怎么怎么改進(jìn)。其實(shí),大家都理解項(xiàng)目中有各種不完美,這里面原因很多,只要面對(duì)質(zhì)疑和壓力能從容應(yīng)對(duì)努力往好的方向思考解決就可以了,不需要掩飾缺陷,更不應(yīng)該有情緒。我遇到過(guò)有的面試者,一旦你對(duì)其項(xiàng)目提出質(zhì)疑,他馬上產(chǎn)生反抗情緒,或不高興,或不承認(rèn)有問(wèn)題,這很容易一下子看出來(lái)他在工作中容不得質(zhì)疑和批評(píng),這種人要想合作就很困難。
6) 個(gè)性特點(diǎn)。許多面試者喜歡在簡(jiǎn)歷上寫(xiě)“精通C++/Linux“,這些字眼看得人麻木,如果有人寫(xiě)”喜歡C++/Linux“,我就會(huì)有一種眼前一亮的感覺(jué)。“精通”是沒(méi)有感情色彩的敘述,而“喜歡”包含了面試者的個(gè)性,我更愿意看到面試者的個(gè)性。我相信對(duì)某樣?xùn)|西真正的熱情遠(yuǎn)比你當(dāng)前對(duì)它的掌握程度更為重要。其實(shí),N年的經(jīng)歷告訴我們,同一個(gè)班的同學(xué),同一個(gè)項(xiàng)目組的同事,雖然每天所學(xué)的知識(shí),所接觸的工作都是相同的,但其實(shí)每個(gè)人的成績(jī)和表現(xiàn)差異是十分明顯的。那么,到底本質(zhì)的差異是什么呢?其實(shí),就是每個(gè)人的個(gè)性。是個(gè)性使得有的人業(yè)余時(shí)間去打球,有的人業(yè)余時(shí)間去看書(shū),有的人喜歡Linux,有的人喜歡Mac。一個(gè)人在團(tuán)隊(duì)中扮演的角色也和他的個(gè)性有很大的關(guān)系。面試官應(yīng)該引導(dǎo)面試者展現(xiàn)自己的個(gè)性,并判斷其是否有益于團(tuán)隊(duì)。
總結(jié)
最后總結(jié)起來(lái),我的經(jīng)驗(yàn)是:
1) 面試官的目標(biāo)是找到”工作好“的人,一定要圍繞這個(gè)目標(biāo)來(lái)進(jìn)行面試,如果把面試當(dāng)成了算法或操作系統(tǒng)期末考試這就走入了誤區(qū);
2) 面試過(guò)程是通過(guò)學(xué)歷、性格、基礎(chǔ)、經(jīng)驗(yàn)、算法等可以測(cè)試的因素去綜合判斷面試者“工作好”的概率;
3) 在各種因素中,性格 > 經(jīng)驗(yàn) > 基礎(chǔ) > 算法。性格是最重要的,如果性格不好,所有技術(shù)能力都會(huì)大打折扣,而且技術(shù)缺陷容易彌補(bǔ),性格缺陷很難改變;經(jīng)驗(yàn)體現(xiàn)了一個(gè)人的綜合能力,你可以從面試者過(guò)去的經(jīng)歷中判斷他能從事哪種工作,不能從事哪種工作;基礎(chǔ)和算法則主要起到輔助參考的作用,基礎(chǔ)好的程序員一般適應(yīng)性比較強(qiáng),學(xué)新技術(shù)更快,但是切忌單純從基礎(chǔ)來(lái)判斷一個(gè)人的能力。