如何编写一本教科书

如何编写一本教科书

原文来自Tim Wheeler,作者Tim Wheeler

原文链接:https://www.google.com/search?q=http%EF%BC%9A%2F%2Ftim.hibal.org%2Fblog%2Fhow-we-wrote-a-textbook%2F%3Futm_source%3Dwanqu.co%26utm_campaign%3DWanqu%2BDaily%26utm_medium%3Dwebsite&oq=http%EF%BC%9A%2F%2Ftim.hibal.org%2Fblog%2Fhow-we-wrote-a-textbook%2F%3Futm_source%3Dwanqu.co%26utm_campaign%3DWanqu%2BDaily%26utm_medium%3Dwebsite&aqs=chrome..69i57.624j0j7&sourceid=chrome&ie=UTF-8

写教科书有什么条件?这是个好问题,一下子就把我问懵了,经过几个小时的思考和总结,这篇博文就是我的答案。​

我希望此文对您有所助益,不论是理解教科书出版所涉及的工作,还是列举可能对出书有帮助的工具。

我们做了什么

《优化算法》是一本标准的大学教科书,内容基于科陈德福(Kochenderfer)在斯坦福大学教授工程设计优化课程的材料,由科陈德福教授和我合著。

这本书重点介绍了如何优化现实中的算法。市面上有许多关于特定学科的书籍(如结构优化),或特定的技术(如凸优化)。本书21章则涵盖了优化理论研究、以及数学和算法的基本优化。

《优化算法》与大火的《数字食谱》(Numerical Recipes)类似,后者着眼于计算机科学中广泛的算法问题。与《数字食谱》一样,我们提供实打实的代码,不拘泥于学科或领域。

《优化算法》包含了堆排序的所有算法,而且易于理解。这些都是真正可以运行的代码,也是最生动的图例。

如何编写一本教科书

说到插图,本书使用大量图像和注释解释概念。这些插图是理解的基础,让这本书更有可读性。

如何编写一本教科书

图注:以小倍数显示Nelder Mead算法,由直接在LaTeX文件中编写的Julia代码生成,在编译期间通过pythontex包执行。

我们充分利用边距,通过加边注详细阐述概念却不至于阅读碎片化。受数据可视化之父爱德华·塔夫特的启发,图表和引用置于页边空白处。

一切都基于LaTex,由Bitbucket源代码控制,全部是文本资源。

所有的图形要么是在LaTeX文档中直接使用TikZ处理,或者来自于编译时从Julia代码块生成的TikZ代码。

如何编写一本教科书

《优化算法》在形式和功能上都是独一无二的。主要卖点有:

1.易于理解的所有Julia语言算法。

2.丰富的插图和附注,概念清晰,易于阅读。

3.章节的多学科设计优化,不同于传统的学术模式,大大简化了理解过程。

4.包括关于代理模型和代理优化方法的章节。

5.对于数值优化的全面概述,大学本科生一样能够理解。

6.包括关于离散和表达式优化的额外章节。

时间轴

科陈德福教授和我从2016年秋天开始筹备《优化算法》。当时我是他的博三学生。

如何编写一本教科书

从准备到出版只花了两年多时间!光编辑工作可就花了不少时间。

科陈德福教授AA222,当时被称为多学科设计优化。科陈德福教授将课程的重点从多学科设计优化转到更全面的工程设计优化。

这门课很棒,收获好评无数。教授已经教了两届学生,问题是没有相关的教科书,也没有一本教科书能涵盖这么多的优化技术。

科陈德福教授曾经写过《不确定性下的决策》一书(Decision Making under Uncertainty),所以他经验丰富,但是时间紧迫。只有课程笔记,没时间把它们编写成书。这时候另一位主人公蒂姆·惠勒登场了。

作为一名博士生,我有大把的空闲时间。了解教授课程表的人可能会脱口而出:那肯定的,博士生的空闲时间比教授本人多得多。

此外,教授还获得了编写教科书的资金,无疑是另一大助力。

一次偶然的机会使得我加入了这个计划:我作为交换生在德国度过了2016年的秋季。这意味着我与朋友、家人失去了联系,所以我晚上经常无所事事。

我在飞往德国的航班上认真地筹划了这本教科书的各项事宜,抵达德国后也一门心思在写这本书,不久就完成了计划材料的80%左右。

我在晚上写书,计划每周编写一个章节。然后教授进行全面的审核和编辑,相辅相成,效果非常好。简而言之,我处理了大量的内容,而他负责敲定每个方面的细节。

有几个步骤我没有料到,或者至少没有考虑到。出版说明书是向出版商推荐这本书的材料,列出了书的内容、目标读者、与其他课本的不同之处、类似的课本以及它们为什么不能满足特定读者或功能等等。

幸运的是,教授以前写过出版说明书。我们很早就未雨绸缪,还附上润色后的第一章供出版商审阅。

出版商拿到说明书和样章后,一般会把它们寄给该领域的其他教授和专家审核,由他们推荐这本书出版与否。我了解到,大多数教授很看重教科书,因为这是在课堂上使用的材料,教授需要教科书来给学生上课。

我们遇到了一个有趣的问题,从优化学专家的角度来说,我们的教科书并没有涵盖任何新奇的研究,但优化专家不是我们的目标读者。

我们写这本书是为了总结在各种不同学术领域出现的大量现有工作,而不是展示新的研究结果,后者通常出现在期刊文章和会议。有些书评人的反应不温不火,主要是因为这本书没有像以前的教科书那样深入探讨某个特定的子领域。

值得庆幸的是,大家都认为书中所涉及的主题足够广泛。麻省理工学院出版社以前曾与科陈德福教授合作过,知道他的上一本书获得了巨大的成功,并且认为这本书也会如此,即便它的目标读者中没有优化专业的博士生。

这本教科书已经在AA222课程中使用半年了。学生提出的反馈让我们获益良多。听到所有对本书的赞美也很鼓舞人心。并不是所有的教科书作者都能接触到这样的被动读者群体,我认为我们非常幸运。

教科书的编辑工作比我预期的要长得多。与我们合作过的编辑审核地非常全面,认真发现书中每一个问题。

他们费心注意同义词的差别;提醒在提到数量时应使用1,而提到代词时应使用一。我也终于弄清了从句介词间的不同、逗号和顿号的区别。每个图表、示例和算法都必须标明来源。非常感谢审稿人。

最后版本有500多页。每一页都代表了数小时的努力。我们一一推敲了每个句子,为格式和排版苦恼,不断作着修改,精益求精。

前后大约花了两年半。出版教科书要花很长时间。为了让大家有概念,塞巴斯蒂安·特伦告诉我《概率机器人技术》花了七年才问世。

科陈德福教授和我在职业操守、劳动分工、时间分配和毅力方面都幸运地不谋而合。

工具箱

写书要用什么工具?我其实已经剧透了一些。

1.LaTeX

首先,这本书是用LaTeX编写的,LaTeX是一种排版语言,也是数学排版的首选工具。全部都是用文本编写的。例如表达式:X2被写成$x^2$。LaTeX文档可以编译为PDF版本。

LaTeX的贡献不止于此。图表是自动编号的,可以自动链向相关文本。布局也是自动确定的。我们提供了最终的PDF给麻省理工学院出版社,他们可以直接进行编辑。在我看来,这种情况很少见。

我们还使用了lualatex。最主要的原因是它为我们提供了一些更好的字体和字体工具。我们使用了fontspec包和最新版本的texlive。

2. 塔夫特风格

我们的书采用的是塔夫特风格,有很宽的边距,可以放置评论和图片。内联注释会干扰阅读。边距注释则允许我们提供额外的信息,同时最小化干扰。我们也可以添加更前沿的信息,而不是用过多的内容淹没读者。

书中的每一段引文都放在页边空白处,这样你就可以找到准确的段落,而不需要翻来翻去。每张图片都有一个标题,每张图片都有编号。

除了明确的风格,我们还遵循了塔夫特哲学。整本书都在使用小倍数方法展示算法是如何发展的。这涉及到具有相同比例的多个图表,可以突出显示它们之间的区别。

整本书中使用统一的配色方案。事实上,我们试着在整本书的每个方面都尽可能地保持一致——计数、排版、措辞等等。

3.Pythontex

我们使用Juliaplot.sty整合Julia代码、绘图API(应用程序接口)和工具集。

它非常容易使用和安装,内部则使用pythontex。

Pythontex包允许在LaTeX中显示、执行代码。它最初是为python编写的,但现在支持相当多的语言。我们使用它编排所有Julia代码块,和生成书中的许多图表。

书中所有的图表均以文本表达——用TikZ,或是通过pythontex生成TikZ的Julia代码。

Julia代码块是包含我们代码的Juliaverbatim环境。编译时,这些块属于类型集,语法高亮显示。我们使用pygments包创建了自己的lexer和语法高亮显示主题。

4.自定义环境

科陈德福教授是LaTeX奇才。他创造了好几个我们在教科书中使用的环境:算法在算法的环境,例子在例子的环境中。

两者是浅灰色背景,并支持章节的自动数字标记。例如,第五章中的第二个算法环境被自动标记为Alg 5.2。

我相信这两种环境在本质上是相同的——我们只是以不同的方式计数算法和例子。

我们还有问题和答案环境,能够更好地控制将问题和答案放置在页面的哪个位置。写章节的时候,最好能把问题和答案一个接一个地放在章节的末尾。

在该书的最终版本中,所有的答案都被移到最后的答案部分。同样,问题编号也是由LaTeX自动生成的。

5.Bitbucket

我们使用git进行源代码控制,并使用Bitbucket托管。所有内容都在文本文件中完成,因此我们可以轻松地从资源库中提交处理、推进、抽取等操作。

由于项目只有两个人参与,我们几乎可以直接在主分支工作。在某些情况下,我还扩展了原版本,比如我使用了Julia 1.0而不是Julia 0.6。

有一个服务器使用git hooks听取提交处理。每当我们将更改推进给主分支时,服务器都会更新它的git repo,并将整本书以及每个单独的章节编译成PDF。我们有自己密码保护的网站,上面有这些PDF文件的URL,我们会将其发布给以后的评论者。

因此,他们总是可以看到这本书的最新版本。我们使用vc包和bash脚本在PDF的每个页面上自动生成一个包含版本号的页脚,这样看的是哪个版本一目了然。

我们使用Bitbucket追踪问题。在本书的早期版本中,我们在文本中留下了注释和待办事项。一旦我们开始向学生发布章节,我们就觉得这样不太合适。

因此,我们对每一件必须记住去做的小事(或大事)进行归档。问题得到了适当的解决,随着时间的推移,我们设法削减了问题列表。我们曾经有560个问题和2,555个提交处理。

代码测试是使用集成框架Travis-CI完成的,在每次提交处理时都会触发这一测试。Travis运行我们编写的测试脚本测试算法环境中的代码。我们使用coveralls追踪代码覆盖率,增强了彻底测试所有内容的信心。

6.Zendesk

我们使用Zendesk追踪外部问题。任何提交反馈的人都可以发邮件到[email protected]。Zendesk接收电子邮件,并将其放入内部处理系统。我们很容易地互相分配消息、回复作者、完善问题,并在每条消息链中隐藏讨论。

基于我们的邮件交流,我们有187名审稿人,而且还不是AA222的学生。

心理因素

也许编写一本教科书最有挑战性的方面是心理。编写教科书的人需要长期参与其中。每句话都要被反复改写,从不同的角度考虑,有些语句可能会被学生或评论者错误理解,而且需要与文章的其他部分保持一致。

调整需要考虑周全,因为内容错综复杂,牵一发而动全身。可写的新章节或部分的列表越来越长,值得探索的新问题、解决方案以及材料也越来越多。

最重要的是,所有的介绍和要求写起来都不那么有趣,但是必须有人来写。通常情况下,一旦开始做这件事,就渐入佳境了,而且在很多情况下还会启发灵感。

但是,决定开始写还是需要很大的勇气。

还有一个问题是批评。没有人喜欢被批评。一本500页的书,有很多机会让人指出愚蠢的错误、有点蠢的错误、不清楚的部分、以及应该补充的部分。

别误会,我们得到的批评几乎都是建设性的。编写教科书的早期阶段,收到批评总是很打击我的自尊,学会更好地处理批评则帮助我成长为一个更好的人。

最后,合写一本教科书需要与别人长期一起进行高强度的工作。我很难想象比科陈德福教授更好的合作者了。

他永不熄灭的热情完成了这本书,他拥有似乎无穷无尽的能力,注重细节的努力,对任何事切中要点的评价,使这本书得以成功。我们从来没有偷工减料。任何概念都是按顺序解释的。

我需要强调的是,如果你考虑与人合著一本书,必须找到一个你真正喜欢的人。因为你们将在很长一段时间内共同打造你们美丽的成品。

结论

我对《优化算法》今天的成就感到非常高兴。这是一项令我无比自豪的成就。我希望它能为人所用,这是我们所有努力的最终目的。


“久谦咨询”即将移步新账号“栈外”!欢迎各位读者阅读及关注。

https://www.toutiao.com/c/user/2950743902919048/#mid=1653230945559565

如何编写一本教科书


分享到:


相關文章: