Louis Better than before

程序員修煉之道 - Updated 2022/01/23

“The Pragmatic Programmer have helped a generation of programmers examine the very essence of software development, independent of any particular language, framework, or methodology. This classic title is regularly featured on “Top Ten” lists, and many corporations issue it to their new hires.”

紀錄與心得

最近利用工作之餘時間,閱讀一本關於程式員的相關書籍,此書在Amazon 4.5 顆星: The Pragmatic Programming: From Journeyman to Master by Andy Hunt,一直到上個月才看完這本書,以下就留個記錄和心得。

這本書涉及的內容算蠻廣泛,涵蓋了程式員成長過程中和軟件開發過程中要注意的地方。從程式員的個體哲學到編碼過程中的各種環節,再到團隊的項目管理:程式員需要如何擴充知識,如何利用有效的工具打造個人的工作環境,到項目啟動之前如何建立一些基本的準則,如何分析、設計、編寫、測試、重構,如何實現自動化。結合工作中累積的經驗或經歷,某些章節的概念能與之共鳴。

章節概要

以下就大略紀錄共鳴的章節內容吧!

第一章 注重實效的哲學

注重實效的程序員具備哪些特徵:

  • 早期的採納者/快速的改編者 - 具有技術與技巧上的直覺。給予一項新事物,能很快掌握它,並且與自己的知識結合在一起
    "Early adopter/faster adapter - Instinct for technologies and techniques, and you love trying things out. When given something new, you can grasp it quickly and integrate it with the rest of your knowledge."
  • 好奇 - 喜歡提問。收集小知識的pack rat,透過提問收集的每一條小知識都可能會影響今後幾年內的某項決策
    "Inquistive - You tend to ask questions, That's neat. You are a pack rat for little facts, each of which may affect some decision year from now."
  • 批判的思考者
    "Critical thinker - You rarely take things as given without first setting the facts."
  • 有現實感 - 設法理解面臨每項問題的內在本質
    "Realistic - You try to understand the underlying nature if each problem of you face."
  • 多才多藝 - 總是能轉向新的領域和新的挑戰。盡力熟悉廣泛的技術與環境,並且努力工作,以與各種新發展並肩作前行
    "Jack of all trades - You try hard to be familiar with a broad range of technologies and environments, and you work to keep abreast of new developments. Although your current job may require you to be specialist, you will aways be able to move on to new areas and new challenges."

這章節描述軟件開發中的一些哲學,好比說許多因素可以促生軟件腐爛。其中最重要的一個似乎是開發項目的心理(或文化)。一扇破窗戶、一段設計低劣的代碼就足以使項目開發衰退。 “There are many factors that can contributes to software rot. The most important one seems to be the psychology, or culture, at work on a project. One broken window, left unrepaired for any substantial length of time, instills in the inhabitants of the buiding a sense of abandonment - a sense that the porwers that be don’t care about the building. So another window gets broken. Ignoring a clearly broken situation reinforces the ideas that perhaps nothing can be fixed, that no one cares. All is doomed; all negative thoughts which can spreed among team members, creating a vicious spiral. - No broken window!!”

當然,程式員需要主動擔負,並承諾確保某件事情正確完成。當犯錯誤或是判斷失誤時,誠實承認它,並設法給出各種選擇,要說明能夠做什麼來挽回局面。不要責備別人或別的東西,或是拼湊藉口。 程式員基於自己的道德準則和判斷不可能做到的事情或是風險太大的事情,有權利不去為之負責。

“Taking responsibility for yourself and your actions in termof your career advancement, your learning and education, your project, and your day-to-day work. Programmers take charge of their own career, and aren’t afraid to admit ignorance or error.”

軟件工程是一項持續的過程,每天提煉所擁有的技能而工作,以及把新的工具增加到你的技能列表中而工作。 “The reward is a more active involvement with a job you love, a feeling of mastery over an increasing range of subjects, and pleasure in a feeling of continuous improvement.”

第二章 注重實效的途徑

這章節提到程式員需遵守DRY (Don’t Reap Yourself)原則,讓開發軟件更可靠、更易於理解和維護。比如可根據文檔本身透過程式方式自動生成更新代碼的測試。程式員也需養成不斷地批判對待自己的代碼習慣。尋求任何重新進行組織,以及改善其結構和正交性的機會。

第三章 基本工具

這章節闡述工程師應該要熱於超越IDE所施加的各種限制,並且保持基本工具集的鋒力且徹底瞭解它,將其用於所有的編輯任務。此強力的編輯器也應該具備可配置、可擴展、可編程、自動完成、自動縮排、初始代碼或文檔樣板、語法突顯…。工程師也應該注重源碼控制系統,確保每項東西都處在源碼控制之下。

注重實效的程式員在剪切代碼、或是開發對象模型、或是撰寫文擋、或是構建過程自動化盡量透過shell實踐完成。而對於測試程式或修正策略最佳的途徑是讓其可再現,並需要好好看一看它操作的數據或查看stack trace認識認識程序執行的過程。

第四章 注重實效的偏執

在測試過程中,往往第一道防線是檢查任何可能的錯誤,第二條防線是使用斷言設法檢測疏漏的錯誤。為了增加代碼檢查”當然不可能發生的事情”,最容易的方式是使用assert,當assert失敗時會調用exit。但要記住決不要把必須執行的代碼放在assert中,也不要用assert代替真正的錯誤處理。

考慮重構代碼時,需留意不要試圖在重構的同時增加功能,採取短小以及深思熟慮的步驟,並且在開始重構之前,確保有良好的測試,盡可能經常運行這些測試。

第八章 注重實效的項目

這章節強調一切都要自動化,shell腳本能以相同的次序,反覆執行相同的指令; cron 自動化工具允許安排無人照顧的任務週期性運行,例如自動安排備份,夜間構建以及網站維護。目標是維持自動、無人照管、以及內容驅動的工作流,讓計算機去做重複、擁長的事情,安排時間做更重要與更困難的事情。

總結

個人認為這本書全面的、清晰地闡述實際開發軟件中獲得的各種知識。這些許多實用的建議和知識,都是值得學習以及內化吸收。

=========== To be continued…. ==========

Reference