Categories
程式開發

數據科學家應該了解的最佳軟件工程實踐


本文最初發表在Towards Data Science 博客,經原作者Kurtis Pykes 授權,InfoQ 中文站翻譯並分享。

我一直與朋友們熱切地研究並嘗試一些能使我成為更好的數據科學家的方法。如果不與那些幫助過我的人們分享目前的情況,我是不可能在事業上取得進步的。

最近,我在LinkedIn 上進行了一次民意調查,我驚訝地發現,很多人持有這樣的觀點:數據科學家必須懂得編程標準並遵循工程最佳實踐。

數據科學家應該了解的最佳軟件工程實踐 1

投票結果

許多數據科學家(包括我自己)都缺乏基本的統計學知識,對統計學的應用知之甚少。而數學家們認為,在應用之前,必須對應用於各種場景的原理有一個堅實的理解,我承認我並不了解這些原理。軟件工程師希望數據科學家能夠在遵循基本編程原則的同時進行實驗。

最讓我感到刺痛的是,每一位“贊成”的投票者目前都在擔任數據科學家,而且其中許多人還擔任領導角色(在投票時)——包括4x Kaggle Grandmaster(Kaggle 數據科學競賽大師)Abhishek Thakur 這樣的人。好吧,我承認,你想要的角色決定了你對統計學和其他數學概念(如概率、線性代數和微積分等)的理解有多深——儘管基礎知識是絕對必要的——但軟件工程實踐呢?

我曾經也是數據科學家中的一員,人們認為我們只是數據科學家,而不是軟件工程師,因此我們的責任是從數據中提取有價值的見解,這仍然是一個事實,然而,這次調查擾亂了我的心智模式,讓我陷入了深深的思考。

當職位是數據科學家時,為什麼要必須了解軟件工程的基礎知識呢?

我記得我的目標——成為一名不可或缺的數據科學家。我的意思是,如果我不知道或不去學習軟件工程的基礎知識,那我就不是不可或缺的數據科學家了嗎?嗯,是的,基本上是如此。請注意,這句話做了一個假設,比如,你是一個數據科學家,所編寫的代碼很可能會進入生產環境。

在這一點上,我整理了一份清單,這些內容是軟件工程的基本原則,應該適用於數據科學家。但由於我沒有軟件工程的背景,因此我諮詢了很多軟件工程師的朋友,幫助我列出了這份清單,並教我如何寫出更好的生產代碼。

下面是數據科學家應該知道的一些最佳實踐:

整潔代碼

注意:首先我想向R 編程語言的用戶致歉,因為我並沒有對R 編程語言的編碼方面做過太多的研究,因此,本文提到的許多整潔代碼的技巧,將主要針對Python。

我學的第一門編程語言是Python,因為我的英語很流利,對我來說,Python 與英語非常相似。從技術上講,這指的是Python 編程語言的高可讀性,這是Python 的設計者在意識到代碼閱讀的頻率比代碼編寫的頻率更高,特意設計成這樣的。

當一名經驗豐富的Python 開發人員將部分代碼稱為非“Python 風格”時,他們通常意味著這些代碼行沒有遵循通用的指導原則,並且未能以被認為是最好的(聽說是最易讀的)的方式表達其意圖。

——《Python 編程之美:最佳實踐指南》(The Hitchhikers Guide to Python)

我將列出一些構成整潔代碼的因素,但我並不打算說得過於詳細,因為我相信,這些主題,有很多很棒的資源講得比我還好,比如這兩本書:《Style Guide for Python Code》和《Clean Code in Python》(譯註:這兩本書目前暫無中譯本)。

  • 有意義且可發音的命名約定;
  • 清晰度高於一致性;
  • 可搜索命名;
  • 使你的代碼易讀。

請記住,不只是別人會閱讀你的代碼,你自己也會閱讀。如果你不記得某些命名的含義,請想像一下別人會有什麼希望。

模塊化

這可以部分歸咎於我們學習數據科學的方式。如果一個數據科學家不能打開一個Jupyter Notebook 並開始做一些探索,我會感到驚訝。但這就是Jupyter Notebook 的作用:實驗!然而不幸的是,許多關於學習數據科學的課程並沒有很好地將我們從Jupyter Notebook 轉移到腳本上,而腳本對於生產環境來說更為有效。

當我們談論模塊化代碼時,我們指的是被分離成獨立模塊的代碼。通過有效地執行,模塊化可以使打包、測試和可維護的代碼能夠重複使用。

在這個視頻中,Abhishek Thakur 為Kaggle 競賽構建了一個機器學習包,這是我第一次接觸到模塊化。我以前也聽過Abhishek 提到過,他學習更多模塊化和軟件工程最佳實踐的方式是通過閱讀GitHub 上的Scikit Learn 代碼。

其他有助於編寫好的模塊化代碼的其他因素包括:

不要重複你自己(Don’t repeat yourself,DRY):是面向對象編程中的基本原則,程序員的行事準則。旨在軟件開發中,減少重複的信息,編程過程中不寫重複代碼,將能夠公共的部分抽像出來, 封裝成工具類或者用“abstraction” 類來抽象公有的東西,降低代碼的耦合性,這樣不僅提高代碼的靈活性、健壯性以及可讀性,也方便後期的維護或者修改。

單一功能原則(Single Responsibility Principle,SRP):是一種計算機編程原則,規定每個類都應該有一個單一的功能,並且該功能應該由這個類完全封裝起來。

開閉原則(Open-Closed Principle):在面向對象編程領域中,開閉原則規定“軟件中的對象(類、模塊、函數等等)應該對於擴展是開放的,但是對於修改是封閉的”,這意味著一個實體是允許在不改變它的源代碼的前提下變更它的行為。

重構

代碼重構可以定義為在運行時不改變代碼外部行為的情況下重構現有代碼的過程。

重構旨在改進軟件的設計、結構和/或實現(其非功能屬性),同時保留其功能。

重構代碼有很多好處,例如,提高了代碼的可讀性,降低了複雜性,這反過來又導致源代碼更容易維護,並且我們配備了一個內部架構,提高了我們編寫的代碼的可擴展性。

此外,我們不能只談論代碼重構而不談論性能的提高。我們的目標是編寫一個執行速度更快、佔用內存更少的程序,特別是當我們有最終用戶要執行一些任務時。

測試

注意:在機器學習模型的部署Udemy 課程中,我簡單學習了測試(以及本文所涉及的其他大多數想法)。

在某種意義上,數據科學是一個有趣的領域,即使我們的代碼有錯誤,但我們的代碼仍然有可能能夠運行,而在軟件相關項目中,代碼會拋出一個錯誤。因此,我們最終會得到誤導性的見解(也可能找不到工作)。因此,測試是必要的,如果你懂得測試,你的身價就會上升。

以下是我們進行測試的一些原因:

  • 確保我們得到正確的輸出。
  • 更新代碼更容易。
  • 防止將破壞的代碼推送到生產環境。

我相信還有更多的原因,但我不再就此贅述。

代碼審查

代碼審查的目的是通過推廣最佳編程實踐來提高代碼質量,使代碼能夠為生產做好準備。此外,這對每個人都有好處,因為它往往會對團隊和公司文化產生積極影響。

代碼審查的主要原因是為了發現錯誤,儘管審查對於提高可讀性以及確保滿足編碼標準非常有用。

結語

可以這麼說,這絕對是一大堆需要學習的東西,但出於完全相同的原因,它推動了數據科學從業者被高估。能夠製作出Jupyter Notebook 已經不足以讓你成為數據科學家脫穎而出,因為每個人都能做到。如果你想超越平均水平,你就必須做超過平均水平的事情,在這種情況下,可能要涉及到學習軟件工程最佳實踐。

作者介紹:

Kurtis Pykes,痴迷於數據科學、人工智能和商業技術應用。

原文鏈接:

https://towardsdatascience.com/data-scientist-should-know-software-engineering-best-practices-f964ec44cada