白板與編程面試:為什么不在電腦上編程更有幫助
在技術(shù)評估中的檢查方法
白板編程可以檢查出兩方面的技能:
- 從一開始就可以寫簡潔的代碼,以及
- 知其代碼之所以然。
這兩大技能對于一個出色的軟件開發(fā)人員是至關(guān)重要的。通過進(jìn)行白板編程,這兩種技能都能被準(zhǔn)確地檢驗出來。
從一開始就寫簡潔的代碼。
不管我們是否喜歡,現(xiàn)代軟件工程主要在于知道足夠的模式,并在正確的規(guī)則中使用正確的模式。
幾天甚至幾周后的工作的結(jié)果,通常只是修改幾百行的代碼。
表面上看,原來的開發(fā)人員在寫代碼時需要多少協(xié)助并不重要。他們可能在寫代碼之前,在腦子里就已經(jīng)想好所有細(xì)節(jié)了?;蛘咭灿锌赡芩麄儗懨恳恍写a的時候都查閱了API文檔、實例、或者語法指導(dǎo)。
但是當(dāng)我們深入探究的時候,就會發(fā)現(xiàn)這其中有很大差異。
理解概念要比理解現(xiàn)象更重要。
一段代碼變得越復(fù)雜,僅僅依靠一些開發(fā)模式的知識去開發(fā)就會變得更難,甚至理解代碼都會很艱難。
好的白板編程練習(xí),可以檢查出一個人到底是理解概念,還是通過記住大量模式來掩蓋其基礎(chǔ)知識的匱乏。
當(dāng)我們問到“你最擅長哪種編程語言?”我們其實并不是想要簡潔的代碼。我們只是在尋找一個切入點,能深入了解一個人,看看他到底有多大能耐。
這里簡單總結(jié)一下根據(jù)“候選人熟悉哪一領(lǐng)域”來決定“在面試中需要涉及哪些方面”:
- 面向?qū)ο缶幊?mdash;—多繼承,虛擬方法,對象構(gòu)建與析構(gòu)順序,異常處理。
- 前端——異步邏輯與終止,REST API,驗證用戶輸入。
- 算法與數(shù)據(jù)結(jié)構(gòu)——動機(jī),用法,平均及最差情況下的復(fù)雜度。
- 后端與架構(gòu)——內(nèi)存模型,垃圾處理機(jī)制,多線程,線程鎖機(jī)制,benchmarking, profiling。
- 函數(shù)式編程——Lambdas,curring,排序操作,一元。
- 內(nèi)核層次——文件系統(tǒng),網(wǎng)絡(luò),POSIX,協(xié)議,標(biāo)準(zhǔn)的檢驗與分析工具。
測試——單元測試,逆向測試和端對端測試,必要測試,基于模型的測試,測試驅(qū)動的和行為驅(qū)動的開發(fā),集成測試。
和候選人談到上面這些的時候,***的方法是從舉一個例子開始。***的例子就是讓他們自己寫一個短小簡單的例子。
實際中,候選者寫的大多數(shù)代碼片段都是不***的。這就提供了一個絕好的機(jī)會,看看候選者到底有多少知識。
白板編程很有用,是因為:
- 有限的寫代碼空間。
- 有限的寫代碼速度。
- 修改很麻煩,***要避免。
- 沒有補(bǔ)全,語法高亮和其他IDE的牛逼功能。
想明白代碼到底要干嘛。
過一遍代碼片段是如何運行的,這是非常好的練習(xí)。做技術(shù)面試的時候,絕對不要跳過。
如果代碼寫的是一個算法,有人可以寫出所有步驟,有人可以考慮到特殊情況,有人可以寫出不變式(invariants)并能證明。有人可以根據(jù)每個獨立循環(huán)結(jié)構(gòu)和遞歸調(diào)用解釋其復(fù)雜性。
如果代碼是面向?qū)ο缶幊?,有人可以明確指出其具體功能,對象在何時如何被創(chuàng)建,如何被銷毀,什么時候以什么樣的順序會調(diào)用構(gòu)建與析構(gòu)函數(shù),以及異常出現(xiàn)會怎樣,內(nèi)存布局看起來是什么樣的。
I代碼是否整潔,或是否包含明顯的bug,這非常重要。
觀察候選人認(rèn)真解釋代碼每一步實現(xiàn)的功能,可以了解他們的思考與說話方式。以及他們在其他領(lǐng)域有多深的了解。
***,這些都是在技術(shù)面試中要用到的檢驗技巧。而不是使用API和使用IDE完成特定任務(wù)的技巧。
白板編程很有用,是因為:
- 白板上的內(nèi)容或多或少是不變的。
- 用不同顏色的筆標(biāo)出“候選人的原始代碼”、“面試官的評論”、“候選人評論”,可以很好的將對話可視化。
不用白板是否有辦法做到上面這些技巧呢?
能,也不能。
對于寫整潔的代碼,我覺得可以讓候選人在自己的筆記本電腦上寫。
但是要有這些條件:
- 代碼要用投影儀投射在大屏幕上
- 字體要非常大。
- 關(guān)掉大多數(shù)IDE的牛逼功能。
要知道,在不熟悉的操作系統(tǒng)、鍵盤甚至是編輯器上,相比在白板上編程可能會更難。要么讓他們在自己的電腦上寫程序,要么確認(rèn)你提供的環(huán)境他們能夠接受。
至于理解代碼的部分,白板要更有利。
理想情況下,如果是投影儀的影像就是投放到白板上,我會讓候選人把投放投射的白板上,面試官再拿幾支記號筆。
不過我要說明白,電腦上不允許使用“快速修改”之類的功能。
如果只有兩個人的話,打印機(jī)又在旁邊,那就用用大字體打印出代碼,然后用幾支彩色筆去分析也非常好。
教學(xué)可以幫助練習(xí)這些技巧。
我經(jīng)常被問到,一個人要如何掌握上面的這些技巧。我的答案就是:教學(xué)(teaching)。
這對面試官和應(yīng)聘者都是有益的。
我自己對我的知識水平有一個簡單標(biāo)準(zhǔn)。如果我可以對一個領(lǐng)域不做準(zhǔn)備就能進(jìn)行討論的話,我就算是有豐富的知識了。
在軟件領(lǐng)域,這就意味著不用點退格就寫出***的代碼,然后能一步一步解釋它是做什么的。
如果你是那種經(jīng)常要被叫過去解釋一個算法或者API的人,那你基本上就不會對白板編程面試感到有困難。
白板編程是面試的必要環(huán)節(jié)么?
不可否認(rèn),白板編程很有幫助。但沒有它也可以。
如果有一個大屏幕可以顯示代碼,如果屏幕本身就是個白板,可以在上面用彩色筆進(jìn)行注釋。
我個人喜歡鼓勵別人走到白板前。而且這樣做有什么不好呢?
原文鏈接: dima korolev 翻譯: 伯樂在線 - TonyRideBike