2014年12月10日 星期三

你不可不知的JavaScript

原文:You don't know JavaScript but you should



這是我參與Kyle Simpson會談時記錄的部分抄本,他是名來自奧斯丁的開放網路提倡者,同時也身兼作家、講師、工作指導、開源軟體的贊助者等多種身份,最重要的是,他熱衷於與Javascript相關的一切。

感謝各位這次的邀請,我是凱爾·辛普森,暱稱getify,目前活躍於TwitterGithub、及這些地方。就在上週末,我受邀於Thought@Work在羅切斯特主持了場研討會,並在討論New Media Interactive Development這個專案時,發現自己陷於JavaScript和Node的類別囹圄中,所以再次感謝各位的邀請,給我重新審視JS的機會。

我曾寫過幾本關於JavaScript的系列書You Don't Know JS,全冊都開放在GitHub 供免費閱讀。它們也有經歐萊禮正式出版,但目前市面上只有兩冊,第三冊正在進行最後的修訂,第四冊已近乎完成,而第五冊將在不久後著手編修。

  1. Scope & Closures:主要在探討閉包,它是Javascript中最重要的基本議題,每個JS的程式都涉及閉包,但是大部分的開發者都不曉得它們正在使用它,或不了解什麼機制呼叫了閉包及其運作原理。
  2.  this & Object Prototypes:將探討 this 這個奧妙的關鍵字,並且解決JS中的一個錯誤的迷思一一JS有類別。事實上,JS有的只是原型的指派,我們應當正視它,而非去嘗試不切實際的類別導向。
  3. Types & Grammar:我們將專注在變數的強制轉型,儘管多數開發者把它當成糟糕的機制,但我鼓勵各位深入鑽研它。因為強制轉型並不如你所聽到的那麼詭異,而且如果你運用得當,它能大幅改善你的編碼。
  4. Async & Performance (編寫中) :我們首先會解釋為何回呼函式不適用於非同步程式,並深入於改善非同步模式下的promise與generators,當然也囊括了優化與評估JavaScript效能的部分。
  5. ES6 & Beyond (預定編寫): 涵蓋了JS在ES6的所有改變,以及ES6後即將迎來的各種革新
如果想洞悉這系列的精神,不妨和道格拉斯·克羅克福特JavaScript: The Good Parts做個比較。這本書對我們社群有好有壞,他就像名領航人,近乎獨力地把開發者帶至(或拉回)JS,並使JS獲得了高度的重視,在這方面,我們欠他一份大恩。但是他也灌輸了開發者一些錯誤的思想,那就是「在JS中,你真正當學的只有極小的一部分」,這使得大多數的開發者,甚至是有5~10年經歷的程式設計師,所理解的仍只有JavaScript的冰山一角。

而談到我寫的這系列,若與JavaScript: The Good Parts做對比,它們所論及的是「非優良部分」,要注意,這不代表他們是壞的部分,而是涵蓋了JavaScirpt完整的面向。我認為開發者不該試圖迴避困難,我鼓勵各位挑戰它並瓦解它,當各位碰上了JS中令你困惑費解的語法,比起埋怨語言本身,更當去思索自己究竟遺漏了什麼,並進一步徹底鑽研。

我想這種思維對JS開發者顯得有些微妙,因為在他們的認知中,JS應該是一個既簡單又直覺,甚至是能夠一望而知的程式語言,如果JS達不到這些要求,那一定是語言本身出了什麼問題。其實,期望任何一種語言(如C++、Java)在規則上不言而喻,本身就是不合理的要求。所以當你碰著了不懂的程式碼,別去苛責語言設計者或寫這段程式碼的人,而是要趕緊補足自己缺失的部分。許多時候,開發者討厭JS的一些功能,只由於不理解,而在我向他們解釋運作原理後,他們漸漸從厭惡轉為接受,補充一下,接受可不一定等於喜歡,只意味他們肯正視這些功能而已。

在我看來,欲確實駕馭JS,精神與時間的投資必不可少,除了瞭解怎麼去寫,更該瞭解JS做了什麼?乃至JS為什麼要這麼做?我之所以鼓勵各位在學時就該精熟JS,是因我身為一名JS的教員,曾和一群用錯誤方式學習JS的工程師共事過,為了重新起步,他們無不投入了莫大心力,如果各位在學期間就真正理解了JS,進入產業後,除了不重蹈覆轍,更能明白JS的規範在當今網路平台何其重要。

在未來,JS將是鞏固網路平台的堅實地基,為此,我們更當熟悉它,並且掌握它。

最後,我想傳達給各位一件事‧我堅信,各位在課程上必定能學到不少好東西,但是更重要的是,要趁現在掌握學習的方法,以及享受學習的過程。在你這輩子裡,不可能只需精通一件事。科技日新月異,業界主流一代換過一代。如果沒別人出頭的話,我想現在是蘋果當道。無論你的興趣何在,唯有永不止歇的學習,才是成功的不二法門。

Q&A

Q:這五本書有特定的閱讀順序嗎?
A:Scope and Closures應該算是必修,按照出版順序閱讀是OK的。前三冊鎖定在JS的核心,雖然四五冊是建立在前三冊之上,但它們主要是探討ES6上的改變。

Q:免費的開源軟體對你的工作有多重要?
A:我工作上的一切都來自開源軟體,我堅信它的影響力,在不久的將來,開源軟體將使我的事業更上層樓。如果你對科技的發展史有些研究,會發現雖然技術總起於私有,但幾經調適後,最終都會走向開放,而且我認為,起於開放將漸漸成為一種趨勢。或許不少人會說:「我不想把我的程式碼公開,我怕別人會取笑我蹩腳的技術。」不過我先前嘗試時,別人是這麼說的:「你該更有自信些,因為你的程式寫的真好。」但你若看看那份程式碼,會發現裡頭充斥著不少糟糕的設計。You Don't Know JS的You其實是個集合名詞,就連我也不敢說我了解他。

我寫的每份專案都是起源於空白文件,我會把他們公開在GitHub,並盡全力持續更新它。這麼做並非要行銷理念或設計,我假定我寫的每行程式碼都是最糟糕的,而唯一能改進的方法就是借助他人。開源軟體超越了任何獨力開發,因為它是集眾人之力協做而成。

各位應當投身於開源文化中,我堅信開放是一切技術的起源,也是我們事業能延續10年的首要原因。

Q:像我這種怕把自己程式碼公開的人,應該從哪裏參與起?
A:這有很多答案,就我而言,加入別人的專案是個不錯的選擇。許多自由及開放原始軟體(FOSS)上的貢獻不是來自編程,而是來專案文件的編修與更新,如果你能夠在文件上添加一些註釋、細節或測試結果,乃至回傳一份錯誤訊息給開發團隊,這都是對社群的巨大貢獻。而要揪出這些小bug,已經有不少廣為人知的方法,並不需要透過編程去處理他們。其實,不少FOSS界的巨星都是從寫文件起頭的,一個專案要成功,實際上就只是比別人多做一點點,編程是很重要,但留下文件能傳承這份專案,而且你透過親身參與,也能更了解一份專案到底是怎麼運作的,所以我建議新手由此入門。

Q:那有什麼參與的管道嗎?
A:通常是選擇Github,當然,其他社群也不錯。而且我不會呼籲你去挑某個專案,因為你該選的是你「自己感興趣」的專案,比如你想做資料可視化,那就試試D3。找出你的熱情所在,這不但助於快速建立自信,同時也是個優化程式的良性循環。

Q:你曾說JS將是我們這輩子唯一會用的網路語言,先聲明一下,我並不是Dart或類似語言的支持者,但你怎麼不覺得他們會成功?
A:真是個有內涵的好問題, 不過Dart無法取代JS,並不是Dart設計的不好,而是在Google的態度。先看看Google在網站上怎麼說,他們把Dart定位成JS的死對頭,期望有朝一日能取代JS,而非僅只實驗性的影響JS發展。不過從Dart外洩的紀錄得知了一件事:「Dart無法修正JS的根本性瑕疵。」,無論是在Chrome中與JS分庭抗禮的虛擬機Dartium,或是在語言轉議器Dart2JS裡,Dart都做不到。這訊息相當耐人尋味,Google似乎不是想做的比JS更好,而是假定在開發者生來就選Dart的前提下,JS將逐步衰退。但我能肯定一件事,Mozilla絕對不會在Firefox中實做Dart,所以如果Dart真要取代JS,那得等到Firefox消失,不過我想像不出這種情形。

宏觀來看,有數以百計的語言能編譯為JS,如果你想在網頁上執行你的程式碼,可以把它轉譯為JS。 雖然我個人不怎麼喜歡那些語言,但它們確實很重要!因為源碼不是給電腦看的,而是給開發者看的,處理與演算的手段如恆河沙數,開發者要在這些手段中,找出一個最符合自己思考模式的。為此,我們還需在JS的轉譯上做更多試驗,就像CoffeeScript,他使ES6如虎添翼。我想未來CoffeeScript能做的已經很有限了,但不要緊,它已是JS革新的重要推手。至於Typescript,雖然我不怎麼喜歡類別,但Eich在報告中提到,它未來將改為近似JS的宣告方式。

先學好JS,儘管你仍將接觸其他語言,並發現在某些情形它們做的比JS好,或對你的團隊更有利。很多人就因為這樣而不學JS,但我認為不該這麼做,學會JS不僅對自己有利,也能將你喜歡的語言轉譯為JS。這促成了網路平台的美好未來。




沒有留言:

張貼留言