自學 14 天后,我毀掉了自己的數據工程師面試

本文最初發表在 Medium 博客,經原作者 Emanuele Maruzzi 授權,InfoQ 中文站翻譯並分享。

我是如何搞砸面試的?

我既然寫下本文,就應對讀者赤誠相見。我真的不是優秀的數據工程師,也不是優秀的軟件開發人員。儘管如此,但技術能力我可能還是有的,而且也有幹勁。雖然技術上不是最優秀的,但我比較善於與人打交道。你可能會問:“那我為什麼還要讀這篇文章呢?” 答案很簡單:因為失敗乃成功之母。至於我這篇文章的觀點,嬉笑怒罵皆由你。

我將我的經歷寫下來,就是希望能夠撫慰一下那些面臨求職面試或做副業項目時感到受挫的人們。

背景故事

我在一家公司工作有一年半的時間了,做了很多數據萃取和構建報告的項目。我覺得這些工作很簡單,我很肯定這些工作我都能夠勝任。然而,我依然想要嘗試一些新事物,於是有位朋友給了我一個機會,讓我以數據工程師的身份去他的初創公司參加面試。幾天後,我和這家公司的人力資源部負責人、技術負責人進行了第一次面試,一切都很順利,我們約好了去他們總部進行下一輪面試。雖然我現在的工作並沒有這個新職位所需的技能,但面試官並不在意這一點,他就是想看看面對新的挑戰,我會有怎樣的表現。

在真正的面試之前,他給了我 14 天的時間讓我學習 Apache Spark 和 Apache Airflow,而這 14 天恰恰就是問題所在。

“噩夢”的開始

Apache Airflow 是一個工作流管理平臺。它用於定義 DAG(Directed acyclic graph,有向無環圖)並對其進行調度。DAG 是 Airflow 表達操作和命令的方式,你可以通過下圖來了解它的要點。

版權所有:Apache Airflow 軟件基金會

Airflow 最廣泛的用例是構建 ETL(extract, transform and load,萃取、轉置、加載)管道並對其進行監控。

Apache Spark 是一個分佈式計算框架。簡單地說:只需告訴 Spark 你需要做什麼,它就會用 MapReduce 範式將工作分配到計算機集群上。聽起來很有趣是吧?那就去看看它們的官方文檔吧:Airflow 和 Spark。

Airflow 鏈接: https://airflow.apache.org/docs/stable/ Spark 鏈接: https://spark.apache.org/docs/latest/

接到任務的當天,我一下班就開始閱讀這些文檔和教程。我花了兩三個晚上看看那些到底是什麼,然後決定實操。我只是簡單地開始編寫代碼,雖然中間出現了一點小曲折,但我也沒有太在意。

如我上文所言,開始動手做並不難,但這次我發現我錯了。我下載了一些 Docker 鏡像來模擬 Apache Spark 集群,並通過 pip 安裝了 Airflow 軟件包。但我卻無法讓它工作。不管我怎麼折騰,就是沒搞定。就這樣,四天過去了,面試準備時間只剩十天了。我能做什麼呢?是時候召喚 Google 大神了:我以 “Apache Spark Cloud” 為關鍵詞進行了搜索,其中一個結果是 Google Dataproc。

如今,Google 是推動雲解決方案的三大公司之一,但在我看來最重要的是,Google 提供了免費的套餐,可以免費使用他們的平臺,聽起來不錯。啟動 Apache Spark 集群很容易,只需在 Dataproc 上選擇一些選項,然後等上五到十分鐘,所有的基礎設施就都設置好了。

Cloud Composer 是 Google 提供的另一項服務,它設置了運行 Airflow 的 Web 服務器,這樣你就可以在幾分鐘內設計出 DAG。

項目

當我開始嘗試用 Google 的教程來熟悉環境時,我有了一個想法:我可以構建一個小項目,一個概念驗證,然後在面試的時候將其展示出來。以我的經驗,我認為這個做法應該會給面試官留下好印象。

我想創建一個管道,將一些數據加載到 BigQuery(Google 的數據存儲工具之一)。我之所以選擇 Reddit 作為我的來源,是因為我已經知道 Reddit 的 API 怎麼用。我想到的工作流非常簡單,步驟如下:

從 Google Cloud 上的單個虛擬機調用 Reddit API,並將前 100 條帖子的數據存儲在 Frontpage 上。將此數據加載到 Google Cloud Storage(類似於數據容器的文件系統)。使用 Dataproc 來萃取數據、轉置數據,執行一些數據質量相關的操作,然後將其加載到 BigQuery。(這一步驟是可選的)從 BigQuery 構建另一個 Dataproc 來分析數據。使用 Google Composer 對此工作流進行調度。

每個項目都要有一個明確的目標,這點我做到了。儘管不是最初設定的目標,但我的目標一直很明確。

長話短說,我搞砸了。

前兩個步驟是最簡單的:每隔十分鐘,我在 Google Cloud Storage 上的目錄就會有一個新的 JSON 文件。

當我終於完成第三個步驟時,我的興奮溢於言表,於是,我跳過了第四個步驟。

但是,第五個步驟比我想象得還要難,這時,離面試時間只剩下三天。我和十天前的情況一樣,再次不知所措。

在剩下的日子裡,我試著進行一些修補把事情搞好,最後一天,不知怎麼著,我把 Dataproc 部分的管道給弄壞了。我知道你們很多人都會這麼說:“為什麼不用 Git 或者做備份之類的呢?” 我完全同意你們的這一說法。我刪除了 Google Cloud 項目中的所有內容,除了前面兩個步驟以外,因為只有這兩個步驟我還有點信心。

到了面試的那一天,我來到了公司總部。因為我已經參加過一些面試,我可以自信地說,我一直都很擅長面試。我以一個思維敏捷、機智和勇敢的形象出現在了面試官的面前。我對這個職位抱有很大的希望,儘管面試官對我很友好,但我還是感到很緊張。

面試官提的問題都挺標準的,無非就是一些 Python 和 SQL 的原理,以及他們要求我學習的技術。我不記得所有的問題了,但有一個問題讓我記憶猶新。“Yield 在 Python 中是什麼意思,在哪裡使用?” 當時我就傻眼了,內心暗自痛罵自己。我在 Apache Spark 和 Apache Airflow 上浪費了太多的時間,思考我那個剛剛搞砸的小項目,但我還沒有修改我的主要技能,以至於我在前一年就已經荒廢了。我沒有項目來保護我或掩飾我對 Airflow 或 Spark 的知識匱乏,所以,很多問題我都回答錯了。

過了些日子,我收到了面試官的一封郵件,措辭非常親切,他們告訴我,我太過缺乏經驗,不適合這份工作。他們還說這是一個艱難的決定,因為他們很喜歡我這個人。

我真的很恨自己,不是因為失去了這個機會,而是因為被自己想達到的目標矇蔽了雙眼。雖然我花了這麼多時間來學習這些基礎知識,但內心深處有一種聲音在催促著我,希望能快點把事情做完。多年來我所建立起來的那種不受挑戰的自負精神,也隨之瓦解了。現實狠狠地打了我的臉,我意識到我有多少事情都給忘記了。

我沒有計劃,只有一套我稱之為計劃的任務,而我沒有設定完成每項任務的時間表,也沒有 B 計劃。我本可以制定一個計劃的,但我當時覺得沒有必要這樣做。

結論

我花了幾天的時間來反思我的錯誤,於是便有了本文。

你可以認為我技術太爛。但是,我確實認同這句話:失敗乃成功之母。

經歷了面試這些事後,我又去 Python 官網看了很多年前就讀過的 Python 入門,開始學習一些 Coursera 的網課。現在,我正有條不紊地去學習這些課程。

我一直對自己說,就算我不是一個優秀的程序員,也沒有什麼力量能夠阻止我努力成為一名優秀程序員的決心。

具有諷刺意味的是,就在幾周前,我還向邀請我應聘這份工作的朋友展示了我的小項目還剩下些什麼。他說:“你應該給他們看看這個,他們肯定會選你的!” 我只不過在這些文件上做了一些更新,用 Google 自然語言 API 對所有文本進行分類,並在 Google Data Studio 上做了一個簡單的圖,他就欣喜若狂。

最後,我要給求職者一句忠告,不要對自己太過苛刻,最糟糕的評判者就是自己。試著把注意力放在真正重要的事情上。不要太過擔心,錯誤無論如何都會發生的。