怎樣編寫優秀軟件
英文原文:How to write good software
軟件必須是自由的
優秀軟件是自由軟件。我將避免使用“開源”,因為它根本沒有包含社會層面,它和技術本身同等重要。你可以從這里了解更多。
廣泛被接受的工具和語言
編寫優秀軟件的語言是被廣泛使用的,這使得有人能夠閱讀和修改代碼。優秀的語言,比如C、Python 和 Java。當然也有例外,一些較少被使用的語言是更好的選擇。
保持簡單
優秀軟件不做不必要的事情。換句話說,沒有不必要的功能。實現沒人使用的功能只會產生 bug。設計軟件時,保持簡單應該作為最高優先級。正如愛因斯坦說的“讓事情盡可能簡單,而不是比較簡單。”
太多抽象是糟糕的。如果你把代碼隱藏在多層抽象之后,你也隱藏了 bug。太多的抽象讓代碼難以理解,難以跟蹤執行路徑和 debug。它也會降低性能。抽象之上的抽象經常可以在 Java 編寫的企業軟件中看到。優秀軟件可以用 Java 編寫,但是 Java 也讓編寫恐怖的、結構復雜代碼變得非常容易。C++也是如此。
不要弄成火箭科學
使用具有真正意義的變量名。不要使用單字符變量名。它們幾乎不可能理解和追蹤。也有單字符的變量名,它們是被普遍接受了。例如對于坐標,用x和 y就行。對于循環,就使用i,j等等。除此之外,不要這樣使用了。通常地,對于優秀軟件,代碼的結構是清晰的,還有可查的、記錄下來的代碼風格。
文檔是重要的
不管文檔是多么地讓人厭煩,優秀軟件也是有文檔的。代碼有清晰的注釋,軟件有隨之一起安裝的手冊。對于 web 應用程序,讓文檔可以在線上訪問到。
開發者經常認為,當軟件被完成后再去寫文檔,就足夠了。那是完全錯誤的方式。文檔必須是開發人員在開發軟件過程中的一件事情。文檔必須是開發的一部分,而不是代碼被寫完之后的工作。
使用版本控制系統
優秀軟件使用版本控制系統,一直都用。如今我差不多總是推薦 Git 做版本控制,但是有一些情況,SVN 之類的系統就可以做得很好了。版本控制容易回滾到可能有問題的修改。考慮下面的例子,如果沒有版本控制系統,該怎么辦:
開發者A修改了文件 program.c,該文件被拷貝到了源碼樹(source tree),舊文件被替換了。后來發現了一個 bug,問題出在開發者A對 program.c 所做的修改。開發者B、C等人費了好大勁兒才搞清楚開發者A修改了什么。如果有版本控制系統,這就不是問題了。當然聰明的開發組應該有備份的,因此在這種 情況下,他們將找到修改前的原始備份,使用 diff 工具看看修改了什么地方。然而,既花時間、又麻煩。更不要提從備份拷貝并替換文件是多么地容易出錯了。
擴展性
擴展性不是嚴格意義上的強制項,不過它經常讓軟件更加有用。開發軟件、便于讓它能夠與其它軟件一起被使用,是一種優秀的方式。事實上,這是 Unix 主要設計原則之一。
例子
互聯網充滿了編寫良好的軟件。很多標準的 Unix 工具編寫良好,然而有些就不是。一個寫得不錯的例子是 Memo,這是我寫的軟件。
如果需要推薦一本書,那么我會為你推薦 Eric Raymond 編寫的《Unix 編程藝術》。
— END —