專訪《AngularJS 2權威教程》作者Nate Murray:程式碼更像圖表,需要多維度把握(圖靈訪談)

劉敏ituring發表於2016-08-18

專訪《AngularJS 2權威教程》作者Nate Murray:程式碼更像圖表,需要多維度把握(圖靈訪談)

Nate Murray
內特是一名全棧開發人員,編碼工作從深度學習領域的影像識別到手機遊戲的開發。曾供職於IFTTT,處理MapReduce,分散式計算,iOS應用程式和一些Web應用程式中的T級大規模資料集挖掘工作。最近和Ari Lerner、Felipe Coury、Carlos Taborda合著了《AngularJS 2權威教程》一書。

>




除了程式設計開發之外,生活中玩音樂、養蜜蜂。

參與開發了一款專為“喵星人”設計的遊戲,該遊戲被《紐約時報》《洛杉磯時報》《ABC 新聞》等多家報社報導並評選入圍“前100款熱門iPad娛樂類應用軟體”。

此外,在Github上有很多的開源專案:

  • cascading-simhash
  • Smoker
  • Similarity
  • Chordjerl
  • ...

《AngularJS 2權威教程》堪稱AngularJS 2領域的里程碑式著作,涵蓋了關於AngularJS 2的幾乎所有內容。

即使沒有任何經驗,本書平實、通俗的講解,遞進、嚴密的組織,也可以讓你毫無壓力地登堂入室,迅速領悟新一代Web應用開發的精髓。如果你有相關的經驗,本書對AngularJS 2概念和技術細節的全面剖析,以及引人入勝、切中肯綮的講解,將幫助你徹底掌握這個框架,在自己職業技術修煉之路上更進一步。

訪談內容:

點選檢視英文版

圖靈目前正在翻譯《AngularJS 2權威教程》,我們有必要、也很榮幸請到合著作者之一Nate Murray,進行一期圖靈專訪。

對Nate而言,AngularJS意味著什麼,它又有什麼優勢值得作者們為AngularJS寫本專著?

Angular為編寫和組織Web應用程式提供了美妙的框架。它基於元件開發Web,運用可伸縮、容易理解的方式編寫易於維護的大型應用程式。過去我們需要藉助jQuery這樣的庫來讀取和改變DOM,但這樣的程式碼,眾所周知,相當笨拙。然而,把程式碼拆分成元件可以將系統分解,每個元件只負責檢視的某個部分,整個應用程式也就更容易推出。

《AngularJS 2權威教程》《AngularJS 權威教程》的升級版麼?

不,這是一本全新的書。Angular 2 和Angular 1 在邏輯上有一致性,但它們的框架完全不同。《Angular2 權威教程》向讀者介紹了一些新庫,同時增加了作者們近些年來在Web開發方面的新認識。

在編寫《AngularJS 2權威教程》的過程中,4位(Ari Lerner, Nate Murray, Felipe Coury, Carlos Taborda )作者是如何合作的?你具體負責哪部分?

我主要負責提綱、調查、編輯和協調整個“寫書專案”,差不多編寫了一半的內容。Felipe Coury 同樣貢獻了大量的內容,他的工作非常的出色。多人合作著書的最大挑戰應該是統一問題,幸好我們幾人的追求一致,實際操作中並沒有太大的問題。

你怎麼看待程式碼和文學的關係?

理想情況下,程式碼邏輯要足夠清楚,不需要任何輔助文件。在被機器理解之前,程式碼要為人類提前理解,但實際情況告訴我們,有些人並不適合一開始就學習程式碼庫。

解決辦法有很多,尤其是“文學化程式設計”1 領域。IPython/Jupyter 是文學化程式設計方面比較成熟的工具之一,但這些工具要求所有程式碼必須出現且以線性順序呈現。這意味著用這些工具只能完成一小部分的應用程式,無法真正掌握整個結構。程式碼不是文件,更像是一個圖表,你需要來回跳轉。

  1. 譯者注:文學化程式設計是由高德納提出的一種程式設計方法,該方法認為程式設計就是用自然語言如英語,解釋程式邏輯的過程。穿插巨集和傳統原始碼的片段,生成可編譯的原始碼。

為了解決上面的問題,我最近開發了一款cq,藉助CSS樣式選擇器提取程式碼片段到文件。在寫《AngularJS 2權威教程》的時候,我們就藉助cq有效減少了拼寫錯誤和維護難度(我們總是從磁碟上可執行的程式碼裡直接載入需要的程式碼塊)。選擇器清楚地掌握程式碼結構,即使程式碼行號發生了變化,魯棒性也不會改變。

這當然不是程式碼和文學關係的最終解釋,但對我們的理解有很大幫助。

從您的簡歷介紹上,我們得知,從2009年開始你一直從事大型資料探勘工作。相信你一定能給圖靈社群成員一些資料探勘方面的建議。某些情況下,我們需要在父作用域操作子作用域的資料,作用域間通訊的最佳實踐是什麼?是$broadcast/$emit/$on 嗎?

你說的$broadcast/$emit/$on應該是指Angular 1。《AngularJS 2權威教程》主要關於Angular 2,並不包含這些,但下面的概念同樣適用。

在經典Angular裡,$broadcast/$emit/$on絕對是作用域間資料傳遞的第一選擇,但隨著Angular的演進,我們的思考方式和工具也都發生了變化。特定情況下,我們可以根據以下三個方式來決定應用程式的資料結構:

  • 通過包含EventEmitter 的服務管理狀態;

  • 如果你更喜歡Observables,採用RxJS並讓元件訂閱這些RxJS流的變更;

  • 完全擺脫$scope,使用Redux。

Redux是近來新出現的一種有趣的資料結構模式,通過將資料儲存在中央資料結構減少資料直接突變。這樣,我們就不再需要排程action,把舊狀態和action 傳遞給返回一個新狀態的函式。我建議完全放棄$emit/$broadcast$scope,藉助Redux儲存任何一個全新Angular專案的狀態。

處理大型複雜結構的資料時,ng-repeat有時會出現卡的現象,應該如何提高它的效能呢?

有一個好的辦法是隻顯示一定的數量,然後迴圈利用DOM元素(而不是顯示整個列表,併為每一個建立DOM元素)。

假如重複可滾動容器中的一個div列表,你可以限制DOM中div的最大數量比如為100,然後等待容器元素滾動並填充div。設定這些需要大量的工作,但會得到更好的效能。

現在我們來預測下Angular的前景。Angular有沒有可能走進後端開發,成為一個類似Diango的後端開發解決方案?

就我而言,成為類似Diango或者Rails這樣的後端開發框架並不是Angular的目標。Angular本身是一個強大的前端開發框架,作用於瀏覽器的DOM,能夠向任何API發出HTTP請求填充資料。

也就是說,Angular 2 這樣的構建方式支援多個平臺,尤其是移動開發平臺。在Angular 2 框架下運用NativeScript或者Ionic建立移動客戶端相當激動人心。

在服務端,Patrick Stapleton和其他貢獻者為Angular Universal 也做出了很棒的努力。Angular Universal可以加速伺服器執行和應用程式啟動。理論上,它能為使用者帶來更好的效能體驗。

Angular技術將來會直接封裝進瀏覽器內部麼?

這很難說,但很可能不會。如果可能,也是瀏覽器讓Angular的某些功能不再必要。Web元件就是一個很好的例子。瀏覽器支援的功能越來越廣泛,最終使@component沒有必要存在。

瀏覽器還會提供變化檢測,比如Zones ,這樣我們幾乎可以看到瀏覽器實現Object.observe,Object.observe跟Angular的$watch非常類似。但它並沒有成為ECMA標準的一部分,很好。

Angular 2 相對於元件有更多的功能,比如路徑選擇、依賴注入、測試框架,等等。雖然這些框架都很好,但任何框架都不能適合每一種情況,所以我也不知道它們會不會被封裝進瀏覽器。

Angualr技術很強大卻也複雜,能不能給初學者一些學習上的建議?

學習任何一種框架的最好方式就是用這種程式設計框架構建些東西出來。所以我建議初學者到Angular官網上學習文件,跟著教程學習。Angular 1 和Angular 2 官網上都有相關的介紹教程。

接下來,我建議初學者找到能夠提供一步一步引導學習的示例程式碼源。我個人以為《AngularJS 權威教程》和《AngularJS 2權威教程》就是很好的資源,另外Egghead.io也提供了很棒的視訊課程。

——更多訪談


更多精彩,加入圖靈訪談微信!

相關文章