摘要
本文旨在说服工程师们,尤其是敏捷团队的成员,在撰写过程文档时,放弃传统方式,尝试使用:1、Markdown撰写;2、SVN/Git版本管理;3、HttpServer排版;—— 3合1的新方式。
本文也描述了相关的技术要素:如何不再打开Office或WPS,只需普通的记事本,一样写出漂亮、易读的文章;如何搭建一套Markdown->html的生成、发布、和访问系统;如何使用浏览器快捷、永久的访问文档……
关键词
文档代码化 markdown toc headeranchor
目录
理论篇
项目中的文档有很多种:需求/用户故事、方案设计、详细设计、接口说明、测试报告…… 以前的软件工程理论将这些文档分摊到不同的角色身上;现代的敏捷理论强调工作的软件高于详尽的文档,讲求文档的简单有效和角色的互相渗透合并。本文不论两者的优劣,只想探讨一下如何让写文档变的更方便、更愉悦这个话题,窃以为应该是对两派同学都是有益处吧。
文档的传统方式
回顾一下我们文档撰写、分发、阅读、更新的传统方式:
-
找到文档模板:例如是word/Excel/PowerPoint模版。大公司里不要小瞧了找模板的困难,尤其是写跨部门、跨团队的文档,要找别人的模版时。找不对的话提交系统时被打回还要重新找。万一遇到了模版更换Logo一类的事情,用提心吊胆来形容有时候都不过分。
-
把讨论和笔记写入文档:虽然有模版,但还是会常常见到字体五花八门、行间距大小不一、色调五彩缤纷……对待这些问题,读者只能呵呵了(本文如果哪天写入了某个Word模版,肯定也是个鬼样)。
-
合写文档的痛苦:通常的模式是:牵头人把章节定一下,在章节后面把具体撰写人的名字写上,约定个时间,牵头人手工合并。问题显而易见啦:
-
手工合并易出错
-
具体撰写人需要修改时会去麻烦牵头人,要么牵头人不断合并,要么撰写人采取保守策略不再积极提交变更
-
合并文档的版本管理困难:经常会看到把日期加到文档后,一连串的日期把自己累的不行
-
“指定章节到撰写人”打击了撰写人写其他章节的积极性:因为会给合并人带来更多的工作和混淆,撰写人宁可保持低调;同时撰写人并不知道另一章节的人是否已经撰写了自己想到的内容。
-
提交评审:挺好。但其中有一点需要改进:作者根据评审意见修改后,通常有两种方式评判是否OK:主持人直接评判,主持人开会召集评委们再次评判。—— 在一个温和的团队中,这两种方式都会“和谐”的完成。可以增加第3种意见表达的方式:评委直接修改文档,然而在word模版+没有版本管理的方式下,这是令人望而却步的。
-
更新文档:最痛苦的部分到了
-
需求、方案类文档:开发实现后回头更新需求、方案的比例有多高?这个现实问题很多同学宁可提都不提, Let it go,随她吧。
-
详设、开发类文档:软硬件工程师们拿各种理由来搪塞的场景相信都遇到过吧,什么“来不及”了、“太多了”、“更新太快了”……甚至还有“代码即文档”这种左倾冒险主义的托辞不一而足。面对领导燃烧的怒火,工程师们用微笑和耸肩来抵挡。
-
测试、报告类文档:这个还好,因为是一次性活动的文档产物,基本不需要更新。《测试方案》归属到第一类中。
-
其他:技术积累、会议纪要等过程文档,细想想更恐怖,几个月前讨论的会议纪要你还会打开么?到哪里找估计都忘了吧,那次会议中的决议还记得么?上次调试遇到的挫折写入技术积累了么?…… 呀呀呀,不要再说了。呵呵。
-
更新后文档的推送:有几种方式
上面这些如果有哪条戳中了你的痛点,请继续往下读。如果你觉得没关系啦,这些都是小事,鸡毛蒜皮的,我们团队可以克服,那就请不用往下看了,谢谢!
文档的新方式
现在,我们来试想下一种新的方式:
-
写作和排版是分离的:作者只关心内容和简单的排版(如标题、分段、列表),不关心最终的排版布局、字体色调等表现形式(如颜色、字体、行间距……),类似书籍出版业:作者只需要把内容写在稿纸上或txt文本,编辑去完成排版和书籍的美工。这样带来的优点很多:
-
作者专注于写内容、表达思想
-
编辑可以使得表现形式很容易统一
-
编辑不是人,是软件、电脑
-
多人合写、协作是非常方便的:每个人的观点和想法可以方便的在团队中流动,关键是可以被记录在文档中,而不是散落在邮件里。
-
写作是简文本形式的:随时、随处、随编辑器可打开、编辑,再也不会出现在一个没有安装Office的电脑上打不开一个word文档、打开文档后一个visio图是个红色叉叉……的囧境。
-
文档更新历史信手拈来,毫厘不差:不必人工更新文档中的某个叫做“更新历史”的章节,而是能够方便的看到该文档的所有参与人、参与时间、和修订内容。——这可不是word的修订模式能够完成的。
-
通过浏览器访问文档:打开IE/Chrom/FF,访问网址既能看到最新的文档,收藏到收藏夹中时不时看看,甚至可以进行RSS订阅 —— 这种阅读体现还不能打动你么?
OK,几大梦想如何来实现呢?非常方便,我们现在所处的互联网时代早就搞定这些事情了,并且是非常简单、高效,需要的只是你勇敢的去尝试、然后喜欢。
-
使用Markdown等标记类语言来写简文本文档:编辑器很多,可以参考下文“工具软件”章节,此处我推荐SublimeText,Win/Mac/Linux全系统通用,适当的加上各种插件,写什么都特有感。
-
使用SCM(svn、git等)管理简文本文档:并不是什么都能用SCM管理,至少软件版本、压缩包、视频、甚至图片……这些二进制的东西都是不能交给SVN、git来管理的,倒不是scm不能管理,而是你在做不对的事情,就像非要一个软件工程师去画一块电路板,不是他做不出来,而是你用人不当。简文本是svn/git最能接受的,并且好处多多:
-
多人合写文档:在svn/git提交就是了,update一下,然后commit,什么牵头人、合并人都不再需要了
-
修改别人的章节:update后,修改就是了,提交后能方便地看到修改了啥,还能回退
-
促进文档更新:能看到log和每次更改的记录,就像一个成绩肯定,会建立作者的成就感,越是不断更新文档的人,看着自己的更新log,越是更充满再更新一下、再完美一点的冲动。
-
对开发工程师没抵触:当前的开发工程师99%都已经熟练的掌握了svn或git的使用,剩下1%可能还在使用cvs或clearcase。所以问题是如何让系统工程师、测试工程师等其他人员也掌握svn或git这种可以1h入门速成的好工具(git的精通还是需要更多的时间和实践,svn则基本没有精通的必要了)。
-
配置HttpServer完成编辑角色:Markdown撰写的文档当然也可以在本地静态编译成html,自己查看,或分发给朋友,但这样做的缺点是把编辑工作自己承担了,后果就是模版不统一,这种团队中不可取。由HttpServer中加Markdown渲染插件:把编辑工作交给服务器是更好的选择。
-
加入权限控制:svn、httpserer都可以进行权限控制,控制某些人不能提交或阅读。
总结一下:回头一看,你会发现,这不就是写代码么?做软件的都懂这个。—— 就是,就是,就像写代码一样来写文档,对软件工程师简直是零门槛,呵呵。
文档的代码化
这里需要首先分辨出两个概念:
-
代码的文档化:是对工程师的期望,期望软硬件工程师写出的代码是尽量不需要外部文档的,或能够自动生成文档的。
-
文档的代码化:是对所有写文档人的期望,期望所有写文档的人能够掌握svn/git等工具,采用简文本格式书写文档,适当加入标记类语言,克服传统文档书写、合并、发布、更新过程中的痛点,写出喜闻乐见、快速迭代、有效传播的文档。
代码文档化是另外一个课题,本文不表。
文档代码化是本人提出的新名词,百度上暂时还搜不到,提出这样的名词主要还是为了促进更多的人改进原有的文档编写方式。
那么文档代码化除了个人视野眼界和接受新事物的能力两点阻力之外,还有没有其他的困难呢?当然有:
-
并不是所有文档都适合代码化:正式严肃、需要加密、红头文件之类的应该更适合使用传统方式
-
markdown标准在不断演化中,并且已经开始有分支能够强力到影响创始人的决策
-
markdown的编辑工具虽然好找,但编译工具并不是很统一
下面开始解决上面的几个小困难 —— 说实话这些对软件工程师不算困难,有N多的开源项目可以拿来主义,但对其他团队有可能是个不大不小的困难,还是描述一下吧。
实现篇
Markdown基础
熟悉、已经会使用markdown的同学请跳过本章节。
标记语言与Markdown
计算机的可读文本记录有两种:简文本方式、富文本方式
特性 |
简文本方式 |
富文本方式 |
编写工具 |
普通文本编辑软件 如:记事本、vi/vim、sublime等 |
各自特定的编辑软件 如:office、WPS等 |
存储空间 |
小 |
大 |
版本管理 SVN、git |
Server上可压缩,支持增量存储 存储空间极小 Client支持方便的对比等功能 |
Server上不支持增量存储,占空间 Client大部分不支持对比 |
举例 |
.txt/.c/.sh/.xml/.html/…… |
.doc/.ppt/.xls/.rtf/…… |
两者各有优缺点,长期以来互补而不能互相替代。
但是到了网络时代,移动阅读日渐成风,追求简洁阅读,随之也带动桌面阅读一起,都在向“扁平化、去拟物、沉浸式”发展,富文本的丰富似乎变得可有可无(其实本来word的丰富表现力又有几人会用?80%的人群只用了富文本编辑工具的20%功能,其实是另外80%的功能变得可有可无)。
有没有结合两者优点:简文本书写、(小)富文本表现的产物呢?—— 有:标记语言(markup language),在文本中插入格式描述。
其实并不是近几年才开始有人关注两种文本的融合,标记语言也已经发展了很多年,也不止一种:
都是在文本中插入格式描述,孰优孰劣暂且不表,这里只说一个:随着github的风靡而在广大程序直男中迅速普及的:markdown。
markdown的细节本文不表,可参考:
Markdwon工具软件
我本人对比试用过的几款如下表。列出来只是想给大家多一些选择,如果有选择恐惧症的同学,跳过本节,参考附录1,使用 sublime + MarkdownEditor + MarkdownPreview 即可。
Name |
OS |
LivePreview |
TOC |
VI |
OpenSource |
Haroopad |
Mac Win Linux |
Yes |
Yes |
Yes |
No |
Mou |
Mac |
Yes |
No |
No |
No |
MarkdwonPad |
Win |
Yes |
No |
No |
No |
CuteMarkEd |
Win Linux |
Yes |
No |
No |
Github |
SublimeText+plugin |
Mac Win Linux |
No |
Yes |
Yes |
No |
Cmd |
Web |
Yes |
Yes |
Yes |
No |
stackedit |
Web |
Yes |
Yes |
No |
Github |
MaHua |
Web |
Yes |
No |
Yes |
No |
点评
-
Haroopad:偶然发现的通吃、美观、功能强悍的全能型选手
-
Mou:好久没升级了,又听说作者正在考虑出售,看来已经日落西山了。
-
MarkdownPad:基于.NET Framework4.0,启动稍显慢,其他都挺好。
-
Sublime Text + Plugin:强烈推荐,取代了我Windows上的Notepad++,Fedora上的gedit,和Mac上的TextEdit,以1抵3。其实VI也能做到以1抵3的,VI也有Markdown插件,但Sublime有VI模式,但VI没有Sublime的很多特性,只能说:VI加油!
工作流
工作流1:本地静态生成HTML
-
书写markdown文档
-
本地编译为HTML
-
markdown文档和HTML同时上传到svn/git服务器
-
读者通过权限受控的http访问svn服务器上的html文件
工作流2:HttpServer动态生成HTML
-
HttpServer管理员配置好服务器
-
书写markdown文档
-
仅上传markdown文件到svn/git服务器
-
读者受权限控制的通过http访问svn服务器上的markdown文件,动态转换为html
对比两种工作流,由于每个人转换markdown的方式可能有所不同,甚至markdown转换html可能对某些同学是个麻烦。我建议采用工作流2,只需管理员做一次配置,后续的转换都不成问题,只需要规范大家的书写。
最后,上几幅高清无码大图来赏析一下。
sublime中畅快的书写和预览markdown

通过SVN来合并、更新文档,并查看修改记录,快捷追溯

配置Apache识别.md文件

通过浏览器访问.md后缀的Markdown文件(截图中为本文的网络地址)

一些技术细节
附录
SublimeText的基本使用
一定要分清标记类语言的:编辑器和编译器。Sublime只是编辑器,MarkdownEditor和MarkdownTOC是编辑器辅助插件,MarkdownPreview是编译插件。
安装
基本操作
配置
Plugin
|