CoffeeScript?TypeScript?还是JavaScript?

原文地址(source):http://innoarchitech.com/coffeescript-typescript-javascript/

请注意本文只是我的偏见,我努力地理解借助CoffeeScript或TypeScript之类的编译器写JavaScript代码的理由。静态编译、强类型语言和框架,我有着这些流行的、丰富的背景。我的上一份工作就是使用TypeScript,因为我不得不使用。那是一段不快乐的时光,我将因此而离开。

我很幸运地把自己从这种困境和负担中释放出来,正在完全地使用JavaScript编写代码,我对此感到格外高兴!如果我对于这种变化的热情还不够明显,请让我向你保证,我现在更开心了。有一点很重要,我不是在暗示静态编译或强类型语言有什么错误,因为它肯定没错。它只不过不再是我的菜了。

鉴于JavaScript的动态本性以及缺乏静态类型检查,我可能编写着低质量代码,充斥着bug却不能在编译时发现,对吗?答案是毫不含糊的,不对!我从来不能这样有动力、多产、富有表现和高效。我没有编写过最少bug的高质量代码,也不能在发现bug后快速修复。或许你想知道,我是否在编写风格统一的JavaScript,它们遵循最佳实践和风格,却没有编译器?答案是,对的!我不是故意在这里鼓吹自己,而是要指出,静态编译的缺乏不一定会导致更多的bug和低质量的代码。

的确,有很多方法来确保JavaScript代码被正确地编写、遵循推荐的风格和最佳实践。更不要说编写高质量JavaScript成为了第二天性,自然地,你倾向于遵循你学到的、同样优秀的模式。你还应该总是编写合适的单元测试,这是一种最佳实践和另一种应对bug的防御,有助于确保预期的功能。我们不要忘了,合适的代码审核也是一种最佳实践,应该去用。

那么,为什么要用这些编译器,好处又是什么呢?答案是,我也不知道。是不是应该有可以编译成Ruby和Python的RubyScript和PythonScript呢?在我看来,如果你不喜欢、或者不想编写JavaScript代码,那么你可能就不应该做一名JavaScript开发人员。它是古怪的、不完美的语言?它绝对是,但是它一直在变得更好。大部分的怪癖和遗漏在ECMAScript Harmony【注1】中提出了,比如:ES.next。

我认为使用某种编译器只有一个原因,那就是,如果你是高级专家、JavaScript大拿,不喜欢原生JavaScript,只是想简单快捷地做些东西。如果你不是刚才提到的专家,那么我真地相信你只是在伤害自己而逃避原生JavaScript。你干嘛这么问?答案是,JavaScript正变得无处不在,成为庄重的、令人惊叹的语言。它已经融入了所有的web和移动环境、使用Node.js的服务器,还有数据库(比如MongoDB),甚至最近的硬件级别的处理(比如arduino)。

我读了很多博客、newsletter、书、文章、论文、文档、MDN等与JavaScript相关的东西。它们都包含了用原生JavaScript编写的代码,我很少看到作者用CoffeeScript或类似语言呈现的代码,在极少场合碰到这些代码时,我会立即停止阅读,因为我只对JavaScript、而不是它的其它版本感兴趣。

如果你曾经计划、或者有兴趣在工作中用到基于JavaScript的数据库(比如MongoDB),那么你需要知道如何编写JavaScript。你不能用CoffeeScript来查询MongoDB,也不能没有预编译就用CoffeeScript为Node.js编写基于服务器端的JavaScript,即使你有能力,也不能这样做。

在GitHub上,如潮水般涌来的、表面上有数百万种的JavaScript资源库和框架,该怎么样呢?大型的有jQuery、AngularJS、Underscore等等。我强烈推荐深入学习JavaScript,这样你不仅能够阅读和理解源代码,还可以调试它。是的,说到了调试,不管是你是在浏览器,还是使用Webstorm为Node.js调试JavaScript,都会涉及到原生JavaScript。

我最后想指出的是与其他人的协作(比如GitHub),或者找一份JavaScript工作室的工作。如果顺利的话,掌握原生JavaScript的好处应该比较明显。当你入职第一天走进严肃的JavaScript工作室、提出CoffeeScript编译器的问题,你能够想象得到这是什么情景吗?

重申,如果你是高级专家JavaScript大拿,那么编译器可能就是好的吗?尽管如此,我怀疑你会不会成为这样的大拿,如果你因为青睐某种编译器而避免学习、编写原生JavaScript的话。如果你担心静态检查和风格,可以尝试一些构建工具(比如,Grunt、Gulp、Node、NPM等)。很多插件运行非常不错。对于既定代码,使用CoffeeScript或TypeScript是为了查看编译好的JavaScript,然后模拟原生代码的输出。无论怎样,帮自己一个忙,优先掌握JavaScript。

注1:ECMAScript Harmony将会以“ECMAScript...

开源是免费的,维护也是免费的

原文(source):http://danielcompton.net/2014/11/19/dependencies

五金店

最近Zach Tellman和Factual开源了一些资源库,他们想处理根本不存在的具体需求。在Reddit的评论里,有人发牢骚,因为这个软件可能在1-2年内被抛弃,如果他们依赖这个软件,他们将陷入困境。我认为这种想法源于对开源软件的误导和自私的视角。

做为软件工程师,应对开软资源库、应用程序和框架,就像在一家五金店,这是非常有吸引力的。如果你有问题,而标准资源库无法解决,就拉取一个依赖项。需要工具集函数?在GitHub搜索一下,并增加一个依赖项。想发挥最近疯狂流行的单页应用程序?那就拉取另一个依赖项。需要用Ruby处理XML?只需瞬间安装Nokogiri你可以笑到最后

或许这可以应付一段时间,但是漏掉了软件工程中最关键的地方:软件随着时间而衰落,也叫。软件不是以独立系统的形式存在的,它与其它随着时间而变化的软件交互,包括你的操作系统、内存、其它外部服务、数据库、CPU、网络、IO设备(打印机、显示器)和最重要的因素—用户。这些系统被新的系统取代或更新。有时候变化是向后兼容的,有时候却不是。因此,代码被一次写完、而终身维护。使用某人的开源代码对你是个巨大帮助,因为你不必去写了。然而,随着时间的流逝,状况有所改变,熵就起了作用,代码需要维护和更新了。

一个资源库的供养需要一个村子的努力

除了把开源软件看做五金店,我认为更好的比喻应该是,加入一个村子去供养一个孩子。你拉取的每个依赖项需要随着时间一直维护,还有它所依赖的依赖项,如此往复。这里的问题不是关于维护是否需要去做,而是谁来做。较大的社区有更多的资源和时间来做,成熟的项目已经经过了优化、良好的测试以及具有稳定的API。如果你正忙于新生的模糊的

如何选择教学语言

如果你正在教授编程课,你该用哪种语言呢?

我喜欢这个问题,因为它有很多不错的答案,彼此存在很大差异,不同的方法对于编程的理解有着不同的思考。

我在普林斯顿大学上的第一堂正式的编程课是COS 217,由优秀老师Anne Rogers讲解(当时我觉得是可怕的)。这个课程采用C语言,这门课的聪明之处在于从机器开始。我们不只是学习C,还学到了用来编程的机器是如何运行的。我就是在这里首次接触到了指令计数器、堆栈帧、寄存器和分级存储,太让人振奋了。

C鼓励你从机器开始,而Scheme【注1】想让你从计算的数学基础开始。你不需要理解λ演算【注2】,这得益于Scheme的简洁核心,你可以在此之上构建丰富多彩的计算世界。其核心具有表现力,足以引入多种不同的语言,包括函数式语言与命令式语言、面向对象语言和逻辑程序设计。

经典课程是MIT的6.001,也就是熟知的SICP,计算机程序的构造和解释。悲剧的是,这节课在MIT网站已经下线了,但是这本书还有,即使你多年前已经完成了最后的计算机科学课程,它还是值得一读的。

MIT用基于Python的课程取代了SICP,这体现了一种较广的趋势。根据Philip Guo的一项非正式研究所强调的,很多学校现在教授Python,尤其是针对早期的入门课程。我对这个选择有着复杂的感受。Python是一门非常友好的语言,但是这种友好性也附带了一些问题。

在一定程度上我觉得是比较明显的,根据我的面试经历,应聘学生选择编码的语言就是Python。在很多场合,Python是理想的面试语言,因其简洁、可读性强的语法,在空间有限的白板上写代码,是完全可以接受的。不过我看到了,学习Python的学生经常搞不清楚这门语言的、相当粗略的语义模型。大量用Python编程的部分学生不能猜到Python的列表(list)是如何被实现的,更不要说他们有能力解释生成器或装饰器之类的、语言特性的语义了。

这里真的不是说Python不好。毕竟,存在一些伟大的工具,你可以完全不用理解其工作原理就可以把工作搞定。但是用不同的方式,Scheme和C鼓励你从底层理解发生了什么,某种教学的力量就存在于此。总之,对于早期的入门课程,特别是对于那些不打算最终成为计算机科学家或全职程序员的人来说,我认为Python是一个不错的选择。但是,对于这种情况之外使用Python,我是持保留态度的。

就个人而言, 我感到想当被鼓励的一个进展就是静态类型语言的出现,特别是ML语言【注3】做为教学语言。在过去的几年,我非常荣幸地访问了布朗大学、康奈尔大学、宾夕法尼亚大学、卡内基梅隆大学和哈佛等学校,并发表演讲,这些学校使用Ocaml和Standard...