其实我一直希望Kindle能够成为我知识管理的一部分,我们此刻所处的这个时代实则是一个信息爆炸的时代。我们每天都不得不去面对各种各样的信息,可这些信息中有多少是我们真正需要的呢?在一个信息碎片化的时代,有人说我们要懂得如何去利用碎片化的时间,有人说我们要懂得如何去高效查找需要的信息,微信和微博这类社交产品加速了信息的碎片化,或许当我们发现自己无法再集中精力去做一件事情的时候,我们就应该停下来反思如何去做好个人知识管理,我一直希望Kindle可以成为我知识管理的一部分,因为Kindle的阅读体验完全超越主流的电子设备,而且它可以让我们更加专注地去关注内容本身,Kindle的同步机制为了提供了良好的知识管理契机,所以这篇文章我主要想分享我在以Kindle作为知识管理载体这件事情上的想法,希望对大家有所启发。

记录,成为更好的自己

  相信大家都有在阅读中收集和整理内容的习惯,尤其是当我们需要在写作过程中参考大量资料的时候。对博主而言,写博客其实是我学习和理解技术的一种方式,我始终相信:写作是一种自我鞭策式的学习方法。当我们通过描述来向别人传达一种概念时,如果连自己都没有想清楚其中的关节,那么我们必然无法想别人清晰地传达这种概念。或许我们会畏惧犯错,畏惧向别人传达出错误的概念,可是如果你永远不愿意迈出那一步,那么我们就永远无法知道自己的弱点在什么地方。所以,当我们尝试对自我进行知识管理的时候,我们就需要一种良好的方式来管理这些零散的知识,在这里Markdown和Kindle会成为我们的强力工具,来帮助我们收集和整理各种各样的信息,正如我在写这篇博客的时候,我需要Markdown文档撰写和Kindle电子书格式的相关内容,我可以快速地从我的为知笔记中找到参考内容。

  我最早一直使用网易的“有道云笔记”来做笔记,选择“有道云笔记”更多的原因是我使用着“网易云音乐”、“网易邮箱”和“网易云阅读”等众多的网易旗下产品。虽然国内不乏有OneNote、为知笔记、有道云笔记、EverNote、马克飞象等众多笔记类产品,可是选择一款适合自己的笔记产品非常困难的。让我逐渐想要放弃有道云笔记的一个重要原因是,有道云笔记在推出“云协作”功能后,整体上显得非常臃肿,即使在后来推出了我喜欢的Markdown功能,我还是决定渐渐地从这个产品中过渡出来,或许是网易公司这样的大厂更注重产品线的全面化,“有道云笔记”在一段时间里产品定位一直相对尴尬,而且“有道云笔记”不支持导出笔记到同类产品这个举动,让我觉得这不符合网易相对国内厂商一贯良心的风格,所以我不得不去寻找一款它的替代产品。

  而最终我选择了为知笔记,它整体天蓝色的风格让我非常喜欢,虽然没有“有道云笔记”功能强大,而且内置付费模板,但对我来说,因为大部分记录都是在手机上,所以对我来讲,其实免费的功能基本足够我使用了,当然选择为知笔记的一个重要理由是它可以支持Markdown,而且它的笔记存储格式为.zip和.html,这意味着我们可以将笔记从云端同步到本地以后,我们可以将其导出到其它笔记产品中,这是我非常喜欢的特性。对为知笔记来说,它提供了类似Kindle通过邮箱传输电子书的功能,因此我们可以通过这个机制来将喜欢的资料推送到为知笔记中,目前主流笔记类产品在微信公众号中都提供了发送文章到笔记的功能,显然亚马逊官方公众号提供的Send To Kindle可以为我们提供类似的体验。即使微信公众号的出现让信息变成了新的信息孤岛,可我们通过这种方式来让我们感兴趣的内容被收集到笔记中,这是否在说明笔记类应用和Kindle阅读器冥冥之中就存在某种联系呢?

使用Markdown来写作

  可能你想象不到,你眼前看到的这篇博客,正是我通过Markdown这种“语言”来完成撰写的。而事实上,我使用Markdown超过三年了,对我而言Markdown是一种能让我专心写作的一种利器,不要告诉我Word是这个世界上标准的文档编写工具,如果我告诉你,使用Markdown你仅仅需要的是一个记事本,你是否还会对它的强大产生怀疑呢?事实上Word作为文档编制标准,对我们使用Markdown并没有太多影响,因为写作本来就应该是一件让自己开心的事情,如果我们不喜欢它,为什么不尝试更好的方式呢?一种让你可以关注核心内容的撰写,而非字体、段落或者是排版这种和样式息息相关的事情,我并不是说这些东西不重要,仅仅是因为从此时此刻开始,它开始变得不再重要起来。

  或许对普通人而言,Markdown是一种陌生的语言,因为Markdown天生就有着极客的基因,我们最早接触Markdown或许是从Github上的某种一个开源项目开始,这种与生俱来就在全球最大的同性交友网站上活跃的语言,或许会被人们下意识地打上“程序员”的标签,这个世界从来不乏因为一知半解而肆意猜度的人,其实Markdown在写作领域是一种非常时尚的语言,我经常被别人问一个问题,Markdown到底能为我们提升多少效率呢?这让我们从Markdown的语法说起。虽然我们称Markdown为一种语言,事实上Markdown是由John Gruber设计的一种标记语法,它的基本元素有:

标题

  Markdown中定义标题采用#来完成,按照标题的级别,我们在需要提升为标题级别的内容前面,添加指定数目的#就可以了。例如我们可以定义下面的标题,以此类推总共有6级标题:

1
2
3
# 一级标题
## 二级标题
### 三级标题

列表

  熟悉HTML的朋友都知道,在HTML中存在有序列表和无序列表两种,而在Markdown语法中无序列表采用-或者*来完成,有序列表采用1.、2.等来完成。我们来看一个简单的示例:

1
2
3
4
5
6
7
8
9
//这是一个无序列表
* 无序列表元素1
* 无序列表元素2
* 无序列表元素3

//这是一个有序列表
1. 有序列表元素1
2. 有序列表元素2
3. 有序列表元素3

引用

  我们在写作时经常需要引用相关观点来作为辅证,我们学习一种知识通常是一种由内而外的方式,我们从这个世界吸收知识和思想,通过内化来形成我们独立的世界观,世界原本就不是非此即彼的,就像自然界中的熵增定律一般,永远处在一种动态的平衡中。对Markdown来说,它采用<来完成引用的定义。例如,愿洞察之父指引我等:

1
> 万物皆虚,万事皆允。当其它人盲目追寻真相的时候,记住万物皆虚;当其它人被道德和法律约束的时候,记住万事皆允。

图片与链接

  互联网的重要精神是分享,我们说没有人是一座孤岛,对互联网来讲,没有链接就意味着没有一切。在Markdown语法中图片和链接的定义方式是非常接近的:

1
2
[Google](http://www.google.com)
![这是一张图片](http://mouapp.com/Mou_128.png)

加粗与倾斜

  我们通常会在文档中将重要信息加粗或者倾斜以表示其重要性,这种习惯在工作以后写邮件的时候得到了进一步的强化,虽然我们说Markdown更关注内容本身,即认为内容是写作的核心,可是这并不代表Markdown就此黯淡无光,相反地通过定义CSS样式,我们可以让Markdown文档更加美观和优雅。在Markdwn语法中,我们使用两个来表示加粗,一个表示倾斜。比如下面这个例子:

1
2
**这是一个加粗的文本**
*这是一个倾斜的文本**

代码高亮

  没有什么比看到一段支持代码高亮的代码片段更让人开心的了,所以你至此就会明白,为什么Markdown会如此深受工程师们的喜爱,尤其当我们需要撰写一篇技术文章并且需要在文章中展示代码的时候,如你所见,这个博客中所有的代码片段都支持代码高亮,这样可以给阅读者更好的阅读的体验,我想吐槽的一件事情是公司内部的Jira居然不支持Markdown语法,虽然公司的第一架构经常会在这里Share技术文章,可是糟糕的代码片段完全让人没有继续看下去的冲动。在Markdown中定义一个代码块的语法使用三个`符号:

1
2
3
4
5
6
7
8
9
using System;

class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine("Nothing is true, Everything is permitted.");
}
}

表格

  表格在Markdown中使用频率相对较低,因为如果没有编辑表格内容的需求,通常采用图片来展示表格内容会是一个更好的选择,而表格在Markdown中的表示同样是最复杂的,当然更复杂的是Markdown中的LeTex和FlowChar,这些均属于Markdown的扩展语法,因为违背Markdown语法简洁的原则,所以我们在这里简单说下Markdown中的表格:

1
2
3
4
5
| Column1| Column2| Column3|
|:-------|:------:|-------:|
| Left | Center | Right |
| Left | Center | Right |
| Left | Center | Right |

这里我们定义了一个四行三列的表格,我们这里使用:符号来表示表格中的对齐方式,显然这三列分别表示左对齐、居中对齐和右对齐,我们说表格这种元素复杂,主要是因为当表格中内容特别复杂的时候,这个表格定义就会降低可读性,而且它无法处理在单元格内换行的情况,所以它主要适用于表格内数据相对简单的情况下。

  好了,这些就是基本的Markdown语法所定义的元素啦,我觉得这是一种非常优雅的标记语言,如果你觉得纯文本的内容太单调,如果你觉得Word使用起来太复杂,那么Markdown就在这两者间找到一个平衡点,我没有劝大家放弃Word然后转而投身Markdown写作,可是作为一个经常码字的博客作者,我可以负责任的说,Markdown是一种可以让你专注写作的工具,而且作为一名工程师,你会发现StackOverflow、Segmentfault、Github等知名技术社区,无一例外地都在支持Markdown语法,所以Markdown其实是开源社区里除了英语以外的第二大通用语言,所以如果你喜欢写作或者是喜欢开源,Markdown都会是你不错的选择,而它的语法相信你此时已然学会了。

从Markdown到Kindle

  有人说,Markdown是一个人的狂欢,因为即使你再喜欢Markdown语法,如果你身边的同事都在使用Word等不同的工具,那么你该如何和他们写作呢?这听起来好像是一个严重的缺陷,所以Markdown注定是一种小众的写作语言。Markdown可以转化为HTML或者PDF,相比HTMLPDF相对会好些,因为HTML需要依赖CSS样式文件,没有样式文件的HTML是无论如何都不能彰显Markdown的优雅的。那么,难道我们就要坐以待毙接受这种妥协,Markdown注定要被人们抛弃吗?不,让我们勇敢地说不,下面我们介绍常见的Markdown导出/转换工具:

文档转换神器Pandoc

  如果说Markdown是这个世界上最为简洁、优雅的书写语言,那么Pandoc就是标记语言转换领域的瑞士军刀。我们知道Markdown是一种轻量级的标记语言,它可以允许写作者使用纯文本标记来来编写文档。通常我们会在Markdown编辑器中完成Markdown文档的编辑,然后将其发布到支持Markdown语法的站点上。以博主为例,博主会在Sublime中安装了Markdown插件,通常我会在Sublime中编写好文章,然后利用Hexo这个静态博客生成器生成静态HTML页面,利用Github Pages提供的静态网页托管服务,我将这些博客发布到了互联网上,大家此刻所看到的这篇文章就是通过Markdown语法撰写的。可是一旦Markdown语法出现在一个不被支持的场合,Markdown的简洁、优雅都将大打折扣,这个时候就该我们的Pandoc登场啦!

  Pandoc是一个采用Haskell语法编写的命令行工具,或许你对Haskell这样的函数式编程语言闻名已久,但是我相信Panndoc对我们每一个人来说都是一个新颖的事物。Pandoc采用GNU GPL授权协议进行发布,属于Linux世界的自由软件。庆幸的是,Pandoc支持主流的Windows、Mac和Linux三大平台,这里我们以Windows平台为例介绍Pandoc这个工具。Pandoc支持HTML、.docx、Markdown、LaTex、.TXT、.epub等常见格式的转换,以Markdown为例:

  • Markdown转HTML

    1
    pandoc README.md -o README.html
  • Markdown转Word

    1
    pandoc README.md -o README.docx
  • Markdown转Pdf(需要安装LaTex)

    1
    pandoc README.md --latex-engine=xelatex -o README.pdf

  好了,现在通过Pandoc我们可以将Markdown转换为可读性更为良好的文档,而我们知道Kindle阅读器是可以支持.pdf格式的文档的,虽然这种格式在Kindle并不能做到尽如人意,可是这对于我们而言,是将Markdown和Kindle紧密联系在一起的重要一步,这意味着我们只要Markdown文档转换为Kindle支持的文档格式,就可以实现Markdown+Kindle的个人知识管理方案。

支持导出HTML/PDF的Cmd Markdown编辑器

  下面推荐的是由作业部落出品的Cmd Markdown编辑器,这款自称为国内国内最强大的Markdown编辑器,实现了全平台覆盖,可以在线编辑同步预览,同时支持自动保存文档和云同步,支持一键发布文章到社区,是一个集文档编辑、预览、同步和发布等功能于一身的综合型Markdown编辑器,支持一键切换黑、白两种主题,支持直接导出HTML/PDF,整体上是一个非常出色的Markdown编辑器。我不太喜欢这个编辑器的一个重要原因是,我喜欢在离线环境下写文章,然后将其发布在我的个人博客上面,而这款编辑器和社区耦合过紧,虽然提供了离线版本的Markdown编辑器,但是对我而言功能上略显臃肿,我在这里推荐这个Markdown编辑器的原因是,它提供了HTML/PDF的导出功能,当我们在线编辑Markdown文档时即可通过浏览器导出HTML/PDF,如果你不需要经常导出Markdown为其它的文档格式,我会推荐你使用Sublime、VSCode、马克飞象、为知笔记、小书匠等编辑器,虽然Markdown语法对使用者的要求并不高,但我相信有一个体验良好的Markdown编辑器,会让我们的写作过程更为开心,从而达到事半功倍的效果。我们这篇文章的主题是希望将Markdown和Kindle结合起来形成一套个人知识管理的方案,所以在这里的核心关注点就变成了如何快速、高效的导出Markdown为其它文档格式,而在这一点上,相信Cmd Markdown不会让你我感到失望。

支持导出PDF/Mobi/Epub格式的GitBook

  好了,下面我们介绍一个使用Github/Git和Markdown来构建电子书的网站GitBook,请不要误会,这个网站和全球最大的同性交友网站Github没有任何直接的关系,两者的关系可以理解为,GitBook是一个基于Github/Git的静态页面生成器,其本身是一个由NodeJS编写而成的命令行工具,而通过这个工具和Markdown语法,我们就可以创建出足以媲美专业电子书籍的电子书,和Hexo类似,我们可以将这些生成的静态页面部署到Github Pages来供其它人浏览和阅读,除此以外GitBook本身就是一个相当优秀的内容发布平台,截止到今天GitBook上已经有18036本电子书。如果说在此以前,我们讨论的话题,即如何将Markdown转换为Kindle支持的电子书格式,是一个和Kindle电子书没有多少交集的话题,那么此时此刻我们已然和电子书密切地发生着关系,并且我们可以编写一本属于自己的电子书然后将其存放在Kindle上来阅读,这是一件非常酷的的事情,不是吗?如同王力宏在《开讲啦》节目中提到他幼时曾憧憬在广播里听到自己的歌一样,相信每一个喜欢写作的人,都渴望有朝一日看到自己的作品被发布出来,而GitBook就给了你这样一个梦想成真的机会。GitBook提供了epub、moni和pdf等非常Kindle的文档格式导出功能,因此我们可以在编写完Markdown文档后直接导出为Kindle支持的文档格式,这是多么美好的一件事情呀!除此以外,我们还可以使用Calibre这个Kindle电子书管理软件来完成Markdown文件的支持,但这个世界上没有绝对完美的事情,经过博主尝试后发现,使用Calibre转换的电子书在Kindle上阅读体验并没有想象中出色,对此感兴趣的朋友可以自行尝试,这些都是后话啦!

#本文小结
  个人知识管理其实是一个非常答案开放的问题,常言道“世事洞察皆学问,人情练达即文章”,当你渐渐地建立个人知识管理的意识,开始经常性地去梳理和完善自我的知识体系,这个时候到底选择什么样的方式来管理,其实是并不重要的,就像我们管理项目可以使用Github,同样可以使用Jira,这并不意味着这其中哪一种就是最好的,只有适合自己的才是最好的,就像我们使用Jira来管理项目并不意味着我们就在践行敏捷开发,我更愿意相信Wesley的观点,当你真正领会一件事情的思想和本质的时候,其实采用什么样的形式反而是次要的,我们从小到大常听到的一句话是,”如果连形式化的东西都不愿意去实践,又有什么资格来妄谈超脱形式化呢?”,我们暂且不管这句话对不对,我们必须认同的一点是,从Git到Github到Markdown到GitBook再到Kindle,一个明显的趋势是,我们这个时代,信息会越来越趋于碎片化,而与此同时,开源让我们每一个人离信息越来越近,当每一个人都成为信息的提供者,我们这个时代是一个百家争鸣、集思广益的时代,所以不管你愿不愿意,不管你有没有意识到这一点,学会去高效地检索信息、学会高效地管理信息、学会高效地利用信息,这是这个时代对我们个人知识管理能力的一种要求。好了,这篇文章就是这样啦,再次谢谢大家的关注!