最近跟同事討論面試的事情比較多,所以就綜合大家所說的列舉幾條面試建議吧。這些建議是針對中國候選人應聘美國職位而寫的,但適用范圍可能更廣。假若你實際的實力是 X,面試官感知到你的實力是 Y,這些建議既不能讓你實力暴增(X++),也不能讓你展現超乎實際的實力(Y > X),只能幫助你避免由於溝通問題而造成的實力不被發現(Y < X)。
當做討論而非考試
盡管面試有個「試」字,但在真正好的技術面試其實不是一問一答的考試,更多是如同同事之間的技術討論一樣,從比較糟糕的解決方案開始做優化,直到做到大家都可以接受的程度為之。這個觀點在《理想的技術面試過程》中也提到過,在這里就說一下具體應該怎么做。
首先你要自信,不能覺得面試是公司對你的單向選擇,其實是同時包括你對公司的雙向選擇。有些心理學上的技巧可以讓你顯得自信一點的,例如說在公司大堂等待的時候嘗試深呼吸和伸展一下四肢。由於人的心理狀態和身體語言是互相加強的,所以如果你使用自信的身體語言,你就會無意識地被「誤導」以為自己確實自信,不過這正是你想要的效果。(如果你想更多的了解什么身體語言表示自信,可以去找本身體語言方面的書來看。)
然后你不要高估題目的難度。有些人可能被 Google 中國的某些面試官虐待過,覺得越是好的公司題目自然越難,但這其實是中國應試體系的思維方式而已,題目難度不是篩選出少數人的唯一手段。就好像同事問你問題一樣,問及的事情有可能是你完全沒做過的,你就憑借常識來提供一些基本的判斷;也有可能是你深入研究過的領域,你可以說出很多細節和難以遇見的問題。面對后面一種情況,假設你說的都是對的,面試官會很開心;面對前面一種情況,面試官會讓你說出更多細節,或者問你哪里還能繼續優化,這時候你就知道你的答案和已知最優答案還有差距了。(有些 Google 面試官會在你給出該問題業界已知最優解后仍然問你能不能繼續優化。)所以千萬不要一開始就假設題目很難,覺得給出一個沒有優化過的答案很丟臉。
英語說慢一點
很多時候人一緊張起來,說話就會越說越快,在有點口音的情況下只會讓對方越來越難聽懂。在對自己技術自信的基礎上,同時也需要對自己的英語表達能力自信。其實語法或者詞匯有點問題,說話有口音,這些影響都不大,只要對方能夠聽到關鍵詞匯,意思還是能明白的。有時候可能雙方都要多說幾次「excuse me」和「what is it」才能問明白對方的意思,但只要最后問題能討論清楚,那你至少還是讓面試官了解到了你的真實實力。
代碼要易讀易改
這個問題來源自某人的一句評論:
有 ACM 背景的人往往在面試過程中都很不介意寫全局變量,但我更期望這個問題的解決方案就是一個函數,所以實現細節都在內部解決。
其實「全局變量」不是重點,代碼的易讀性和可維護性才是重點,而這往往是 ACM 或個人項目所缺乏的訓練,這種問題尤其容易出現在編碼能力很強但很少跟人合作的人身上。
對於 ACM 而言,只要程序能運行代碼怎么寫都沒所謂,反正代碼的生命周期也就是幾個小時,無論是否通過幾個小時后你就不會再去閱讀或者修改這段代碼了。這種訓練使得寫 hacky 代碼缺少懲罰。但在實際工作當中,任何 hacky 的代碼都會引入新的 technical debt,最終肯定是你以及你的同事承擔。你寫下的第一個版本,可能要在代碼庫中停留幾年才有人完全推倒重寫,這幾年內不停地有人在上面做修改,你需要保證在這個過程當中大家都還能明白這段代碼是干什么的。
如果你把面試官看做同事,那么你寫的代碼自然是要經過他 code review 的。不要為了追求高性能而寫出很難讀的代碼來,面試官讀不懂就判斷不了代碼的正確性,性能再好也沒有用。你寧可先寫下來最清晰可讀的版本,如果面試官說需要優化性能時再做優化。
其它參考資料
我暫時能想到的就這么多了。此外推薦 David Wei 的《面試硅谷創業公司:請把面試官當成你的同事》。
