Python 資料科學家的軟體工程
資料科學將數學和統計學、專業程式設計、高階分析、機器學習和人工智慧 (AI) 與特定主題領域的專業知識相結合,揭示隱藏在組織資料中的可操作見解。
資料科學是各個行業增長速度最快的領域之一。這是由於資料來源和由此產生的資料量不斷增加。
自資料科學開始獲得認可以來,它就在其他學科中引發了爭議。
在本文中,我們將學習軟體工程的基礎知識,為什麼它對資料科學家很重要以及各種原則。我們將進一步瞭解重構、簡潔和模組化程式碼(這裡我們主要關注 Python)、測試和評審。
為什麼軟體工程對資料科學家很重要?
數學家反對在沒有透徹理解底層原理的情況下使用工具,軟體工程師批評資料科學家對基本程式設計概念的無知,統計學家則哀嘆從業人員中經常缺乏基本統計知識。
而且,說實話,他們都是正確的。
在統計和算術方面,你確實需要牢牢掌握機率、代數和微積分等概念。
這些知識需要掌握到什麼程度?
基礎知識是不可協商的,儘管很多取決於你的職位。
類似的情況也適用於程式設計;如果你的工作需要編寫生產程式碼,那麼你至少必須熟悉軟體工程的基礎知識。
為什麼?
原因有很多,但我認為,它們可以總結為以下原則:
完整性 - 程式碼完整性是指程式碼編寫得有多有效,對錯誤的彈性,捕獲異常,經過測試以及是否受到外部審查。
可解釋性 - 程式碼的可理解性及其充分的文件。
速度 - 程式碼在現實環境中執行的速度。
模組化 - 指令碼和物件應該是模組化的,以便於重用,減少重複,並在類之間提高程式碼效率
重構的重要性
在我們的程式碼能夠工作之後,重構使我們能夠整理和模組化它。我們還有機會提高程式碼的效率。軟體工程師在討論有效程式碼時通常會使用以下其中一個術語:
更短的執行時間
更少的記憶體空間
我們可以透過以下方式處理這兩點:
並行化是減少執行時間的絕佳方法。編寫一個指令碼以並行處理資料,同時利用機器的一些或所有處理器,這被稱為並行化。
我們的指令碼通常以序列方式計算資料,先解決一個問題,然後再繼續解決下一個問題,依此類推。這通常發生在我們開發 Python 程式碼時,如果我們想從並行化中獲益,我們必須明確說明這一點。
由於 Python 不會真正將記憶體釋放回作業系統,因此在這種語言中減少記憶體使用量具有挑戰性。當物件被刪除時,它們的記憶體可供新的 Python 物件使用,但不會免費返回給系統(free())。
編寫簡潔程式碼的重要性
我們將在本文中討論的大多數主題從理論上講都可以歸類為編寫更簡潔程式碼的工具或建議。但是,在本節中,我們將重點關注“簡潔”一詞的確切含義。正如 Robert Martin 在他的著作《Clean Code》中指出的那樣,即使是有缺陷的程式碼也可以執行,但骯髒的程式碼可能會使開發團隊陷入困境。
如何?
說實話,有很多選擇,但請考慮一下在審查編寫得很糟糕的程式碼時浪費的時間,或者在開始新工作時卻發現你將要處理舊的、難以閱讀的程式碼時浪費的時間。
編寫模組化程式碼的重要性
儘管 Python 本身是一種面向物件的程式語言,但本文不打算詳細解釋其含義。
但簡而言之,面向物件程式設計是關於建立具有其屬性和行為的模組,而不是過程化程式設計,在過程化程式設計中,你為指令碼編寫一系列指令以供其遵循。
在現實生活中,這些特徵被稱為特性和行為作為技術。
上述場景中的計算機和印表機物件將是獨立的類。
類是一種藍圖,它包含該型別每個物件的屬性和方法
換句話說,我們設計的所有計算機和印表機都將具有相似的特性和功能。
封裝是該命題背後的理論。封裝是指將資料和函式整合到單個物件或模組中的能力。
此外,當程式被分解成模組時,如果各個模組不負責執行某項操作,則它們不需要知道該操作是如何完成的。
這有什麼幫助?
如前所述,除了使你的程式碼在類之間更高效且可重用之外,它還可以簡化必要的除錯過程。
在將整個程式組合在一起之前,每個程式部分都經過完善,這樣可以更容易地在其他程式中重用單獨的模組。你還可以更輕鬆地解決問題,因為能夠識別錯誤的根本原因。
測試的重要性
資料科學需要測試。資料科學家程式碼中缺乏測試是其他軟體相關領域經常抱怨的一個問題。在其他演算法或指令碼中,錯誤可能只會導致程式停止工作,但在資料科學中,這甚至更危險,因為程式可能會執行但會產生錯誤的見解和建議,原因可能是編碼錯誤的值、使用不當的特徵或與模型所基於的假設相矛盾的資料。
當我們談論測試時,有兩個關鍵概念值得討論:
單元測試
測試驅動開發
程式碼審查的重要性
團隊中的每個人都受益於程式碼審查,程式碼審查鼓勵良好的程式設計實踐並使程式碼準備好投入生產。程式碼審查的主要目的是查詢錯誤。但是,它們也有助於提高可讀性和確保符合團隊標準,防止將緩慢或不乾淨的程式碼引入生產環境。
除了這些好處之外,程式碼審查還有助於知識共享,因為團隊成員可以閱讀不同編碼方法和背景的示例。
結論
在這個故事中,我們看到了一些即使對於那些儘管本質上不是程式設計師但試圖從完全不同的背景進入該領域的人來說也很有用的基礎知識。這些有助於編寫更好的生產程式碼,節省時間,並在實施指令碼時使程式設計師的生活更輕鬆。