文档 文档
首页 U 开头 本地查找local find 不用本地查找帧, 全屏 Google 搜索特定话题的网页 jump to footer translate with Babelfish by Roedy Green ©1996-2008 Canadian Mind Products  翻译:SuperMMX ©2003-2008 自由 SuperMMX
“Any fool can tell the truth, but it requires a man of some sense to know how to lie well.”
“任何傻瓜都能讲真话,但一个人需要一些能力才知道如何更好地说谎。”
~ Samuel Butler (1835 - 1902)

“Incorrect documentation is often worse than no documentation.”
“不正确的文档常常比没有文档更糟糕。”
~ Bertrand Meyer

既然计算机忽略注释和文档,那么你就可以肆无忌惮地撒谎。做一切在权力范围能做的事让可怜的维护程序员迷糊。

  1. 在注释中撒谎

    :你不必要刻意去撒谎,只是没有让注释随代码保持最新。
  2. 给明显的事实写文档

    :在代码中到处加上诸如 /* add 1 to i */ 等的注释, 但是永远不要写下有用的文档,象包或者方法的整体目的等等。
  3. 只写出"怎么做"的文档,而不是“为什么”

    :只写出一个程序到底在做什么的细节,而不是它要完成什么。这样,如果有 bug 的话,修改者就不知道代码到底应该做什么。
  4. 避免给"明显事实"写文档

    :例如,如果你正在写一个航班预订系统,要保证如果你要加一条航班,至少有 25 个地方需要修改,但绝对不要写出哪里需要修改。之后的程序员只有在完全理解程序中的每一行之后, 才敢修改代码。
  5. 正确使用文档模版

    :考虑一下使用函数文档原型,能自动给代码产生文档。把这些原型从一个函数(或者方法,或者类)拷贝到另外一个, 但是永远不要填写。如果由于某些原因必须填写,那么一定要保证所有这些函数的所有参数名字都相同, 并且所有的警告也都是一样,当然这些都与当前的函数完全无关。
  6. 正确使用设计文档

    :当实现一个非常复杂的算法时,在编码之前使用传统的软件工程原则做一个合理的设计。 写一个极其详细的设计文档,描述这个复杂算法中每一步的细节。文档写得越详细就越好。

    事实上,设计文档应该把算法分解成结构化步骤的分层结构,在文档中以自动编号的独立段落来描述每一步。 标题至少要 5 层。完成的时候,要确定把整个结构分解得非常彻底,有超过 500 个这样自动编号的段落。 例如,其中一段可能是:(这是一个真实的例子)

    1.2.4.6.3.13-显示出对活动的影响,选出的缓和做法能够应用在这些活动中。(省略一些伪码)

    然后…,(这就是害群之马)当你编写代码的时候,给每一个这样的段落写一个相对应的全局函数, 叫做:

    Act1_2_4_6_3_13()
    不要给这些函数写文档,要知道,这可是设计文档的作用!

    既然设计文档是自动编号的,让它跟上代码的更新是极端困难的(因为这些函数的名字当然是静态的, 而不是自动编号的)。这对不是个问题,因为不需要保持文档一直最新。实际上, 要尽你所能来销毁文档的痕迹。

    之后的那些人只能找到一份或者两份早期设计文档的草稿,相互矛盾,布满灰尘, 扔在那些破烂 286 机器旁边的房间里。

  7. 度量单位

    :永远不要给出任何变量、输入、输出、或者参数的度量单位,例如英尺、公尺、盒等。 这虽然在数豆子的时候没什么用,但在工程工作中却非常重要。可以推论出, 永远不要给那些转换常量的度量单位作注释,或者是它们的值是怎么来的。虽然这只是小小的欺骗, 但对于用一些错误的度量单位给代码加点调味品,却非常有效。如果想要更恶毒一点, 可以创造你自己的度量单位;以自己或者某个不出名的人来命名,但却明确定义它。 如果有人来质问,就说这样就能使用整数而不是浮点数来进行算术运算了。
  8. 陷阱

    :不要给代码中的陷阱写出文档。如果怀疑一个类可能有错误,自己知道就可以了。 如果你对如何重新组织或者重写代码已经有了想法,为了天堂(for heaven's sake), 不要写下来。记住电影 Bambi 中 Thumper 的话"如果不能把事情说得很好, 那就干脆不要说"。如果写代码的人看到注释会怎么样?公司的老板看到它们会怎么样? 客户呢?你可能会让自己被炒鱿鱼。一个匿名的注释,写着"这里需要修改", 就能让人大吃一惊,特别是当注释具体指什么还不清楚的时候。保持含糊,没有人会感到受了批评。
  9. 给变量写文档

    绝不要给变量声明写注释。变量如何使用、它的范围、合法值、隐含或者显示出来的小数位数、 度量单位、显示格式、数据输入规则(例如,全部填写、必须输入等)、什么时候值可以信任, 所有这些都应该在程序的代码中得到。如果老板强迫你写注释,那么就在方法体中间夹杂一些, 但绝不要在变量声明的地方,甚至是一个临时变量也不要。
  10. 在注释中进行贬损

    :要阻碍任何使用外部维护的包,可以在代码中夹杂一些句子,诋毁处于领导地位的软件公司, 特别是有可能签约做这项工作的公司。例如:
    /** The optimised inner loop.
     * This stuff is too clever for the dullard at Software Services Inc., who would
     * probably use 50 times as memory & time using the dumb routines in <math.h>.
     */
    class clever_SSInc
       {
       ...
       }
    如果可能,把这些诋毁的东西放在代码中语法比较重要的地方,以及注释中, 这样如果他们要在外包维护之前消除这些,就可能会破坏代码。
  11. 象在打孔卡片上的 CØBØL 一样作注释

    :始终要拒绝接受开发环境的进步,尤其是 SCID。不要相信谣言: 所有函数和变量的声明都绝不会超过一次点击。始终要假设在 Visual Studio 6.0 中开发的代码可能由某个使用 edlin 或者 vi 的人来维护。坚持苛刻的注释规则,把代码完全淹没掉。
  12. Monty Python 般的注释

    :给一个叫做 makeSnafucated 的方法加上 Java 文档 /* make snafucated */。决不在任何地方定义 snafucated 的意思。只有傻瓜才不知道自己已经完全知道了 snafucsated 的意思是什么。 要看这个技巧的经典例子,请参阅 Sun AWT Javadoc。
  13. 废弃代码

    保证把无用代码注释掉,而不是删除、并且必要的情况下依赖版本控制再取回来。 绝不要说明新代码是为了补充、完全替代旧代码,或者旧代码是否还能工作、出了什么错、为什么要替换等等。 用开始 /* 和结束 */ 把它注释掉, 而不是每行一个 //。那种方法让可用代码更容易搞错,并只能维护一部分。