程式碼效率和可維護性是軟體開發的關鍵要素。本文深入探討如何運用 IDE 捷徑、程式碼重構技巧以及有效的技術債務管理策略來提升開發效率。同時,文章也強調測試和設計的重要性,並介紹抽象和介面等軟體設計原則,幫助開發者編寫更易於理解、維護和擴充套件的程式碼。此外,文章也討論了程式碼可讀性的重要性,以及如何利用新聞隱喻等方法來組織程式碼,使其更易於理解。最後,文章還介紹了一些進階工具和技術,例如遠端程式碼協作工具、IDE 除錯器和 GitHub Copilot,以進一步提升開發效率。
程式碼折疊
- Mac: ⌘ -
- Windows/Linux: Ctrl -
程式碼折疊可以暫時隱藏某些程式碼區塊,讓您更容易地檢視和編輯其他部分的程式碼。
程式碼展開
- Mac: ⌘ ⌥ [
- Windows/Linux: Ctrl + ⇧ + [
如果您之前折疊了某個程式碼區塊,可以使用這個快捷鍵將其展開,還原原來的狀態。
內容解密:
以上的快捷鍵組合可以大大提高您的編輯器使用效率。透過掌握這些快捷鍵,您可以更快速地在不同的檔案和程式碼區塊之間進行導航,找到所需的程式碼,甚至是快速折疊和展開程式碼區塊以便於編輯。
圖表翻譯:
flowchart TD A[編輯器] --> B[導航] B --> C[檔案間導航] B --> D[程式碼導航] B --> E[查詢參照] B --> F[程式碼折疊/展開] C -->|Mac| G[⌘ [ 或 ] ] C -->|Windows/Linux| H[Ctrl + Alt + ← 或 →] D -->|Mac| I[Ctrl - 或 Ctrl Shift -] D -->|Windows/Linux| J[Alt + ← 或 →] E -->|Mac| K[⌥ F7] E -->|Windows/Linux| L[Alt + F7] F -->|Mac| M[⌘ -] F -->|Windows/Linux| N[Ctrl -] F -->|Mac| O[⌘ ⌥ [] F -->|Windows/Linux| P[Ctrl + ⇧ + []
這個流程圖展示瞭如何使用不同的快捷鍵在編輯器中進行導航,包括檔案間導航、程式碼導航、查詢參照以及程式碼折疊和展開。每個步驟都對應著特定的快捷鍵組合,讓您可以快速地在編輯器中找到需要的功能。
編輯器捷徑鍵
以下是 PyCharm 和 VS Code 中的編輯器捷徑鍵:
程式碼折疊和展開
- 展開所有程式碼區域:
- Mac:⌘ +
- Windows/Linux:Ctrl +
- 折疊所有程式碼區域:
- Mac:⌘ ⌥ ]
- Windows/Linux:Ctrl ⇧ ]
- 展開所有程式碼區域:
- Mac:⌘ ⇧ +
- Windows/Linux:Ctrl ⇧ +
- 折疊所有程式碼區域:
- Mac:⌘ ⇧ -
- Windows/Linux:Ctrl ⇧ -
程式碼編輯和導航
- 搜尋檔案:
- Mac:⌘ ⇧ F
- Windows/Linux:Ctrl ⇧ F
- 切換標籤:
- Mac:⇧ ⌘ ] 或 [
- Windows/Linux:Alt ← 或 →
其他捷徑鍵
- Mac:⌘ K ⌘ 0
- Windows/Linux:Ctrl K Ctrl 0
- Mac:⌘ K ⌘ J
- Windows/Linux:Ctrl K Ctrl J
注意:這些捷徑鍵可能會根據您的系統設定和編輯器版本有所不同。您可以在 PyCharm 和 VS Code 中查詢更多的捷徑鍵。
效率提升的程式設計技巧
在程式設計的過程中,提高效率和降低認知負擔是非常重要的。這不僅可以幫助我們更快速地完成任務,也能夠使我們的工作更加高效和愉快。下面,我們將探討一些有助於提升程式設計效率的技巧和工具。
新聞隱喻:撰寫可讀的程式碼
新聞隱喻是一種撰寫程式碼的方法,旨在使程式碼更容易被理解和維護。這種方法的核心思想是將程式碼組織成類似於新聞文章的結構。首先,我們會看到標題(檔案和類別的名稱),然後是摘要段落(函式的名稱),最後是詳細的段落(函式的內容)。這種組織方式可以幫助我們快速地瞭解程式碼的功能和結構。
例如,以下是一個使用新聞隱喻的程式碼範例:
import ...
class TestMetrics:
recall_threshold = 0.65
def test_global_recall_score_should_be_above_threshold(self):
# 測試全域召回率
pass
def test_stratified_recall_score_should_be_above_threshold(self):
# 測試分層召回率
pass
在這個範例中,類別的名稱 TestMetrics
就是標題,函式的名稱 test_global_recall_score_should_be_above_threshold
和 test_stratified_recall_score_should_be_above_threshold
就是摘要段落。這種組織方式可以幫助我們快速地瞭解程式碼的功能和結構。
螢幕實質管理
螢幕實質管理是指如何有效地使用螢幕空間來提高工作效率。以下是一些螢幕實質管理的技巧:
- 使用快捷鍵來切換不同的視窗和標籤頁。
- 將螢幕分割成不同的區域,以便同時檢視多個檔案。
- 使用工具列和側邊欄來快速地存取常用的功能和資源。
以下是一些常用的螢幕實質管理快捷鍵:
任務 | PyCharm | VS Code |
---|---|---|
關閉所有其他標籤頁 |
最佳化開發環境的捷徑和團隊協作
在前面的章節中,我們已經探討了許多提升開發效率的技巧和工具。現在,讓我們來看看一些實用的捷徑和團隊協作,以進一步最佳化你的開發環境。
IDE捷徑
在開始之前,讓我們先看看一些基本的IDE捷徑。這些捷徑可以幫助你更快速地在程式碼中導航和編輯。
- Mac: ⌘ ⌥ T
- Windows/Linux: Ctrl Alt T
這個捷徑可以幫助你快速地在不同視窗之間切換。
分屏和搜尋
如果你需要同時檢視多個檔案,可以使用分屏功能。以下是如何使用它:
- Mac: ⌘ \
- Windows/Linux: Ctrl \
然後,搜尋“Split Right”以將螢幕分割為兩個部分。
搜尋和導航
IDE提供了強大的搜尋功能,讓你可以快速地找到特定的程式碼或檔案。使用以下捷徑來搜尋:
- Mac: ⇧⇧
- Windows/Linux: Ctrl Shift Alt T
這個捷徑可以幫助你快速地搜尋和導航到特定的程式碼或檔案。
團隊協作
現在,讓我們來看看一些團隊協作,以幫助你和你的團隊更有效地合作。
組態程式碼
所有團隊成員都應該可以載入專案級別的組態,並且IDE應該尊重這些規則。盡量避免安裝和組態任何需要透過GUI和點選操作的東西。如果你想做某些事情(例如,為專案設定linter),請確保它是透過程式碼完成的,程式碼被提交,且你的團隊成員可以載入組態並執行相同的任務。
例如,在本章的 .vscode/settings.json
中,我們已經組態了以下內容:
- 預設的linter
專案組態
以下是一些專案組態的:
- 組態程式碼:所有團隊成員都應該可以載入專案級別的組態。
- 避免GUI操作:盡量避免安裝和組態任何需要透過GUI和點選操作的東西。
- 程式碼組態:如果你想做某些事情,請確保它是透過程式碼完成的,程式碼被提交,且你的團隊成員可以載入組態並執行相同的任務。
確保程式碼整潔與可維護性
在開發過程中,保持程式碼的整潔和可維護性至關重要。這不僅能夠提高開發效率,也能夠減少後期維護的困難。以下是幾個確保程式碼整潔的建議:
使用自動格式化工具
自動格式化工具可以幫助您保持程式碼的一致性和美觀。例如,Python 的 Black 和 Rust 的 rustfmt 都是非常受歡迎的自動格式化工具。
設定 IDE 的自動儲存和換行
設定 IDE 的自動儲存和換行功能,可以幫助您保持程式碼的整潔和一致性。
避免過度自訂
雖然自訂 IDE 的設定可以提高開發效率,但是過度自訂可能會導致團隊成員之間的設定不一致。因此,應該盡量使用預設設定,並在必要時進行自訂。
團隊級別的一致性
在團隊中,應該盡量保持一致的編碼風格和工具。這可以透過設定團隊級別的 linting 和 formatting 工具來實作。
自動化檢查
可以使用 pre-commit hooks 和 CI pipeline 來自動化檢查和強制執行團隊的編碼風格和工具。
保持捲軸區域清潔
保持捲軸區域清潔可以幫助您快速地發現和定位錯誤。
熟悉 IDE 的捷徑
熟悉 IDE 的捷徑可以幫助您提高開發效率。可以透過查詢 IDE 的檔案或線上資源來學習捷徑。
線上資源
有許多線上資源可以幫助您學習和提高開發效率。例如,PyCharm 和 VS Code 的官方檔案和教程都是非常有用的資源。
使用容器
使用容器可以幫助您保持開發環境的一致性和可移植性。雖然本章的練習中沒有使用容器,但是所有的學習內容仍然適用於使用容器的情況。
內容解密:
以上內容強調了保持程式碼整潔和可維護性的重要性,並提供了幾個實用的建議。透過使用自動格式化工具、設定 IDE 的自動儲存和換行、避免過度自訂、保持團隊級別的一致性、自動化檢查、保持捲軸區域清潔、熟悉 IDE 的捷徑和使用線上資源,可以幫助您提高開發效率和保持程式碼的整潔和可維護性。
# 示例:使用 Black 自動格式化 Python 程式碼
import black
# 設定 Black 的組態
black_config = {
"line_length": 88,
"target_versions": ["py37", "py38", "py39"],
}
# 自動格式化程式碼
black.format_file("example.py", fast=False, config=black_config)
圖表翻譯:
flowchart TD A[開始] --> B[設定 IDE] B --> C[自動格式化] C --> D[保持團隊級別的一致性] D --> E[自動化檢查] E --> F[保持捲軸區域清潔] F --> G[熟悉 IDE 的捷徑] G --> H[使用線上資源] H --> I[提高開發效率]
此圖表展示了保持程式碼整潔和可維護性的流程,從設定 IDE 和自動格式化開始,到保持團隊級別的一致性、自動化檢查、保持捲軸區域清潔、熟悉 IDE 的捷徑和使用線上資源,最終達到提高開發效率的目標。
組態IDE和虛擬環境
要在容器中組態Python直譯器和虛擬環境,需要進行一些額外的步驟。PyCharm使用者可以透過購買PyCharm Professional Edition許可證來簡化組態過程,該許可證的費用約為每月10美元。另外,VS Code使用者可以使用Dev Containers功能,但需要進行一些較為複雜的組態步驟。
作為替代方案,可以在主機上建立第二個虛擬環境,主要用於IDE組態。這樣可以讓我們同時使用主機上的虛擬環境和Docker化的虛擬環境。但是,這種方法有兩個主要缺點:需要維護兩個虛擬環境,每次更改依賴項時需要在主機和容器中執行poetry install
命令。
因此,建議使用PyCharm Professional Edition來避免工作-around和hacks,並保持開發設定簡單易於遵循。
附加工具和技術
PyCharm和VS Code近年來引入了許多有用的功能。在本節中,我們將著重於三個功能:遠端程式碼協作工具、IDE偵錯程式和GitHub Copilot。
遠端程式碼協作工具
VS Code LiveShare和PyCharm CodeWithMe都是遠端配對程式設計的絕佳工具。這些工具允許我們協作和遠端配對程式設計。
IDE偵錯程式
IDE偵錯程式是一種有用的工具,允許您暫停和步驟執行程式碼,並在每個步驟檢查其狀態。這有時比視覺化解析列印陳述式和重新執行程式碼更快。學習如何使用它不需要太長時間,在我們的經驗中,它是值得投資的。
GitHub Copilot
GitHub Copilot是一種AI助手,可以根據它所訓練的所有開原始碼提供整行或整個函式的建議。它可以與VS Code和PyCharm一起使用。
# 示例程式碼
import os
# 使用IDE偵錯程式步驟執行程式碼
def example_function():
x = 5
y = 10
# 暫停並檢查變數
print("x:", x)
print("y:", y)
# 遠端程式碼協作工具示例
def remote_collaboration():
# 使用VS Code LiveShare或PyCharm CodeWithMe進行遠端配對程式設計
pass
# GitHub Copilot示例
def github_copilot_example():
# 使用GitHub Copilot提供的建議完成程式碼
pass
內容解密:
在上面的程式碼中,我們示範瞭如何使用IDE偵錯程式、遠端程式碼協作工具和GitHub Copilot。IDE偵錯程式允許我們暫停和步驟執行程式碼,遠端程式碼協作工具使我們可以協作和遠端配對程式設計,GitHub Copilot提供了AI驅動的建議以完成程式碼。
圖表翻譯:
flowchart TD A[IDE偵錯程式] --> B[遠端程式碼協作工具] B --> C[GitHub Copilot] C --> D[程式碼完成] D --> E[遠端配對程式設計] E --> F[程式碼審查]
在上面的Mermaid圖表中,我們展示了IDE偵錯程式、遠端程式碼協作工具和GitHub Copilot之間的關係。IDE偵錯程式允許我們暫停和步驟執行程式碼,遠端程式碼協作工具使我們可以協作和遠端配對程式設計,GitHub Copilot提供了AI驅動的建議以完成程式碼。
重構和技術債務管理
程式必須為人們所寫,而不是為機器執行。沒有重構,軟體的內部設計——架構——會逐漸惡化。當人們修改程式碼以實作短期目標時,往往沒有完全理解架構,程式碼就會失去其結構。結構的喪失會產生累積效應。程式設計師越難以看到設計,越難以保留它,架構就會越快惡化。定期重構有助於保持程式碼的健康。
作為機器學習實踐者,我們知道程式碼可能會變得凌亂,通常比我們預期的更快。典型的機器學習模型訓練程式碼由半套範本程式碼組成,長時間執行指令碼,充滿副作用——例如,列印陳述式、漂亮的列印資料框和資料視覺化——通常沒有自動化測試。這可能對於教導人們瞭解機器學習過程的筆記本是可以的,但在真實專案中,這是一個不可維護的混亂,認知過載和阻礙進展的原因。糟糕的編碼習慣和缺乏設計使得程式碼難以理解,從而難以修改。這使得功能開發變得困難。
內容解密:
上述內容強調了重構和技術債務管理的重要性。重構是指重新組織程式碼以提高其可讀性、維護性和演化性。技術債務是指由於糟糕的編碼習慣和缺乏設計而導致的技術問題。透過定期重構和管理技術債務,可以保持程式碼的健康,避免技術債務的累積效應。
# 重構示例
def calculate_area(length, width):
return length * width
# 重構後
def calculate_area(length, width):
"""計算矩形面積"""
return length * width
圖表翻譯:
此圖示為重構前後的程式碼比較。重構前,程式碼簡單但缺乏可讀性和維護性。重構後,程式碼增加了註解和函式名稱,提高了可讀性和維護性。
flowchart TD A[重構前] --> B[重構後] B --> C[增加可讀性] C --> D[增加維護性] D --> E[減少技術債務]
技術債務:阻礙我們進步的沙粒
作為一名機器學習實踐者,你可能曾經遇到過看似簡單的編碼任務,但最終卻花費了遠超預期的時間。這種情況可能是由於多種原因引起的,例如:
- 程式碼品質問題(例如,變數命名不佳、函式過長等),使得程式碼難以理解
- 設計不良(例如,函式混合多個責任),使得程式碼變更困難
- 意外錯誤,常常在錯誤的時候被發現,迫使你放棄當前的工作去除錯和排除問題
這些原因(程式碼品質問題、設計不良和缺乏自動化測試)都是技術債務的例子。就像財務債務一樣,如果我們不定期償還技術債務,我們將浪費寶貴的資源在支付利息上。例如,我們可能認為自己有一個特定的工作日有四個小時的時間來工作,但我們可能會浪費三個小時試圖理解複雜的程式碼或除錯。這意味著我們浪費了75%的時間在支付利息上。
技術債務的概念可以用一個簡單的例子來闡述。想象一下,你正在開發一個機器學習模型,但你的程式碼基礎存在著許多問題。這些問題可能包括:
- 程式碼組織混亂,難以維護
- 函式過長,難以理解
- 缺乏自動化測試,難以確保程式碼的正確性
在這種情況下,你可能會花費大量的時間試圖理解和修改程式碼,而不是專注於開發新的功能。這就是技術債務的概念,它會使你的開發進度變慢,並增加維護程式碼的難度。
技術債務的影響不僅僅是浪費時間和資源,它還會對開發人員計程車氣和工作效率產生負面影響。研究表明,開發人員平均浪費了23%的工作時間在技術債務上,這是一個驚人的數字。因此,管理技術債務並不僅僅是提高開發效率的問題,也是提高開發人員的工作滿意度和士氣的問題。
技術債務的型別
技術債務可以分為幾種型別,包括:
- 程式碼品質問題:例如,變數命名不佳、函式過長等
- 設計不良:例如,函式混合多個責任等
- 缺乏自動化測試:例如,沒有單元測試或整合測試等
這些型別的技術債務都會對開發進度和維護程式碼的難度產生影響。因此,識別和管理技術債務是提高開發效率和工作滿意度的關鍵。
管理技術債務
管理技術債務需要一個系統的方法,包括:
- 識別技術債務:定期審查程式碼基礎,識別技術債務
- 優先順序技術債務:根據技術債務的嚴重性和影響,優先順序技術債務
- 解決技術債務:根據優先順序,解決技術債務
這個過程需要開發人員的積極參與和管理階層的支援。透過管理技術債務,開發團隊可以提高開發效率,減少維護程式碼的難度,提高工作滿意度。
技術債務對開發人員的影響
研究人員發現,技術債務對開發人員計程車氣、信心和進展速度產生了負面影響。當開發人員在技術債務較大的區域工作時,會感到沮喪或恐懼。然而,就像金融債務一樣,在某些情況下,承擔一些技術債務是合理的,只要我們小心謹慎地做出計劃並償還債務即可。
技術債務的目標不是完全消除,而是要小心管理。正如 Martin Fowler 所說,「穩定的但複雜的程式碼區域可以被忽略,而高活躍度的區域需要零容忍的態度,因為利息付款非常高」。這意味著我們需要在管理技術債務和開發新功能之間找到平衡。
減少技術債務的方法
幸運的是,軟體工程領域有一種方法可以幫助我們保持技術債務在健康水平:重構。在下一節中,我們將分享實用的和技術,教你如何重構、測試和設計,以減少技術債務,維持實驗和交付的速度。
透過測試、設計和重構達到健康的技術債務水平
在這一節中,我們將分享有用的和技術,教你如何重構、測試和設計,以減少技術債務,維持實驗和交付的速度。然而,在你開始重構之前,你需要了解兩件事:首先,沒有自動化測試的重構是非常風險的;其次,軟體設計很重要。好的設計可以節省時間和精力。
測試的重要性
測試是確保重構安全的關鍵。沒有測試,你就無法確保重構後的程式碼仍然正確工作。在實踐中,我們將展示如何定義特徵測試,以建立安全的環境,然後再進行重構。
設計的重要性
軟體設計對於減少技術債務至關重要。好的設計可以節省時間和精力,讓你更容易維護和擴充套件程式碼。設計的目標是建立一個清晰、簡潔和可維護的系統。
高階別的設計圖
高階別的設計圖是指你對程式碼基礎的理解,包括模組和元件的物理視覺化。這有助於你識別和避免建築風格的壞味道,例如重複和緊密耦合。
可取的設計
可取的設計是指建立一個清晰、簡潔和可維護的系統。這需要你建立具有清晰介面的抽象和類別。這樣可以幫助你最小化「熱接線」的需要,建立更易於維護和擴充套件的系統。
C4 模型
C4 模型是一種有用的工具,幫助你獲得軟體架構的清晰度。它可以幫助你識別和避免建築風格的壞味道,例如重複和緊密耦合。
軟體設計的基本模組
軟體設計的基本模組包括抽象和介面。抽象是指建立具有清晰介面的類別和函式。介面是指定義類別和函式之間的互動方式。這些基本模組可以幫助你建立更易於維護和擴充套件的系統。
# 範例:使用抽象和介面建立一個簡單的銀行系統
class BankAccount:
def __init__(self, account_number, balance):
self.account_number = account_number
self.balance = balance
def deposit(self, amount):
self.balance += amount
def withdraw(self, amount):
if amount > self.balance:
raise ValueError("餘額不足")
self.balance -= amount
class Bank:
def __init__(self):
self.accounts = {}
def create_account(self, account_number, balance):
self.accounts[account_number] = BankAccount(account_number, balance)
def get_account(self, account_number):
return self.accounts.get(account_number)
# 使用銀行系統
bank = Bank()
bank.create_account("123456", 1000)
account = bank.get_account("123456")
account.deposit(500)
print(account.balance) # 輸出:1500
內容解密:
在這個範例中,我們使用抽象和介面建立了一個簡單的銀行系統。BankAccount
類別代表了一個銀行帳戶,具有 account_number
和 balance
屬性。Bank
類別代表了一個銀行,具有 accounts
屬性,用於儲存所有帳戶。create_account
方法建立了一個新的帳戶,get_account
方法傳回一個帳戶。這個範例展示瞭如何使用抽象和介面建立一個清晰、簡潔和可維護的系統。
圖表翻譯:
classDiagram BankAccount <|-- Bank class BankAccount { - account_number: str - balance: float + deposit(amount: float) + withdraw(amount: float) } class Bank { - accounts: dict[str, BankAccount] + create_account(account_number: str, balance: float) + get_account(account_number: str) }
這個圖表展示了 BankAccount
和 Bank
類別之間的關係。BankAccount
類別具有 account_number
和 balance
屬性,Bank
類別具有 accounts
屬性,用於儲存所有帳戶。這個圖表有助於你理解這個系統的結構和類別之間的關係。
抽象:簡化複雜系統的強大工具
抽象是一種強大的工具,能夠簡化複雜系統,讓我們更容易地理解和使用它們。抽象的基本思想是將複雜的實作細節封裝起來,然後用一個簡單的表示來替代它,例如一個函式的名稱或一個類別及其方法。
想象一下你在一家餐廳,選單上不是列出菜餚的名稱,而是每道菜的做法。例如,一道菜的做法可能是:
- 在一個大鍋裡加熱油,加入胡蘿蔔、洋蔥和芹菜,攪拌直到洋蔥變軟。加入大蒜、月桂葉、牛至和羅勒,煮2分鐘。
- 加入扁豆、番茄和水,將湯煮沸,然後減小火候讓它慢慢煮30分鐘。加入菠菜,煮直到菠菜變軟。最後,調味以醋、鹽和胡椒。
如果選單只列出菜餚的名稱,例如「扁豆湯」,就會更容易理解和使用。菜餚的名稱(即抽象表示)幫助我們理解需要知道的內容,而不需要花費寶貴的認知資源來瀏覽不必要的實作細節。
抽象的目的
抽象的目的不是要模糊或不清楚,而是要創造一個新的語義層次,在這個層次上,我們可以絕對精確地描述系統。抽象讓我們可以將複雜的系統簡化為一個簡單的表示,從而更容易地理解和使用它們。
在軟體開發中,抽象是一種強大的工具,能夠簡化複雜的系統,讓我們更容易地維護和修改它們。透過使用抽象,我們可以將複雜的實作細節封裝起來,然後用一個簡單的表示來替代它,從而更容易地理解和使用系統。
介面和抽象
在軟體開發中,介面是一種抽象的表示,描述了一個類別或物件的行為和屬性。介面定義了一個類別或物件的可用方法和屬性,讓我們可以在不知道實作細節的情況下使用它們。
例如,Python 的 pandas
函式庫提供了一個 DataFrame
介面,讓我們可以使用 head()
和 sort_values()
方法來運算元據框架,而不需要知道排序演算法的實作細節。
從產業生態的動態變化來看,提升程式碼品質和開發效率是軟體工程持續追求的目標。本文深入探討了從程式碼折疊技巧、快捷鍵使用到技術債務管理等一系列效率提升策略。分析比較了不同IDE的快捷鍵設定,並闡述瞭如新聞隱喻程式碼撰寫風格、螢幕實質管理等實務技巧,也指出了技術債務累積對開發效率的負面影響。然而,單純追求速度並非最佳策略,程式碼的可讀性、可維護性和長期價值同樣至關重要。展望未來,AI輔助程式設計工具如GitHub Copilot的應用將進一步提升開發效率,但開發者仍需關注核心程式碼品質與軟體設計原則,方能將技術紅利最大化。玄貓認為,持續學習和應用新的開發工具和技巧,並保持對技術債務的警覺,才能在快速變化的軟體開發領域保持競爭力。