302 Found

Found

The document has moved here.


302 Found

Found

The document has moved here.

登录 | 注册

Hi,欢迎向Builder投稿、爆料

稿件可以直接投递到:builder@zdnet.com.cn,请先阅读投稿需求



302 Found

Found

The document has moved here.

当前位置: 首页 > Web开发 > JavaScript权威专家谈编程风格和思维观念

JavaScript权威专家谈编程风格和思维观念

Builder开发者在线 作者: 张德东【原创】 2013年04月25日 评论(0)
关键词: 2013 QCon JavaScript 编程
本文摘要

开发者无时无刻无不都在追求编程的完美,JavaScript权威专家Douglas Crockford认为开发者的编程风格和思维观念不仅受大脑的影响,一些大脑之外的因素比如广告与宣传的影响也会影响到开发者的编程风格。

Builder开发者在线消息 文/张琎)自从人类有了计算机以来,程序可以说是人类大脑创造的最复杂的东西。开发者无时无刻无不都在追求编程的完美,JavaScript权威专家Douglas Crockford认为开发者的编程风格和思维观念不仅受大脑的影响,一些大脑之外的因素比如广告与宣传的影响也会影响到开发者的编程风格。

编程风格和思维观念

Douglas Crockford是JavaScript权威专家,《JavaScript:The Good Parts》一书的作者,他是JavaScript开发社区最知名的权威,是JSON、JSLint、JSMin和ADSafe之父。JavaScript发明人Brendan Eich称他是Lambda编程和JavaScript精神领袖,他同时也服务于ECMA的JavaScript2.O技术委员会(TC39)。 (张琎 摄)

Douglas Crockford以JavaScript实例代码为例讲述了可以提升代码质量的编程风格,他表示这些原理也适用于所有的编程语言。

Douglas Crockford:北京上午好!今天我有两个话题,这两个话题可能是毫不相关的看起来,首先是你的大脑,大家都知道你的大脑上面有很多肉,要吃很多肉给它提供营养让你思考。第二是你的编程风格。编程风格可能就是你的编程的项目,这些编程者大家有时不太注意,你可以很自由的去做一些事情,比如说你表达你个人的风格,一个风格可能和另一个风格都是同样好的。我想今天说服你这并不是事实,这两个话题是相关的,而且比较有意思的方式进行相关的。

我想讲一下DANIEL的工作,给他经济学的奖项,有时可能每个人都可以去按他的兴趣进行工作,但有时候对于人来讲事实并不是这样,因为人们的思考方式,并不是和经济学家设想的思维方式是一样的,我们看一下经济学时,我们看到我们是怎么样做事情的。这位教授建立了两个体系,第一个就是第二个系统就是比较慢的,需要你很多的思考,需要高程度的一些思考。比如数学、逻辑、推理等等需要这方面思考。第一个系统就是自动的很快的一种无意识的反应。它是比较直觉性的,可能把一个难的解决方案可以想的简单化,自动去想出一些解决方案。

第二个系统就是你的大脑,你的大脑告诉你做什么事情,但是你的心里不去这样做。他找到了两个系统之间的关系,第一个系统给你提供基本假定基本事实,进入第二系统,第二系统有时去分析进行思考。问题是第一系统有时通常是错的,因为他是及时性自发性的,这时基于一些思考,有时产生错误的结果。

可以给大家看一下这个系统的作用,一个是视觉的程序,我们看到照相机上有一些象素,我们会分析他们头像的因素,他们如何相关度,可以说这是一个很难的问题,但有时我们能够做的事情就是说,即使我们能够预期事情的情况,比如说在未来,在下面几刻钟会发生的情况,我们并不是解决视觉处理的情况,而且我们看到你的视觉处理过程中有时会出现偏差。这是一个棋盘,我会看到不同的颜色,不同的颜色标记为A和B,这些方块会看到,它实际上颜色都是一样的,有一些人可能会看到说,不对这颜色一个是白的一个是黑色的,他们性不是同样的颜色,实际上他就是这个颜色,只是不同的色调罢了。我们看到A和B之间的不连续性,有时可能会看到有一些同样的不同的颜色,实际上这可以说就是你的大脑给你有一种错觉,可以说我们在每件事情里面,都有这样的错觉。

对于广告行业来讲,这并不是一个新的东西,有时他们可以去创造一些信息和形象,而是不会进入你的大脑,而是进入到你的心里面去,说服我们购买一些不需要的东西。烟草行业是最了解这点的,烟草行业做什么呢?他让你吸更多的烟,让你牙变黄,让你生病然后杀掉你。如何销售这么一个产品呢?你不是销售给理智,你是销售给你的第一系统,他们给你一些令你迷惑的信息,令你误解他的危险性,有时我们信息系统不善于推理,说服人们理智上不愿意做的事情。

我们要用大脑来做,计算机变成人们能够做的最复杂的事情,没有什么其他别的东西,会比计算机程序更为复杂。因为我们计算机程序是要把所有的东西组合到一起,来运行。我们很早时候已经认识到编程非常难,我们做了一些人工智能方面的分析,目的是让电脑让计算机能够运行我们所编写的程序,人工智能可以做很多好的东西,但是他们不能写任何程序。有时我们电脑可以把一个语言变成另外一个语言,我们也是很好的利用了这一点,我们有编程语言,我们可以把编程语言写成其他的,可以把他翻译成其他机器语言。编程语言可以提高我们抽象的一个水平,通过我们的编程语言,我们可以更好的利用,我们可以更好的利用编程语言来完成我们想要完成的工作。

编程为什么说非常难呢?因为编程需要完美,对于计算机编程来说,它必须在各个方面,在所有输入所有状态情况下都必须是完美的。如果不完美的话,你就会遇到很多的问题,你就会遇到最糟糕的情况,很多时候问题并不是计算机出现了问题,而是你编写的程序出了问题,因为它不够完美。因此我们在发布一项软件时,我们都必须知道,这个软件必须完美之后才会把它发布,实际上有一些特别差的软件发布出来,主要因为他们不知道这个完美的情况。有的时候我们并不知道他这个东西是否已经完美,仅仅通过一些测试,也无法测出他是否完美。

从冰河世纪的时候,我们大脑一直都是这个样子的。编程毫无疑问它是需要用大脑来做的,因为我们要做一些分析性的工作,同时要用我们的内脏我们的心,有时帮助我们做出一些决定,有时做决定时可能需要我们的心来帮助我们做出一些决定,不仅仅靠大脑做出一些决定。在编程时既需要大脑也需要你的心,很多时候可能我的大脑知道这东西并不对,但你的心告诉你是对的你可能会去做。

JavaScript是普通的编程语言,有好的方面也有坏的方面,和其他编程语言相比,它有更多好的东西,JavaScript也有很多特别差的地方,为了更好的帮助识别JavaScript的语言,我写了JSLint,我发现用JSLint可以识别JavaScript哪些是更好的部分,哪些是不好的,JSLint会伤害你的感情,经常收到电子邮件,JSLint有时不喜欢我的程序,这是非常奇怪的。我们都知道在编程时,一般来说不会有人哭,去抱怨,但JSLint确实让很多人哭了,让很多人感到不高兴了,因为JSLint要求非常严格,它总是发现你程序当中的一些问题。编程人员觉得他们总是非常理性的,他们觉得他们是计算机大拿,而计算机是非常理性的,实际上人并不是这样的。

在这里我们看一下,比如说用大的话,我们把block放左边还是右边,我们不知哪边是好的,但要保证左边右边都是一致的。昨天我在日本,在那边都是左边开车,而我是喜欢在右边开车,靠右边开车。并不是说你在路上走的时候,靠右走靠左走还是好,不管怎么说他可以保证不会出现交通事故的问题,如果我们都朝一边走的话。有些人对于放到右边还是放到左边不是特别清楚,有的时候并没有原因来说明,为什么应该放到右面,为什么放到左边。但是通过JavaScript我们有一个答案,我们永远放到右边不要放到左边,JavaScript我们可以从函数中有一个对象,这也是JavaScript能做的,如果你把它放到左边程序没有问题,可以运行的很好,但你如果把它放在左边,这个程序它会表现的特别差。

它会给你一个未确定的一个值,这样会出现一些错误。而且会出现很多的bug。对程序来说,bug是非常难的问题,放在左边以后bug会非常负责。JavaScript有一个功能,自动审查分号的功能。有些编程人员,并不清楚分号的功能,有时他会犯一些错误。在这里你可以看到,我们在这有一个分号声明,实际上并不是这样,它会误解。它又搞错了,我们得出的结论是无用的一个表达声明,也就是说如果我们把这个插入到这里边的话,还有一个分号,可能被忽略了,主要因为我们空白声明。如果放在右边你不会浪费任何时间,也不会有这样的痛苦。我们希望我们的错误越少越好。它可以让你自动的进行switch,有人说JavaScript也应该具备这样的功能,我也是深入的思考了一下。

我觉得可能会出现这样的情况,但如果不能把所有的很好的排列可能出现一些问题,错误如果要出现的话总会出现的,所以我觉得有switch statement更好一些,有人跟我讲我在JavaScript中发现一些de bug,后来发现他有一个案例出现了问题。我们经常会犯一些错误,我们很多时候你把这个错误纠正了之后,你忘了你曾经犯了这个错误,不会从错误中收取任何经验教训,我们只是在打字,我们应该更多花一些时间仔细分析一下我们曾经犯的错误,为什么出现这样的错误,以避免以后出现类似的问题。

我并不是说一个好的东西,但它出现错误时,你应该仔细的分析一下,在写这个代码的时候,你也应该关注代码的正确性,我觉得这是非常重要的一个部分。但是还有最大的一个错误从来不会发生,我们有时说从来不会发生这件事情,实际上它隐藏的意义,它可能会发生,它是会发生的,只不过发生的几率非常少。我觉得这也是非常差的一种想法,很多时候我们依赖于我们的内脏,依赖于我们的心,做出错误的判断,我们更多时候依赖大脑帮助我们做出正确的判断,好多风格关于各种程序,风格不仅是喜好自我表达,应当是尽量减少程序中出现错误,我们希望我们的程序尽量完美,我们可以达到完美的程度。

我们可以从人类语言看一下,一开始罗马人书写没有任何标点符号,他也是持续很多年的时间,后来罗马帝国的国王他们发现了问题,他们发现提交上来很多的文件,都没有任何的标点符号。但是每次在被别人腾抄的时候会出现一些变化,后来中世纪抄文件的这些人,他们推出了一些像小写字母,还有断字还有标点符号这些东西,我觉得这是非常重要的一个创新,当伯格在使用印刷这些东西时,也使用这些观点,小写字母、断字、标点符号都是非常有用的,即使在编程也是非常有用,它可以让我们更加容易阅读,可以让这个文件更容易传递出信息,好的风格可以帮助我们减少错误的发生,我们希望在编程的过程中也能够运用这一原理。

这个是关于一本书,英语写成的风格的要素,很多大师他们会把这本书中一些原理用于计算机程序编写中非常有用。程序必须明确与人进行沟通,如果这个程序仅仅是用一次的话,可能你觉得风格并没有什么用处。的但是我们应该保证,你的这个程序,就是说你编程序的这个人,在把程序写出来之后,其他人在看到你这个程序的时候,他和编写者想到的是一样的,他必须明确的传递信息。如果我没有证据来表明一种风格比另外一种风格好的话,我们就应该保持原来的风格。当然对于程序员来说,在编写程序的时候,还有其他的一些规则,比如说到底该怎么样,比如说要消除括号的一个歧异,这个时候你应该使用空格。比如说在函数名还有左括号之间,不应该有任何的空格。很多时候我们会发现有这样的情况,在函数名和左括号之间有空格,但不应该有,必须保证程序名让人容易理解才可以。

这部分我想把它跳过。还有一个with statement,with statement可以让我们表达更加容易。它可以进行任何的扩展,在读代码的时候,我们可以知道,有可能是其中任何一个代码,这个是可读性的问题。可能我们可以读出这个代码,但并不知道这个代码它具体的功能是什么,所以在JavaScript我们不太使用with statement,它会产生一些混淆,有些人比较擅长使用with statement,他们说没有问题,因为with statement非常有用,但我的观点是,我并不是说with statement没有用,我说的是with statement,它总是会造成一些混淆,我并不希望我们的程序会给人们带来任何的混淆,造成一些混淆的问题让人不清楚,我们必须避免这样的混淆,因为如果有混淆的话,就会出现bugs。对于编程来说,很多时候他并不是特别干净,因为这个时候他这样运行,而下个时候他又变成别的了,主要因为其中有错误有bug出现,因此我们总是希望我们的程序当中不会有bug。因此你要避免任何的这种混淆。

另外,就是关于Transitivity的问题,如果程序编写的类型有混淆的话也会产生很多的问题。同时它还应该不是Transitivity的话,如果是Transitivity的话也会让你的程序变得非常难,也会造成很多的混淆和错误。对于一个语言来说,语言有一个功能它可能是有问题的,如果你觉得这个功能可以被另外一个功能更为可靠的来替代的话,你就要去使用更为可靠的功能。

这里是即JavaScript当中新加的另外的功能,叫做多行字串。我觉得这也是编程语言中非常重要的一个部分,在这里我们有两个多行的字串,其中一个是对的,另外一个是有问题的,是第二个,在这里是有一个空格。每当我把这个问题指出来时,你们才会恍然大悟,我希望我们的程序是正确的是完美的,所以你要尽量避免这样的一些错误,它和一般的错误是很难区分的,这样一些错误应该尽量避免。我们看经常的情况中间的这个行是对的,不管是编程人员他写的对还是写的不对,还是说读程序的人,他都可能造成混淆,所以你一定要表达的清楚,一定要让你的程序看起来是你所想你的程序表达那个样子。

另外是Scope,Scope是编程语言中重要的发明,就是作用域。可以更好确定变量的情况,很多程序都有Scope,在块以外是看不见的,JavaScript只有功能的Scope,在function Scope以外你是看不见这个函数的,我们可以编写只有JavaScript的函数。很多人会造成一种问题,很多人比较熟悉JavaScript编程语言的,在JavaScript Scope中出现function Scope会有一些混淆。

看一下变量声明,应该在所有函数上部声明所有变量,另外应该调用函数之前要声明所有的函数。对于编程人员来说,他们可能很难理解这一点,特别是在错误的声明当中,他们只想在function Scope中声明,但是JavaScript中,你可以看到变量i它是在以外的。

在JavaScript里边并不是这么写的,如果你是在JavaScript里边写的话,你就去写论断,然后写在函数的上面。那么在JavaScript上面一个,我们可以看到最后一个情况,当我们进到这点,经常建议不要使用太多的V,当然你仍然可以使用它。JavaScript它有全球一些变化的情况,在所有语言里变异是不好的,因为它会导致安全可靠性的问题。JavaScript里边这也是不可避免的,我们仍然有全球变化的一些情况变量,我也推荐尽可能少的变量去使用,因为危险就在于,有时不要让危险情况加以扩大化。

我们有些新的前缀,它有一些constructor函数,有时输入新的前缀,有时带来新的变量,如何避免这些情况,我们有一个常规,我们用一些InitialCaps,我们目前所有的方法就是尽量避免这种变量的产生。

还有令人一个迷惑不解的不清楚的,它也产生了一些新的变量,可以说这并不是我们想要的。你要去避免这些令人迷惑的地方,要去清楚的表达你的想法。这是另外一个情况,可以说他本来要表达第二个函数的意思,但他实际上是表达第三个函数的意思,所以我们看第一个函数里面,如果a是真实的,那么我来建议这点,每次你写那些的时候,你要去用一个括号,让你和大家都能够更容易的去更好的去修正你的编程。

我们的程序正在变得越来越敏捷,我们的编码可以说也变得越来越强大。可以说在这些语言里面,在一开始的时候我们要去有一些这种符号,有时大家认为它是一个不好的东西。会有一些安全方面的危险,因为它会导致一种编程的风格,会把很多内容写入到同一行里面去,这会导致一些安全错误方面的问题,我们避免一些错误。在我的实验里,我不再使用它,我不再相信自己,有时我用它会写出糟糕的程序,实际上有时我用的是这个符号。

这是非常好的,有人说等一下我也可以++,是不是同样一个意思?不是的。两个加号和x是一个意思。有人写++x的情况,你们是否知道他们之间的这些区别,这些领域可能比较微妙。有时可以说如何在一个声明里面去防止这些不好的事情发生,++x,有时会出现错误,有时用另一个符号来进行打补丁。一的话有时可以转化为二的形式,这就带来一个问题,为什么我们需要不同的句式的组成,可以用来添加一些价值,有时这样做是没有意义的。对于这些程序人员来讲,有时这样做,它是具有一定意义的。可以说有很多的变量或者错误应该是尽量去避免的。

还有一些人他们会编程风格不是特别好,他们没受过足够多的教育,可能在编程方面没有得到足够的训练,或者说他们受到一些不好的影响。可能过去的一些人,他是使用一种语言,现在他想去使用另外一种语言,但他又不想做更多的学习,有时我们看到不好的编程,他有时做了一些不好的编程但他还去炫耀,有些人更好的去通过案例进行学习,去写更多的程序,有些程序会是非常好,但有些程序可以说让人无法理解比较糟糕,有些时候他说我这个是正确的,可能你程序是正确的,但比较让人迷惑,有些人说我是有意这样的,我知道我在做什么,如果你知道怎么做的话,你实际上就没有做好。

还有一个就是我们的效能的问题,有些程序可能让你程序变得更快,有时程序比较易懂,那就会更加让人们便于利用。我们有一些通用的这些程序,它会采用一些通用的规则,可能产生错误的几率比较小。可以说编程是人所经常做的事情,编程有时会有一些完美的,但是人会犯错误。我是一个会犯错误的人,我也需要完美无瑕的程序管理我的这些不足之处。所以设计一个编程的风格,实际上需要一些纪律性的东西,有些特点可能你不能够说,你熟悉你就去选用它,而是应该选择一些工具避免犯错误,减少你的错误,这样你会成为一个更加有效率的编程者。

否则的话你会花很多的时间在Abyss方面,有时我们还要Debug,我们花了很多时间在这方面是不舒服是痛苦的。有时我们字完之后会忘掉他,我们会想到,我们每天都在程序,但我们没有意识到,可以说我们忘掉这些错误,有些未完成的程序,会让我们花费一年的时间,但有时一天两天内就可以做完,这就带来问题,就是你99%的时间应该怎么去做,所以要选择合适的编程风格减少输入减少嵌入,要让你的风格防止Abyss,你在Abyss方面花的时间越少你的效率就越高。

JSLint风格可以自动发现程序缺陷,当我开发程序我发现,有些形式是比较难于识别,它是正确还是错误的加以使用了。有时我不需要使用某些表格,这些模糊不清的表格,有时会给我带来一些问题。这仍然是关于你的一些具体的实践,你要在你的实践里面避免一些不好的容易导致错误的东西。

还有一个是Language Subsetting,不是使用语言的特点,只使用可靠的特性。因为比整个语言更有好处。可能只有一个疯狂的人,才会使用所有的C++。语言有实验性的东西,我们会加入新的特性,这是我们如何取得进步。但有时会犯错误,如果这个语言变得很流行,他们不再自我更新了,因为那些糟糕的东西已经会没有用了,但是有些错误可能很危险,你应该去把它去掉,你要去选择应该适用的那些特点,而不是使用所有语言里的特性。

当还仍然会有bugs,那么你的程序你认为可能会是没有什么bug,但是没有什么完美的程序,因为这个具有一定的bugs,有时会对你的程序的话,可以说会带来一定的更加具有灵活性。

  • 转发 腾讯微博 推荐到豆瓣豆瓣 人人网 网易
  • 本文关键词: 2013 QCon JavaScript 编程
  • 邮件订阅

订阅builder.com.cn技术邮件

《应用开发管理周刊》

邮箱地址:
  • 热门评论
  • 推荐