现在Markdown大行其道,几乎成为了网络写手的必备技能。按照目前的趋势,Markdown的潜能仍在被不断地发掘,发展空间非常大。Markdown一开始设计成可以方便地转化成HTML,但是Markdown没有满足于此,它有一个更大的目标——成为一种网络书写语言。在目前的发展来看,Markdown成为普通的网络书写语言指日可待。

不管从哪个角度说,Markdown都太火了,正因为太火了,所以更加需要冷静地看待Markdown,也就有了《反思Markdown》这篇文章。

思考Markdown:Markdown vs 一般富文本编辑器

当我们希望拿一个东西来跟Markdown对比的时候,相信很多人很自然地想到了Word,而想到Word也就容易想到Word与LaTex之间那旷日弥久的神圣战争。Word与LaTex都是排版系统,都提供了文档从书写到展示的完整解决方案,但是实现方式各有不同:

  • Word是内容与形式同时处理;LaTex是内容与形式分离。
  • Word是所见即所得;LaTex是源码(纯文本)输入。

其实从这个角度看,Markdown其实跟LaTex有很多相似之处,完全兼具这两个特点,都是源码输入,都是内容与形式分离,只不过Markdown是手枪,LaTex是大炮,功能上有数量级的差别。

所以Markdown与富文本编辑器的比较其实可以分解成一下两点的比较:内容与形式分离 vs 所见即所得、源码输入 vs 所见即所得。

内容与形式分离 vs 所见即所得(内容与形式融合)

一份最终呈现的文档必然包含内容与形式(排版)两部分,内容规定了文档有什么,形式规定了文档的内容怎么呈现,二者是不可或缺的。这里所说的内容与形式分离是指两点:一是操作上的分离,将内容书写与排版操作分开进行;二是文件上的分离,使用不同的文件分别记录内容与形式。而一般所见即所得富文本编辑器往往在这两点上都与之相反,比如我们在Word中书写内容的时候往往需要不时去调整格式,因为很多格式与排版往往不是我们所想要的,并且最后所有的内容与形式都会被打包到Doc或者Docx格式文件中。Markdown中是怎样的呢?Markdown是面向内容书写的,让我们能够专注与内容的书写,而无需关心具体的排版,生成一个只包含内容的md格式文件,至于具体的形式只需要一开始调整好或者最后需要发布前调整即可。不过Markdown怎么样面向内容的?它是通过大幅削弱排版功能实现面向内容,通过对不同内容进行定义来实现不同内容形式上的区分,比如使用#来定义标题,程序会自动为标题添加合适的格式。

内容与形式分离比内容与形式融合有着压倒性的优势:

  • 首先当然是前面说过的专注内容书写。在书写过程中,专注内容是很有必要的,因为“写作不是一个孤立的动作,虽然简单到只需要纸笔(或者是一台电脑)就能开始,但同时意味着你的大脑需要承担所有其他下笔之外的任务,这无疑是给自己增加了不少负担1。”内容与形式分离之后我们思维上的负担会大大减轻,全心全意地如关心内容的书写。

  • 调整排版的方面依然具有优势。虽然Markdown的排版很弱,但是这点使用LaTex书写论文时会非常明显,内容书写完成之后,只需要套用模板就可以根据不同的杂志格式要求导出不同排版的论文。而如果使用Word的话则需要一处一处更改格式,每一次都是大工程。在需要统一多个文档的样式的时候,内容形式分离的优势非常明显,我们可以在书写内容之前或之后调整格式,并可以在多个文件之间实行样式的迁移,从而统一让多个文档样式统一起来。而在Word虽然有模板功能,但是这只能在书写内容之前实现样式统一,在文档完成之后无法统一进行样式修改。

  • 内容与形式文件分离,甚至只保留内容文件之后,不仅让有利于作者调整排版,而且也有利于读者阅读,因为可以将最终样式的选择权部分交给读者。这样文章的样式不再是死板的,而是具有弹性的,读者可以根据自己的阅读习惯或阅读环境适当的调整文章的显示样式,而这不会影响具体的内容。简书中就可以让读者根据阅读习惯改变显示的字体。

源码输入 vs 所见即所得

源码输入是直接面向原始代码进行书写的方式,而所见即所得是面向最终显示结果进行书写的方式。两种方式其实各有优缺点:

  • 严谨性方面,源码输入更加严谨。源码输入得到的文档每一处都是自己所需要并精心书写得到的,不会有多余的东西。像LaTex这种功能强大的系统,更能精确地控制想要的排版,所以LaTex常常被称为排版之王。 
    所见即所得更加智能,编辑器往往会猜测用户的想法补全一些操作和样式,而这可能不是我们所需要,虽然部分所见即所得编辑器(如Word)也能有丰富的设定来进行精确的排版,但是排版的时候更多的还是依靠作者的双眼,这就造成很大的随意性。

  • 功能方面,源码输入与所见即所得之间没有太大可比性,源码输入的功能有限取决于语法本身,其次是编辑器,而所见即所得基本取决于编辑器。像经过几十年的发展的Word在功能上已经完全可以与LaTex并驾齐驱了,就Markdown而言,Markdown本身是轻量级的标记语言,功能上与LaTex、HTML等其他源码相比不占有优势,与Word这样的巨人相比更是以卵击石,但是如果与部分所见即所得的前端富文本编辑器相比,Markdown实在是过之而无不及的。另外Markdown具有可拓展性,其语法功能仍在不断的发展和更新,未来的Markdown一定会比目前的Markdown更加的强大。

  • 显示和上手难度方面,所见即所得编辑器有着得天独厚的优势,因为是面向最终显示结果进行书写,能直观地看到最终的结果,更容易对错误进行及时的纠正,而凭借图形界面和丰富的工具栏,用户又可以非常方便的上手使用,这种体验是非常友好的所以非常地普及。 
    相反,源码输入需要经过渲染才能得到最终的显示结果,非常不直观,而且一般源码输入上手难度比较大,学习成本高,这就将很多用户拒之门外,而且源码的语法与文章内容放到一起,往往会影响对内容的把控,干扰对内容的书写。当然,如想学习Word的高级功能,也是需要很大学习成本的。有人说过LaTex是开始难——然后容易——最后很难,而Word是开始容易——之后变难——最后很难。我诚以为然。

  • 用户层面,所见即所得的学习成本很低,但也正是如此,大部分所见即所得用户都没有养成良好的编辑习惯 ,这导致了使用上的随意和排版的混乱。而源码输入用户相反,大多有较好的排版意识。

  • 书写流畅性方面,所见即所得编辑器一般采用工具栏按钮进行编辑操作,这虽然简单,但是用户的右手需要经常在键盘与鼠标之间进行切换,很影响效率。而源码输入因为是纯文本输入,基本是使用键盘,是一种流畅的线性输入,而且正因为是键盘输入,不依赖工具栏,所以源码输入编辑器的界面一般更加简洁,简洁的界面也更能让作者专注于内容的书写。

  • 文档修改方面。当我们进行书写的时候,往往是线性的,而这正是源码输入的特点。但是当我们修改文章的时候,往往是针对某一个局部进行修改,操作不是线性的,在这点上源码输入会显得吃力。而所见即所得编辑器没有这个问题,因为在所见即所得编辑器中修改与录入的体验是相似的。

Markdown vs 其他语法

上面我们说了这么多,好像除了不直观、上手难度大以及语法干扰内容这三点之外,源码输入对比所见即所得几乎全是优点。而我们今天的主角Markdown,它的出现正好解决了这几个问题,也正是如此,才让Markdown现在如日中天。而这一切正是基于Markdown语法的“易读易写”特性。它没有采用字母文字,而是采用特殊字符,甚至不起眼的空格构建自己的语法,这让语法对内容的干扰降到最低。这些精挑细选的特殊字符与空格空行组合之后又让源码尽可能的贴近最终的输出效果,这使得源码变得非常易读易写,即使不将源码渲染,源码依然非常直观。另外功能和排版进行大幅度的简化,加上贴切的语法,这都使得Markdown语法非常容易学习,上手难度降到很低。

了解到这里,对于Markdown为什么会如此流行,似乎已经不需要抱有什么疑问了。可以说,Markdown今天的流行是源码输入以及内容与形式分离输入的一次回归性胜利,让源码输入、内容与形式分离这些东西散布到互联网的各个角落,而不再属于程序员和专业用户的专利。朋友们,感受到Markdown的魅力了吗?

反思Markdown:Markdown的局限

介绍了那么多Markdown的优点,好像Markdown没有缺点一样。其实不然,它的缺点非常显而易见,而且估计很多使用Markdown的人都会深有体会,现在我们反思一下Markdown的不足和局限:

  • 没有统一的标准。Markdown目前语法众多、编辑器更是层出不穷,每个编辑器支持的语法不同,对语法的改造程度也各有差异,Markdown形成了其他语言难得一见的“方言现象”。CommonMark曾经一度希望成为Markdown的标准,然而被Markdown创始人John Gruber喊停了,所以目前Markdown的方言现象依然严重,而且随着Markdown的发展和编辑器的出现,方言现象只会愈发严重。John Gruber允许不同平台根据需要对Markdown进行调整。本人对此非常不能理解的,可拓展与随意修改不是一个概念,拓展性与规范并不冲突,一个良好的规范才能让一门语言有更良性和更长远的发展。正因为没有统一的标准,方言现象衍生了其他的问题:

    • 兼容性问题。John Gruber说过:“Markdown是一种书写格式,而不是一种发布格式。”我一开始不能很好理解这话的意思,直到我尝试将一个编辑器的文本复制到另外一个编辑器时出现了兼容性问题。虽然兼容性问题是格式与编辑器的永恒问题,但是Markdown的兼容性不是一般的差。Md不是一种发布格式,意味着我们应该尽量避免使用Md文件做网络交流。

    • 更换编辑器时需要更高的学习成本。不同编辑器间不同的语法规定造成了我们在使用不同编辑器的时候需要掌握各自不同的语法。这个时间成本不是单纯地多掌握一两个语法这么简单,而是要更改原本的使用习惯去适应一个新的语法习惯。这个跟我们实际上的方言是很像的,就好比一个湖北人为了跟四川人对话专门去学习四川话一样。

    • 平台/编辑器依赖性。Markdown本身是纯文本,是可以脱离编辑器的。然而Markdown不是一种发布格式,其最终的结果就是形成平台或编辑器的依赖,因为Markdown能实现多少功能与怎么书写完全由平台或编辑器决定。不同的平台和编辑器都可以输入Markdown语法,都可以导出Md文件,让我们产生一种错觉——以为Markdown是通用的。这其实是一种很危险的感觉,一开始我也深陷这种错觉之中。虽然目前支持Markdown的编辑器和平台很多(未来会更多),但是因为平台/编辑器依赖,最后能被我们使用的只会零星几个。

  • 图片的支持。在使用层面,不同编辑器对本地图片有不同的处理方式,这个涉及到上面所说的兼容性。在语法层面,图片的语法比较简单,功能较为单一,不能直接显示图片,不够直观,也不支持一些基本的修改大小等操作。

  • 表格的支持。Markdown支持最多的是简单表格,原生Markdown甚至不支持表格。虽然Pandoc's Markdown语法支持多种复杂表格,但是仍不被大多编辑器所支持,而且复杂表格的书写相对困难。

  • 可拓展与易读易写之间的权衡。人们正在不停地为Markdown添加新的语法以图实现更多的功能,但是功能与内容之间有不可调和的矛盾,基于源码输入的特性,在内容书写时要求的功能越多,需要添加的语法也会越多,势必会让Markdown易读易写的特性下降,影响内容的书写,而且学习的成本也会提高。

  • Markdown对中文不友好。Markdown使用的都是英文字符,在中文键盘中,很多字符无法输入。相信Markdown用户都有这种体会,在输入Markdown语法的时候,需要经常性的进行中英文切换。而且因为半角全角的问题,有的字符在显得格外的相似,比如冒号与叹号,一旦写错不容易被看出来。这个问题在移动端非常明显,曾经为了写Markdown给ipad买了个蓝牙键盘,结果发现基本无法使用纯键盘书写,移动端根本无法快速进行中英文的切换和符号书写。这个谁用谁知道。

  • 转义。Markdown的语法会占用一些特殊字符,这些字符对某些用户而言是很常用的。虽然可以转义,但是在进行文字内容书写的时候需要去注意要不要转义是一件很干扰的事情。在一般所见即所得编辑器中,转义是交给编辑器自动解决的。但是在Markdown中,转义的任务很自然地落到了用户的头上。

  1. /p/dd6fed60