
作為一個專業(yè)的數(shù)據(jù)科學程序員需要具備些什么
我作為一個數(shù)據(jù)科學家的經(jīng)歷跟我在書本和博客上所讀到的根本不一樣。我曾讀到過為數(shù)字超級新星公司工作的數(shù)據(jù)科學家,他們聽上去像是英雄,可以寫出自動化(近乎有感知能力的)算法并不斷地大量獲取認知結果。我也讀到過像百戰(zhàn)天龍那樣的數(shù)據(jù)科學家黑客,他們可以通過將他們周圍有的任意原始材料拼湊出數(shù)據(jù)產(chǎn)品來拯救世界。
我的團隊創(chuàng)建的數(shù)據(jù)產(chǎn)品并沒有重要到可以評價大型的企業(yè)級基礎設施。只是我覺得,投資超高效的自動化以及產(chǎn)品控制是不值得的。另一方面,我們的數(shù)據(jù)產(chǎn)品影響了企業(yè)中的重要決策,并且我們的努力是可測量,這一點十分重要。我們負擔不起總是將所有的事情人為來做,但我們也需要高效的方法來為成千上萬的人們共享結果。
現(xiàn)實中大部分還是 “常規(guī)”的數(shù)據(jù)科學家。我們比黑客們更有組織但是并不需要一個超級英雄般的數(shù)據(jù)科學老巢。我們一組人聚在一起進行思維碰撞,我們在此對于寫出穩(wěn)定的代碼的最佳實踐進行頭腦風暴。這篇文章是對這次對話的一個總結,并且試圖將我們的知識收集起來,取其精華至于一處。
如何變得專業(yè)化
數(shù)據(jù)科學家需要具備一些軟件工程的技能,只不過并不是一個專業(yè)的軟件工程師所需要的所有技能。我將具備必要的數(shù)據(jù)產(chǎn)品工程技能的數(shù)據(jù)科學家稱為專業(yè)的數(shù)據(jù)科學程序員。專業(yè)并不是指類似一個證書或者多少小時的經(jīng)驗,我所指的是方法上的專業(yè)性。專業(yè)的數(shù)據(jù)科學程序員在他們建立數(shù)據(jù)產(chǎn)品的過程中是可以自我改正的。他們有著常見的策略來識別工作中的問題并糾正錯誤。
專業(yè)的數(shù)據(jù)科學程序員不得不將一個假說用一個可以測試的程序來表達出來。數(shù)據(jù)科學編程在軟件工程中是獨特的,這是因為數(shù)據(jù)科學家所處理的那些問題類型。巨大的挑戰(zhàn)在于數(shù)據(jù)科學本質(zhì)就是實驗性的。這些挑戰(zhàn)經(jīng)常是困難的,數(shù)據(jù)是混亂的。對于很多這類問題,并沒有已知的解決方案和策略,通往解決方案的路是前所未有的,可能的解決方案都是步步為營取最優(yōu)來得出的。在下面的內(nèi)容中,我會介紹一個規(guī)范的、有生產(chǎn)力的試錯的常見策略:將問題分成多個小步驟,分別嘗試解決方案,在過程中一直做出糾正和改進。
像專業(yè)人士一樣思考
為了成為一個專業(yè)的數(shù)據(jù)科學程序員,你必須了解比系統(tǒng)是如何構造的更多。你必須知道如何設計一個解決方案,在你有一個解決方案時你必須能夠識別出來,你也必須在你沒有完全理解你的方案時有所察覺。最后一點是你必須能夠自我糾錯。當你識別出你方法中的概念差異的時候,你能夠自己將其完善。為了以一個你可以自我糾錯的方式來設計數(shù)據(jù)科學解決方案,我發(fā)現(xiàn)依照以下基本步驟是很有用的:觀察、理解、想象以及展示。
第一步:觀察。從掃描環(huán)境開始。做背景研究并對所有可能與你試圖解決的問題有關的細枝末節(jié)有所了解。以盡量寬廣的視野來看待你的問題。盡量多的發(fā)現(xiàn)場景并且收集各類不同的信息。
第二步:理解。將你發(fā)現(xiàn)的各種信息碎片抽象成符合黑板模式的元素。在這個階段,你正在將問題中的元素轉化為有意義的技術性的概念。理解問題是為可行的設計奠定基礎的關鍵步驟。
第三步:想象。根據(jù)你理解的技術概念,想象一些可以使你往目標更近一步的實現(xiàn)。如果你不能想象出一個實現(xiàn),那么你可能在你觀察問題的時候錯過了什么。
第四步:展示。首先將你的解決方案解釋給自己聽,然后是你的伙伴,然后是你的老板,最后是你的目標客戶。每一次解釋只需要以傳達到你的觀點的正式程度即可:一次飲水機旁的短暫談話,一封電子郵件、一次15分鐘的散步。這是在成為一個自我糾錯的專業(yè)數(shù)據(jù)程序員的過程中最重要的常規(guī)實踐。如果你的方案有任何漏洞,那么他們將會在你嘗試解釋的時候發(fā)現(xiàn)它?;c時間來填充這些溝通代溝,并且確保你可以恰當?shù)亟忉寙栴}和針對它的解決方案。
像專業(yè)人士一樣設計
創(chuàng)建和發(fā)布一個數(shù)據(jù)產(chǎn)品的活動是多樣且復雜的,但是,一般來說,你將要做的會在阿利斯泰爾克羅爾(Alistair Croll )描述的大數(shù)據(jù)供應鏈中所包含。
由于數(shù)據(jù)產(chǎn)品依照一個范式(實時、批量或者兩者的混合)來執(zhí)行,你很有可能發(fā)現(xiàn)你自己正在一個數(shù)據(jù)供應鏈活動和一個數(shù)據(jù)范式的整合之中:注入和清理批量更新的數(shù)據(jù),建立一個算法來分析實時數(shù)據(jù),將批處理的結果進行共享等。幸運的是,黑板架構模式給予了我們一個基礎的藍圖來應用良好的軟件工程應對這些場景。
黑板模式
黑板模式告訴我們通過將整個任務進行劃分來找到一系列更小的自包含 的子任務的方式來解決問題。每一個子任務將你的假說轉化為一個更容易解決或是解法已知的假說。每一個任務逐漸改進解決方案,并且理想的情況下通向一個可行的解決方案。
數(shù)據(jù)科學被工具所淹沒,每一個都有其獨特的優(yōu)點。生產(chǎn)力是很重要的,我喜歡讓我的團隊選擇任何他們最熟悉的工具。使用黑板模式使得從一系列不同的技術來構建數(shù)據(jù)產(chǎn)品變得可行。算法之間的協(xié)作通過共享數(shù)據(jù)倉庫來發(fā)生。每一個算法可以獲取數(shù)據(jù),將它們作為輸入并且將結果返回給數(shù)據(jù)倉庫為其他的算法作為輸入。
最后,所有的算法都通過使用單個代表用來解決問題的啟發(fā)者的控制組件來互相協(xié)作。控制器是你已經(jīng)選擇的解決問題的策略的實現(xiàn)。這是最高層面的對問題的抽象和理解,這是由可以交互的并且決定所有算法順序的技術所實現(xiàn)的??刂破骺梢允窍褚粋€cron的定時任務或者腳本一樣的自動化組件?;蛘呖梢允侨斯さ模凑枕樞驁?zhí)行不同步驟。但總體來說,這是解決問題的根本策略。這是一個你可以從頭到尾了解問題解決方案的地方。
圖片由Jerry Overton提供
這一基本的方法已被證明在構建必須通過不完全數(shù)據(jù)解決不確定的、假設的問題的軟件系統(tǒng)時是有用的。最棒的一部分是它使得我們通過確定的部分在不確定的問題上獲得進展。不幸的是,我們并不保證你的努力真的一定會解決問題。你最好盡早知道如果你走的路是不起作用的。你需要 通過你實現(xiàn)系統(tǒng)的順序來完成。
像專業(yè)人士一樣構建
你不一定非要以固定的順序來構筑數(shù)據(jù)產(chǎn)品的元素(例如,先建立數(shù)據(jù)倉庫,然后是算法,然后是控制器)。專業(yè)的方法是按照最高的技術風險來構建。從最高風險的元素先開始。一個元素會因為很多原因成為技術風險。最有風險的部分可能是那個有著最高工作負載的或者是你最不了解的部分。
你可以通過專注于單個元素然后解決其他的方式以任意順序構建組件。例如,如果你決定從構建算法開始,無視數(shù)據(jù)輸入并且定義一個臨時點來寫入算法輸出。
圖片由Jerry Overton提供
然后,以技術風險高低的順序?qū)崿F(xiàn)數(shù)據(jù)產(chǎn)品:風險最高的元素最先開始。專注于一個特定的元素,無視其他的,稍后再替換它們。
這里的關鍵是以小塊的方式構建并執(zhí)行:以你理解的小步驟來寫算法,一個數(shù)據(jù)源一次的方式構建數(shù)據(jù)倉庫,以及一個算法執(zhí)行步驟一次的方式構建你的控制器。目標是總是有一個可以工作的數(shù)據(jù)產(chǎn)品,只不過它只有到最后才是功能完備的。
專業(yè)人士的工具
每一個專業(yè)人員需要有質(zhì)量的工具。有太多的選擇可以使用。下面列出了一些公認最常用的工具,我附上了鏈接使得你們可以了解更多信息:
D3.js: D3.js (或者D3, 數(shù)據(jù)驅(qū)動文檔) 是一個JavaScript 庫,旨在在瀏覽器中建立動態(tài)的可交互的數(shù)據(jù)可視化。它利用了廣泛被實現(xiàn)的SVG, HTML5以及 CSS 標準。
版本控制:
GitHub: GitHub 是一個基于網(wǎng)絡的Git倉庫服務,它提供了所有的Git的分布式修訂控制和源代碼管理功能,也添加了它自己的功能特性。GitHub提供了一個基于網(wǎng)絡的圖形化界面和移動端的桌面應用。
編程語言:
R: R 是一個針對統(tǒng)計計算和圖形化的編程語言及軟件環(huán)境。R語言在統(tǒng)計學家和開發(fā)統(tǒng)計軟件和數(shù)據(jù)分析的數(shù)據(jù)挖掘者中被廣泛使用。
Python: Python 是一種被廣泛使用的通用的高層次的編程語言。它的設計理念強調(diào)代碼的可讀性,它的語法允許編程人員用比C 和Java更少的代碼來表達概念。
Scala: Scala 是一種針對通用軟件應用的對象函數(shù)式編程語言。Scala有著對函數(shù)式編程的全面支持,以及一個非常健壯的靜態(tài)類型系統(tǒng)。這使得用Scala寫的程序非常簡潔因而比其他通用編程語言尺寸更小。
Java: Java 是一種通用的計算機編程語言,它是并發(fā)的、基于類的、面向?qū)ο蟮?、特別為了減少實現(xiàn)依賴而設計的。它旨在讓應用“一次編寫,隨處執(zhí)行”
Hadoop生態(tài)系統(tǒng):
Hadoop: Hadoop 是一個用Java開發(fā)的開源的軟件框架,為了在基于商業(yè)硬件的計算機集群上進行分布式存儲和分布式處理海量數(shù)據(jù)集。
Pig: Pig 是一個為了創(chuàng)建Hadoop之上MapReduce程序的高層平臺
Hive: Hive 是一個在Hadoop之上構建的數(shù)據(jù)倉庫基礎結構,旨在提供數(shù)據(jù)匯總、查詢和分析。
Spark: Spark的內(nèi)存原語操作為某些應用提供了高達100倍的性能提升
結束語:本文來自哪里
這篇文章起始于一次偶然的關于我的團隊中正面臨的生產(chǎn)力問題的討論。我們最終將問題追溯到技術平臺和我們的軟件工程知識。我們需要在我們的軟件工程實踐中補上漏洞,但是每次的經(jīng)驗都太抽象或是太細節(jié)(對于專業(yè)的軟件開發(fā)者來說)。我是一個由外至內(nèi)數(shù)據(jù)科學方法的擁護者,我決定主辦一個開放的群聊來討論這些事。
我們獲得了相當大的參與度:30分鐘之內(nèi)有179條發(fā)布;600個觀點,以及28000多個訪問。我主持了討論并基于最有影響力的答案總結了我們的發(fā)現(xiàn),然后我將那個總結作為本文的基礎。我想要感謝所有那些參加了這一過程的人們,并花一些時間來認可他們的貢獻。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉換:從基礎用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關聯(lián)查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結構數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結構數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預期算子的內(nèi)涵、作用與應用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結構數(shù)據(jù)特征價值的專業(yè)核心 表結構數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結構化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應用 在數(shù)據(jù)分析與統(tǒng)計學領域,假設檢驗是驗證研究假設、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結構數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結構數(shù)據(jù)(以 “行 - 列” 存儲的結構化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結構數(shù)據(jù)價值的核心操盤手 表格結構數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務邏輯:從規(guī)則拆解到數(shù)據(jù)把關的實戰(zhàn)指南 在業(yè)務系統(tǒng)落地過程中,“業(yè)務邏輯” 是連接 “需求設計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10