业界对文档的厌恶是什么?


47

即使编写最基本的文档,似乎也存在反感。我们的项目自述文件是相对裸露的。在文档中甚至没有更新的依赖项列表。

我在行业中没有意识到让程序员不喜欢编写文档的东西吗?如果需要,我可以键入文档的段落,那么为什么其他人那么讨厌呢?

更重要的是,我如何使他们相信写文档会为我们节省时间和日后的挫败感?


13
因为我们知道我们在做什么!为什么我们要抽出时间写下我们已经知道并且永远不会忘记的内容?不过,认真的说,我每天都要处理一个基于代码库的事情,这个代码库是7年前开始设计的,此后每天由4-7名工程师组成的团队进行每日更新。文档记录是我们一直努力解决的问题,但这是必不可少的。
Ampt

61
因为经验证明,没有人可以阅读文档。
user16764

7
从业务的角度来看,大量文档使公司现在和现在都花了钱,而当您可以从事下一个赚钱的项目时。始终需要产生利润的是您对“浪费时间”编写文档的压力。另外,没有人阅读文档,而是阅读源文件,因为只有它们才是最终的权威。
Patrick Hughes

14
如果您编写的文档级别高于Javadoc或同等级别的文档,则使文档与最新代码保持同步可能会“具有挑战性”。
Dan Pichelman

12
这不好玩……

Answers:


21

我认为推测那些没有采用您认为是好的做法的人或正在继续做您认为不好的事情的人的动机没有帮助。在这项业务中,属于这两个类别中的一者或两者的人将远远超过与您会面的人,因此不要让自己发疯。

相反,请专注于问题和可能的解决方案。

1.自己编写好的文档

期望团队中的每个人都将精力放在您认为是问题上的事情可能是不现实的。如果您是该团队的新手,则尤其如此。我敢猜测您是,因为如果您是团队的创始成员,您似乎很可能早就解决了这个问题。

相反,考虑实现自己编写好的文档并使人们使用它的目标。例如,如果团队中的某人问我项目A的源代码在哪里或项目A需要什么特殊配置,我可以将他们指向项目A Wiki页面。

如果有人问我如何编写Factory F的新实现以为Client C定制事物,我告诉他们是在开发人员指南的第10页上。

大多数开发人员讨厌问一些问题,这可能会使他们看起来不仅只是“阅读代码”而不是讨厌阅读文档。因此,在经过如此性质的足够答复之后,他们将首先阅读文档。

2.证明文件的价值

确保您抓住一​​切机会指出文档在哪里证明了它的价值(或如果有的话,将具有证明价值)。尽量保持微妙,避免使用“我曾告诉过你”,但是说些类似的话是完全合法的

为了将来参考,该项目的Wiki页面包含有关为持续支持版本2.1而创建的核心代码分支的信息,因此,如果维护发布版本的人员进行了检查,将来我们可以避免进行完全的回归测试。签出代码之前先查看Wiki。

要么

我很高兴写下了执行任务T的步骤。我真的不在乎是否没有其他人使用它-它已经为我节省了比编写它更多的时间。

3.做好管理工作

在发生了一些事后可以证明节省时间/金钱的事件之后,您可能会注意到对文档的一种独特的“解冻”。现在是时候开始在评估中包括文档时间了(尽管老实说,我通常会在较长的进程(例如编译或签入)运行时更新/创建文档)来达到目的。尤其是如果这是最近招聘的员工,可能不会对此提出质疑,而是将其视为您从以前的工作场所引进的新做法(这很可能是)。

忠告:大多数老板都不愿意人们做任何事情,尤其是与可计费任务没有直接关系的事情,因此不要指望这种支持会以强制性的形式出现。相反,它更有可能让您自由地编写更多文档。

4.鼓励您看到文档

人们不经常写文档的部分原因可能是他们觉得没有人在阅读文档。因此,当您看到自己喜欢的东西时,请确保至少提及您对它的可用性感到高兴。

如果您的团队进行代码审查,那么此时您可以输入一两个字来鼓励良好的评论。

感谢您在Framework G中记录错误B的解决方法。我对此一无所知,而且我认为如果没有该工具,我无法理解您的工作。

如果您的团队中的某个人实际上对文档充满热情,那么通过午餐或喝咖啡来培养这个人并确保提供一点验证以抵消他们因看到团队中的其他成员而产生的挫败感并没有什么害处。对文档的重视程度不高。

除此之外,除非您担任领导或管理职位,否则这实际上不是您的问题。您可以将一匹马带到水上,但不能让它喝水。如果不是您的马,您可能会不满意它的口渴,但您所能做的就是填满食槽。


1
点2的+1,直接回答了OP的问题,开头的问题是“我如何说服...。”
Ray Toal

我喜欢这个答案,其他人则更多地关注“为什么”而不是“如何”
Rudolf Olah 2013年

@omouse-这是因为在大多数情况下,编写文档并不会节省您的时间和日后的挫败感。它们很少准确,人们甚至从不阅读。
Telastyn

1
SOLID原则通常也不会节省您的时间或导致更好的设计,因为大多数人要么不完全理解它们,要么根本不屑一顾。按照您的逻辑,我们不希望应用它们,GRASP或其他任何良好做法。提醒我为什么您还要再次参加程序员?
艾米·布兰肯希

它认为推测人们的动机非常有帮助。
tymtam

55

我的经验有两个主要因素:

截止期限

大多数公司太过追求日期,以至于削减了质量保证,技术债务和实际设计,这样项目经理就不会看起来很糟糕,也不会遇到一些荒谬的,过分承诺的客户期限。在这样的环境中,甚至功能质量也被削减,因此像文档这样的长期投资几乎没有机会。

更改

对于开发人员而言,相对较新的最佳做法是取消强调注释。这样做的想法是,将信息保存在两个位置(代码(包括测试)和代码周围的注释)会导致大量开销,导致它们保持同步,而收效甚微。“如果您的代码难以阅读而需要注释,那么花时间清理代码会更好吗?”

我个人甚至不会再评论。代码不能撒谎。

文档遵循同样的思路。随着敏捷的广泛采用,人们认识到需求会定期更改。随着重构的广泛使用,代码的组织将发生相当大的变化。为什么花时间记录所有这些必将改变的东西?代码和测试应该做得很好。


11
为“我个人甚至不再看评论” +1,我认为这很普遍;当您对代码本身有了一定的了解时,您可以比注释更快地阅读它(如果注释不碍您,阅读起来也更快),并且代码也不会说谎
Jimmy Hoffa 2013年

40
这错过了要点,这是为了解释原因。他们不需要到处都是,也不需要很长,但是到业务规则的适当位置链接描述了为什么在当前状态下存在接下来的20行真正奇怪的逻辑的原因更多比尝试浏览版本​​历史记录来查找原始推理更方便。
zzzzBov

7
@zzzzBov-绝对是现代事物。这与以前鼓励更普遍评论的观点有所不同。同样,有关代码正在执行的操作的文档已减少为专注于其执行原因的文档(例如,设计文档)。
Telastyn

8
代码可以说谎。客户可能想要一些东西,并且将其编码为可以做其他事情。因此,如果您现在只拥有代码,那是对的吗?
2013年

6
代码可以说谎...我有4,000行的方法(嘿,我没有创建它,我现在才拥有它...),我看到一个明确命名为“ productList”的集合,因此对于新更改,我添加了一个Product反对。大。只是它不起作用,结果是一些过去的开发人员在“高效”并重新使用List类型变量,以避免过多的变量使4,000行混乱,并且在该范围内它包含Customer对象……
Kevin Rubin

16

这里有许多因素在起作用:

  1. 编写良好的代码是其自己的文档。在其他所有条件都相同的情况下,最好编写能说明问题的清晰代码,而不是编写更多文档。这样做,当您更改该代码时,您将需要修改较少的文档。

  2. 编写文档可以说是与编写代码不同的技能。一些软件开发人员比其他软件开发人员更好。有些人在编写代码方面比编写文档要好得多。

  3. 文档只需要编写一次,而不是两次(在源代码中一次,在程序员指南中一次)。这就是为什么我们需要XML注释和文档生成器之类的原因。不幸的是,使用这些工具比手工编写文档更加棘手和麻烦,这就是为什么您看不到这些工具被广泛使用的原因。

  4. 好的文档非常耗时,而且很难做好。在其他所有条件都相同的情况下,编写新代码比为已有代码编写文档更具价值。

  5. 当代码更改时,您还必须更改文档。文档越少,需要更改的内容就越少。

  6. 无论如何,没人会阅读文档,那么为什么要打扰呢?


2
关于#1,我认为情况并非如此,但#4确实是对的
Rudolf Olah 2013年

3
@whatsisname:完全没有。编写需要更少文档的更清晰的代码,并且在更改该代码时将需要修改更少的文档。
罗伯特·哈维

2
@thursdaysgeek:这些项目符号的意思是您不必写两次文档:一次用于代码注释,一次用于帮助文件/程序员参考。您当然不必重写两次。你们在读这个东西吗?
罗伯特·哈维

4
#6 ...我认为这是一个普遍的误解。一个很多人仔细阅读文档。
2013年

3
@tymek:你的标志倒退了。伙计们,这不是有关如何创建文档的教程;这是为什么开发人员对此持消极态度的一种推论。
罗伯特·哈维

11

房间里的大象:程序员不是(不一定)是作家。它们也不一定适合向技术作家充实其实现。房间里的第二象:技术作家通常无法充实对将来的开发人员有用的细节(即使开发人员愿意向他们解释)。

如果没有适当的文档说明,随着时间的推移,复杂的系统将变得难以理解。与它的可扩展性[sic]成反比,该代码的价值变得越来越小。解决后,管理层聘用了软件工程师,他可以从开发人员那里读取代码和同轴电缆详细信息,以开发人员的价格向他付款,并授权他进行文档编制和维护文档。该作者可以阅读代码,并且知道要问什么问题,并根据需要填写详细信息。就像您有一个质量检查部门一样,您也有一个内部文档部门。

该代码将变得更有价值,因为您可以将其许可给第三者(因为他可以理解),因此可以更轻松地对代码进行审核和改进/重构,即使在您可以轻松访问的地方,代码也可以更好地重用剔除软件的轻量级版本,您将能够更轻松地将新开发人员引入该项目,您的支持工程师将很乐意为您工作。

这将永远不会发生。


1
更不用说当试图描述现有代码时,当代码和功能如此复杂以至于没人知道它已经做什么的时候,很难给出一个很好的描述,因此任何新的变化都会对新开发人员没有产生影响。了解...
Kevin Rubin

1
我建议“具有(有限的)文档来传达他或她的意图的基本能力”是必要的程序员技能。程序员不必一定是诗人,但是如果他或她不能记录下来,老实说,我不希望他加入我的团队。这样的人是长期责任。

5

更重要的是,我如何使他们相信写文档会为我们节省时间和日后的挫败感?

这样做吗?

有两种类型的文档:

有用的文件

记录如何使用成品,API,服务器的IP地址或URL名称等。基本上,所有日常使用的东西都很繁琐。错误的信息将很快被发现并得到纠正。需要被发现易于编辑(例如在线Wiki)。

无用的文档

文档经常更改,很少有人对此感兴趣,而且没人知道在哪里可以找到它。就像正在执行的功能的当前状态。或隐藏在SVN中某个地方的word文档中的需求文档,该文档已于3年前更新。该文档将花费一些时间来编写,并且稍后需要花费时间来发现它是错误的。您不能依靠这种类型的文档。这没用。浪费时间。

程序员不喜欢编写或阅读无用的文档。但是,如果您可以向他们展示有用的文档,他们会编写它。在引入Wiki时,我们在上一个项目中取得了成功,我们可以在其中编写经常需要的所有信息。


4

我要说的主要原因是缺乏意志和对文件功能的理解。有许多类文档可供考虑:

产品/发行文件

这是您的“成品”产品所不具备的。这不仅仅是手册,还包括自述文件,更改日志,HOW-TO等。从理论上讲,您可以不用编写这些代码而逃不过一劫,但最终会得到人们不希望使用的产品,或者不必要地增加了昂贵的支持负担。

API文档

这描述了应该是相对静态的东西。由于可能有许多使用者使用您的API进行编码,因此它应该足够稳定,以至于一些描述如何使用它的散文都具有价值。描述支持哪些参数,可以返回的值以及可能引发的错误将使其他用户能够在正确的抽象级别(接口(而不是实现))理解您的API 。

代码注释

目前,业界对评论的意见似乎在不断变化。当我第一次开始专业编程时,注释是编写代码的必要条件。现在,时尚是编写如此清晰的代码,而无需注释。我可能会猜测,部分原因是由于许多现代语言的编写水平更高,而且用Java,JavaScript,Ruby等语言编写清晰的代码比在汇编器中编写起来更容易,C,FORTRAN等。因此,注释具有更大的价值。

我仍然相信,在描述部分代码的意图的注释中还是有价值的,或者是有关为什么选择某种算法而不是一种显而易见的算法的一些细节(以避免过分热衷于将“固定”代码重构为“恶意”)。 t实际上需要修复)。

不幸的是,程序员在决定不记录时有很多自私,合理化和自欺欺人的行为。现实情况是,与代码一样,文档的主要受众是其他人。因此,在任何级别上写(或不写)文档的决定都是应该在团队级别做出的。对于更高级别的抽象,让开发人员以外的人来做可能更有意义。至于评论级别的文档,应共同就评论的目的和意图达成一致,尤其是在能力和经验混合的团队中。让高级开发人员编写初级开发人员无法接近的代码是不好的。一些位置适当且书面明确的文档可以使团队更有效地运作


1
+1是“文档的主要受众是其他人”。太多的程序员并不真正重视与他人交流。(这也是为什么他们将难以晋升的原因。)
Donal Fellows

4

这是我的两分钱。

  1. 敏捷宣言指出“在综合文档中使用软件”,而并非每个人都会继续读下去,“也就是说,尽管右侧的项目有价值,但我们更重视左侧的项目。”

  2. 遗憾的是,https: //en.wikipedia.org/wiki/Code_and_fix很常见,并且该文档不适用于此模型(它不同步)。

  3. 软件开发行业监管不力。没有法律要求编写文档。

  4. 自记录代码是当前的趋势。

话虽如此,我认为那里有很多很好的文档。


(1)“ 我们更重视左侧的事物…… ”并不意味着我们根本不在乎右侧。(2)“ 4.自我记录代码是当前的趋势 ”如果没有必要记录文件,那么为什么人们首先抱怨不良/丢失文件?(3)每个需要信息的开发人员都会花一个开发人员通过不记录其工作而节省的时间,因为他必须扫描5000行的自我记录代码,而不是5页的文件。效率是另外一回事,但是,我们很敏捷!
JensG 2014年

2

文档编写需要时间,我怀疑很多开发人员的文档运行过多,比没有用的糟糕。他们的想法是,不仅文档会给他们的经理(一直削减计划中的质量检查部分的那个人)带来麻烦,而且对任何人(包括他们)都没有帮助。

任何体面的文件记录都是对未来的投资。如果您不关心未来(因为您不考虑下一份薪水,或者因为您认为这不会成为您的问题),那么编写文档的想法将非常痛苦。


2

许多其他答复掩盖了至少有两种类型的文档:一种是针对其他开发人员的文档,另一种针对最终用户的文档。根据您的环境,您可能还需要系统管理员,安装人员和帮助台人员的其他文档。每个目标受众都有不同的需求和理解水平。

考虑一下(立体)开发人员:他是一名选择的编码人员。他从公众的视野中选择了职业,并且主要在与自己进行交流的键盘后面度过了很长时间。文档编制过程是一种沟通形式,而生成良好文档所需的技能与生成良好代码所需的技能相反。

一个好的文档编写者可以使用多种语言进行交流:用户的语言,管理的语言,支持人员的语言,开发人员的语言。文档编写者的工作是了解编码人员所传达的内容,并将其转换为所有其他小组都可以理解的形式。

当您期望编码人员发展成为良好的沟通者(书面或其他)所必需的技能时,磨练主要技能集(编码!)所花费的时间会减少。他离舒适区越远(与其他编码人员进行编码和通信),则需要更多的时间和精力来很好地完成任务。您可以合理地期望专业编码人员希望主要专注于其核心能力,而却要牺牲所有其他能力。

因此,文档(内联代码注释除外)最好留给沟通者,而不是程序员。


4
哎呀 您学会做得更好的事情越多,您就会学会做得更好。正如懂多国语言的人比只懂一种语言的人(因为他们知道解决问题的更多方法)要更好地编程一样,能够书写甚至以图形方式可视化的语言为您提供了更多的工具来思考和解决问题。您需要用来描述正在发生的事情的技能与您需要弄清楚应该发生的事情的技能相同。
艾米·布兰肯希

1
我希望其他开发人员成为或成为熟练的交流者。我们所做的绝大多数编程(至少在商业软件中)不需要绝对最高的磨练编码技能。它需要更好的人与人沟通技巧,以便将来的开发人员了解所写内容。开发人员可以进行更好的交流,尤其是与他们永远不会见面的人交流,从长远来看,他们会被更好地思考,并且对于聪明的代码也不太可能。
凯文·鲁宾

2

阅读代码将向您展示其工作方式。它无法解释原因:您需要评论。

读取代码将为您显示方法的名称和参数的类型。它无法解释语义或作者的确切意图:您需要评论。

注释不会代替阅读代码,而是添加了代码。


4
+1。但这不是对这个问题的答案。除了实际提出的问题之外,您似乎在回应其他问题。
bignose

2

文档未按代码执行。结果,通常没有有效的反馈循环来验证文档是否到位并完整。这与代码注释倾向于腐烂的原因相同。

Donald Knuth提倡Literate Programming,以提高软件质量,有效地编写带有代码的文档。我看到一些项目非常有效地使用了这种方法。

我个人试图保持现代趋势,即保持代码的公共API尽可能可读,并使用单元测试来记录其他开发人员的使用情况。我认为这是使您的API具有可以探索和发现的形式的更大想法的一部分。我认为这种方法是HATEOAS试图通过Web服务实现的一部分。


为了证明我选择自动生成文档的合理性,我想出了一个模拟公式来说明人为惰性是所有评论腐烂的元凶。在扩展该论点的同时,我发现创建为开发人员提供实际优势的方法(例如从源代码中的元注释中自动生成部分图表)倾向于每次都进行更新,而开发人员则试图理解这些代码。顺便说一句,这个开发人员常常只是“未来我”。
wolfmanx

0

这是一个很小的要点,但对于一些编写令人讨厌的小文档的开发人员来说,这似乎很重要:他们无法键入。如果您大致了解10指系统,则往往会因为简单而编写更多文档。但是,如果您坚持狩猎和啄食,就会迷路。如果我要负责招聘,那实际上是我要检查的事情。


0

不喜欢阅读文档的人不喜欢编写文档。为避免彻底阅读文档,许多程序员将竭尽所能。

不要专注于写作,专注于阅读。当程序员阅读文档并将文档中的内容吸收时,他们将看到其价值,并且更倾向于编写文档。


-1

当我开始目前的工​​作并从以前从事该项目的人员那里接手了一个硬件和软件项目时,得到了一百页左右的描述该系统的ms word文档。生产必须花几天的时间。我看了两次。尽管其中包含大量信息,但是它很少回答我对系统的实际问题,即使这样做,也可以更快地查看代码。

经过足够的经验之后,您才开始思考,为什么要打扰?为什么要花时间回答人们从未问过的问题?您开始意识到预测人们将在文档中寻找的信息是多么困难。事实不可避免地充满了事实,这些事实变得毫无用处,不清楚或显而易见,并且缺乏最紧迫问题的答案。请记住,提供有用的文档是在预测人类行为方面的一项工作。就像用户界面设计在经过多次测试和调试迭代​​之前不太可能成功一样,因此天真的认为仅根据人们对系统的理解以及期望的内容编写有用的文档是可能的。文档及其语言将在该解释中扮演的角色。

我倾向于认为编写文档的大部分压力来自这样一个事实,即这是一件令人不快的琐事,人们喜欢内like地彼此做不愉快的琐事(“您还没有吃过腓肠肌的lb脚!”)。

然而

我并不认为文档在所有方面都是绝望的。我认为这主要是无望的,主要是因为人们将文档视为完成工作之前必须完成的额外负担,作为匆忙完成的最后清理工作以及作为检查框的工作。文档是您应该始终进行的日常工作。我认为电子邮件是做文档的一种特别好的方法。添加新功能时,给几个人写一封简短的电子邮件,说明它的含义。绘制新原理图时,生成PDF并将其发送给可能感兴趣的任何人。电子邮件的优点是:

  1. 人们通常会检查电子邮件,而没人会涉足名为“ doc”的文件夹。

  2. 电子邮件存在于上下文中,周围是讨论该功能和相关功能以及当时发生的任何其他事情的其他电子邮件。

  3. 电子邮件简短简短,主题明确。

  4. 电子邮件允许关心的人立即提出问题,

  5. 电子邮件是高度可搜索的,因为人们将其用于所有内容,并且这些年来,邮件客户端已经有了长足发展。

  6. 如果在电子邮件中,则至少有另一个人知道在哪里可以找到它。

从理论上讲,代码中的注释似乎也应该是“无论如何都需要注意的一天”,但是老实说,我从不阅读代码中的注释。我不知道为什么,但是它们并不是很有用,可能是因为缺少可以解决电子邮件的上下文。


除了#4(“关心的人会立即问问题”)外,您列出的电子邮件中的任何一项都没有对我有效。1:人们往往会忽略电子邮件,而电子邮件却很多:2:电子邮件经常倾向于丢失上下文,将其掩埋在附带问题中并过度引用3:电子邮件时间太长/太大,随着讨论的深入,往往会失去焦点更多附带问题和主题行通常是不相关的/过时的(“ Re:今天的服务器上发生了WTF吗?”)...
gna

... 5:删除邮件的能力极大地损害了电子邮件搜索的能力,这是任何体面的邮件发送者都具有的功能,并且对任何活动的邮件用户都很好,使用了很多功能6:请参阅5,如果邮件被删除,则没有人能够找到它(我唯一可以依靠的是搜索我发送的邮件,这仅仅是因为我非常努力地不删除这些邮件)。除了电子邮件好评(这看起来很没有道理给我),你做虽然有些好点
蚊蚋

@gnat我想这可能会因删除公司而异。在我公司,我们将保存所有电子邮件,以及以前员工的所有电子邮件的存档,每当新人员开始执行任务时,我们都会将该人员所有相关的电子邮件转发给该人员。我认为风格有所不同。
Owen

是的,这取决于很多的样式/文化。尽管“对抗删除”无疑是可行的(甚至在技术上很简单,只需将邮件线程导出到某些服务器即可实现),但保持专注,主题相关,引用限制在合理范围之类的事情是高度文化性的事情,需要大量的工作以及维护的决心(和管理支持)...与这项工作相比,尤其是对于mgmt买入的需求,维护Wiki /代码注释/ doc文件夹之类的东西可能会变得更加容易
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.