假想面試的時候用 Clojure 做題,狠狠地鄙視了一下不懂 Clojure、且高傲無知的面試官,然後瀟灑地離去。
如果你打算找一份程式設計師的工作,那麼你必須要通過白板面試。 作為工程師,模擬白板面試也經常是我們早上例行公事的一部分,同時還需要在星光層(astral plane)上開啟一個漂亮的網格狀的 xterms 視窗,並且在每個鄰近的目錄中不由自主地執行 ls 命令,以防事情在昨晚有什麼變化。
這不亞於在廚房後面的那個抽屜裡,搞一次天翻地覆地搜查。而那個抽屜裡存放著各種各樣的法蘭盤、螺絲刀和從各種家用電器上掉下來多年的各種配飾或零件。現在誰也不知道這些東西原來是做什麼用的,或許從來就沒知道過,儘管如此,我們還必須小心翼翼的對待它們。
下面我將通過一個常見的面試題,向你演示一下白板面試:反轉連結串列。
首先,我們需要一個連結串列。清除 xterms 中不需要的工作區,然後在兩個括號的作用域中寫上必要的元素和萬用字元。這樣我們就從無到有建立出了一個連結串列。
1 |
(defn cons [h t] #(if % h t)) |
“那不是一個連結串列,那只是一條 if 語句。”面試官說。
“ 這不就是一個另類點的連結串列嗎?”你回答到,同時翻了一個白眼。
1 2 3 4 5 6 |
user=> (def x (cons 1 (cons 2 nil))) #'user/x user=> (x true) 1 user=> ((x false) true) 2 |
“x 到底是什麼?”面試官儘量讓自己看些來友善些。答案就在 REPL,但不要被它一時誤導了,它們可不是你的朋友。你在前臺的“誓言”,不允許你使用它。
1 2 |
user=> x #object[user$cons$cell__4431 0x3b89cc1c "user$cons$cell__4431@3b89cc1c"] |
“瞭解一個事物最好的方式,就是對它命名。”你回答到。恰當的名字具備魔力。由 Ursula K. Le Guin 發明的 K 語言是最古老和最精練的形式語言之一。一旦你使用某個字元對程式進行自定義命名,意味著你將不能再使用這個字元元素。 你自定義的縮寫名稱會記錄在程式的記憶體中。
“呃,好吧,你怎麼從這個連結串列裡面取出一個元素呢?” 面試官又問。
那些巧妙的表示式在你腦海中逐一呈現,彷彿紅地毯在你光著的雙腳下慢慢展開; 猶如昨晚觀看奧斯卡頒獎典禮時,你憧憬著不同的明星來親吻你;又好像你住在瑟略島(Sørøya )山脈之上,月亮就是你的愛人。 除了邊界檢查,你在第一時間寫出了正確的程式碼:
1 2 3 4 |
(defn nth [l n] (when l (if (= 0 n) (l true) (recur (l false) (dec n))))) |
“你能不能給我寫一個正常的連結串列嗎?就像 Python 中的那樣?”
你咬緊牙關,氣憤地在地板上直跺腳,但還是寫了一個排版良好的列印函式。 此刻,你的手掌彷彿充滿了老繭,你的眼皮彷彿沾滿了冰霜、以及菸灰黑色的雪花。 每個函式都是要付出代價的,當然,除非它是無副作用的純函式。
1 2 3 4 5 6 7 8 9 |
(defn prn-list [l] (print "(") (loop [l l] (if (nil? l) (print ")n") (do (print (l true)) (when (l false) (print " ")) (recur (l false)))))) |
白板面試時根本沒有多餘的時間去描述變數、寫示例或文件註釋。在白板面試中,時間就是一切。你就假裝你是一名 Haskell 程式設計師,正當著你奶奶的面繼續完成下面的程式碼。
1 2 |
user=> (prn-list (cons 1 (cons 2 (cons 3 nil)))) (1 2 3) |
面試官笑了,安心了。 至少此時,程式碼輸出的連結串列仍是正序的。“那麼,要反轉這個連結串列,你需要……”
你抓住了他的手,然後在白板上寫程式碼,那感覺就像在用古老的語言吟誦詩句。而此時此刻,他的大腦卻一片混亂,好像鬆了發條的瘋狂亂撞的鐘,又彷彿心臟上爬過絛蟲,砰砰直跳的心臟恨不得逃出胸腔。
1 2 3 4 5 6 7 8 |
(defn reverse [l] (loop [r nil, l l] (if l (recur (cons (l true) r) (l false)) r))) user=> (prn-list (reverse (cons 1 (cons 2 (cons 3 nil))))) (3 2 1) |
當你鬆開他的手時,他結結巴巴地說了些有禮貌的話,然後把連帽衫的拉鍊拉上假裝以抵禦寒冷。這裡將會有其它的面試會議,但你已經不需要參加了。他用銳利的眼光朝你所在的地方看了一眼。
當然,他們會拒絕你,並且總是裝著極其難為情地說,你不符合他們的公司文化。乘風歸去吧。此地不屬於你。