我討厭編碼面試已經(jīng)不是什么秘密了。
他們是一種糟糕的招聘方式并且容易出現(xiàn)誤報(也就是不必要地拒絕優(yōu)秀候選人)。對于大多數(shù)公司來說,提出白板式的問題并不符合他們的最大利益。
不幸的是,它們是行業(yè)標(biāo)準(zhǔn)。作為一名軟件工程師,您必須在求職過程中回答白板上的問題。
所以,這是我如何擅長于它們的框架。
能力觸發(fā)器
這個框架依賴于我在數(shù)十次面試過程中發(fā)現(xiàn)的一些能力觸發(fā)器。我還看到這些技巧對我指導(dǎo)的工程師很有用。
我所說的“能力觸發(fā)器”是指您可以展示的一種做法或可以說出的短語,可以清楚地表明您知道自己在說什么。向面試官發(fā)出信號的小而輕松的時刻:這個人明白了。
坐在桌子的兩邊,我知道最好的候選人在編碼面試中會做一些關(guān)鍵的事情:
提出好的問題來澄清需求
編寫測試并尋找邊緣案例
在陷入細(xì)節(jié)之前要全面思考
8步框架
這是我回答面試問題的過程。我在面試的任何時候都使用這個框架,每次幾乎完全一樣:
提出問題并重申預(yù)期目標(biāo)——當(dāng)面試官給你問題陳述時,問一些澄清問題并用你自己的話重申問題。即使您完全理解問題,也可以將此作為展示能力的一種方式。
搭建解決方案、偽代碼——不要立即深入研究代碼。相反,請使用注釋/偽代碼粗略地概述您的解決方案,以展示您的一般方法并讓您從整體上考慮問題。
直截了當(dāng)?shù)卣f,“這看起來合理嗎?我走在正確的軌道上嗎?” — 在采訪的早期階段,征求反饋意見。讓你的面試官有機(jī)會向你指出不同的方向。你會驚訝于面試官經(jīng)常說:“聽起來完全正確!” 或者,“有趣的是,你很接近,但你有沒有考慮過……”Free 很早就暗示了解決方案!
編寫一些實現(xiàn),做簡單的部分——不要太沉迷于困難的部分,而是用一些真實的代碼替換你的偽代碼,這樣你就可以開始運(yùn)行它了
編寫快樂路徑測試用例和測試運(yùn)行器——這是一個巨大的能力觸發(fā)器。預(yù)先編寫一些簡單的測試用例,為您的代碼運(yùn)行提供真實數(shù)據(jù)。目標(biāo)應(yīng)該是讓您的代碼盡快運(yùn)行。
迭代代碼,直到解決快樂路徑測試用例——這是面試的實際工作。解決這個問題。但是請注意我們是如何只在第 6 步解決問題的。到目前為止,您已經(jīng)為解決問題奠定了良好的基礎(chǔ)。
尋求優(yōu)化并直截了當(dāng)?shù)貑?,“這能更高效嗎?” — 這是許多候選人錯過的一步。與面試官一起尋找優(yōu)化方法(如果有的話)。討論運(yùn)行時間和權(quán)衡。另一個重要的能力觸發(fā)器是討論權(quán)衡和替代實施的能力。
測試邊角案例——當(dāng)您的快樂路徑測試案例正常運(yùn)行時,不要就此止步。另一個重要的能力觸發(fā)器是證明您了解如何查找邊緣情況和處理錯誤。
Fizzbuzz 示例
假設(shè)您被問及經(jīng)典的fizzbuzz 問題。
從明確要求開始。我什么時候應(yīng)該停止迭代?3 和 5 是否被硬編碼為間隔,或者嘶嘶聲和嗡嗡聲除數(shù)是否可變?函數(shù)的返回值是多少?數(shù)字是字符串還是整數(shù)?
搭建解決方案——我需要一個空列表。有一個 for 循環(huán)來遍歷整數(shù)。有一些邏輯可以決定將什么附加到每個整數(shù)的列表中。最后,我應(yīng)該返回列表。我會直接問面試官,“這看起來合理嗎?有什么我想念的嗎?
編寫一些解決方案——定義函數(shù)
def fizzbuzz(stop: int)
。初始化一個空列表result = []
。開始一個循環(huán)for i in range(stop):
。在循環(huán)中,我需要一些邏輯,但我們先不要深入。在循環(huán)中的某個時刻,我需要result.append(i)
. 然后,用 結(jié)束函數(shù)return result
。這肯定還沒有解決問題,但它給了我工作的結(jié)構(gòu)。讓我們運(yùn)行它!寫一個測試用例——起初,我可能會做一些類似的事情
print(fizzbuzz(3))
,只是手動查看它是否打印出來[1, 2, 'fizz']
。我可以python fizzbuzz.py
從命令行運(yùn)行它。但我們需要更全面的測試,所以我可能會創(chuàng)建一組test_cases
并迭代它們以查看我的代碼產(chǎn)生的結(jié)果。迭代代碼 — 現(xiàn)在,我實際上已經(jīng)準(zhǔn)備好搞亂 fizzbuzz 的邏輯了。我可以嘗試我的代碼并重新運(yùn)行測試,直到我做對為止。
尋找優(yōu)化——在這種情況下,可能沒有太多優(yōu)化。還是挺好看的。但這
fizzbuzz
是一個線性問題,因為您需要為每個整數(shù)打印一些東西。測試極端情況——當(dāng)你執(zhí)行
fizzbuzz(0)
or時會發(fā)生什么fizzbuzz(-1)
?我是否需要處理無效輸入的情況,例如fizzbuzz('a')
orfizzbuzz(None)
?
示例代碼
昨晚我和一位教練客戶一起完成了這個練習(xí)。這是我們在短短幾分鐘內(nèi)使用該框架得出的結(jié)論:
def fizzbuzz(stop: int):
"""On multiples of 3, print 'fizz'
On multiples of 5, print 'buzz'
On multiples of both, print 'fizzbuzz'
For all other numbers, print the number
"""
result = []
for x in range(1, stop+1):
if x % 15 == 0:
result.append('fizzbuzz')
elif x % 3 == 0:
result.append('fizz')
elif x % 5 == 0:
result.append('buzz')
else:
result.append(x)
return result
test_cases = (
(-1, []),
(0, []),
(1, [1]),
(3, [1, 2, 'fizz']),
(15, [1, 2, 'fizz', 4, 'buzz', 'fizz', 7, 8, 'fizz', 'buzz', 11, 'fizz', 13, 14, 'fizzbuzz']),
)
for stop, expected in test_cases:
actual = fizzbuzz(stop)
try:
assert actual == expected
print('PASS!')
except:
print(actual, expected)
框架的價值
在像面試這樣壓力很大的情況下,有一個可以依靠的框架是非常有價值的。當(dāng)你覺得自己陷入困境時,只需按照步驟設(shè)置你需要的工具——腳手架、單元測試,以及你可以從面試官那里得到的任何提示。
希望這會有所幫助!關(guān)于面試還有其他問題或意見嗎?給我回信。
每日清單
我每天早上都會為軟件開發(fā)人員寫一些新東西。
如果你喜歡我的文章,點贊,關(guān)注,轉(zhuǎn)發(fā)!