軟體工程面試中的反烏托邦

職場 發佈 2020-02-28T00:31:04+00:00

去年的1 月份前後,我決定找一份新工作,一家大型搜索和廣告公司的招聘人員在 LinkedIn 上聯繫我,告訴我電話面試的事情。

在面試中,我經常會被要求寫一個算法或者為某個算法編寫測試用例。去年的 1 月份前後,我決定找一份新工作,一家大型搜索和廣告公司的招聘人員在 LinkedIn 上聯繫我,告訴我電話面試的事情。我被要求在 45 分鐘內編寫出康威的遊戲人生。我完寫了整個程序,並進行了良好的測試,但我還是被拒絕了。

磨難

搜索與廣告巨頭公司的面試以失敗告終。我沒能解決這個問題。但這只是今年瘋狂的開始。一開始,我對自己申請的公司很有策略。我不只是想要一份「工作」,還想要一份「合適的」工作。

接下來是一家自動駕駛汽車公司。在提交了申請並準備進行初次編碼篩選後,我幾乎立即收到了回復。面試官讓我編寫一個非常複雜的圖像過濾算法。我寫了,並希望獲得反饋。「這看起來很好!」,他說。第二天我收到了一封事先準備好的拒絕郵件。

然後一家分析公司邀請我面試,我盡所能寫了一個非常複雜的多線程圖像處理系統。招聘人員禮貌地拒絕了我,當我要求反饋時,他們告訴我,我的實現「太低效了」。

之後是一家支付處理公司。我跟招聘人員進行了電話溝通,她對我的簡歷與職位描述的吻合度讚不絕口。第二天,我收到了一封電子郵件,說他們找不到適合我技能的職位。

另一個例子是大型社交媒體平台公司(Giant Social Media Platform Company)。「Jared!感謝您的申請!我認為您對大型社交媒體平台公司是一個很好的補充!我已經把您的申請直接寄給您所在地區辦事處的招聘經理了!」收到這封郵件八分鐘後,我收到了一封自動拒絕郵件,說我的技能不適合這個職位。

然後,我終於獲得了一個大型社交媒體平台公司現場面試的機會。在四場不同的面試中,我和許多人討論了一系列的編程問題,並提出了正確的編寫方案。整個過程,他們問了我一系列令人費解、難以回答的問題:「講講你某一次……」。因為這是我第一次在求職過程中被問到有關作為工程師的經驗和智慧的問題,然後是系統設計面試。

分析

在經歷了這麼長時間的反烏托邦之後,我認為我應該重新評估自己,以獲得更清晰的認識。

我們被自己的神話所消費,關於軟體工程師的幾乎每一個流行概念,尤其是在今天這個科技狂熱的世界裡,都鍾愛獨行俠程式設計師的理念,認為他們可以很輕鬆地編寫任何需求的算法。典型的軟體工程師是脫離社會的、反結構的和高度理想主義的。他或她非常獨立,不需要與任何人溝通就能完成工作。因此,由於我們無意識地相信這種原型,作為一名工程師,我必須通過一個測試這些特質的篩選,才能與了解該職位的人交談。但是,據我們所知,這些特質實際上並不能幫我們找出那些高績效的候選者。軟體公司由一個或多個軟體團隊組成。軟體團隊是個體的集合。

為了在一個有著共同目標的群體中取得成功,個人必須:

  1. 相互溝通。如果一個團隊成員不知道目標是什麼,就會拖累整個團隊。
  2. 與非軟體工程師溝通。不管有多少軟體工程師不喜歡這個觀點,事實是,運營一家軟體公司需要的不僅僅是軟體工程師。
  3. 確定方向。產品的發展方向通常來自軟體團隊之外。畢竟,在某種程度上,這就是為一個組織工作的意義所在:把一個不屬於你的願景帶入了自己的生活中。
  4. 相互學習。在一個團隊中,誰知道什麼誰不知道什麼總是存在不平衡。產品知識和技術技能都是如此。集體團隊的集體技術技能需要一個加權平衡。這就是為什麼我們有不同的經驗層次和責任分配。這種平衡從來都不是,也不應該是靜態的。總有人需要學,總需要有人教。

綜上所述,對於招聘過程的結構,似乎是軟體工程師的流行概念發揮了更大的作用,而不是使軟體工程師在工作中取得成功的特質。

此外,算法到底有多大價值?關於這個問題,有很多觀點。無論我多麼不同意他們的觀點,總有一些人認為,即使你對算法的工作原理一無所知,甚至連一台數字計算機都不知道,你也可以成為一名完美的軟體工程師。我的觀點是,飛機機械師和航天工程師是不同的。哪一個更有價值,你更願意成為哪一個?我這個問題留給你思考。一個更好的問題可能是算法到底有多重要。

算法到底有多重要?雖然我相信算法和計算機工作原理知識對於成為一個成功的、有價值的軟體工程師來說很重要,但我也知道,而且每個人都知道,這些知識很少在工作中用到。「非我發明」的心態在團隊中非常普遍。對於許多應用程式來說,這是一個很好的策略。如果有一個經過良好測試的、萬無一失的庫能夠滿足需求,那麼相比重新發明輪子,引入這個庫才是更安全、更恰當的做法。可以說,圓輪子就是好輪子。所以,如果你考慮與這個問題相關的算法挑戰,你就會想知道我們為什麼要問這些問題。如果許多業內人士都認為這些算法在軟體工程師的日常工作中沒有價值,那麼我們為什麼要用它們來評價軟體工程師呢?

算法挑戰的陰暗面,就像生活中許多哲學問題一樣,這些有害的算法挑戰也有其陰暗面。事實上,有大量的人正試圖投身於科技行業。LinkedIn 上發布的招聘信息,一天之內就有 100 多位求職者。事實上,沒有一家公司有足夠的資源來面試他們所有人。事實是,這些算法挑戰是作為一種機制,用於避開不適合該工作或沒有基本編程技能的申請人。問題是,每個人對於「基本」這個詞在這裡的意思似乎有不同的理解。

我們不知道它們應該多難。在我過去 7 個月的面試中,我遇到了各種各樣的算法難題。比較簡單的,我被要求寫一個函數來反轉一個字符串。比較難的,我被要求模擬一個社交網絡,並編寫一個圖像過濾算法。有一家公司讓我做兩次單獨的編碼面試。在第一次面試中,他們要求我寫一個簡單的排序算法,我寫好了。第二次是用動態編程的方法編寫遞歸排列生成器,這不是一件容易的事。我完全被那個問題難住了。面試結束時,我問面試官:「這個問題對電話面試來說似乎有點難以回答。您經常在支付處理公司編寫遞歸算法嗎?」他回答說:「不,我們不用遞歸。」「那排列呢?您什麼時候用這些?」他回答說:「我們的算法不需要排列。我們這裡的大多數工程師都從事用戶介面和基礎設施方面的工作。」對我來說,這完全說得通。這兩個例子適用於不同公司中技能級別類似的角色。那麼,為什麼一家公司選擇的算法比另一家要難呢?

這個衡量方法僅比俄羅斯輪盤賭好一點點。假設你是候選人。在過去的幾個月里,你研究了所有你能想到的與編程面試相關的主題。假設你申請了 A 公司,A 要求你寫一個二叉樹搜索算法。太棒了!你上周剛學完二叉樹!你以優異的成績通過了考試。現在,假設你申請了公司 B。B 要求你編寫一個 Trie 樹的實現。不要啊!你忘記學習 Trie 了!因為你沒有研究那個主題,所以面試失敗了。現在把順序顛倒一下,假設公司 B 問你二叉樹算法,而公司 A 問你 Trie 樹算法:很明顯,在某些公司,應聘是否成功完全是取決於你碰到的問題。

時間限制是有害且不公正的。通常,在電話面試時,你有 45 分鐘的時間來解決編碼挑戰。對於一個簡單的問題來說,時間足夠了。但當你被要求編寫一個複雜的算法時,這顯然是荒謬的。當我被要求編寫康威的遊戲人生時,我花了 50 分鐘去編寫一段能夠運行的代碼,而幾乎沒有時間去測試它。當我被要求寫一個圖像過濾算法時,我只花了 15 分鐘來理解問題。我沒時間了。如果要在現實世界中編寫如此複雜的算法,可能需要一周的實現時間和一個多月的實際測試時間。最少這麼多。為什麼我們要求工程師在 45 分鐘內完成?

圍繞著如何通過面試,一個山寨產業已經湧現。所有這些算法挑戰都始於像谷歌這樣受歡迎的公司。有幾個在這些受歡迎的科技公司工作的工程師看到了一個賺錢的機會,他們提供了一些準備材料。關於這個主題有兩本很有影響力的書:《程式設計師面試金典》和《編程面試習題集》。這兩本書都提供了指導性的面試準備材料。問題是,這個行業得到了這些書,並根據書中的材料定製了他們的面試。然而,一旦人們開始通過這些書中列出的基本面試問題,這些公司就意識到,他們的招聘是在刮桶底了,不過換了個新桶。因此,他們編了一些新的、更具挑戰性的算法問題,讓自己與眾不同,並從所有看似合格的候選人中挑選出「更合格的候選人」。關於某些公司的現任和前任頂級工程師,有很多趣聞軼事,他們聲稱,面試過程已經變得如此艱難,如果他們現在去面試,可能永遠都無法通過。我看了一場故事精彩的演講。在某家「頂尖」的科技公司,面試流程是這樣的:當求職者通過面試時,他(她)就會有一個關於其面試表現的信息包。然後,信息包會被交給一個委員會,該委員會的工作是公正地審查信息包,並做出聘用決定。有一次,一個特別委員會特別挑剔,他們拒絕了幾個月來的每一個信息包。當人力資源部得知此事後,他們決定進行一次測試。他們給委員會寄去了新一輪的信息包,委員會再次全部拒絕。然後,HR 把他們召集到一個會議上,並解釋說,他們剛剛看到的信息包實際上是招聘委員會成員自己在面試該公司時收到的信息包。他們不知不覺地拋棄了自己!誰又能過這一關呢?

為什麼我們評判他人而不去了解他人?

幾個星期前,我看了一個人的演講,他在一家頂級公司做了大量的面試。用他的話來說,他演講的目的是「提煉出一種在面試中『提取信號』的策略」。「什麼?!人們在認識他人的過程中發生了什麼?這種態度似乎完全是機械的,坦率地說,完全是反烏托邦的。這裡的邏輯是什麼?我們要掃描候選人的大腦來尋找當前表現良好的候選人之間的相似性嗎?這種態度散發出一種混合了可怕的利己主義和組織大男子主義的氣味。在我看來,現在的公司更害怕聘用糟糕的候選人,而不是對有機會聘用優秀的候選人感到興奮。在企業對招聘再次表現出更大的熱情之前,我不認為那能給應聘者帶來多少好處。最糟糕的是,求職者從招聘人員那裡聽到的第一句話是,你看起來很優秀,但一旦你進入面試,你發現的只是他們懷疑你是個騙子。我認為應該用謹慎的樂觀取代懷疑。我確信我能繼續寫下去。我的本子上還有八個要點要寫。但是,這篇文章看起來更像是無休止的指責,而不是一篇博客文章。我希望,至少我能夠傳達一些我在過去七個月里經歷的困難。最後,我發現自己相當矛盾。我現在的老闆剛剛解僱了我們整個辦公室的人,讓我失去了工作,讓我獨自一人寫下這一切對我而言有多痛苦。我不太確定我是否想再經歷一次這個過程。我做了很多思考,根據經驗得出了一些簡單的結論:我知道如何寫代碼。

在過去兩年,我編寫了大約 85000 行 Java 代碼,對我正在開發的產品產生了非常積極顯著的影響。我用 Python 編寫了一些非常複雜的機器學習算法實現,還編寫了一些腳本。我為嵌入式圖形等多種底層應用程式編寫了嵌入式 C 和 C++。我自學了 Flutter 並發布了幾款應用。我自學了 Clojure,這讓我的思維開闊了很多。我使用 C#做過一些開發。我知道如何建立一個靜態網站。我有計算機科學學位。

公眾認為企業迫切希望招聘軟體工程師,而軟體工程候選人面臨著殘酷的現實,這兩者之間存在著根本性的失配。這些生死攸關的高壓編碼挑戰看起來更像是一種欺騙機制,而不是有價值的評估工具。使用它們就像僱傭了一名警察,他們會在你問他對法律了解多少之前就開槍。事實是,我所批評的面試過程可能是公司辨別好的候選人和壞的候選人的唯一方法。我從來沒有加入過招聘團隊,肯定有些事情我不知道。

最後,我有幾個想法:

  • 適者生存是真的,儘管我很想去一家知名的科技公司找一份薪水不錯的工作,但現實是,還有很多人在競爭這些工作。就像生活中的其他事物一樣,資源少而需求大。人人都想通過寫代碼獲得豐厚的報酬。我懷疑,設置如此激進的篩選障礙的原因是,客觀上(不管這意味著什麼)技能水平較低的人的占比比確實擁有這些技能的人的占比要大得多。遺憾的是,這意味著無論你多麼有經驗,都必須和這麼多的人競爭。任何一個學習過編程的人都知道,即使是最低限度地精通基本技能,其學習曲線也很陡峭。除此之外,在工作中取得成功所需的核心能力的知識體系更是龐大。此外,要熟練掌握一套符合市場需求的相關技能是很困難的,更不用說精通它們了。不管一個人通過什麼途徑成為一名軟體工程師,很明顯,競爭是生活的一部分,而且在這個行業中相當激烈。
  • 等級制度是真的,我對軟體工程師的招聘廣告中的分級相當困惑。似乎只有兩個等級:非高級和高級。一般來說,招聘廣告要求應聘者有 5 年的工作經驗,這樣才能被認為是資深員工。這裡似乎缺少了一些分級。我們怎麼稱呼一個有 20 年工作經驗的人?他們真的和有 5 年經驗的人一樣嗎?就我來說,我們怎麼稱呼有 4 年工作經驗的人?我不是應屆畢業生。我知道如何獨立編寫軟體。我知道如何使用版本控制,以及如何在敏捷環境中工作。根據情況,我需要人們為我的工作設定方向。還有一個問題進一步增加了這個問題的複雜性,就是關於一項技術的多年經驗。如果一個人有 5 年的 Java 編寫經驗,並且加入了一個使用 Python 的團隊,而且這個團隊的成員都只有不到兩年的 Python 編寫經驗,那麼這個人應該被視為初級開發人員嗎?這是一個令人困惑的話題,有必要單獨寫一篇完整的文章,即使這樣,我也不確定我是否能夠理解。我的觀點是,我處於初級和高級之間,以我的經驗水平,這似乎是一個渺茫的選擇。
  • 抱怨沒有任何好處,我早晚得另找工作。即使我不喜歡這種方式,我也不得不再次經歷這個循環。但現在我已經受夠了。一遍又一遍的重複同樣的過程,似乎不太可能讓任何事情發生。我最終會回到快樂的循環中,但現在,我要做出唯一一個讓我保持理智的選擇:我要暫時退出這個循環。


關注我並轉發此篇文章,私信我「領取資料」,即可免費獲得InfoQ價值4999元迷你書!

關鍵字: