“八股文”? ——什麼是好的技術面試
我之前寫過一篇文章:
這篇文章有詳細的講我喜歡與什麼樣的人共事。我也很希望能儘可能找到這樣的人。
不知道什麼時候起,市面上開始流行所謂的面經、背題之類的八股文,大到位元組、騰訊、阿里、baidu,小到十幾人的小微企業都是開始有大量的演算法類筆試題。而且在面試時的問題也越來越標準化,網上到處流傳著 xxx 公司面經、xxx 公司面試題這種東西,我不禁感嘆這種方式的面試和篩選簡歷的方式真的能招到好的人才嗎?
ReactJs 核心開發 Dan Abramov 和 Youtube 主播和 Dan 進行 了一場模擬面試,這個面試將近持續了一個小時,但是主要是後面的那個演算法題耗費時間,前面幾個問題都是很八股的前端面試題(這部分翻譯和評價來自@程式設計師的喵):
- let 和 const 區別
- 什麼時候使用 redux
- dangerouslySetInnerHTML 是什麼,該怎麼用
- 把一個 div 居中
- 把一個 binaryTree 映象翻轉
- Bonus Q: 一個找兔子的演算法題,兔子出現在陣列的某個位置,但是每次可以跳向相鄰的位置,用最快的辦法找到兔子的位置。
https://www.youtube.com/watch?v=XEt09iK8IXs
把 div 居中算是前端中的經典梗了,Dan 花了好一會時間在面試官的提示下才把一個 div 居中。如果對方不是 React 核心開發,手熟的前端可能就會開始鄙視這位“初級前端”了。
最後一個演算法題比較新穎,這不算紅黑樹式的八股演算法題,倒像是一個 IQ 測試題目。可以看出 dan 也很少碰這類演算法題。他花費了近半個小時在面試官的提示下,按照自己的直覺一步一步推出了答案。但是他最後寫的程式碼是有點小問題的(沒有用 2 來遞增 index),面試者看他思路是對的也沒有指出來了。
即使是非常知名的開源作者在面試這些基礎問題和演算法題的時候都是很困難的,那普通人豈不是更困難?如果不背題的情況下要做出演算法題還是很難的。
我在寫這篇文章之前我搜了下,我發現有篇文章寫得非常好,基本已經把我想說的都概括進去了。
怎樣花兩年時間去面試一個人 – 劉未鵬 | Mind Hacks
我就著這篇文章往下說下自己的感受吧。
現在市面上基本無論實習還是社招、校招都大量的流行筆試的本質是因為如何界定好的、優秀的技術人才越來越難。如果在上面文章說的一樣:
招聘真的很困難。以至於招聘者每年需要絞盡腦汁出新筆試題,以免往年的筆試題早就被人揹熟了。出題很費腦子,要出的不太簡單也不太難,能夠濾掉絕大多數濫竽充數的但又要保證不因題目不公平而濾掉真正有能力的,要考慮審題人的時間成本就只能大多數用選擇題,而選擇題又是可以猜答案的(極少有人會在選了答案之後還敢在空白的地方寫為什麼選某答案的原因的)。更悲催的是,有些題目出的連公司的員工們自己都會做錯(真的是員工們做錯了嗎?還是題目本身就出錯了?)
我們沒有很好的辦法去界定一個人在技術上是否優秀,實踐證明是否在大廠工作過、學歷是否很好只是提高了優秀人才的概率,但並不能決定一個人是否優秀。現在大部分五年以下工作經驗所做的都是純業務開發,例如 API 開發、所謂的”增刪查改“等等。甚至於換不同語言都已經很難了,經常使用 Java 開發的就很難切換到 Python 開發。
即使筆試之後進入面試階段,我們也很難在很短的時間內去界定一個人他是否是好的、優秀的人才。就如在《社會性動物》裡描述的一樣:”我們總是尋求儲存認知(心理)能量並將複雜事物簡單化處理的方法。我們會利用經驗法則去走捷徑。我們會忽略一些資訊以減少認知負擔;我們會過度利用一些資訊以避免去尋找更多的資訊;或者我們只是按照最初的直覺,接受一個不夠完美的選擇,因為它已經足夠好了。人類進化的一個奇怪的特點是它傾向於消極:我們傾向於關注潛在的威脅而不是祝福,這種傾向通常被稱為消極偏見。(羅伊·鮑邁斯特(Roy Baumeister)和他的同事發現,消極的事件通常比積極的事件更有力量。)“。
在面試的過程中,無論是對於面試官還是候選人來說,都很難保持完全中立,會不由自主的傾向於尋找對方的缺點,尋找對方不會什麼、缺點是什麼。甚至如果對方與自己越相似你就會越喜歡他,對方與自己越不相似,自己就越不喜歡他。(如學習經歷、成長環境、同個國家留學、上個公司是同個公司等等)。
對於現在的候選人來說,剛一坐下來就要擔心需要不需要筆試了,等下筆試有電腦還是手寫、有沒有現代的 IDE、有沒有程式碼提示等等。
所以說在短短的幾個小時(很多時候一小時都不夠)中想要發現一個人的閃光點是很難的。僱主在招人時很難選擇優秀的人只能通過更加標準的”考試“來選擇那些至少更擅長應試的人,或者使用標準的面經類的面試題去扣一個框架的細節、一個工具的細節、Hashmap 原理什麼的。在這樣的市場環境下候選人也會慢慢習慣這樣的環境,隨時準備應試。這樣的市場環境將工具和解決問題的能力本末倒置,我們不能說一個擅長使用錘子的人更擅長鍛造,我們也不能說一個擅長鍛造的人一定擅長揮舞錘子。
但實際上對於好的技術開發來說,難道具體的語言和框架不應該只是工具嗎? 哪個用得順手就用哪個麼?我們實際應該要做的不是利用數學知識、計算機相關的知識、邏輯思維能力、分析能力在某個場景下用適合的工具去解決遇到的問題嗎?
我有一次打車遇到一個司機跟我抱怨說每天派單都很少,但是他本人應該優先順序很高才對,那我就問他你是不是每天出門是一樣的路線?他說是,我告訴他你其實可以試下每天出門時每遇到一個十字路口就走與上次不一樣的方向,然後記錄下來哪個條路線單最多最好,以後就按那個路線走。
我們換成計算機領域的話來說,這就是一種類似廣度優先搜尋演算法的演算法,我們將每天出門的路線看作是一張圖,每個十字路口看作是一個節點。廣度搜索演算法可以幫我們分析出從 A 節點出發前往 B 節點哪條路徑最短,我們可以把路徑最短的目標換成哪條路徑同等時間獲得的收益最大。我們只不過是用人力去模擬這個演算法,來實現最優路徑。
所以所謂的精通 xxx、熟悉 yyy、掌握 zzz 的本質是,我們能不能用類似這些東西的機制或者利用這些東西解決業務問題,或者我們能不能利用這些演算法、原理的思想解決現實生活中遇到的問題。
在網際網路這麼多年,最重要的方法論就是在高密度的資訊下用某個方法論解決某個問題。雖然有時候網際網路黑話很好笑,但有時候遇到某個問題的時候就會發現這個黑話還是很好用的,畢竟它代表了某個方法論的簡寫(手動狗頭)。
那麼怎麼樣才能讓僱主方更容易找到好的人,也能讓候選人更好的表現自己呢?我覺得提供一個自己的部落格和 GitHub 之類的開放程式碼平臺能夠非常好的表現自己的技術品味、自學習的能力、進步的速度。長期維護一個好的品味的部落格、深度的部落格是很難的,需要花大量的時間和精力去寫作、去思考。
同時我們可以參與開源專案的貢獻或者我們可以自己設計一個解決了某個經常遇到的問題的專案、模擬某個場景的專案。自己撰寫架構設計文件、技術文件等等然後開發、完善單元測試、不斷完善迭代、嘗試更加新穎的技術。通過把專案展示在 GitHub 之類的平臺上,僱主方可以很好的通過你的專案和程式碼瞭解到你的技術品味,也可以看到你的程式設計習慣是否與自己符合。自己也可以通過長期維護和更新專案不斷更新技術棧。
對於僱主方來說,要思考的是自己所需的人到底是更擅長揮舞錘子的人還是更擅長鍛造的人。如果我們是希望更擅長鍛造的人,我們應該更關注的是候選人本身在什麼樣的環境下、通過什麼樣的方法、取得了什麼樣的成果、吸取了什麼教訓、下次再解決這個問題是否有更好的方案。通過與候選人共同探討過去的經歷,我們很快可以知道這個人是不是適合與自己合作的人(當然重點是合作了能不能解決問題,需要保持中立去評估)。
關於是否應該選擇創業公司的問題,我今天搜尋的時候發現有篇當年好像很火的文章《沒事別想不開去創業公司》,15 年 16 年那個年代我也是創業潮中的一員,在當時的環境下的確就如同文章一樣:
天確實變了,但是這天是不是為你變的,很難說。就像一線城市繁華的夜景,和你有沒有關係,很難說。押上自己所有的時間和機會籌碼,自己創業或加入創業公司,是不是一步好棋,也很難說。
當現在的環境與當年不一樣了,如果說當年是資本+政策+經濟興起的三重推動力的話,現在就是三者都不行的環境了,更惡劣的環境反而容易誕生更加正規和更有潛力的創業公司的。
選擇創業公司不能直接想著加入後就能馬上 IPO 發家致富,而是應該往最壞的方向打算。創業就像吹一個泡泡,太大就會爆炸,太小又沒有任何的意義。如何小心意義的讓這個泡泡不爆成為一個飛在空中的泡泡是一個很難的且要求人非常理性、反人性的事情。
其次選擇一個創業公司一定要去試試它的產品,看看自己喜不喜歡,如果自己都不喜歡這個產品不會經常用,你如何相信這個產品能發展起來?你如果不相信你為什麼要參與創業呢?一隻眼睛看著外面商業環境的變化,隨時準備調整戰略戰術適應市場,另一隻眼睛盯著內部的團隊,隨時要調整和救火。在一個高速發展的公司中的確平日和週末的界限沒那麼明顯,但無論是公司還是個人還是應該想著如何更高效而不是如何加班更多,加班多並不代表高效,高效也不一定要加班更多,像 intel 現在 的 CEO 帕特·基爾辛格在自傳中寫到的——“一個雜耍藝人同時轉動三個小茶碟。一個碟子代表上帝,另一個代表家庭,第三個代表工作。我當時的生活就是這樣,我得時刻注意讓這三個碟子都在空中旋轉,根本沒機會暫停或休息。如果我稍有分神,碟子就會掉下來,摔到地上。也許我們可以把這稱之為有張馳的工作。工作和生活要平衡:工作時要竭盡全力;休息時要完全放鬆,或在家陪伴家人,或外出度假。”
加入創業公司的本質是選一個好的創業公司,與他一起成長,如果他沒法長大為何要加入?如果他要野蠻生長,你呢?
回顧招聘的話題,對於我個人而言,評估一個人是不是好的技術人才最簡單的辦法就是,如果將來網際網路衰敗,當工程師並不能提供很多收入的時候、甚至你換行了你還會喜歡並跟進新的技術嗎?甚至有一天程式設計將死、程式設計師職業消失在歷史長河中,你會怎麼辦?