如何編寫一本教科書

如何編寫一本教科書

原文來自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

如何編寫一本教科書


分享到:


相關文章: