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也提供了很棒的视频课程。

——更多访谈


更多精彩,加入图灵访谈微信!