个人简介 周爱民(Aimingoo),国内软件开发界资深软件工程师,技术作家。有十余年的软件开发、项目管理、团队建设的经验,现任支付宝公司架构师。著有《Delphi源代码分析》、《大道至简》和《JavaScript语言精髓与编程实践》等。
QCon全球企业开发大会(QCon Enterprise Software Development Conference)是由C4Media媒体集团InfoQ网站主办的全球顶级技术盛会,每年在伦敦、旧金山、东京、北京召开。自2007年3月份在伦敦召开首次举办以来,已经有包括金融、电信、互联网、航空航天等领域的近万名架构师、项目经理、团队领导者和高级开发人员参加过QCon大会。
1. 今天我们很荣幸的请到了周爱民老师,那么周爱民老师相信大家都非常熟悉了。那么今天他想,我们希望就是周老师能分享一些关于JS方面的话题?
谢谢。
2. 那么JS呢,就是一度被认为是快消亡的一种语言。但是实际上证明呢,现在情况来看,它其实成了Web开发的头等语言,这是什么原因导致的,您觉得?
JS这个语言在早期的纷争是很大的,因为最早它出现的时候,是正好是Java很热火的时候,那个时候Java是完全面向对象的,只有对象语言,而JavaScript自身的面向对象特性是不充分的,它最早被称为基于对象的语言,所以它有些对象特性在它的早期实现版本里根本就不存在,或者是不足够。那这种情况下呢,很多人就会预言说JavaScript不会得到很大面积的推广,因为它语言特性相对于当时语言背景环境很弱。
那事实上呢,在JavaScript所需要的开发环境里面,比如说浏览器环境里面,就不需要这么强的语言特性,过强的语言特性的掌握难度就太大了,那事实上就变成了它的语言的特性的弱势刚刚好,这是第一种情况,在当时的浏览器所需要的开发背景下,它是刚刚好,这是第一种这个背景。第二种情况是因为没得选,当时的浏览器是只有以英文NetScape为主的,然后像IE呢也选择了在JScript这条道路上跟随JavaScript,而自己开发了VBScript,如果你想要在浏览器中通用,那你就只能选JavaScript,你没有别的选择,所以呢就使得它一家独大,大家都只能这么用。然后也刚刚和前端开发人员所需要使用的背景,这是到了大概03年、04年这样的一个阶段之前的一个局面,就大家必然的一个局面。在此之后呢,由于Ajax的兴趣,所以这个JavaScript就被大量的发扬起来了。大概是这么个情况。
3. 那么JavaScript呢,就是它客户端开发已经相当普遍了。但现在呢,它一些服务端的开发,比方RingoJS、NodeJS这些东西也都开始发展起来了,您觉得您怎么看待这种状况?
这个是一种,其实可以说是必然的事情,而且事实上来讲,JavaScript最早是一门服务器端开发语言,最早最早在Netscape设计2.0这个版本的时候,提出JavaScript这个语言的时候,最早它是叫LiveScript,而且最早是可以作为服务器端语言使用的,当时它的技术是类似于当时的ASP,以及后面的JSP的这种设计思想,也就是服务器端包含脚本,然后生成服务器端的页面这种语言体系。只是后来,NetScape的服务器,就是Web服务器不流行,几乎没有人用,所以在服务器端上的这个用JavaScript来做页面开发的,几乎就没有办法推行起来,这使得这个前端的开发成为我们能够看到JavaScript的主要的地方。
但在这个历史的发展过程中,Mozilla一直在维护着一个服务器端版本的LiveScript,然后可以使得它在服务器的开发端使用。在后来的Mozilla这个代码仓库里面也一直有一部分是服务器端的脚本,JavaScript的脚本和JavaScript的脚本引擎,以及上面的开发包,包括文件IO等等都有。这些语言都在它的维护的范围内,不过也是很长时间没做。
然后再到后来,大概也是到了07年,或者08年这样的一个阶段之后,服务器端的开发语言被大大的热火炒起来了之后,就大家都想用不同的语言来开发服务器端,因为类似于Python、Ruby这样的语言也在服务器端大放异彩,然后像Iron语言大家也推得很热火,于是大家在寻求不同的语言下面的服务器端的解决方案,这个时候JavaScript又再次被提起来。然后呢,于是我们就会看到了很多愿意在服务器端的做JavaScript解决方案的这种东西,比如说CommonJS这个约束和规范,以及像这个NodeJS这样的一些已经成熟的在推动的,已经相对成熟,在推动的这种案例,大概是这样的一些情况。但事实上服务器端使用JavaScript是一直以来潜藏在个个案例中的,就是没有消失过的。
4. 这个我原先还是以为它是从客户端发展来的,这是一个误解。那么就说目前可能大部分开发人员还是认为就说JavaScript还是一种比较难以调试的语言,您怎么认为的?
这个误解真的是来之以久了,太久了,非常非常久,。我个人觉得可能的原因是因为最早大家都是在网页里面使用脚本,然而网页里面好像没办法调试,你只能一遍又一遍的刷新这个网页,看错误,大不了你用alert把这个错误显示出来,或者信息显示出来。
但是事实上,我在99年,或者98年底开始使用JavaScript的时候,我就已经用JavaScript调试器了,就是这种,就是集成调试器。因为JavaScript早期的这个Netscape提供的版本里面,它就包括一个集成调试环境,你真的可以在里面做单步调试。然后在IE4.0、3.0的这个版本里面已经有它独立的这种JavaScript调试器,4.0里面有一个非常完整的调试器可以用,大概我是在01或者02年的时候,就已经在用这样的项目,我们其他高级语言里面那种调试功能在调试了,方法也很简单,安装了之后在菜单里面就有一个在下一行执行脚本的时候打开断点,也就是你刷新一下页面,有一行脚本,于是就成为一个断点,就可以让你去做调试,也可以执行,也可以看DOM结构等等,那个时代都已经有了。然后这件事情,在后来微软是一直没有推动的,因为在后来变成了IE一家独大的局面,所以网景的以及Mozilla这边的这个开发环境就不是非常,在那个时代是不是非常流行。
而在IE这一面呢,做大量开发的开发人员呢,又遇到了一个难题,微软它是主动的想推Visual Studio系列的,他不想推这种单独的调试器和单独的开发环境。而Visual Studio呢,又主要是面向这种,这个VC之类的和后来的这个.net之类的开发,它不是主要面向浏览器开发的,所以在里面的浏览器开发特性以及调试特性就很少有人提起。但事实上在Visual Studio里面,也可以做调试,一样的,打开一个断点一样可以做调试,这是没有问题的。但是这个事情就被,就这么,不是主流就淹没下去了,大家都不太觉得。然后呢,Firefox它的需求里面就有人用插件的形式来提供了Firebug,这是目前用的最多的一个调试器,提供Firebug之后大家发觉这浏览器里面,直接集成调试环境看起来是很舒服的,很实用的,用起来很多。
于是在倒过来,推动IE7以后,在浏览器里面,嵌入一个调试器来做调试,大家才以为这个时代开始,IE终于可以调试了,其实再往前推很多年IE都是可以调试的,只不过Firebug提供的这种调试方案,让IE觉得这样做可能更适合前端开发人员,于是有了这么一个版本。那事实上现在就变成了由Firebug那种调试方法,在浏览器中集成那种方法几乎统一了几个主流浏览器,几乎都是用那样的方式来调试的。就现在的情况来看,这些调试还是用得非常好的,而且也没有什么不太方便的地方。所以现在的局面下,尽管这种调试方式不是我所欣赏和最喜欢的那种方式,但它已经让所有的前端人员都有了自己完整的调试工具系列,不管在哪种浏览器上都可以,这应该不成为问题了。
5. 可能有一些人认为,比如说有很多匿名函数,或者一些动态加载的JS,他可能调试,就是比方说动态加载了第一次他调试不到,要等JS Load完之后才能调试?
这是一个问题,这是在Firebug里面的一个非常非常明显的问题,也是我很不喜欢用Firebug的原因,就是你用动态加载的一个字符串的方式去执行的时候,你是跟不到它里面的断点的,我不确知现在的这个Firebug有没有改好,我至少前一段时间使用它还是这个样子的。但是在IE里面没这样的问题,在Chrome里面,我没有去尝试过,没有试过这个案例。但是这只是说明,一些调试器对现在的所需的调试环境支撑是不够的,但并不等于这不可解决不可改善。我觉得它是可以改的,可以改善的,尤其是说,我个人觉得,如果你真的愿意用一些比较专业的调试工具的话,那你可以直接用Visual Studio来调试,效果也挺好,那可以做你几乎想做的所有事情。
6. 那么HTML5现在正在迅速地发展,然后JS各种框架也层出不穷地出现了,您认为这对JavaScript语言的发展有什么样的影响?
对于JavaScript这个语言本身的发展,我觉得影响最大的仍然是ECMA Script这个标准的确定和它的推进,这个可能是对JavaScript语言发展影响会最大的以及左右起来最明显的一个东西,毕竟所有的浏览器以及第三方的脚本引擎都在它的基础上实现。然后HTML5以及我们现在的第三方框架的话,我个人认为HTML5的影响主要会将这个前端的开发,它不仅仅是JavaScript,主要会把前端开发引领向一个真真正正面向物理设备这种开发的这么一个阶段,因为你看我们它已经开放了你的这个3D、2D的这种图形绘制界面,这意味着把显示器开放给你,然后它把Socket开放给你了,这意味着它把网络开放给你了,物理设备、网络物理设备开放给你了。
在服务器端开发语言,脚本开发语言上面,它把文件IO开发给你了,也就说你可以用存储。然后在这个客户端集成的类似于桌面的脚本。比如说AIR,就是Adobe的那一套,那ActionScript里面,它把本地的IO,然后呢,操作系统API的这些东西都可以开放给你了,那这意味着我们操作系统的所有的资源渐渐的向这个脚本这个领域里面在延伸,我们可以做更多的事情,我们可以把握更多的资源,就我们的脚本开发已经越来越面向于一个完整的集成环境,这有很大的空间。但仅从HTML5来说,我们从HTML5里面得到了显示器,我们得到了网络,这两个东西是必然的,我们才能控制的东西才会更多,这是我觉得它会产生一个影响。但是它对JavaScript这个脚本语言本身的发展是没有太大的影响,它毕竟不在一个系列里面,至于第三方框架的话,我觉得CommonJS和NodeJS这些影响还是会比较大的。但是它不会对我们的前端开发造成太大的影响,它也不在一个体系里面。
7. 那ECMA4.0里面对JavaScript OO的那种语法做了一些增强,那么可能大部分人还是用JS来做前端开发的,那么你觉得这是一件好事还是坏事呢?
这是一件可能过于超前了的事情,ECMA4.0里面对JavaScript的语法增强主要表现在系统特性上面,包括命名空间、包、类,还有这个类的这种定义和这个派生的方法,就是完整的类集成的体系,以及这个类上面的成员各种约束。还有呢就是很强的这个类型系统等等,这些东西是大型系统开发中所必须的。但它不一定是前端的开发中所必须的,我如果想做一个大型的,假定我举个例子,我真的想要再重新写一个像Gmail一样复杂的前端的应用,我当然需要很大的系统开发能力的语言,那这是我会觉得,我的语言会是瓶颈。但是当我大量的时间是在处理单个的Page,或者是在一个网站或者一个网站系统里边的一些类同的配制的时候,我所需要的是一个轻量级的框架,我所需要的是能够把这些页面都控制起来让我很好处理的框架,我不需要太复杂的这种系统性的语言,那这些特性对我来讲叫偏向多余,偏向于多余了。
那最后你会看到这些特性,这些在ECMScript4.0里面定义的特性为大公司所接受,比如说Adobe,因为他要推动他的像Photoshop,这个Acrobat等等这种客户端应用里面的脚本,这是像Illustrator。然后呢,他是因为要推动Flash应用开发,那么这些规模已经超出了我们大多数前端所要开发的这个范围,像微软,他是需要在.net里面提升JScript.net,然后像Mozilla他是想要在这个Mozilla的前后端,前端和后端都能够一统的使用这种语言,而且Mozilla实际上这个语言上,在ECMScript4.0上还是属于,4.0上还是属于比较摇摆的这么一个脚色,因为他既倾向于增强类集成的这种特性,又倾向于使用函数式特性来提供更便捷的、更精巧的这种语言特性,它是属于比较摇摆的,所以其他大部分规模来看,你会发现是规模要求他们,是应用的规模要求他们去推动这些语言特性。而这个就意味着什么呢?前端,处于JavaScript使用者的大多数的前端开发人员,或者浏览器上面的开发人员,不太愿意接受这些语言特性,因为他不用,简单讲他就不用。所以呢,ECMA4.0这个版本迟迟地推进不下去,既这个标准委员会的这些人达不到一致意见,那开发人员又往往处于拒绝和排斥这种状态,然后呢,ECM4.0又被暂停了。然后现在在发展Harmony这个分支在往前推进。
然后另外一部分呢,ECMA Script5.0推出来了,然后它提出来的一个最重要的概念,就是use target这个东西,它使得我们的安全的这个模式里面可以做一些约束过的这种动态和这个函数式特性等等,这些特性被约束过,那一旦这个造成系统就是复杂性的这些特性,被和对系统的复杂性有这个分解作用,就是可以避免系统过于复杂的这种特性,这两个可以分开了之后,那语言就可以向着两个方向并行发展,我把一些精巧的用法放在这个Spec里面,或者外面,那把另外一部分放在另外一个地方,那这样的话,我们的系统还是可以稳定的走下去,就好像一个过于复杂的系统里面有一个非常精巧的核,这是可以做得到的。所以这个模式,安全模式对于ECMAScript的发展来讲,是一个非常大的阶段,我觉得这是EMCAScript5.0做得最好的地方。
8. 那最后一个问题是,WebOS可能是以后的一个方向,那么JS在这个WebOS里面可能承担一个什么样的脚色?
那这个真得看Google怎么发展WebOS,因为WebOS当然有很多家在推动,但是就驱动力来讲,最大的可能还是Google。因为Google如果想要在操作市场上跟微软去争一争的话,他做桌面操作系统好像是表现不是很大,它仍然会倾向于做WebOS。然后我所知道的Palm的这个手机平台它会做Mobile的WebOS,那它也支持一个激进的一个选择,它难以形成说像这个Google这样子,试图在桌面OS上面一统天下,把这块吃掉,战略性地吃掉,Google是有这样的一个意图在里面的。那如果WebOS的需求是像JavaScript和增强性的JavaScript这样的语言的话,那么这个语言会,自然的会被提升起来。如果Google愿意做这样的战略性的决策的话。如果不是,那么可能也不会是那样一种局面。WebOS对于这个脚本语言的需求,我个人认为远远大于现在JavaScript所表现出来的语言能力。因为我们的JavaScript在语言的展现能力上还是很弱的,即便我们去看,比如说ECMAScript4这个版本,已经很激进的在系统性的语言推算已经很激进了,对于操作系统级别的这种应用语言来讲它也是欠很多的,大概是这样一个局面。不过我对这一点我并不乐观,我不认为这么快,JavaScript就会向系统性语言的这个方向发展太大的跨越,这个很难。
9. 好,那么今天周爱民老师为我们消除了很多对JS的误解。我们谢谢周爱民老师接受我们的采访。
谢谢。