为什么想写书

不知不觉大三结束了,再过一年我的本科生涯也将结束了,在这个时间点,我不禁想,我的大学生活是有意义的吗?

我不能说我的大学经历是成功的,但是粗略一想,有意义的值得回味的场景还是有不少的。于是我便想将其记录下来,未来看到便也能重新回忆这段美好的青春岁月。

另一个方面,作为新一批即将毕业的学生,我也不禁想给后人留下点精神财富之类的东西,倒不是为了让什么人记住我,更多的是希望后来的学弟学妹不要重蹈我的覆辙。这里我很想提一下jgggTJ-CSCCG项目,我从中真的受益很多,让我能够站在巨人(各位学长)的肩膀上更好的接受每一门课程。虽然客观来说,这个仓库可能会导致一些课程卷度的提升,但正如介绍所说,它的意义“由你而定”,能从中学到些学长学姐们的经验,我感觉才是最大的意义。

说来惭愧,之前我还应了jggg“寻找接盘侠”的邀请,但是之前我对Github的使用实在是了解甚少(现在也没有太多hhh),又羞于请教,结果自然是不了了之。到了大四空闲的时候,我想我还是会尽力把自己所有的一点点经验放上去吧。

既然jggg已经构建了一个如此好的平台,那我的书里是否还需要兼顾分享经验呢?其实确实是不需要了,本身我写作的出发点更是记录我的大学生活,如果真能在客观上起到一点分享经验的作用,我自然是深感荣幸了。

以上讨论其实也是我内心的辩论,最终让我确定了我的写作更重要的目的是记录自己的大学生活,而不是为了写什么“《生存/自救指南》”。

为什么是书的形式

但是如果仅仅是记录我的大学生活,为什么非要是书的形式呢?写博客不行吗?

对此我的想法是,如果是从大一开始记录博客,现在能够积攒成册,自是妙极。可惜的是,我大三才开始写博客,而且非常疏于更新,现在的写作,更像是站在跑道3/4处做的总结,同时兼顾对未来1/4的憧憬。如果写成一篇博文,未免有些太长了;写成多篇博文,分开管理又有点不合我的想法。在我困扰之时,我突然想到之前查阅资料时经常看到的电子书形式的文档,我个人是非常喜欢这种形式的,简洁又具有整体感,具有非常不错的沉浸式屏幕阅读体验。于是,抱着试一试的想法,我决定采用写书的形式来做记录,这不一定是最合适的记录方式,但我觉得能在记录的同时兼顾练习一点点编写线上文档的能力,还是比较有意义的。

技术选择

  1. 使用博客主题

    首先常见的博客框架基本都有电子书的主题,使用方式类似于写博客,方便有相关经验的选手快速上手。但我想搞点新东西,故暂不考虑。

  2. GitBook

    GitBook是借助Git工具管理的静态文档生成工具,基于Node.js,拥有各种主题和插件;支持使用Markdown或富文本编写,文档效果简洁大方,能够支持导出PDF、epub等常见格式;而且从官网来看,许多常见应用使用GitBook编写文档。总体来说,GitBook简直是完美的覆盖了我的需求!

    可惜是的,GitBook的团队近年来一直向着商业化的方向发展,积极发展线上Web模式,而原本开源的本地模式则已经停止维护4年之久。我尝试了一下Web模式,感觉国内访问真的不够稳定,不算很适合使用。

    我也尝试了一下本地模式,发现本地模式光安装都会因为不兼容新版本的Node会报2个错误,查阅资料解决方案有两种:一是降低Node的版本到10.X(开玩笑我会为了运行这个自降版本?),也可以安装多个Node(有点懒得折腾,但是其实不算很复杂);二是修改一点源码解决问题。我自然是选择了方案二。安装起来之后,我发现GitBook果然各方面设计都很合我意,无论是文章组织形式还是生成效果。

    当我想要实现特定功能寻找插件、以及想要美化界面寻找主题时,我发现GitBook的社区仿佛尘封了4年——很多插件和主题的更新时间整齐划一的指向四年前或更久的某个时间——就好像一场突如其来的火山爆发将这一切直接埋入地下。

    我尝试了一下,基本功能和简单美化还是正常可用的,效果也确实相当不错。但是一想到GitBook的生态静止在了4年前的时间点,未来恐怕也是再也不会更新了,我感觉没必要选择它了,毕竟未来如果有什么新的需求或由于Node等更新带来的新的问题都难以解决。

    不得不说,GitBook的效果还是相当不错的,看得出4年前的生态也相当好,以至于尽管难以维护,我在放弃他时还是有所纠结。我这里有一点小问题:为什么开发者要停止这么好的开源项目呢?为什么这4年来没有出现完全超越GitBook的同类产品呢(或许有但是我没有了解到)?为什么没有其他开源组织接手这个项目继续开发呢?希望懂的人能给我指点一二。

  3. mdBook

    mdBook是使用Rust语言编写的静态文档生成工具,Rust的官方教程也是用它编写的,成书效果还是相当不错的,兼容GitBook的各种格式,鉴于Rust的特点速度非常快,是替代GitBook的一级首选。

    Rust是一门比较新的高级程序设计语言,我有幸了解过他的基本语法,并被他的设计哲学深深折服。我的感觉是,Rust通过对程序员添加了一定的限制,达到了可以通过静态分析在编译阶段找到尽可能多的bug的效果;Rust没有垃圾回收器,而是使用所有权、生命周期等概念保证不会出现访问无效内存、重复释放、悬挂引用等问题,同时保证了极高的运行效率(看网上的测试和C不相上下,在很多场景下甚至比C快,但我自己其实没有测试过);Rust编写出来的是二进制文件,与C类似,不需要额外的运行环境,非常方便。但我此前一直感觉Rust还不够成熟,一个很大的原因是我暂时没有接触过使用Rust编写的主流应用(很可能是我无知了,也很可能Rust还是太年轻了),这让我对Rust有一点不自信。而mdBook则让我有些欣喜,如果mdBook能够替代GitBook,至少可以让更多人接触与了解这门很不错的编程语言,从而推动Rust进一步发展。

    扯远了。按照网络说法,mdBook在个别细节上还是不如GitBook,但是对我来说这些细节场景很少用到且无伤大雅;我也相信mdBook的上限一定比早已停止维护的GitBook要高得多😁。

  4. Sphinx

    Sphinx是使用Python语言编写的静态文档生成器,Python的官方文档就是使用的此工具;另外比较出名的《跟我一起写Makefile》就有很不错的基于Sphinx版本;学习编译原理时我参考的《自己动手写编译器》也是使用Sphinx结合Read the Docs主题生成的。以上几本书的效果如下:

    Python官方文档
    《跟我一起写Makefile》
    《自己动手写编译器》

    总体来说还是不错的,可以一试。

  5. MkDocs

    也是基于Python的静态文档生成器,也可以使用Read the Docs主题,感觉效果很不错。

    之前看到的LearnOpenGL CN便是用了Mkdocs结合Yeti主题;MkDocs的官方文档自然也是使用了MkDocs生成;MkDocs中文文档则是使用了MkDocs+Read the Docs主题。以下是效果展示:

    LearnOpenGL CN
    MkDocs官方文档
    MkDocs中文文档

    感觉效果也挺好的。

  6. VuePress

    之前建博客的时候就有所了解,这里又看了一下。其实VuePress用来写书效果还是很不错的,Vue官方文档以及Vue系列的文档都是用它生成的;另外最近我在学习的南京大学软件分析课程网站的文档也是用了VuePress生成。以下是相关展示效果:

    VuePress文档
    南京大学软件分析课程网站的文档

    我非常看好VuePress这个静态网页生成器,他也不仅仅可以用来写书,前景很好。

  7. 其他方式

    这里要说的是我不太了解实现方式的几个在线电子书。

    首先是Phodal Huang大神写作的《GitHub 漫游指南》及其他书籍,我感觉比较像VuePress,但我实在不确定他是用什么生成的(原谅我太菜了没找出来ww),但是看他的项目文件确实是写了一个很大的Markdown文件。

    《GitHub 漫游指南》

    然后是Element Plus官方文档的实现,感觉效果还挺好的,但是我感觉似乎没有用什么静态网页生成器而是自己用Element Plus的各种组件搭建的?我不是很确定……

    Element Plus官方文档

    以上几个所用的技术如有看官知道,真诚希望能在评论区不吝赐教,谢谢~

    没想到写个书有这么多方法,而且肯定还有很多其他我不知道的方案,鉴于我第一次接触了解不多,在此谨记录我接触过的一些方法。

我的选择

在此我暂时选择使用mdBook进行写作,感觉在以上众多方案中,mkBook是我相对来说最喜欢且非常看好的项目。

接下来就是漫长的写作了。受限于时间我大概要写很久,争取这个暑假空闲时间慢慢完成吧。我计划先记录一下过去三年中一些有意思的值得记录的事情,并记录一下自己的得失与反思;接下来我想记录一下以我现在的角度来看大学三年都应该做些什么,才能够达到我理想中“完美的自己”;然后我想根据前两部分的写作憧憬一下未来我应该做些什么,以及如何补偿三年来自己失败的部分,希望能给我的最后一年本科生涯提供一点指导;至于说大四的生活,我希望能够在博客中逐步记录,最后总结起来添加到这本书中。

想好了,那就做起来吧~


更新2022-07-19


xs,没想到这么快我就打算放弃mdBook了。起因是mdBook有2个我暂时不太能忍受的问题:

  1. 不支持使用$$插入数学公式,这让我很不爽,写法不方便且不方便预览效果,这对于数学公式尤为致命。
  2. 不支持搜索中文,无疑是一个很大的扣分项
  3. 其实主要问题就以上两个。第三个问题是每页上方都要显示很大的提示文字,不太美观。

好吧,我承认之前选择mdBook有很大程度上是因为他是Rust实现的,但是现在看来还有诸多不完善之处。尽管如此,我对这个项目仍保持乐观态度并抱有很大的期待。

关于替代品,我暂时打算在Sphinx和MkDocs中选择。总体来说,Sphinx的现有文档更多一点(我接触到的),美观程度上都差不多,以上所说的问题也都有所解决。看网络上的说法,Sphinx似乎要更强大一点,但是实际上在我的应用场景里二者都是足够的。我暂时没有做出决定,因为短时间内我似乎也没有时间去忙写书的事(苦笑)。日后我想根据两个项目的发展前景进行选择吧。