(給伯樂(lè)在線加星標(biāo),看經(jīng)典文章)
假想面試的時(shí)候用 Clojure 做題,狠狠地鄙視了一下不懂 Clojure、且高傲無(wú)知的面試官,然后瀟灑地離去。 如果你打算找一份程序員的工作,那么你必須要通過(guò)白板面試。 作為工程師,模擬白板面試也經(jīng)常是我們?cè)缟侠泄碌囊徊糠郑瑫r(shí)還需要在星光層(astral plane)上打開一個(gè)漂亮的網(wǎng)格狀的 xterms 窗口,并且在每個(gè)鄰近的目錄中不由自主地運(yùn)行 ls 命令,以防事情在昨晚有什么變化。 這不亞于在廚房后面的那個(gè)抽屜里,搞一次天翻地覆地搜查。而那個(gè)抽屜里存放著各種各樣的法蘭盤、螺絲刀和從各種家用電器上掉下來(lái)多年的各種配飾或零件?,F(xiàn)在誰(shuí)也不知道這些東西原來(lái)是做什么用的,或許從來(lái)就沒知道過(guò),盡管如此,我們還必須小心翼翼的對(duì)待它們。 下面我將通過(guò)一個(gè)常見的面試題,向你演示一下白板面試:反轉(zhuǎn)鏈表。 首先,我們需要一個(gè)鏈表。清除 xterms 中不需要的工作區(qū),然后在兩個(gè)括號(hào)的作用域中寫上必要的元素和通配符。這樣我們就從無(wú)到有創(chuàng)建出了一個(gè)鏈表。
“那不是一個(gè)鏈表,那只是一條 if 語(yǔ)句?!泵嬖嚬僬f(shuō)。 “ 這不就是一個(gè)另類點(diǎn)的鏈表嗎?”你回答到,同時(shí)翻了一個(gè)白眼。
“x 到底是什么?”面試官盡量讓自己看些來(lái)友善些。答案就在 REPL,但不要被它一時(shí)誤導(dǎo)了,它們可不是你的朋友。你在前臺(tái)的“誓言”,不允許你使用它。
“了解一個(gè)事物最好的方式,就是對(duì)它命名?!蹦慊卮鸬?。恰當(dāng)?shù)拿志邆淠Я?。?Ursula K. Le Guin 發(fā)明的 K 語(yǔ)言是最古老和最精練的形式語(yǔ)言之一。一旦你使用某個(gè)字符對(duì)程序進(jìn)行自定義命名,意味著你將不能再使用這個(gè)字符元素。 你自定義的縮寫名稱會(huì)記錄在程序的內(nèi)存中。 “呃,好吧,你怎么從這個(gè)鏈表里面取出一個(gè)元素呢?” 面試官又問(wèn)。 那些巧妙的表達(dá)式在你腦海中逐一呈現(xiàn),仿佛紅地毯在你光著的雙腳下慢慢展開; 猶如昨晚觀看奧斯卡頒獎(jiǎng)典禮時(shí),你憧憬著不同的明星來(lái)親吻你;又好像你住在瑟略島(S?r?ya )山脈之上,月亮就是你的愛人。 除了邊界檢查,你在第一時(shí)間寫出了正確的代碼:
“你能不能給我寫一個(gè)正常的鏈表嗎?就像 Python 中的那樣?” 你咬緊牙關(guān),氣憤地在地板上直跺腳,但還是寫了一個(gè)排版良好的打印函數(shù)。 此刻,你的手掌仿佛充滿了老繭,你的眼皮仿佛沾滿了冰霜、以及煙灰黑色的雪花。 每個(gè)函數(shù)都是要付出代價(jià)的,當(dāng)然,除非它是無(wú)副作用的純函數(shù)。
白板面試時(shí)根本沒有多余的時(shí)間去描述變量、寫示例或文檔注釋。在白板面試中,時(shí)間就是一切。你就假裝你是一名 Haskell 程序員,正當(dāng)著你奶奶的面繼續(xù)完成下面的代碼。
面試官笑了,安心了。 至少此時(shí),代碼輸出的鏈表仍是正序的。“那么,要反轉(zhuǎn)這個(gè)鏈表,你需要……” 你抓住了他的手,然后在白板上寫代碼,那感覺就像在用古老的語(yǔ)言吟誦詩(shī)句。而此時(shí)此刻,他的大腦卻一片混亂,好像松了發(fā)條的瘋狂亂撞的鐘,又仿佛心臟上爬過(guò)絳蟲,砰砰直跳的心臟恨不得逃出胸腔。
當(dāng)你松開他的手時(shí),他結(jié)結(jié)巴巴地說(shuō)了些有禮貌的話,然后把連帽衫的拉鏈拉上假裝以抵御寒冷。這里將會(huì)有其它的面試會(huì)議,但你已經(jīng)不需要參加了。他用銳利的眼光朝你所在的地方看了一眼。 當(dāng)然,他們會(huì)拒絕你,并且總是裝著極其難為情地說(shuō),你不符合他們的公司文化。乘風(fēng)歸去吧。此地不屬于你。 |
|
來(lái)自: 漢無(wú)為 > 《Java及架構(gòu)》