
你是否覺得很奇怪,當你準備換工作,需要參加面試的時候,你首先想到的就是「我需要準備面試」。解決 HackerRank 上的問題,閱讀破解編碼面試,記住 ArrayList 的工作原理以及它與 LinkedList 的區別。哦,是的,他們可能還會問到排序問題,而說快速排序很可能是最佳選擇顯然是不專業的。
但等等,你每天編程 8 小時,解決有趣和非平凡的問題,在新的工作中你也會做或多或少相同的事情。但儘管如此,為了通過面試,你需要做一些準備,甚至不是為了磨練你的日常技能,而是為了了解你在目前的工作中不需要什麼,以及在下一份工作中不太可能需要什麼。你反對說電腦科學已經融入我們的血液,如果我們半夜被叫醒,就不得不閉著眼睛在一個樹寬的枕套上寫字,甚至沒有意識,我的回答是,如果我在馬戲團找到一份工作,我的主要技巧就是這個 - 那麼也許是的,我同意。這個技能需要經過測試。
但是為什麼要測試與目前工作不相關的技能呢?只是因為它變得時尚了?因為Google就是這麼做的?或者因為你未來的團隊領導在面試之前必須學習所有的排序方法,而現在他認為「每個優秀的程式設計師都必須熟記在字串中尋找回文的實現方法」。
那麼,你不是谷歌(c)。谷歌能做到的事,普通公司做不到。谷歌在分析了其員工的數據後得出結論:對於谷歌來說,對於其任務來說,具有奧林匹克背景的工程師非常擅長處理這些任務。此外,當他們設計選擇流程時,他們可以承擔可能不會僱用少數優秀工程師的風險,因為他們無法輕易解決數學問題。但對他們來說這不是問題,有很多人想在谷歌工作,這個職位會被填滿的。
現在讓我們看看窗外,如果仍然沒有工程師在你的辦公室前面紮營想要為你工作,並且你的開發人員更多的時候是在 stackoverflow 上搜索下一個要放入的 Spring 註釋,而不是排名算法的複雜性,那麼,很有可能,你是時候考慮是否值得複製谷歌了。
好吧,如果谷歌這次讓我們失望了,沒有給我們答案,我們該怎麼辦?檢查開發人員在工作中具體做什麼。您看重開發人員的哪個面向?
為您想要雇用的人制定標準,並制定測試這些確切技能的測試。
ThoughtWorks的
ThoughtWorks 與此有何關係?正是在這裡,我找到了自己的模範面試範例。 ThoughtWorks 是誰?簡而言之,它是一家在世界各地設有辦事處的高端顧問公司,從中國、新加坡到美洲大陸,它已在發展領域提供諮詢服務約 25 年,並且擁有自己的科學部門,由馬丁·福勒 (Martin Fowler) 領導。如果你要找一份軟體工程師必讀的 10 本書的清單,那麼其中大概會有 2-3 本是由 ThoughtWorks 的人寫的,例如 Martin Fowler 的《重建》和 Sam Newman 的《構建微服務:設計細粒度系統》或《構建進化架構》。
作者:Patrick Kua、Rebecca Parsons、Neal Ford。
該公司的業務建立在提供相當昂貴的服務上,但客戶買單的是非凡的質量,包括專業知識、內部標準,當然還有人員。因此,僱用合適的人才至關重要。
什麼樣的人是對的?當然,每個人都有自己的。 ThoughtWorks 確定其開發者業務模式最重要的標準是:
- 能夠成對發展。這正是能力,而不是經驗或技能。沒有人會指望已經練習結對程式設計 5 年的人會來。但接受別人的意見、善於傾聽是一項必備技能。
- 能夠編寫測試,最好能夠實踐 TDD
- 了解 SOLID 和 OOP 並能夠應用它們。
- 提出你的觀點。顧問必須與客戶的開發人員以及其他顧問一起工作,如果一個人可以很好地做某事,但完全無法將其傳達給團隊的其他成員,那麼就沒有太大的好處。
現在,評估候選人的這些特殊技能非常重要。這裡我想談談我在ThoughtWorks的面試經驗。我馬上就會說,我去了新加坡並且通過了,但招募流程是標準化的,在各國之間不會有太大差別。
0.HR 期
正如通常的情況一樣,與 HR 進行 20 分鐘的面試。我不會詳細闡述這一點,我只想說,我從來沒有見過一個人力資源人員可以花 15 分鐘談論公司的發展文化、為什麼使用 TDD、為什麼要結對程式設計。通常,當被問到這個問題時,HR 會感到沮喪,並說他們的流程很正常:開發人員開發,測試人員測試,經理推動。
第一階段。你對 OOP、TDD 有多擅長?
面試開始前1.5小時,我被指派了製作火星探測器模擬器的任務。
火星探測器任務美國太空總署將派遣一隊機器人探測器降落在火星高原上。好奇的人們認為,這片高原呈矩形,火星探測車必須穿越該高原,以便機載攝影機能夠拍攝到周圍地形的完整圖像並發回地球。偵測車的定位和位置由 x 和 y 座標以及代表四個基本羅盤點之一的字母組合來表示。為方便導航,高原被劃分成網格狀。一個範例位置可能是 0, 0, N,這意味著探測車位於左下角並面向北方。為了控制火星車,美國太空總署發送了一串簡單的字母。可能的字母是「L」、「R」和「M」。 「L」和「R」分別使探測車向左或向右旋轉 90 度,而不會從目前位置移動。 「M」表示向前移動一個網格點,並保持相同的航向。
假設 (x, y) 正北方向的正方形是 (x, y+1)。
輸入:
輸入的第一行是高原的右上座標,左下座標假定為0,0。
其餘輸入是與已部署的探測車有關的資訊。每個探測器有兩條輸入線路。第一行給了探測器的位置,第二行是一系列指令,告訴探測器如何探索高原。該位置由兩個整數和一個用空格分隔的字母組成,對應 x 和 y 座標以及探測車的方向。
每輛火星車將依序完成移動,這意味著第二輛火星車只有在第一輛火星車完成移動後才會開始移動。
OUTPUT:
每個探測車的輸出應該是它的最終座標和航向。
注意事項:
只需實現上述要求並透過編寫單元測試來證明吸塵器可以正常工作。
創建任何形式的使用者介面超出了範圍。
最好採用 TDD(測試驅動開發)方法解決問題。
在短暫的時間內,我們更關心品質而不是完整性。
*我無法發布發給我的作業,這是幾年前佈置的舊作業。但請相信我,從根本上來說一切都還是一樣的。
我想特別提請大家注意評估標準。您有多少次遇到過這樣的情況:對候選人來說重要的事情在篩選過程中卻完全不重要,反之亦然?並非每個人的想法都與您相同,但是如果您的價值觀被明確地寫下來,那麼許多人都會接受並遵循您的價值觀。因此,從評估標準來看,可以立即看出,現階段最重要的技能是
- 測試驅動開發;
- 能夠使用 OOP 並編寫可維護的程式碼;
- 結對程式設計技能
所以我被警告要花這 1.5 小時思考如何完成任務,而不是寫程式碼。我們將一起編寫程式碼。
當我們打電話時,他們簡要介紹了他們是誰以及他們做什麼,並建議我們開始開發。
整個面試過程中,我一點感覺都沒有像在接受面試。感覺就像在團隊中開發程式碼一樣。如果你在某個地方遇到困難,他們會幫助你、提供建議,討論甚至爭論如何最好地解決問題。在面試中,我忘記瞭如何在 JUnit 5 中檢查某個方法是否引發異常 - 他們建議我繼續編寫測試,而其中一個人則在 Google 上搜索如何做到這一點。
面試結束後幾個小時,我就收到了建設性的回饋——我喜歡什麼,不喜歡什麼。就我的情況來說,我因使用密封類別作為空物件的替代而受到稱讚;在編寫程式碼之前,先編寫關於如何控制探測車的偽代碼,從而獲得類別的草圖,至少是那些涉及機器人 API 的類別。
第 2 步:告訴我們
面試前一周,我被要求就我感興趣的任何主題準備一份演講。格式簡單而熟悉:15 分鐘演示,15 分鐘回答問題。
我選擇了 Bob 叔叔的《清潔架構》。我又接受了一些人的面試。這是我第一次用英語演講,如果我當時處在壓力很大的環境中,也許我就應付不了。但我再也沒有感覺到自己在參加面試。一切如常──我講故事,他們專心聆聽。即使是傳統的問答環節看起來也不像是一次面試,很明顯,這些問題並不是為了「讓他們失望」而問的,而是那些我對我的演講真正感興趣的問題。
面試幾個小時後,我收到了回饋 - 演講非常有用,他們真的很喜歡聽。
第 3 階段。生產品質規範
由於被告知這是技術面試的最後階段,我被要求將代碼帶回家,使其達到生產就緒狀態,之後我會將代碼發送出去進行審查,並安排面試,面試時任務要求會發生變化,代碼也需要修改。展望未來,我可以說程式碼審查是盲目的,審查人員不知道候選人申請的職位,看不到他的履歷,甚至看不到他的名字。
我打了個電話,監視器另一邊又出現了幾個人。一切都像第一次面試一樣:最重要的是不要忘記 TDD,告訴你正在做什麼以及為什麼要做。如果您以前沒有實踐過 TDD,我建議您立即開始,這並不是因為公司要求這樣做,而是因為它可以讓您的生活更輕鬆,減輕壓力。還記得您必須瘋狂地在偵錯器中搜尋只能透過瀏覽器重現的錯誤,但無法透過測試重現它嗎?現在想像一下在面試中發現這樣的錯誤——你一定會掉幾根白髮。透過 TDD 我們能得到什麼?你修改了程式碼,突然意識到測試現在變成紅色,但你第一次卻無法弄清楚錯誤是什麼?好的,我們對面試官說“哎呀”,按 Ctrl-Z 然後開始向前邁出小步。是的,你需要培養使用 TDD 進行開發的能力,朝著目標前進的能力,這樣你的測試就永遠是綠色,而不是半天都變成紅色,因為「你有一個大的重構」。這與編寫可維護程式碼或高效程式碼的技能完全相同。
因此,程式碼的更改程度取決於您最初的設計、其簡單程度以及測試的優劣。
面試結束後幾個小時內我就收到了回饋。此時我意識到我已經快到達目的地了,距離「與福勒的會面」只剩下很少的時間了。
第 4 階段。最後。技術問題已經夠多了。我們想知道你是誰!
說實話,我對這種提問題的方式有些困惑。你怎麼能在一個小時的談話中了解我是什麼樣的人?更何況,我說的不是我的母語,而且坦白說,我說得非常糟糕、結巴,別人怎麼能理解這一點呢?在先前的訪談中,我說話比回答問題更容易,這是我的口音造成的。至少有一位面試官是亞洲人——而且他們的口音,可以說,有點適合歐洲人聽。因此,我決定採取一種積極主動的方式——準備一份關於我自己的介紹,並在面試開始時透過這份介紹來介紹我自己。如果他們同意了,那麼至少我要問的問題就會少一些,如果他們拒絕了這個提議,那麼,我花 3 個小時做一次演講也不算太貴。但是您應該在簡報中寫什麼呢?傳記 - 出生在那裡,然後上學,大學畢業 - 誰在乎?
如果你對 Thoughtworks 文化進行一些谷歌搜索,你會發現一篇由 Martin Fowler 撰寫的文章 [https://martinfowler.com/bliki/ThreePillars.html],其中描述了三大支柱:可持續業務、軟體卓越和社會公正。
我們假設我已經檢查過軟體卓越性了。它仍然體現著可持續的商業和社會正義。
此外,我決定專注於後者。
首先,我解釋了為什麼選擇 ThoughtWorks——大學時我讀過 Martin Fowler 的博客,因此熱愛 Clean code。
項目也可以從不同角度呈現。他還開發了醫療軟體,使患者的生活更加輕鬆,據傳言,甚至挽救了一條生命。我也為銀行開發軟體,這也讓市民的生活更加方便。尤其是如果這個銀行的使用者是全國 70% 的人口。這與俄羅斯儲蓄銀行無關,甚至與俄羅斯也無關。
想要了解我嗎?好的。我的興趣是攝影,我拿著相機大概有10年了,有些照片我並不羞於向別人展示。另外,有一次,我還幫了一個貓咪收容所:我為那些需要永久住所的貓咪拍照。有了好的照片,貓咪就能更容易找到一個家。我肯定拍了上百隻貓的照片:)
最終,我的演講有 80% 都是關於貓的。
演示結束後,人力資源部立即寫信給我,說他還不知道面試的結果,但整個辦公室已經對這些貓咪印象深刻。
最後,我等待回饋——我作為一個人讓每個人都滿意了。
但在最後的談話中,HR巧妙地解釋說,社會正義非常好且必要,但並非所有項目都是如此。他問我是否害怕。總的來說,我對社會正義有點過分了,這是常有的事 🙂
總
因此,我已經在新加坡的 Thoughtworks 工作了幾個月,我發現這裡的許多公司都在採用谷歌的“面試最佳實踐”,使用傳單和白板進行編碼,儘管這份工作不需要 Spring、Symfony、RubyOnRails(視情況而定)以外的知識。工程師們在面試前會休息一週來「準備」。
在 Thoughtworks,除了對應聘者提出足夠的要求外,也把以下原則放在第一位:
面試的樂趣。 而且,對雙方來說。確實,如果你想要得到最好的人才(誰不想呢?),那麼面試就不是一個挑選奴隸的市場,而是一個雇主和候選人相互評估的觀看過程。如果候選人將愉快的情感與公司聯繫起來,那麼他很可能會選擇這家特定的公司。
多名面試官可以減輕偏見。 在 Thoughtworks,結對程式設計是事實上的標準。如果這種做法可以應用於其他領域,TW 也會嘗試這樣做。每個階段面試均由2人進行。因此每個人至少要接受 8 個人的評估,而 TW 會嘗試選擇具有不同背景、不同領域(不僅僅是技術人員)和不同性別的面試官。
最終,聘用決定將基於至少8個人的意見做出,沒有人擁有最終決定權。
基於屬性的招聘 我們不是根據候選人的喜好來做決定,而是針對每個角色和每個階段製定一份包含要評估的屬性的表格。同時,在評估時,強烈建議不要評估某項技能的經驗,而是評估應用該技能的能力。因此,如果候選人沒有機會應用任何技能,例如 TDD,但仍然嘗試應用它們,並聽取有關如何正確使用它們的建議,那麼他很有可能通過面試。
無學歷證明 TW 不要求候選人擁有任何強制性認證或電腦科學教育。只評估技能。
這是我第一次無需準備就參加外商面試。每個階段結束後,我並沒有感覺自己像檸檬一樣被擠掉了,相反,我很高興我可以應用最佳實踐,顯示器另一邊的人們欣賞它,並且每天都在應用它們。
幾個月後,我可以說我的期望完全得到了滿足。 ThoughtWorks 與一般的公司有何不同?在一般的公司裡你可以找到優秀的開發人員和優秀的員工,但是在 TW 他們的專注力卻是超乎尋常的。
如果你有興趣加入 ThoughtWorks,可以在此處查看空缺職位
我還建議您專注於一些有趣的職缺:
首席軟體工程師: , , ,
資深軟體工程師: , , ,
軟件工程師: , ,
資深資料工程師:
質量分析師:
基礎設施: , ,
(我想誠實地警告你,該鏈接是一個推薦鏈接,如果你去 TW,我將收到一筆不錯的獎勵)。選擇你喜歡的辦公室,沒有必要將自己限制在歐洲,畢竟每兩年 TW 都會很樂意將你遷往另一個國家,因為這是 ThoughtWorks 政策的一部分,因此文化會傳播並變得更加同質。
歡迎在評論中提問或請我推薦您。
如果您覺得這個主題有趣,我會寫一下在 ThoughtWorks 工作是什麼樣的感覺以及在新加坡生活的感受。
來源: www.habr.com
