(文末福利)讓工具成爲雙手的延伸

務實的程序員,他們有哪些特質?

他們面臨問題時,在解決方案中透露出務實的態度、風格、理念。他們總是越過問題的表面,試着將問題放在更寬泛的大環境下綜合考慮。他們爲所做的一切負責,責任感驅使着務實派的程序員,在軟件的熵中,保持項目的有序。

Thomas 與 Hunt 從 1999 年開始,通過這本頗具影響力的大作,幫助無數客戶創造出更好的軟件。這本書是技術書籍中的一件「珍品」,需要經年累月一讀再讀。無論你是新手還是經驗豐富的程序員,你都能從這本書中發現樂趣。
通過這本書,你可以學會:
  • 務實的哲學與務實的方法
  • 避免知識重複的陷阱、靈活駕馭基本工具
  • 防範安全漏洞、組建務實的入門套件
  • 寫出有彈性、動態、適配性強的代碼
  • 無情而有效地做測試


  工欲善其事

你可以在 Shell 中啓動應用程序、瀏覽器、編輯器,還可以搜索文件、查詢系統狀態,並將結果過濾後輸出;你可以通過各種方式組合工具——可能連開發者自己都想不到自己當初開發的工具會被這樣使用;你還可以通過對 Shell 編程構建出複雜宏指令,來自動化日常工作。
有人要問了,在圖形界面和集成開發環境(IDE)中,通過點擊屏幕也可以完成以上每件事情,而且看上去更加直觀,不是嗎?
是,也不是。圖形界面的好處是「所見即所得」。像是拖拽文件、發送電子郵件、輸入信息等這些工作,你完全可以使用圖形界面完成。但是,完全使用圖形界面,你會錯失環境的部分能力——你將無法把常見的任務自動化、無法通過組合工具來定製宏工具。圖形界面的侷限是,「所見即全部」,如果你想要超出設計者給定的功能,就會碰壁。
在《程序員修煉之道》的「基礎工具」一章中,作者鼓勵你使用 Shell、加強使用編輯器的能力。怎樣纔算遊刃有餘地使用編輯器?作者給出了一個挑戰清單,試試看你能能否不使用鼠標和觸控板完成上面所有任務?
  • 當編輯文本時,以字符、單詞、行、段落爲單位移動光標及進行選擇

  • 當編輯代碼時,在各種語法單元(配對的分隔符、函數、模塊……)之間移動

  • 做完修改後,重新縮進代碼

  • 用單個指令完成代碼塊的註釋或者取消註釋

  • Undo 並 Redo 變更

  • 把編輯窗口切割成多個面板,然後在它們之間跳轉

  • 跳轉到特定的行號

  • ……

熟悉 Shell 之後,你會發現生產率大幅度提高,某一天你會驚訝地發現,自己十指翻飛,這些工具已成爲不假思索的肌肉記憶、這些工具將成爲雙手的延伸。

  優秀設計的精髓

想要可靠地開發軟件,讓開發項目更容易理解和維護,需要遵循的原則是:在一個系統中,每一處知識都必須單一、明確、權威地表達。讓我們來看一個典型的例子:

   
   
   
def print_balance(account) printf "Debits: %10.2f\n", account.debits printf "Credits: %10.2f\n", account.credits
if account.fees < 0 printf "Fees: %10.2f-\n", -account.fees else printf "Fees: %10.2f\n", account.credits end
printf "———-\n"
if account.balance < 0 printf "Balance: %10.2f-\n", -account.balance else printf "Balance: %10.2f\n", account.balance end end

先不說不應該用浮點數保存貨幣金額,這段代碼中至少有三處重複。

首先,關於負數處理的地方有一處明顯的複製粘貼。 通過增加一個判斷正負的函數就可以消除這個重複。
其另一個重複是 printf 的調用中,相同字段的格式反覆出現。我們固然可以增加一個常量,把這個常量傳給每次的調用,但爲什麼不直接使用已經定義的函數?解決上面兩個重複問題後,代碼現在長這樣:
  
  
  
  def format_amount(value)    result = sprintf("%10.2f", value.abs)    if value < 0      result + "-"    else      result + " "    end  end
def print_balance(account) printf "Debits: %s\n", format_amount(account.debits) printf "Credits: %s\n", format_amount(account.credits) printf "Fees: %s\n", format_amount(account.fees) printf " ———-\n" printf "Balance: %s\n", format_amount(account.balance) end
如果客戶要求在前面的標籤和後面的金額之間多加一個空格,該怎麼辦?讓我們繼續優化這段代碼:
  
  
  
  def format_amount(value)    result = sprintf("%10.2f", value.abs)    if value < 0      result + "-"    else      result + " "    end  end
def print_line(label, value) printf "%-9s%s\n", label, value end
def report_line(label, amount) print_line(label + ":", format_amount(amount)) end
def print_balance(account) report_line("Debits", account.debits) report_line("Credits", account.credits) report_line("Fees", account.fees) print_line("", "———-") report_line("Balance", account.balance) end
如果我們需要變更金額的格式,就去修改   format_amount ,如果想要變更標籤的格式,就去修改 report_line 。現在的這段代碼相比第一段,更加易於測試和擴展。
程序員要努力的方向,應該是孕育出一個容易複用已有事物的環境,而不是重複知識。

  在作品上簽名

如果你打算跟別人解釋你爲什麼做不完、爲什麼延期、爲什麼搞砸,在此之前先等等,聽一下自己的內心。講給你顯示器上的橡皮鴨聽聽,或是先對着貓說一遍。你的那些藉口聽起來合理嗎?還是很愚蠢?你的老闆聽到會怎樣?
務實的程序員應該提供選擇、解決問題,而不是找藉口。不要說搞不定;解釋一下要做什麼才能挽回這個局面。是否必須扔掉這些代碼呢?和團隊討論下 重構的價值 吧?你是否需要一點時間來做原型?爲了防止錯誤再次發生,你是否需要 清理你的代碼 、引入更好的測試?
作者在書的最後一章指出,如果程序員的代碼都是匿名的,可能會滋生粗心和錯誤,特別是在大型項目中,程序員不免把自己看成是大齒輪上的一個小齒;如果程序員都在作品上簽名,又有可能導致合作的問題。務實的程序員不會逃避責任,相反,我們樂於接受挑戰,併爲自己的工作感到自豪——「這是我寫的,我與我的作品同在」,你的簽名被認爲是質量的標誌。當人們在代碼上看到你的名字,應當對這份可靠的、經過測試的、專業的工作充滿期許。
作者 David Thomas 文末簽名


福利時間

你有哪些「修煉之道」?
對技術感興趣的你,有哪些心頭好書?

歡迎在評論區留言你的想法,
我們將選取一位小夥伴,
贈送紙質版
《程序員修煉之道:
通向務實的最高境界》一本!

積累代碼量很重要,
讀書、讀好書也很重要。
「Zilliz 好書推薦」欄目,
旨在與你分享技術成長相關的書籍,
與你一起先把書讀厚,再把書讀薄。
——————————————————————————

Zilliz 以重新定義數據科學爲願景,致力於打造一家全球領先的開源技術創新公司,並通過開源和雲原生解決方案爲企業解鎖非結構化數據的隱藏價值。
Zilliz 構建了 Milvus 向量數據庫,以加快下一代數據平臺的發展。Milvus 數據庫是 LF AI & Data 基金會的畢業項目,能夠管理大量非結構化數據集,在新藥發現、推薦系統、聊天機器人等方面具有廣泛的應 用。
解鎖更多應用場景

本文分享自微信公衆號 - ZILLIZ(Zilliztech)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章