一個(gè)沒(méi)有數(shù)據(jù)工程經(jīng)驗(yàn)的人成了一家初創(chuàng)公司的第一位數(shù)據(jù)工程師,這是一項(xiàng)艱巨的挑戰(zhàn),但回報(bào)也是很可觀的。
公司在招人的時(shí)候不僅要找到合適的人,還要讓他們相信加入公司是正確的選擇。
當(dāng)我收到 EmCasa 公司的面試邀約的時(shí)候,我是另外一家公司的數(shù)據(jù)科學(xué)家。他們想找一位可以幫助他們組織數(shù)據(jù)的人。我問(wèn)他們現(xiàn)在已經(jīng)有哪些數(shù)據(jù)了,他們真誠(chéng)地回答我:“我們只有 PostgreSQL 數(shù)據(jù)庫(kù)里的幾張表,還嘗試使用了一些 BI 工具,僅此而已”。聽(tīng)了他們的話,我也很誠(chéng)實(shí)地告訴他們:我沒(méi)有亮眼的學(xué)位,之前也沒(méi)做過(guò)數(shù)據(jù)工程師,不懂 Spark,不會(huì) Airflow,不是 ETL 方面的專家,也不懂測(cè)試和 Git 之類的東西,我也不是一名開(kāi)發(fā)人員。但我見(jiàn)過(guò)很多東西,有一些很好,有一些還不錯(cuò)但仍有提升的空間,還有一些完全不行。我的想法是要盡量避免去嘗試已知不可行的東西。
我不知道他們是怎么想的,總之最后我成了他們公司的第一位數(shù)據(jù)工程師。
在加入這家公司后,一切都像他們之前所說(shuō)的那樣。我有足夠的施展空間,可以按照我認(rèn)為的最好的方式去做每一件事情。第一周,我們就制定了一些季度 OKR:
- 從 Facebook Ad、Google Ad、SalesForce 和其他第三方服務(wù)獲取數(shù)據(jù);
- 實(shí)現(xiàn)一個(gè) BI 平臺(tái);
- 將物業(yè)估價(jià)算法準(zhǔn)確度提高 20%;
- 將評(píng)估模型設(shè)計(jì)成獨(dú)立的 API;
- 更新和改進(jìn) Web 爬蟲(chóng)。
為了從第三方服務(wù)提取數(shù)據(jù),我們開(kāi)始調(diào)研 ETL 解決方案,比如 StitchData、Fivetran、Segment、Alooma、Rivery,等等。要為每個(gè)第三方服務(wù) API 構(gòu)建自定義集成方案需要花費(fèi)很多時(shí)間,但我們速度要快,而使用 ETL 服務(wù)解決方案可以為我們節(jié)省幾個(gè)月的開(kāi)發(fā)和維護(hù)時(shí)間。我們決定使用 Rivery,并在兩周內(nèi)搭建了一個(gè) Redshift 集群,用來(lái)每天更新來(lái)自第三方服務(wù)的數(shù)據(jù)。這個(gè)時(shí)候,Luca 加入了我們,成了我們的 BI 分析師。他現(xiàn)在有很多數(shù)據(jù)可以玩了。我們還使用 Metabase 作為儀表盤。到目前為止,一切都很順利。我們終于有了真正的數(shù)據(jù),而不只是 PostgreSQL 里的幾個(gè)表了!
下一步是改進(jìn)物業(yè)估價(jià)模型,并將其作為一個(gè)獨(dú)立的 API(之前的模型是與后端綁定在一起的)。但我們沒(méi)有足夠的數(shù)據(jù)來(lái)創(chuàng)建新模型(雖然確實(shí)有了一些數(shù)據(jù),但還不夠)。于是,我把目光投向了我們的 Web 爬蟲(chóng)工具。它是用 Elixir(我們的后端就是用 Elixir 開(kāi)發(fā)的)開(kāi)發(fā)的,但我不懂 Elixir,于是我決定用 Python 從頭開(kāi)始開(kāi)發(fā)另一個(gè)爬蟲(chóng)。我創(chuàng)建了一個(gè)叫作 Spatula 的 Python 包,它可以從其他網(wǎng)站爬取數(shù)據(jù)清單,并將它們保存到 S3。這個(gè)時(shí)候,我們的數(shù)據(jù)科學(xué)家 Priscila 也加入進(jìn)來(lái),她負(fù)責(zé)處理舊數(shù)據(jù)。我在本地運(yùn)行 Spatula,她就可以使用 Athena 查詢數(shù)據(jù),然后開(kāi)始建模。
接下來(lái),我開(kāi)始研究 Airflow,不過(guò)我遇到了一些麻煩。一個(gè)是學(xué)習(xí)如何編寫(xiě) DAG,一個(gè)是學(xué)習(xí)如何將 Airflow 可靠地部署到 AWS 上。我花了很多時(shí)間學(xué)習(xí) Airflow、Terraform、Docker 和 AWS ECS,才順利地在 AWS 上進(jìn)行了第一次部署(https://github.com/nicor88/aws-ecs-airflow),然后又花了更多的時(shí)間按照我們的需求進(jìn)行了定制。我擔(dān)心這項(xiàng)任務(wù)會(huì)占用太多時(shí)間,所以我問(wèn)經(jīng)理是否可以把時(shí)間往后推一點(diǎn),并換一種方式來(lái)安排任務(wù)(我知道這種方式從長(zhǎng)遠(yuǎn)來(lái)看是行不通的)。經(jīng)理的回答是:“我們?cè)诿嬖嚹愕臅r(shí)候就知道你的情況,有些東西你也不懂,但你可以花時(shí)間去學(xué),找到正確的方式來(lái)完成這些任務(wù)”。這種管理姿態(tài)和”做正確的事情“的承諾是我在其他公司從未見(jiàn)過(guò)的。隨后,我們花了更多的力氣部署好了 Airflow,讓 Spatula 爬蟲(chóng)每周爬取一次數(shù)據(jù)。
收集用戶信息,用來(lái)預(yù)測(cè)房產(chǎn)銷售價(jià)格。我們會(huì)詢問(wèn)物業(yè)的詳細(xì)信息,如有多少個(gè)房間、套房、浴室和車庫(kù)。
這個(gè)時(shí)候,Priscila 的新估值模型也準(zhǔn)備就緒,但還沒(méi)有準(zhǔn)備好用于生產(chǎn)環(huán)境。我開(kāi)始和她結(jié)對(duì)編程,并告訴她我修改了哪些東西,以及為什么和怎么改的。然后我們一起部署了 Priceteller,這是我們的第一個(gè)機(jī)器學(xué)習(xí)模型。它是運(yùn)行在 AWS Lambda 上的 Flask API 和 API 網(wǎng)關(guān)。在部署之前,我們還與開(kāi)發(fā)團(tuán)隊(duì)討論了很多與代碼質(zhì)量、測(cè)試和文檔相關(guān)的問(wèn)題。他們不想在生產(chǎn)環(huán)境中向不可靠的 API 發(fā)送請(qǐng)求——他們提出這樣的高標(biāo)準(zhǔn)絕對(duì)是有道理的。當(dāng)我們達(dá)到他們的標(biāo)準(zhǔn),我們的第一個(gè)機(jī)器學(xué)習(xí)模型就可以上線了。最近,我們還部署了第二個(gè)實(shí)時(shí)模型 Selekta,它可以根據(jù)用戶的偏好來(lái)推薦清單。
我們的第一個(gè)機(jī)器學(xué)習(xí)模型,從數(shù)據(jù)抓取到部署
Priscila 告訴我她以前的公司是如何使用 Airflow 的。因?yàn)槲抑岸紱](méi)有用過(guò) Airflow,所以試著通過(guò)反復(fù)試錯(cuò)來(lái)學(xué)習(xí)。她提出了一個(gè)改進(jìn)清單,我全盤接受了。從那時(shí)起,我們開(kāi)始在 AWS Glue 上運(yùn)行 Spark 作業(yè),并用一個(gè) Airflow 任務(wù)來(lái)觸發(fā)和監(jiān)控它們。我們的作業(yè)每隔一個(gè)小時(shí)從后端獲取數(shù)據(jù)。我們還有其他一些負(fù)責(zé)保存用戶日志事件的任務(wù)。我們還創(chuàng)建了一個(gè)推薦模型,每天以批次的方式運(yùn)行。不知不覺(jué)地,我們現(xiàn)在在 S3 上有了一個(gè)數(shù)據(jù)量超過(guò) 2TB 的數(shù)據(jù)湖。
我們目前的數(shù)據(jù)基礎(chǔ)設(shè)施
那么,我們從中學(xué)到了什么?
如果目標(biāo)明確,學(xué)習(xí)就不是個(gè)問(wèn)題
對(duì)于有數(shù)據(jù)科學(xué)背景的人來(lái)說(shuō),數(shù)據(jù)工程并不復(fù)雜。作為數(shù)據(jù)科學(xué)家,我們感覺(jué)到?jīng)]有可用的數(shù)據(jù)或工具來(lái)完成這項(xiàng)工作是多么的痛苦。但我們可以學(xué)習(xí),Airflow、AWS、Spark、Git、Python,凡是你能想到的東西。只要你知道目標(biāo)是什么,就能在短時(shí)間內(nèi)學(xué)會(huì)它們。漫無(wú)目的的學(xué)習(xí)很難有成效。
了解公司
知道要做什么和動(dòng)手去做是兩碼事。這與公司的文化有關(guān)。在面試的時(shí)候我就知道,我加入了一個(gè)可以讓我擁有自主權(quán)的公司,可以用我認(rèn)為正確的方式去解決問(wèn)題。你可以在面試中問(wèn)他們數(shù)據(jù)對(duì)公司來(lái)說(shuō)有多重要。只是用于提供支持嗎?還是公司發(fā)展戰(zhàn)略的一部分?他們對(duì)你是真誠(chéng)的嗎?如果數(shù)據(jù)并不是公司發(fā)展戰(zhàn)略的一部分,那么你很可能沒(méi)辦法花很多時(shí)間去計(jì)劃和做正確的事情。
數(shù)據(jù)就是產(chǎn)品
將 API、模型和儀表盤作為獨(dú)立的產(chǎn)品,這為數(shù)據(jù)團(tuán)隊(duì)提供了極大的靈活性。但它們必須符合某些標(biāo)準(zhǔn),這樣才能將它們打通。將數(shù)據(jù)作為一種產(chǎn)品,并形成文化,保護(hù)團(tuán)隊(duì)免受日常業(yè)務(wù)問(wèn)題的困擾——可以讓分析師們?nèi)セ卮疬@些問(wèn)題。我們的經(jīng)理可以讓我們免受外界的干擾,讓我們能夠集中精力學(xué)習(xí),把事情做好。
尋求幫助
有時(shí)候你需要獨(dú)自完成一些工作,但有時(shí)候向那些有經(jīng)驗(yàn)的人尋求幫助會(huì)為你節(jié)省很多時(shí)間。如果團(tuán)隊(duì)里有經(jīng)驗(yàn)豐富的人,可以問(wèn)問(wèn)他們之前在其他公司是怎么做的。即使他們不知道該怎么做,至少也會(huì)知道什么行得通,什么行不通。尋求幫助肯定會(huì)把你引向正確的方向。
把時(shí)間花在刀刃上
有些事情可以通過(guò)第三方工具輕松搞定,比如我在本文開(kāi)頭所說(shuō)的 ETL 解決方案。如果你的數(shù)據(jù)倉(cāng)庫(kù)中沒(méi)有來(lái)自 Facebook 的數(shù)據(jù),那就沒(méi)有必要浪費(fèi)時(shí)間學(xué)習(xí)如何連接 Facebook Insights API;如果沒(méi)有運(yùn)行在 EMR 上的作業(yè),就不需要學(xué)習(xí)如何在 EC2 上搭建 Spark 集群;如果沒(méi)有 Glue Job,就不需要使用 EMR;如果沒(méi)有 Athena 查詢,就不需要 Glue Job。
先從嘗試使用最簡(jiǎn)單的解決方案(不需要花很多時(shí)間維護(hù)的解決方案)開(kāi)始。當(dāng)簡(jiǎn)單的解決方案不能滿足需求時(shí),再開(kāi)始學(xué)習(xí)其他工具。如果從一開(kāi)始就使用復(fù)雜的解決方案可能會(huì)浪費(fèi)你的時(shí)間。要專注于用最簡(jiǎn)單的解決方案盡可能快地提供業(yè)務(wù)價(jià)值。
構(gòu)建不需要花太多時(shí)間維護(hù)的東西
花大半天時(shí)間去修復(fù)一個(gè)有問(wèn)題的東西,這是最糟糕不過(guò)的事情了。如果經(jīng)常出問(wèn)題,那么要么是你做事的方式錯(cuò)了,要么沒(méi)有用對(duì)工具,或者兩者兼而有之。從一開(kāi)始就做對(duì)事情可能會(huì)花掉你更多的時(shí)間,但在未來(lái)會(huì)為你節(jié)省時(shí)間。
誠(chéng)實(shí)
如果有什么東西是你不懂的,請(qǐng)說(shuō)出來(lái),但也要證明你可以以及愿意去學(xué)。這樣你就可以用工作時(shí)間學(xué)習(xí)新東西。
分享你的知識(shí)
向其他團(tuán)隊(duì)成員分享他們不知道的東西。這樣有助于你專注學(xué)習(xí),也有助于減少不同工種之前的工作摩擦。如果數(shù)據(jù)工程師、數(shù)據(jù)科學(xué)家和機(jī)器學(xué)習(xí)工程師之間有了默契,工作就會(huì)變得更加順暢。結(jié)對(duì)編程是一個(gè)很好的實(shí)踐,可以借機(jī)分享你的知識(shí),并獲得實(shí)時(shí)反饋?;c(diǎn)時(shí)間分享你的知識(shí),看看你能為別人提供些什么。
花點(diǎn)時(shí)間小憩
在完成一個(gè)大項(xiàng)目后,比如部署了一個(gè)新的 ETL 管道,就可以花點(diǎn)時(shí)間做一些次要的任務(wù),比如寫(xiě)文檔或修復(fù)遺留 bug。欲速則不達(dá),馬不停蹄地開(kāi)始另一項(xiàng)大項(xiàng)目可能會(huì)讓你走得更慢。
【責(zé)任編輯:張燕妮 TEL:(010)68476606】