Linux中國

簡單就是易於調試

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

你可能只編寫一次軟體,但幾乎總要經歷好幾個調試周期。注意我說的調試周期並不意味著「代碼裡面有 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 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國