讨论web开发技术的历史,当然要先说说web的起源。众所周知,web这个internet上最热门的应用架构是由tim berners-lee发明的。web的前身是1980年tim berners-lee负责的enquire(enquire within upon everything的简称)项目。1990年11月,第一个web服务器nxoc01.cern.ch开始运行,tim berners-lee在自己编写的图形化web浏览器”worldwideweb”上看到了最早的web页面。1991年,cern(european particle physics laboratory)正式发布了web技术标准。目前,与web相关的各种技术标准都由著名的w3c组织(world wide web consortium)管理和维护。
从技术层面看,web架构的精华有三处:用超文本技术(html)实现信息与信息的连接;用统一资源定位技术(uri)实现全球信息的精确定位;用新的应用层协议(http)实现分布式的信息共享。这三个特点无一不与信息的分发、获取和利用有关。其实,tim berners-lee早就明确无误地告诉我们:”web是一个抽象的(假想的)信息空间。”也就是说,作为internet上的一种应用架构,web的首要任务就是向人们提供信息和信息服务。
很可惜,在web应用日新月异的今天,许多搞技术的人似乎已经忘记了web架构的设计初衷。他们在自己开发的网站或web应用中大肆堆砌各种所谓的”先进”技术,但最终用户能够在这些网站或应用中获得的有价值信息却寥寥无几。这个问题绝不像评论者常说的”有路无车”或”信息匮乏”那么简单。一个web开发者倘若忘记了web技术的最终目标是提供信息和信息服务,他的愚蠢程度就丝毫不亚于一个在足球场上只知道卖弄技巧,却忘记了射门得分的大牌球星。从这个角度来说,评价一种web开发技术优劣的标准只有一个,那就是看这种技术能否在最恰当的时间和最恰当的地点,以最恰当的方式,为最需要信息的人提供最恰当的信息服务。
客户端技术的萌芽和演进
web是一种典型的分布式应用架构。web应用中的每一次信息交换都要涉及到客户端和服务端两个层面。因此,web开发技术大体上也可以被分为客户端技术和服务端技术两大类。我们先来谈谈客户端技术的萌芽和演进过程。
web客户端的主要任务是展现信息内容,而html语言则是信息展现的最有效载体之一。作为一种实用的超文本语言,html的历史最早可以追溯到上世纪四十年代。1945年,vannevar bush在一篇文章中阐述了文本和文本之间通过超级链接相互关联的思想,并在文中给出了一种能实现信息关联的计算机memex的设计方案。doug engelbart等人则在1960年前后,对信息关联技术做了最早的实验。与此同时,ted nelson正式将这种信息关联技术命名为超文本(hypertext)技术。1969年,ibm的charles goldfarb发明了可用于描述超文本信息的gml(generalized markup language)语言。1978到1986年间,在ansi等组织的努力下,gml语言进一步发展成为著名的sgml语言标准。当tim berners-lee和他的同事们在1989年试图创建一个基于超文本的分布式应用系统时,tim berners-lee意识到,sgml是描述超文本信息的一个上佳方案,但美中不足的是,sgml过于复杂,不利于信息的传递和解析。于是,tim berners-lee对sgml语言做了大刀阔斧的简化和完善。1990年,第一个图形化的web浏览器”worldwideweb”终于可以使用一种为web度身定制的语言–html来展现超文本信息了。
最初的html语言只能在浏览器中展现静态的文本或图像信息,这满足不了人们对信息丰富性和多样性的强烈需求–这件事情最终的结果是,由静态技术向动态技术的转变成为了web客户端技术演进的永恒定律。
能存储、展现二维动画的gif图像格式早在1989年就已发展成熟。web出现后,gif第一次为html页面引入了动感元素。但更大的变革来源于1995年java语言的问世。java语言天生就具备的平台无关的特点,让人们一下子找到了在浏览器中开发动态应用的捷径。1996年,著名的netscape浏览器在其2.0版中增加了对javaapplets和javascript的支持。netscape的冤家对头,microsoft的ie 3.0也在这一年开始支持java技术。现在,喜欢动画、喜欢交互操作、喜欢客户端应用的开发人员可以用java或javascript语言随心所欲地丰富html页面的功能了。顺便说一句,javascript语言在所有客户端开发技术中占有非常独特的地位:它是一种以脚本方式运行的,简化了的java语言,这也是脚本技术第一次在web世界里崭露头角。为了用纯microsoft的技术与javascript抗衡,microsoft还为1996年的ie 3.0设计了另一种后来也声名显赫的脚本语言–vbscript语言。
真正让html页面又酷又炫、动感无限的是css(cascading style sheets)和dhtml(dynamic html)技术。1996年底,w3c提出了css的建议标准,同年,ie 3.0引入了对css的支持。css大大提高了开发者对信息展现格式的控制能力。1997年的netscape 4.0不但支持css,而且增加了许多netscape公司自定义的动态html标记,这些标记在css的基础上,让html页面中的各种要素”活动”了起来。1997年,microsoft发布了ie 4.0,并将动态html标记、css和动态对象模型(dhtml object model)发展成了一套完整、实用、高效的客户端开发技术体系,microsoft称其为dhtml。同样是实现html页面的动态效果,dhtml技术无需启动java虚拟机或其他脚本环境,可以在浏览器的支持下,获得更好的展现效果和更高的执行效率。今天,已经很少有哪个html页面的开发者还会对css和dhtml技术视而不见了。
为了在html页面中实现音频、视频等更为复杂的多媒体应用,1996年的netscape 2.0成功地引入了对quicktime插件的支持,插件这种开发方式也迅速风靡了浏览器的世界。在windows平台上,microsoft将客户端应用集成的赌注押到了1990年代中期刚刚问世的com和activex身上。1996年,ie 3.0正式支持在html页面中插入activex控件的功能,这为其他厂商扩展web客户端的信息展现方式开辟了一条自由之路。1999年,realplayer插件先后在netscape和ie浏览器中取得了成功,与此同时,microsoft自己的媒体播放插件media player也被预装到了各种windows版本之中。同样值得纪念的还有flash插件的横空出世:1990年代初期,jonathan gay在futurewave公司开发了一种名为future splash animator的二维矢量动画展示工具,1996年,macromedia公司收购了futurewave,并将jonathan gay的发明改名为我们熟悉的flash。从此,flash动画成了web开发者表现自我、展示个性的最佳方式。
除了编写html页面之外,客户端应用的开发者还可以利用一些成熟的技术将浏览器的功能添加到自己的应用程序中。从1992年开始,w3c就免费向开发者提供libwww开发库。借助libwww,我们可以自己编写web浏览器和web搜索工具,也可以分析、编辑或显示html页面。1999年,microsoft在ie 5.0中引入的htas(html applications)技术则允许我们直接将html页面转换为一个真正的应用程序。从1997年的ie 4.0开始,microsoft为开发者提供了webbrowser控件和其他相关的com接口,允许程序员在自己的程序中直接嵌入浏览器窗口,或调用各种浏览器的功能,如分析或编辑html页面等。windows 98及其后的windows操作系统甚至还利用wsh(windows script host)技术将原本只在浏览器中运行的javascript、vbscript变成了可以在win32环境下使用的通用脚本语言,这大概也可算作我们对web客户端开发技术的一种巧妙利用吧。
服务端技术的成熟与发展
与客户端技术从静态向动态的演进过程类似,web服务端的开发技术也是由静态向动态逐渐发展、完善起来的。
最早的web服务器简单地响应浏览器发来的http请求,并将存储在服务器上的html文件返回给浏览器。一种名为ssi(server side includes)的技术可以让web服务器在返回html文件前,更新html文件的某些内容,但其功能非常有限。第一种真正使服务器能根据运行时的具体情况,动态生成html页面的技术是大名鼎鼎的cgi(common gateway interface)技术。1993年,cgi 1.0的标准草案由ncsa(national center for supercomputing applications)提出,1995年,ncsa开始制定cgi 1.1标准,1997年,cgi 1.2也被纳入了议事日程。cgi技术允许服务端的应用程序根据客户端的请求,动态生成html页面,这使客户端和服务端的动态信息交换成为了可能。随着cgi技术的普及,聊天室、论坛、电子商务、信息查询、全文检索等各式各样的web应用蓬勃兴起,人们终于可以享受到信息检索、信息交换、信息处理等更为便捷的信息服务了。
早期的cgi程序大多是编译后的可执行程序,其编程语言可以是c、c++、pascal等任何通用的程序设计语言。为了简化cgi程序的修改、编译和发布过程,人们开始探寻用脚本语言实现cgi应用的可行方式。在此方面,不能不提的是larry wall于1987年发明的perl语言。perl结合了c语言的高效以及sh、awk等脚本语言的便捷,似乎天生就适用于cgi程序的编写。1995年,第一个用perl写成的cgi程序问世。很快,perl在cgi编程领域的风头就盖过了它的前辈c语言。随后,python等著名的脚本语言也陆续加入了cgi编程语言的行列。
1994年,rasmus lerdorf发明了专用于web服务端编程的php(personal home page tools)语言。与以往的cgi程序不同,php语言将html代码和php指令合成为完整的服务端动态页面,web应用的开发者可以用一种更加简便、快捷的方式实现动态web功能。1996年,microsoft借鉴php的思想,在其web服务器iis 3.0中引入了asp技术。asp使用的脚本语言是我们熟悉的vbscript和javascript。借助microsoft visual studio等开发工具在市场上的成功,asp迅速成为了windows系统下web服务端的主流开发技术。当然,以sun公司为首的java阵营也不会示弱。1997年,servlet技术问世,1998年,jsp技术诞生。servlet和jsp的组合(还可以加上javabean技术)让java开发者同时拥有了类似cgi程序的集中处理功能和类似php的html嵌入功能,此外,java的运行时编译技术也大大提高了servlet和jsp的执行效率–这也正是servlet和jsp被后来的j2ee平台吸纳为核心技术的原因之一。
两种重要的企业开发平台
web服务端开发技术的完善使开发复杂的web应用成为了可能。在此起彼伏的电子商务大潮中,为了适应企业级应用开发的各种复杂需求,为了给最终用户提供更可靠、更完善的信息服务,两个最重要的企业级开发平台–j2ee和.net在2000年前后分别诞生于java和windows阵营,它们随即就在企业级web开发领域展开了你死我活的拼争。平台之争让整个web世界在最近的几年里不得安宁,但从某种意义上说,也正是这种针锋相对的竞争关系促使了web开发技术以前所未有的速度提高和跃进。
j2ee是纯粹基于java的解决方案。1998年,sun发布了ejb 1.0标准。ejb为企业级应用中必不可少的数据封装、事务处理、交易控制等功能提供了良好的技术基础。至此,j2ee平台的三大核心技术servlet、jsp和ejb都已先后问世。1999年,sun正式发布了j2ee的第一个版本。紧接着,遵循j2ee标准,为企业级应用提供支撑平台的各类应用服务软件争先恐后地涌现了出来。ibm的websphere、bea的weblogic都是这一领域里最为成功的商业软件平台。随着开源运动的兴起,jboss等开源世界里的应用服务新秀也吸引了许多用户的注意力。到2003年时,sun的j2ee版本已经升级到了1.4版,其中三个关键组件的版本也演进到了servlet 2.4、jsp 2.0和ejb 2.1。至此,j2ee体系及相关的软件产品已经成为了web服务端开发的一个强有力的支撑环境。
和j2ee不同的是,microsoft的.net平台是一个强调多语言间交互的通用运行环境。尽管.net的设计者试图以.net平台作为绝大多数windows应用的首选运行环境,但.net首先吸引的却是web开发者的目光。2001年,ecma通过了microsoft提交的c#语言和cli标准,这两个技术标准构成了.net平台的基石,它们也于2003年成为了iso的国际标准。2002年,microsoft正式发布.net framework和visual studio .net开发环境。早在.net发布之前,就已经有许多windows平台的web开发者迫不及待地利用beta版本开发web应用了。这大概是因为,.net平台及相关的开发环境不但为web服务端应用提供了一个支持多种语言的、通用的运行平台,而且还引入了asp.net这样一种全新的web开发技术。asp.net超越了asp的局限,可以使用vb.net、c#等编译型语言,支持web form、.net server control、ado.net等高级特性。客观地讲,.net平台,尤其是.net平台中的asp.net的确不失为web开发技术在windows平台上的一个集大成者。
xml语言及相关技术
如果说html语言给web世界赋予了无限生机的话,那么,xml语言的出现大概就可以算成是web的一次新生了。按照tim berners-lee的说法,web是一个”信息空间”。html语言具有较强的表现力,但也存在结构过于灵活、语法不规范的弱点。当信息都以html语言的面貌出现时,web这个信息空间是杂乱无章、没有秩序的。为了让web世界里的所有信息都有章可循、有法可依,我们需要一种更为规范、更能够体现信息特点的语言。
1996年,w3c在sgml语言的基础上,提出了xml(extensible markup language)语言草案。1998年,w3c正式发布了xml 1.0标准。xml语言对信息的格式和表达方法做了最大程度的规范,应用软件可以按照统一的方式处理所有xml信息。这样一来,信息在整个web世界里的共享和交换就有了技术上的保障。html语言关心的是信息的表现形式,而xml语言关心的是信息本身的格式和数据内容。从这个意义上说,xml语言不但可以将客户端的信息展现技术提高到一个新的层次,而且可以显著提高服务端的信息获取、生成、发布和共享能力。为了将xml信息转换为html等不同的信息展现形式,1999年,w3c制定出了xslt标准。同一年,ie 5.0增加了对xml和xslt的支持。
现在,网站的开发者可以直接使用xml语言发布信息了。针对不同的应用领域,人们还制定了许多专门的xml规范。例如,2001年w3c发布的svg(scalable vector graphics)1.0标准就是一种用xml语言表达的、全新的二维矢量图形格式。开发者可以用svg格式描述大多数已有的flash动画。与flash格式相比,符合xml标准的svg格式显然更有利于信息交换和共享。
web本身就是一个最大的分布式应用系统。对于分布式开发而言,xml技术也大有用武之地。一个明显的事实是,如果能让分布式应用借助xml格式交换信息,那么,以往横亘在分布式架构上的信息交换难题也就迎刃而解了。1999年,w3c和相关的企业开始讨论设计基于xml的通信协议,2000年,w3c发布soap(simple object access protocol)协议的1.1版。人们把利用soap协议传递xml信息的分布式应用模型称为web service。2001年,w3c发布了wsdl(web services description language)协议的1.1版。soap协议和wsdl协议共同构成了web service的基础。随后,j2ee和.net这两大企业级开发平台先后实现了web service,并将其视为平台的一项核心功能。
web service对于web开发者的重要意义在于,当我们需要在不同的服务端、不同的客户端乃至不同的应用类型、不同的计算设备之间传递信息的时候,以往的分布式开发技术或者因为适应性不强,或者因为扩展能力不足,都难以满足现代web开发的需要,而web service正好填补了这一空白。
web开发框架和应用模型
2000年以后,随着web应用的日益复杂,人们逐渐意识到,单纯依靠某种技术多半无法达到快速开发、快速验证和快速部署的最佳境界。研究者开始尝试着将已有的web开发技术综合起来,形成完整的开发框架或应用模型,并以此来满足各种复杂的应用需求。
microsoft在客户端的技术集成方面走在了最前面。1998年时microsoft推出的windows 98就可以在桌面上集成web页面,这实际上是将资源管理器和web浏览器的功能有效地结合了起来。2000年后,microsoft陆续推出了msn explorer和与之相关的msn在线服务。这一应用模型将web浏览、视频点播、邮件处理、网上游戏、在线聊天等许多种用户常用的web功能集成在了一个统一的界面中。从信息利用的角度看,msn试图让用户在一个最舒适的环境中获取足够的信息,这种努力的确值得人们称道。另一个与客户端技术集成相关的例子是搜索引擎google在2003年展示给大家的google工具栏功能。虽然google工具栏有炒作和广告的嫌疑,但安装google工具栏之后的ie浏览器将信息浏览和信息检索有机地结合了起来,这种小小的功能改进确实是对用户的体贴和帮助。
在web服务端,2000年以后出现了几种主要的技术融合方式。首先,越来越多的web开发环境开始支持mvc(model-view-contorller)的设计模型,为开发者提供了全套的开发框架。实际上,j2ee和.net平台本身就是这种开发框架的典型代表。其次,门户服务(portal server)和web内容管理(web content management)在最近几年里成为了应用集成的重点模型。这两种应用模型可以直接为开发者或最终用户提供构建web应用的高级平台,可以让web开发和信息发布工作大为简化。在商业软件领域,这一类应用的例子包括microsoft的sharepoint、ibm的websphere portal、filenet的web content manager等等。开源项目在web开发框架和应用模型方面表现得非常积极,struts、jetspeed、jportlet、cocoon、lenya、xoops等都是开源世界里与mvc开发框架、门户服务和web内容管理相关的优秀解决方案。
当然,技术集成绝不等于技术堆砌。一些web站点和web应用的开发者把xml语言、mvc框架等时髦技术拼凑起来,却不管它们是否能适应具体的应用环境,结果,他们的系统要么运行效率低下,要么功能残缺不全。反之,一个值得注意的事实是,像新浪、搜狐或网易这样的门户网站,在他们的信息发布页面(如新闻页面)里,尽管信息内容时刻都在刷新,但web服务器上存放的始终都是静态的html页面。这种”落后技术”的优点是,在大量并发访问的情况下,门户网站的响应速度仍然很快。深入到技术层面,我们通常会惊讶地发现,这些网站使用的大多是自行研发的web内容管理系统。当网站的内容编辑提交新的信息时,系统会自动将信息转换为html格式,发布到web服务器集群的每一个结点上。在新浪网的一个角落里,我们可以找到”新浪网站发布系统”的研发历程:
v 1.0(1997):基于文件的版本,实现新闻首页、正文和专题的发布。
v 1.1(1998/12):采用数据库后台、实现跨服务器发布,自动化程度高。
v 2.0(1999/3):创立模版和域的全新概念,奠定了该系列的基本设计思路。
v 2.1(1999/9):增加周边模块,如搜索、自动采集。
v 3.0(2000/1):优化传输方式,增加相关新闻和评论。
v 3c(2000/6):v3.0的编译版,也是商业版的原型。
v 3.1(2000/7):优化数据库结构,采用内存cache大幅提速,增加了集中监控功能。
v 3.1c(2000/8):商业用测试版本。
v 3.2(正在制作中):重点解决备份系统的自动化切换,在机制上实现永不宕机。
这一份有趣的历史记录再一次印证了我关于web开发技术的基本观点:一种技术只要能为用户提供高水平的信息服务,它就是最好、最先进的技术。
web开发技术的未来
所有人都在关心web的发展前景,所有人都想知道十年以后的web会长成什么样子。要回答这些问题,没有谁比w3c更有权威了。w3c明确地告诉我们,web的未来是语义化的web(semantic web)。今天的web可以自如地生成、传递和展现各式各样的信息,但它还只是一个信息的”容器”,很难揭示出信息本身的内容和特性。与此相对的是,未来的语义化web是一种懂得信息内容的web,是真正的”信息管理员”。
从技术角度看,xml语言统一了信息的表达方式,但这离揭示信息内容的目标还相距甚远。1998年,w3c和一些研究机构开始对元数据(metadata)进行研究。元数据是描述数据的数据,可以揭示信息的内容特性。1999年,netscape提出的rss(rich site summary)建议标准是用元数据技术描述新闻等信息内容的第一次尝试。1999年,w3c的研究小组提出了rdf(resource description framework)标准草案。rdf在xml语法的基础上,规定了元数据的存储结构和相关的技术标准。使用rdf语言,我们可以用统一的、可交换的格式揭示出信息本身的各种特性。2001年,w3c又开始着手制定owl(owl web ontology language)标准。owl语言也是一种符合xml标准的语言,它比rdf又前进了一步,可以更加深入、细致地描述信息内容。在rdf和owl语言的帮助下,我们能让web上的信息内容变得更容易理解、更便于交换和共享。2003年,w3c成立了语义化web service研究小组(semantic web services interest group),研究在web service中加入语义技术的相关问题。2004年2月,w3c宣布rdf和owl标准正式成为w3c的建议方案,这标志着语义化web的大厦已经破土动工。
随着语义化web的诞生和发展,web开发技术也必将经历更为重大的变革。可以预见的是,在未来的几年里,还会有许多新的开发技术或开发平台出现。从静态技术到动态技术,从开发平台到应用模型,从传统web到语义化web……为了让更多的人获得更有价值的信息服务,web开发者们也许还会经历一次又一次的技术浪潮,还会面临更为严峻的技术挑战,但这和信息共享的最高目标相比,又算得了什么呢?