怎样编写优秀软件
英文原文: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 —