資料科學家的工作日常3 - 建立資料團隊的文化與程式規範

閱讀時間約 9 分鐘

系列文章


這是〈資料科學家的工作日常〉系列的第三篇文章。第一篇文章是比較總覽型的文章;第二篇討論數據團隊可能的組織編制,以及每一種編制下的優缺點。這篇文章會著墨在更技術面與實務面的內容,像是不好的coding style可能會造成什麼樣的風險,甚至進一步對公司造成什麼樣的傷害。

完整的背景知識

對於資料科學家和數據分析師來說,雖然他們也寫程式,但他們寫程式的習慣和一般認知的工程師不太相同,甚至有些人對於寫code的背景知識明顯不足。或許你會說,「因為現在很多做數據分析的都不是本科系,理論知識當然不會那麼紮實」,我認同這是個可能的原因,但我也認為這不能當成藉口,一個專業工作者本來就應該補足自身的不足。我知道軟體工程師中也有類似的問題存在,但我畢竟對於資料科學界比較熟悉,因此只在我熟悉的領域內作評論。
舉個我親眼見證的例子。我們數據團隊有一台Server,可以用來運算較大量的資料。在Server上通常可以開多個帳號,每個人在自己的帳號底下作業,偶爾也會為了某些業務新增獨立的帳號,所有的程式碼與運算結果就放在這個帳號底下。另外,數據團隊也經常需要排程執行某些運算,像是每個月初會預測即將流失的顧客,並與行銷部門合作,針對這些顧客進行挽回的行銷活動。
我曾經在Server上發現一個很少人使用的帳號,根據團隊的說明文件,這個帳號會在每天執行某些檢查,並判斷是否需要進行運算及資料更新。當我登入這個帳號的時候,發現它的自動排程不是使用Linux的crontab執行,而是寫一個for迴圈,每天在固定時間點檢查是否需要進行運算,不需要的話就等24小時候再檢查。當我發現這支驚為天人的code時,它已經不眠不休的跑了兩年,程式的撰寫者早已離職,而且這支程式占用了一顆CPU 99.8%的效能,極度荒謬。
另一個例子,是我發現竟然有人會在code裡面使用中文作為變數名稱,這在技術面上可能可行,但有一定的風險,因為中文字會牽涉到編碼問題,當同樣一份檔案換到另一台電腦執行時,可能會因為電腦系統的設定不同,或是編輯器(IDE)的設定不同,導致無法正常運作。如果要寫中文,強烈建議還是寫在註解裡面就好。

模組化 / Function化

先說一下什麼是function。function是程式設計中常見的技巧,把一些會重複使用到的程式碼寫成特定格式,這些程式碼可能有數十或數百行,當需要使用到這些程式碼的時候,只需要花短短的幾行呼叫這個function即可,這樣的效果與多次複製貼上那數百行程式碼的效果是完全相同,但後者在維護性上明顯不佳。
我發現做資料科學圈中,不論使用R語言或Python,很多人都不喜歡寫function,但是寫function的好處顯而易見,不論對提升工作效率、程式維護性、資料正確性來說都是,因此,這樣的現象讓我非常難以理解。而我的同事也曾經不能理解,為什麼我偏執的想把這麼多東西寫成function。事實上,我更偏執的認為,codebase,也就是function的集合體,是數據團隊的資產,是可以重複使用、快速使用的工具組,這樣的資產某種程度上反應了這個團隊的戰力。每個團隊成員手上都會有不同的專案,每個專案都會有不同的目標,雖然專案可能會結束,但在專案中寫出來的function會被納到codebase中,讓團隊越來越強大。
如果你在一間接案型的公司,這樣的需求可能沒有那麼強烈,因為每一次客戶給的資料格式可能都不太一樣;相反,如果你是In-House的分析師,強烈建議你開始建立自己的分析架構,因為內部資料再怎麼用就是那些,不需要每次都重新造輪子。

高效率

對於某些經常執行的動作,或經常抓取的資料,只要寫成function,並且把可能會調整的部份寫成參數(argument),就可以保持一定的彈性,不需要每次都重頭來過。我看過許多人抓資料時,都從第一行的SQL開始寫,或是將舊有的code複製貼上,這不只降低效率,在維護性上也是一大硬傷。
舉例來說,如果你需要計算公司每一張的訂單明細,並帶出訂單中的商品資料,這裡面至少會需要join兩張資料表。把這些程式碼function化,並將日期區間設成參數,這就是一支容易理解,而且可以重複使用的function。

用參數加速開發流程

除了使用方便外,這在開發速度上也有絕對的好處。延續上面的例子,如果你需要用訂單明細及商品資料,計算過去一年每個商品分類在每個月的營收及毛利,並且還要跟前一年作比較,計算業績成長率。可想而知,這會是一支篇幅與計算量都滿大的程式,如果你用hard code的方式,也就是把全部的參數都寫死在程式中,這在開發及debug時都相當不方便。
更好的方法是把日期設為function的變數,在開發及debug時可以只用一個月或一周的資料量計算。在正常情況下,如果這支function能夠正確計算一個月的資料,理所當然也可以計算一年的資料。

減少錯誤

數據團隊的重大挑戰有兩個,一個是要保證每次提供出去的數據都是對的。巴菲特曾經形容衍生性金融商品是大規模毀滅性武器,數據團隊也有等值的破壞力,亦正亦邪。只要寫程式的人不小心手滑,多敲了一個零,執行出來的結果可能天差地遠。如果這個錯誤讓整支程式掛掉,那還算是不幸中的大幸,最怕的是看起來很正常,但事實上一團亂的結果。如果更不幸地,使用者也沒有看出其中的錯誤,進一步拿去做出重大但錯誤的商業決策時,數據部門很容易會被認為是競爭對手派來搞破壞的臥底。這樣的錯誤在一流的跨國公司中也可能出現,像是Facebook在2016年出的包,〈【廣告商哭了】Facebook 承認演算法錯誤,影片效果被嚴重高估〉
第二個是要讓使用者聽懂你的分析流程,即使他們不懂統計、不會寫code、不熟悉演算法,但數據部門的使命之一就是將複雜的計算邏輯簡單說。當使用者認同你的分析流程後,才會放心使用你產出的結果,因為沒有人會完全信任你的報告,尤其錯誤的決策可能會影響他們的個人績效時。但究其根本,我認為第一個原因才是重中之重。
提供正確的數字,這聽起來很簡單,但卻是許多數據團隊真實面臨的挑戰。因為沒有制式的、嚴謹的驗證機制,導致產出錯誤的資料,而錯誤的資料會傷害使用者對於數據團隊的信賴感,最後可能的情況是使用者對於與數據團隊合作感到興趣缺缺,數據驅動(Data-Driven)的文化也就沒辦法在公司內部推行,大家還是使用舊有的方法和習慣在做事。
為了避免資料錯誤,我認為解決方法有兩個,一個是從程式碼著手,將常用功能function化,並內建檢查機制;第二個是從團隊文化著手,建立code review。這兩者可以同時並行,但應該以前者為優先,因為在程式撰寫階段就先排除大部份錯誤,可以有效降低後續code review的時間和人力成本。

從程式碼著手

舉個例子,在沒有function化之前,一樣都是計算業績,但同事A和同事B算出來的業績可能就是不一樣。喔,可能因為同事A排除了退貨,也就是業績為負值的部份,但在商業邏輯及公司慣例上,退貨到底該不該排?然後大家就開始熱烈討論,甚至詢問相關部門。然而,這樣的情況經常會發生,大家可能在一個月後就會忘記今天的討論結果,同樣的錯誤、同樣的戲碼會再度上演。更別說團隊可能有新人加入,新人可能會因為對公司業務的不熟悉,一樣計算出錯誤的數據結果。
既然知道會有這樣的情況發生,為什麼不要把定義和篩選條件寫成function,並在function內留下註解就好了?甚至可以把幾月幾號,問了哪個部門的誰都寫進去,因為商業環境快速變動,今天的定義可能在幾個月後就會修正。對於修正定義的部門來說,沒有人知道你Data Team會用到這些資料,所以當定義變動的時候,理所當然沒有人會去通知你。
直接把說明內容寫在註解中有另一個好處,團隊成員不需要再花很多時間寫說明文件。大家都知道說明文件很重要,但大家也都會說自己沒空寫文件,或是文件太多找不到,乾脆重新用問的。當然有些時候還是必須有獨立的說明文件,但在大多數情況中,把說明文件與function結合,不論在撰寫上或取用上都有一定的正面影響。
另一個程式設計面的大重點,是將驗證機制寫在程式中,像是確認資料筆數有沒有因為錯誤的join方式而爆增,或是可以用另一個資料源驗證產出結果的正確性等。至於程式錯誤時的處理方式,可以直接停止執行,如果是在Server上的自動化排程,則可以寄mail給團隊成員,告知哪一支程式出現錯誤。

即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
由於資料科學家與數據分析部門出現的時間還不長,大家的認知仍有差異,或因為每間公司核心價價、管理哲學不同,導致數據團隊可能會以各種型式存在,常見的型式有三種:獨立部門、隸屬IT(Information Technology,資訊部門)或RD(Research & Development,軟體開發)
雖然數據分析師是新職位,但數據分析或是資料分析的概念一點都不新。公司裡面行之有年的職位,不管是行銷、業務、採購、倉管,每個職位都需要數據,也都需要分析。隨著大數據、資料科學、機器學習、AI等酷炫的新名詞、新技術與新應用出現,所需的知識與技能多到員工爆肝也學不完。
我之所以大膽的把股價預測稱之為「最強」,因為這本身就是一個可以變現的專案,並且可以同時累積數據分析及投資操作經驗,在投資與程式設計同時躍升為顯學的時代,把這兩條學習路徑融合在一起,似乎自然而然,也合情合理。當然,這條路的學習成本非常高,但翻山越嶺之後的美景也同樣讓人心神嚮往。
網路上可以找到許多關於寫作的書或課程,說明為什麼寫作可以培養表達能力與邏輯思考能力,以及培養寫作能力的具體方法。然而,許多人更關心的是,如果我們想以寫作當成事業,是不是可行,需要具備哪些知識,有沒有技術門檻,可能需要多少成本,以及有哪些潛在的收入來源。
Fugle富果是一間FinTech新創公司,透過大數據搜尋和機器學習推薦技術,協助投資人可以更快速精確的做出決策,並且與玉山證券合作,推出玉山證券富果帳戶。
在職場上,每個人或多或少都有機會擔任會議召集人的角色,可能你上司是專案負責人,他將邀請的會議事務指派給你,或是你本身就是會議召集人。對於工作經驗不多的菜鳥而言,當必須聯繫、召集一群職位比自己高,或是比自己資深的前輩參與會議,或多或少會有點壓力,光是寄封Email可能就要猶豫再三。這篇文章就是要針對這
由於資料科學家與數據分析部門出現的時間還不長,大家的認知仍有差異,或因為每間公司核心價價、管理哲學不同,導致數據團隊可能會以各種型式存在,常見的型式有三種:獨立部門、隸屬IT(Information Technology,資訊部門)或RD(Research & Development,軟體開發)
雖然數據分析師是新職位,但數據分析或是資料分析的概念一點都不新。公司裡面行之有年的職位,不管是行銷、業務、採購、倉管,每個職位都需要數據,也都需要分析。隨著大數據、資料科學、機器學習、AI等酷炫的新名詞、新技術與新應用出現,所需的知識與技能多到員工爆肝也學不完。
我之所以大膽的把股價預測稱之為「最強」,因為這本身就是一個可以變現的專案,並且可以同時累積數據分析及投資操作經驗,在投資與程式設計同時躍升為顯學的時代,把這兩條學習路徑融合在一起,似乎自然而然,也合情合理。當然,這條路的學習成本非常高,但翻山越嶺之後的美景也同樣讓人心神嚮往。
網路上可以找到許多關於寫作的書或課程,說明為什麼寫作可以培養表達能力與邏輯思考能力,以及培養寫作能力的具體方法。然而,許多人更關心的是,如果我們想以寫作當成事業,是不是可行,需要具備哪些知識,有沒有技術門檻,可能需要多少成本,以及有哪些潛在的收入來源。
Fugle富果是一間FinTech新創公司,透過大數據搜尋和機器學習推薦技術,協助投資人可以更快速精確的做出決策,並且與玉山證券合作,推出玉山證券富果帳戶。
在職場上,每個人或多或少都有機會擔任會議召集人的角色,可能你上司是專案負責人,他將邀請的會議事務指派給你,或是你本身就是會議召集人。對於工作經驗不多的菜鳥而言,當必須聯繫、召集一群職位比自己高,或是比自己資深的前輩參與會議,或多或少會有點壓力,光是寄封Email可能就要猶豫再三。這篇文章就是要針對這
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
數學系的訓練,與上面閱讀原始碼的優先順序,本質上是反過來的。在數學的訓練中,是先把函數定義的非常清楚,再進一步去看函數應用在具體的數據上會發生什麼行為,然後就到此為止,不太會再有進一步的討論。但如上面西尾泰和所述,工程師看事情的角度,是先掌握全局,然後再進一步細化每一層的細節。
Thumbnail
本篇週報記錄了數據分析師最近一週的重要工作內容,包括種族與性別分析、Amazon市場分析、購買人群統計資訊及 SEO 品牌字分組等等。透過以上議題的分析與執行過程,不僅能瞭解工作內容,也能學到數據分析的實戰議題,有助於減少行銷和數據分析方面的學習彎路。
Thumbnail
本文談及資料科學的領域與分工。首先是建造一個AI的研發流程,資料收集到 AI 模型訓練的過程,AI經歷這一切流程被創造出來並產生價值;再來本文也提及在這個領域中的各種腳色、資料工程師、數據庫工程師、資料科學家和資料分析師的各種介紹。並且強調跨領域合作的重要性。
Thumbnail
作為一名擁有多年經驗的數據分析師,我深知數據分析的重要性及其對企業決策的影響。然而,數據分析並不是在任何情況下都適用。今天我想跟你聊的事情是:在數據量不足或缺乏流程優化目的時,進行數據分析的局限性。
Thumbnail
資料整理是職場上的重要技能,也是一大挑戰! 透過專案管理的手法建立一套有效的資料管理系統,進而提升工作效率並獲得成功。
上一篇主要在說如何做決定的,這篇就來寫寫面試前該做什麼準備。
Thumbnail
追求乾淨的程式碼是好的開始,但不要陷入過度設計的陷阱,導致程式難以維護。實際上,考慮團隊狀況和專注於解決真正的問題更為重要。了解公司的規模和現實情況,適時調整工作重心。技術不斷進步,使得寫程式變得更加容易,但這並不意味著工程師的角色會消失。在選擇技術時,也要考慮隱形成本有時簡單的解決方案反而更有效。
Thumbnail
資料的統合 在程式設計中,其他人通常關心是否注意到執行的細節。作為程式設計師,主要應該關心的是程式的表現,但往往忽略了很多細節,這些細節可以決定程式的好壞。程式的好壞很大程度上取決於資料的統合,也就是資料是否被正規化。 不同類型的資料在系統中呈現一致 正規化可能對一些人來說聽起來很抽象,有些人
Thumbnail
這是文科轉職數據工程師系列的第一篇文章。 許多人會在轉職前上許多數據分析課程,該怎麼選擇比較適合自己,但又不會噴錢呢? 這篇文章要介紹這個轉職過程前的準備工作。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
數學系的訓練,與上面閱讀原始碼的優先順序,本質上是反過來的。在數學的訓練中,是先把函數定義的非常清楚,再進一步去看函數應用在具體的數據上會發生什麼行為,然後就到此為止,不太會再有進一步的討論。但如上面西尾泰和所述,工程師看事情的角度,是先掌握全局,然後再進一步細化每一層的細節。
Thumbnail
本篇週報記錄了數據分析師最近一週的重要工作內容,包括種族與性別分析、Amazon市場分析、購買人群統計資訊及 SEO 品牌字分組等等。透過以上議題的分析與執行過程,不僅能瞭解工作內容,也能學到數據分析的實戰議題,有助於減少行銷和數據分析方面的學習彎路。
Thumbnail
本文談及資料科學的領域與分工。首先是建造一個AI的研發流程,資料收集到 AI 模型訓練的過程,AI經歷這一切流程被創造出來並產生價值;再來本文也提及在這個領域中的各種腳色、資料工程師、數據庫工程師、資料科學家和資料分析師的各種介紹。並且強調跨領域合作的重要性。
Thumbnail
作為一名擁有多年經驗的數據分析師,我深知數據分析的重要性及其對企業決策的影響。然而,數據分析並不是在任何情況下都適用。今天我想跟你聊的事情是:在數據量不足或缺乏流程優化目的時,進行數據分析的局限性。
Thumbnail
資料整理是職場上的重要技能,也是一大挑戰! 透過專案管理的手法建立一套有效的資料管理系統,進而提升工作效率並獲得成功。
上一篇主要在說如何做決定的,這篇就來寫寫面試前該做什麼準備。
Thumbnail
追求乾淨的程式碼是好的開始,但不要陷入過度設計的陷阱,導致程式難以維護。實際上,考慮團隊狀況和專注於解決真正的問題更為重要。了解公司的規模和現實情況,適時調整工作重心。技術不斷進步,使得寫程式變得更加容易,但這並不意味著工程師的角色會消失。在選擇技術時,也要考慮隱形成本有時簡單的解決方案反而更有效。
Thumbnail
資料的統合 在程式設計中,其他人通常關心是否注意到執行的細節。作為程式設計師,主要應該關心的是程式的表現,但往往忽略了很多細節,這些細節可以決定程式的好壞。程式的好壞很大程度上取決於資料的統合,也就是資料是否被正規化。 不同類型的資料在系統中呈現一致 正規化可能對一些人來說聽起來很抽象,有些人
Thumbnail
這是文科轉職數據工程師系列的第一篇文章。 許多人會在轉職前上許多數據分析課程,該怎麼選擇比較適合自己,但又不會噴錢呢? 這篇文章要介紹這個轉職過程前的準備工作。