簡單就是易於除錯

Martin Tournoij發表於2019-12-19

對於框架、庫或者工具來說,怎樣做才算是“簡單”?也許有很多的定義,但我的理解通常是易於除錯。我經常見到人們宣傳某個特定的程式、框架、庫、檔案格式或者其它什麼東西是簡單的,因為他們會說“看,我只需要這麼一點工作量就能夠完成某項工作,這太簡單了”。非常好,但並不完善。

你可能只編寫一次軟體,但幾乎總要經歷好幾個除錯周期。注意我說的除錯周期並不意味著“程式碼裡面有 bug 你需要修復”,而是說“我需要再看一下這份程式碼來修復 bug”。為了除錯程式碼,你需要理解它,因此“易於除錯”延伸來講就是“易於理解”。

抽象使得程式易於編寫,但往往是以難以理解為代價。有時候這是一個很好的折中,但通常不是。大體上,如果能使程式在日後易於理解和除錯,我很樂意花更多的時間來寫一些東西,因為這樣實際上更省時間。

簡潔並不是讓程式易於除錯的唯一方法,但它也許是最重要的。良好的文件也是,但不幸的是好的文件太少了。(注意,質量並取決於字數!)

這種影響是真是存在的。難以除錯的程式會有更多的 bug,即使最初的 bug 數量與易於除錯的程式完全相同,而是因為修復 bug 更加困難、更花時間。

在公司的環境中,把時間花在難以修復的 bug 上通常被認為是不划算的投資。而在開源的環境下,人們花的時間會更少。(大多數專案都有一個或多個定期的維護者,但成百上千的貢獻者提交的僅只是幾個補丁)


這並不全是 1974 年由 Brian W. Kernighan 和 P. J. Plauger 合著的《程式設計風格的元素The Elements of Programming Style》中的觀點:

每個人都知道除錯比起編寫程式困難兩倍。當你寫程式的時候耍小聰明,那麼將來應該怎麼去除錯?

我見過許多看起來寫起來“極盡精妙”,但卻導致難以除錯的程式碼。我會在下面列出幾種樣例。爭論這些東西本身有多壞並不是我的本意,我僅想強調對於“易於使用”和“易於除錯”之間的折中。

  • ORM物件關係對映 庫可以讓資料庫查詢變得簡單,代價是一旦你想解決某個問題,事情就變得難以理解。
  • 許多測試框架讓除錯變得困難。Ruby 的 rspec 就是一個很好的例子。有一次我不小心使用錯了,結果花了很長時間搞清楚究竟哪裡出了問題(因為它給出錯誤提示非常含糊)。

    我在《測試並非萬能》這篇文章中寫了更多關於以上的例子。

  • 我用過的許多 JavaScript 框架都很難完全理解。Clever(LCTT 譯註:一種 JS 框架)的語句一向很有邏輯,直到某條語句不能如你預期的工作,這時你就只能指望 Stack Overflow 上的某篇文章或 GitHub 上的某個回帖來幫助你了。

    這些函式庫確實讓任務變得非常簡單,使用它們也沒有什麼錯。但通常人們都過於關注“易於使用”而忽視了“易於除錯”這一點。

  • Docker 非常棒,並且讓許多事情變得非常簡單,直到你看到了這條提示:

    ERROR: for elasticsearch Cannot start service elasticsearch:
    oci runtime error: container_linux.go:247: starting container process caused "process_linux.go:258:
    applying cgroup configuration for process caused \"failed to write 898 to cgroup.procs: write
    /sys/fs/cgroup/cpu,cpuacct/docker/b13312efc203e518e3864fc3f9d00b4561168ebd4d9aad590cc56da610b8dd0e/cgroup.procs:
    invalid argument\""

    或者這條:

    ERROR: for elasticsearch Cannot start service elasticsearch: EOF

    那麼…你怎麼看?

  • Systemd 比起 SysVinit.d 指令碼更加簡單,因為編寫 systemd 單元檔案比起編寫 shell 指令碼更加方便。這也是 Lennart Poetterin 在他的 systemd 神話 中解釋 systemd 為何簡單時使用的論點。

    我非常贊同 Poettering 的觀點——也可以看 shell 指令碼陷阱 這篇文章。但是這種角度並不全面。單元檔案簡單的背後意味著 systemd 作為一個整體要複雜的多,並且使用者確實會受到它的影響。看看我遇到的這個問題和為它所做的修復。看起來很簡單嗎?


via: https://arp242.net/weblog/easy.html

作者:Martin Tournoij 選題:lujun9972 譯者:LuuMing 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

簡單就是易於除錯

訂閱“Linux 中國”官方小程式來檢視

相關文章