在經過了漫長的創作、審校過程之後,《JavaScript 全棧開發》終於迎來了在各大平臺上正式出版的日子,以下是這本書的基本資訊:
-
出品方:
非同步社群:https://www.epubit.com/bookDetails?id=UB77a9c6bfcfd2f
卷積傳媒:https://zhuanlan.zhihu.com/p/377544177 -
購買連結:
京東網:https://item.jd.com/10032000128331.html
噹噹網:http://product.dangdang.com/639340832.html
這本書作為我人生第一部成為了印刷品的原創作品,於我個人來說,自然是意義非凡,畢竟著書立言一直以來都是許多讀書人畢生追求的理想之一。而作為一個自認為非常老派的讀書人,在理想達成之日當然也免不了要俗套地撰文一篇,以表紀念。
此時此刻,不禁想起了早年間的求學之路。作為一個無生活自理能力的小腦癱瘓患者,我的本科專業基本是靠遠端教育的形式完成的。在這一路上,我深受一大批中文優秀計算機專著作譯者的恩惠。例如。我永遠都記得閱讀 K&R 的《C程式設計語言》時那種醒醐灌頂的感覺,讀 Scott Meyers 的 Effective 系列時得到培育的專業素養。我也永遠要感激侯捷老師那些譯筆生輝的作品,除此之外,吳軍博士的《浪潮之巔》、《矽谷之謎》等系列著作也幫助我開啟了視野,找到了自己的人生定位。當然,受人恩惠,當求回報,我在日常寫程式碼以求餬口之餘,也一直希望自己有朝一日能追隨這些前輩的垂範,著書育人,踐行科學之信仰,弘揚實幹之風氣,如真能為當下技術土壤的培育盡到絲毫責任,此生可不虛此行了。
具體到《JavaScript 全棧開發》,整個創作過程最初的起心動念來自於某年某月某日在 Facebook 上看到的一張名為“如何成為全棧工程師”的圖,圖中堆疊著一摞足足半人多高的書籍,其中除了最基本的、與 HTML、CSS 相關的書籍之外,還有介紹瀏覽器端程式設計的 JavaScript 語言及其框架的書若干本,在伺服器端使用的語言(例如 Java、C# 等)及其框架的書又是若干本,最後再加上關於 MySQL、SQLite3 這類資料庫的以及關於 Apache 伺服器的書,一共十幾本,頗為壯觀。總而言之,那張圖無看起來無論如何都不想像是要鼓勵初學者的樣子。問題是,這到底是想嚇唬誰呢?
誠然,時下的全棧工程師確實是一個要求不低的熱門職業。該職業要求程式設計師們必須瞭解一個網際網路應用從前端(包括瀏覽器及其他客戶端)到後端(包括 HTTP 服務、資料庫等)涉及到的所有技術棧。但“全棧”並不一定等同於“全能”。在大多數情況下,全棧工程師在職場中的優勢並不在於他一人能幹完所有的事,這在現代網際網路應用專案的開發中幾乎是不可能的,做幾倍的 996 工作量都不現實,畢竟這類專案的開發通常是一個非常複雜的系統工程,需要團隊合作。而學習過軟體工程理論讀者一定都知道,專案的規模越大,溝通成本就越高,全棧工程師真正的優勢是他的技術視野。這其中的道理很簡單,大型開發團隊的溝通成本是非常巨大的,如果隸屬於不同技術棧的程式設計師彼此不能理解對方的技術問題,各說各話,前端和後端是一定會掐架的。而如果團隊之中存在著幾位全棧工程師,這個問題就可以得到很好的解決,因為他們懂產品、懂設計、懂前端、懂後端,自然彼此都能聽得懂。而且,全面的技術視野也有助於做出更加全面客觀的技術架構和決策,從而對所在組織產生很大的正面影響。
所以,要想成為全棧工程師,最重要的任務是要擴充套件自己瞭解的技術棧,而不是去成為一個事必躬親的全能超人。至少在我個人看來,在 Node.js 執行平臺成功地將前端領域的王者 —— JavaScript 語言擴充套件到後端之後,之前圖中所羅列的那些書中至少有一半與程式語言相關的問題完全是可以用一本全面介紹 JavaScript 的書來解決的。為了驗證這一設想,我嘗試著開始了之後長達十個月的創作。從 2019 年 9 月 16 日動筆,到 2020 年 7 月 22 日完成初稿,我自己也沒想到寫這樣一本小書竟然花了近一年的時間,以及需要花費我如此之多的體力,背傷如影隨形,汗水日日如雨,實現理想之路從來不會暢行無阻,今日回首,一切依然都是值得的。畢竟在我把自己關在家裡埋頭寫作的這段時間裡,外面的世界發生瞭如此巨大而劇烈的變化,暴虐的自然,醜陋的世界讓人感慨萬千。我應該慶幸自己選擇了“讀書寫作”這條通往桃花源的小徑,“問今是何世,乃不知有漢,無論魏晉”某種程度上真是何等的幸運,不然,請抬頭看看如今世上有那麼多莫名其妙的憤怒和亢奮。在那經歷了無數分岔的小徑盡頭,我們能聽到陶淵明、博爾赫斯那輕聲細語的傳世之言。慚愧呀!在大師面前,我依然是何等的浮躁,何等的膚淺,何等的不自信。
幸運的是,由於之前參與過十本計算機英文著作的翻譯工作,也參與審閱過別人撰寫的相關作品,我對計算機專著該有的樣子並不陌生。撰寫這類作品的最重要之處在於如何在細節嚴謹性與教學引導性之間找到合適的平衡點。如果沒有教學引導性,缺乏輕重緩急的內容安排和一個循序漸進的過程,初學者就很可能會不得其門而入。而如果缺乏足夠的、可以立刻上機測試的程式碼例項細節,也很可能會讓初學者覺得興趣黯然,導致學習過程形同嚼蠟。這就需要作者有豐富的教學經驗以及帶隊經驗。有了前者,我們就能熟悉教學心理,知道先教什麼,後教什麼,之間如何承前啟後,將人一步一步引入到這麼技術的運用中來。而有了實際帶隊經驗我們就會知道新手在具體實踐中會遇到那些情況,並且能準確的預料到學生在執行什麼程式碼時會遇到什麼問題,而在這種情況下往往是一點就通,不用長篇大論,事倍功半。
同時做到以上兩個方面並不容易,我也只能盡力而為,併為此做了兩項安排:
- 儘可能用單一專案的成型過程貫穿全書,通過專案本身的開發實踐來引導讀者循序漸進地學習JavaScript 的標準語法及其在瀏覽器端、伺服器端的開發思路、設計理念。目的是鼓勵讀者在實際專案需求的驅動之下親手將書中的示例程式碼輸入到計算機中,並逐步修改它們,同時觀察程式碼的執行過程,驗證其結果是否符合預期。如果符合預期,就總結當下的經驗,如果不符合預期,則去思考應該做哪些調整來令其符合預期。如此周而復始,讓學習達到事半功倍的效果。
- 讓這本書只專注於討論如何使用 JavaScript 語言本身與其宿主環境提供的介面,不過多地涉及時下琳琅滿目的開發框架。這樣做主要是基於兩個方面的考慮:第一,介紹 JavaScript 語言及其宿主環境本身就已經足以撐起一本結構完整、內容豐滿的書了。如果再加上眾多開發框架的介紹,只會沖淡這本書的主題,並使其臃腫不堪。第二,JavaScript 社群的開發框架不僅琳琅滿目,選擇眾多,而且新陳代謝極為快速。這意味著,即使這本書介紹了客戶端的 React 框架、服務端的 Express 框架、桌面端的 Electron 框架,很有可能等到這本書寫完並最終出版之時,開發者們已經有了更好的選擇。所以授之以魚不如授之以漁,我們真正應該讓讀者掌握的是“快速學習新框架”的能力,這需要我們瞭解這些框架的設計思路,理解為什麼決定開放那些介面給使用者,為什麼對使用者隱藏那些實現,這就需要讀者自己具備開發框架的能力。
以上安排也意味著讀者在閱讀這本書之前應該要具備一些與 HTML 與 CSS 相關的基礎知識。並且最好能對基於瀏覽器/伺服器架構的應用程式的設計原理、最底層 API 的使用方式、前後端的分工原則有著刨根究底的好奇心和一定的耐心。事實上,程式設計這件事無非就是使用程式語言表達自己的意圖罷了,我們在學會基本單詞,語法之後,對著名家名作模仿學句即可,正如在學習漢語時說的“讀書破萬卷,下筆如有神”,積少成多,不斷頓悟,悟道為所用,如此堅持下去,久而久之,自然會駕輕就熟,行文如流水,自成風格了。到了那時候,我們哪還會在乎什麼招式,格式,最後都是無招勝有招了。當然,這不是不講規矩,而是我們的任何想法,寫法都很自然地落在規矩之內。
王國維說過:“出乎其外,別有高致,進乎其內,固有生氣”,讀書學習求一樂,瀟灑應對,亦可穿越於世間,求得一席之地以安身立業。我由衷地希望這本書能為讀者日後進入更為深入的開發領域創造一個良好的開端。