白板與程式設計面試:為什麼不在電腦上程式設計更有幫助

pythontab發表於2014-05-09

在技術評估中的檢查方法

白板程式設計可以檢查出兩方面的技能:

  1. 從一開始就可以寫簡潔的程式碼,以及
  2. 知其程式碼之所以然。

這兩大技能對於一個出色的軟體開發人員是至關重要的。通過進行白板程式設計,這兩種技能都能被準確地檢驗出來。

從一開始就寫簡潔的程式碼。

不管我們是否喜歡,現代軟體工程主要在於知道足夠的模式,並在正確的規則中使用正確的模式。

幾天甚至幾周後的工作的結果,通常只是修改幾百行的程式碼。

表面上看,原來的開發人員在寫程式碼時需要多少協助並不重要。他們可能在寫程式碼之前,在腦子裡就已經想好所有細節了。或者也有可能他們寫每一行程式碼的時候都查閱了API文件、例項、或者語法指導。

但是當我們深入探究的時候,就會發現這其中有很大差異。

理解概念要比理解現象更重要。

一段程式碼變得越複雜,僅僅依靠一些開發模式的知識去開發就會變得更難,甚至理解程式碼都會很艱難。

好的白板程式設計練習,可以檢查出一個人到底是理解概念,還是通過記住大量模式來掩蓋其基礎知識的匱乏。

當我們問到“你最擅長哪種程式語言?”我們其實並不是想要簡潔的程式碼。我們只是在尋找一個切入點,能深入瞭解一個人,看看他到底有多大能耐。

這裡簡單總結一下根據“候選人熟悉哪一領域”來決定“在面試中需要涉及哪些方面”:

  • 物件導向程式設計——多繼承,虛擬方法,物件構建與析構順序,異常處理。
  • 前端——非同步邏輯與終止,REST API,驗證使用者輸入。
  • 演算法與資料結構——動機,用法,平均及最差情況下的複雜度。
  • 後端與架構——記憶體模型,垃圾處理機制,多執行緒,執行緒鎖機制,benchmarking, profiling。
  • 函數語言程式設計——Lambdas,curring,排序操作,一元。
  • 核心層次——檔案系統,網路,POSIX,協議,標準的檢驗與分析工具。

測試——單元測試,逆向測試和端對端測試,必要測試,基於模型的測試,測試驅動的和行為驅動的開發,整合測試。

和候選人談到上面這些的時候,最好的方法是從舉一個例子開始。最好的例子就是讓他們自己寫一個短小簡單的例子。

實際中,候選者寫的大多數程式碼片段都是不完美的。這就提供了一個絕好的機會,看看候選者到底有多少知識。

白板程式設計很有用,是因為:

  • 有限的寫程式碼空間。
  • 有限的寫程式碼速度。
  • 修改很麻煩,最好要避免。
  • 沒有補全,語法高亮和其他IDE的牛逼功能。

想明白程式碼到底要幹嘛。

過一遍程式碼片段是如何執行的,這是非常好的練習。做技術面試的時候,絕對不要跳過。

如果程式碼寫的是一個演算法,有人可以寫出所有步驟,有人可以考慮到特殊情況,有人可以寫出不變式(invariants)並能證明。有人可以根據每個獨立迴圈結構和遞迴呼叫解釋其複雜性。

如果程式碼是物件導向程式設計,有人可以明確指出其具體功能,物件在何時如何被建立,如何被銷燬,什麼時候以什麼樣的順序會呼叫構建與解構函式,以及異常出現會怎樣,記憶體佈局看起來是什麼樣的。

I程式碼是否整潔,或是否包含明顯的bug,這非常重要。

觀察候選人認真解釋程式碼每一步實現的功能,可以瞭解他們的思考與說話方式。以及他們在其他領域有多深的瞭解。

最後,這些都是在技術面試中要用到的檢驗技巧。而不是使用API和使用IDE完成特定任務的技巧。

白板程式設計很有用,是因為:

  • 白板上的內容或多或少是不變的。
  • 用不同顏色的筆標出“候選人的原始程式碼”、“面試官的評論”、“候選人評論”,可以很好的將對話視覺化。

不用白板是否有辦法做到上面這些技巧呢?

能,也不能。

對於寫整潔的程式碼,我覺得可以讓候選人在自己的膝上型電腦上寫。

但是要有這些條件:

  • 程式碼要用投影儀投射在大螢幕上
  • 字型要非常大。
  • 關掉大多數IDE的牛逼功能。

要知道,在不熟悉的作業系統、鍵盤甚至是編輯器上,相比在白板上程式設計可能會更難。要麼讓他們在自己的電腦上寫程式,要麼確認你提供的環境他們能夠接受。

至於理解程式碼的部分,白板要更有利。

理想情況下,如果是投影儀的影像就是投放到白板上,我會讓候選人把投放投射的白板上,面試官再拿幾支記號筆。

不過我要說明白,電腦上不允許使用“快速修改”之類的功能。

如果只有兩個人的話,印表機又在旁邊,那就用用大字型列印出程式碼,然後用幾支彩色筆去分析也非常好。

教學可以幫助練習這些技巧。

我經常被問到,一個人要如何掌握上面的這些技巧。我的答案就是:教學(teaching)。

這對面試官和應聘者都是有益的。

我自己對我的知識水平有一個簡單標準。如果我可以對一個領域不做準備就能進行討論的話,我就算是有豐富的知識了。

在軟體領域,這就意味著不用點退格就寫出完美的程式碼,然後能一步一步解釋它是做什麼的。

如果你是那種經常要被叫過去解釋一個演算法或者API的人,那你基本上就不會對白板程式設計面試感到有困難。

白板程式設計是面試的必要環節麼?

不可否認,白板程式設計很有幫助。但沒有它也可以。

如果有一個大螢幕可以顯示程式碼,如果螢幕本身就是個白板,可以在上面用彩色筆進行註釋。

我個人喜歡鼓勵別人走到白板前。而且這樣做有什麼不好呢?

相關文章