認知負荷
探討認知負荷對工程師工作效率的影響,以及如何有效管理認知負荷以提升工作品質。
什麼是認知負荷?
認知負荷(Cognitive Load)是指在完成任務時,大腦處理訊息的負擔。它描述了我們在處理、儲存和操作資訊時所需的心理努力。 這種負擔會影響我們的學習效率、工作表現和決策品質。
大腦的工作機制
工作記憶的運作
人類的大腦就像一台電腦,各種感官接收到的影像、聲音、觸感、氣味和味道,會透過神經元傳遞到大腦的短期記憶中。這些訊息在大腦中被編碼,並決定是否需要儲存或丟棄。
這些尚未進入長期記憶的訊息,會在我們的腦中短暫地被使用和處理,這就是所謂的工作記憶。工作記憶就像大腦中的工作檯面,我們在上面處理訊息,將不重要的訊息丟棄,並對重要的訊息進行編碼和儲存,這是執行功能的一部分。
工作記憶幫助我們學習新事物、與他人互動、解決問題和做出重要決策。例如,當老師在數學課上讀一道應用題時,學生需要記住所有的數字,弄清楚要使用什麼運算,同時記下數學運算或同學對話中的重要訊息。
然而,工作記憶是有限的,處理訊息時會消耗大量的大腦資源;而長期記憶則不同,它有無限的容量來儲存訊息,幾乎不需要消耗太多的大腦資源,這就是我們所說的自動化。
自動化的目的是讓我們能夠將注意力集中在更重要的訊息上。例如,寫字時,你不需要一直記得怎麼拿筆,這個姿勢已經成為長期記憶,讓我們能夠專注於理解課程內容和記住重要的知識。
工作記憶的限制
- 人類的工作記憶容量有限,通常只能處理 4-7 個資訊塊
- 一旦認知負荷達到這個閾值,理解事物就會變得更加困難
認知負荷例子
假設我們被要求對一個完全不熟悉的項目進行一些修復。我們被告知一位非常聰明的開發人員對此做出了貢獻。這位開發人員使用了許多很酷的架構、精美的庫和流行的技術。換句話說,作者給我們造成了很高的認知負荷。
在這樣的情況下,我們需要快速理解這些複雜的技術和架構,這對於我們的工作記憶是一個巨大的挑戰。這種高認知負荷不僅影響我們的工作效率,還可能導致錯誤的發生。因此,學會如何有效管理認知負荷是每位工程師必備的技能。
認知負荷的三種類型
- 內在認知負荷(Intrinsic Load)
- 由任務本身的複雜性引起(例如學習新技術、概念、架構)
- 這種負荷通常是不可避免的,但可以通過分解任務、簡化問題來管理
- 外在認知負荷(Extraneous Load)
- 由不良設計或無關訊息引起(例如混亂的程式碼風格、開發者的怪僻)
- 這種負荷可以通過優化流程和設計來減少
- 外在認知負荷也是主要要去減少的地方
- 相關認知負荷(Germane Load)
- 學習和理解過程中的必要努力
- 這種負荷對於長期成長是有益的
工程師常見的認知負荷
複雜的程式邏輯
大多數工程師會推薦 A 為什麼?
B 使用較長的名稱,這使我們無法將其識別為單一區塊
較長的名稱也無助於創建更好的上下文,實際上它只是噪音
我們會選下面的,他使用更具有意義名稱的中間變數
通常我們會選擇右邊的 Early Return
這樣在看程式碼的時候,只需要 focus 在 Happy Path 上就好
A 可能花費的時間最少,主要原因是熟悉
更準確地說,我們的長期記憶中存在 A 的一塊,但其他任何一個都沒有。這意味著我們需要做更多的處理,然後才能從中提取含義和概念
A 就是所說的編寫 for 迴圈的「慣用方式」。就內在複雜性而言,它並沒有真正更好
然而大多數程式設計師可以更輕鬆地閱讀它,因為它是我們常用詞彙的一部分
多層繼承關係
典型的繼承惡夢,會造成大量的 Context Switch,請優先選擇組合而不是繼承
混亂的程式碼風格
混亂的程式碼風格會增加閱讀和理解的認知負荷:
- 不一致的縮排方式
- 混亂的空行和空格使用
- 不統一的命名規範
- 不同的括號和引號風格
- 註解格式不一致
這些看似微小的差異會累積成巨大的認知負擔,因為大腦需要不斷適應不同的閱讀模式。
建議:
- 使用程式碼格式化工具
- 建立團隊共同的程式碼風格指南
- 在 Code Review 時注意風格問題
- 配置 IDE 的自動格式化功能
過多淺層模組
過多的淺層模組可能會導致專案難以理解
我們不僅要記住每個模組的職責,還要記住它們所有的互動
要理解淺層模組的用途,我們首先需要查看所有相關模組的功能
設計模組的時候要記得高內聚,低耦合
過多的微服務
待了很久的老人 vs 剛進來的新人
如果你已將項目的心理模型內化到長期記憶中,你就不會經歷高認知負荷
如果你保持較低的認知負荷,人們就可以在加入你公司的最初幾個小時內為你的程式碼庫做出貢獻
常見工程師工作中的認知負荷來源
- 理解複雜代碼(例如深層繼承、多重條件)
- 學習新技術或工具(如 Kubernetes、Prometheus)
- 處理模糊的需求或不完善的文檔
- 多任務切換(前端與後端、多人協作)
- 技術債和遺留系統
減輕認知負荷的建議
1. 程式碼層面
- 使用清晰的命名規範
- 保持函數簡單且單一職責
- 適當的程式碼分層和模組化
- 實施 Early Return 模式
- 避免過深的巢狀結構
- 保持一致的程式碼風格
2. 工作流程優化
- 實施番茄工作法,專注單一任務
- 建立不受打擾的專注時段
- 使用待辦清單管理任務
- 將複雜任務分解為小步驟
- 定期進行程式碼重構
- 自動化重複性工作
3. 開發環境優化
- 善用 IDE 功能和快捷鍵
- 建立常用程式碼片段(Snippets)
- 設置自動化測試和部署流程
- 關閉不必要的通知
- 整理工作空間,減少視覺干擾
4. 團隊協作
- 建立清晰的文件規範
- 定期進行知識分享
- 實施有效的 Code Review
- 統一團隊的開發工具和流程
- 建立共同的程式碼規範
5. 將常用知識轉化為長期記憶
- 重複練習與應用:透過反覆練習和實際應用,將常用的知識和技能內化為長期記憶,減少每次使用時的學習負擔
- 使用記憶輔助工具:如記憶卡片、思維導圖等,幫助鞏固知識並促進記憶的轉化
- 建立知識間的連結:
- 跨領域學習:鼓勵跨領域的學習,將不同領域的知識聯繫起來,形成更全面的理解
- 使用聯想記憶法:透過聯想記憶法,將新知識與已有知識連結,增強記憶效果
實踐建議
- 建立自動化基礎
- 熟練掌握開發工具的快捷鍵
- 建立個人的程式碼片段庫
- 製作常用的工作流程腳本
- 讓基礎操作變成肌肉記憶
- 強化長期記憶
- 定期複習核心概念
- 將新知識與已有知識連結
- 製作知識地圖
- 實踐間隔重複學習
- 優化工作記憶
- 使用外部工具記錄臨時想法
- 將複雜問題分解為小任務
- 一次專注於單一任務
- 適時休息,避免認知疲勞
- 環境管理
- 清理桌面和編輯器介面
- 整理專案文件結構
- 建立一致的工作流程
- 減少環境干擾
結語
在軟體開發中,管理認知負荷不僅關係到個人效率,更影響著整個團隊的生產力。透過理解認知負荷的本質,採取適當的管理策略,我們能夠:
- 提升程式碼品質
- 增進團隊協作
- 促進持續學習
- 維持工作熱情
最重要的是,記住每一個我們今天所做的改進,都能減少明天的認知負荷,為自己和團隊創造更好的工作環境。