转眼间,World-Wide Web 诞生已经超过了十年,回头看去,似乎那个时候拿着 Mosaic 浏览器看到的东西,和现在 Google Calendar 这样的东西是那么的不同,这种变迁就像 Web 的诞生本身一样,带来了理念、架构、基础技术的潜在的巨大变化可能,面对各种纷繁的概念和炒作,我们有必要自己好好用用自己的脑子,来看看究竟什么是 Web 的未来。


Part I Web 的过去和现在

Web 的核心是什么?一般认为是 HTML 和 HTTP,也就是超文本置标语言 HyperText Markup Language 和专门设计来接受和传输它的超文本传输协议 HyperText Transfer Protocol。Web 诞生伊始就已经具备的、目前也仍然是核心的特性就是:超文本 HyperText,这是从 SGML 等更早期的学术成果发展而来的一种文本格式,其最核心的特性是:
1、统一资源定位:使用标准化的体系来命名和寻址特定的资源,这种资源可以通过任何支持 HTTP 协议的机制访问。
2、超链接:允许使用标签把不同地方的 HTML 文件链接起来,通过点击来快速的跳转。
3、多媒体:允许使用标签嵌入图片(后来通过扩展机制又引入了音频视频等资源)。
另外,Web 最初主要用于学术交流,所以 HTML 也提供了一定的排版功能。

如果要从上面的特性中找出一个最核心的,毫无疑问的应该是超链接。正是超链接改变了人们使用信息的方式,使得全球范围的信息互联、共享和快速传播成为可能。最早的 Web 也就是这样了,没有什么更多的东西可以挖掘。

很快的,使用 Web 的人们开始探索一种可以一边看超文本一边进行交互的方式,BBS 等网络社区开始建立,这个时候的关键技术是 HTML Form 和后台的 CGI,也就是在后台书写的一段程序,能够接受 HTML 上一些用户填写的数据,经过处理再动态的生成新的 HTML 页面反馈给用户。不要小看了那时候简陋的 CGI BBS 们,它们一下子把 Web 从一个网络超文本库往应用程序这边拉近了好多,后面就开始路路续续的产生了 ASP 啊 JSP 啊 PHP 这样一些简化 CGI 编程的技术,再加上 InterDev、Dreamweaver 这些 IDE 工具的大行其道,顿时,所有的程序员几乎在学会应用程序开发之前就已经可以写出交互式的 Web 页面了,Web 变成了新的应用平台。这是上个世纪最后几年时候的事情。

作为新兴的编程平台,基于 Web 的开发有了非常迅速的发展,但是很多程序开发上的问题在这个时候也开始暴露,这里说几个最突出的。
1、缺乏标准。不仅编程接口没有标准,随着厂商加入大量自定义的标签,搞得连 HTML 本身的解释也没了标准,开发者要为不同的浏览器开发不同版本的页面。
2、代码结构混乱。往往是表达内容的文本,和表达交互的脚本,还有表达样式的标签混杂在一个文件中,比面条还面条。
3、交互方式受限。HTTP 最早设计目标仅仅是针对超文本的传输,根本没有考虑应用的问题,所以它只支持无连接、无状态的模式,这使得复杂的交互要在页面上实现不得不自己另外想办法来保存和维护中间状态,这使得在线交互的设计变得非常困难。
4、展现方式静态和单一。HTML 所有的显示样式是高度分散在页面的各个部分中,所以修改起来非产困难。而且 HTML 本身只支持简单的输入 UI 控制,像常用的树型结构、Tab 结构等都需要另外实现。
5、程序调试困难。分布式的代码使得一体化的调试很难实现,而分布式的调试又具有很高的技术要求。

所有这些,最后导致的结果就是:开发效率低下,应用功能受限,响应效率难以令人满意。直到几年前为止,几乎没有基于 Web 的 killer 级的应用出现,网上最成功的应用是搜索引擎以及类似的以信息检索为核心的应用,罕见复杂的交易和生动的用户界面,更不用说大型企业级应用了。在这个过程中,业界提出了不少的解决方案,影响比较大的包括:
1、使用样式表来分离样式和内容。
2、使用 MVC 模式来分离展现和控制逻辑。
3、使用嵌入式程序插件来提供有状态连接模式(包括微软体系的 ActiveX 和 Java 体系的 Applet)。

说起来,我们也是最早的吃螃蟹者之一。我们在 1998 年开始开发在线交易系统的时候,几乎碰到了上面的所有问题,我们当时的解决方案:前端采用 Java Applet,按照传统应用程序的方法来设计交互流程,实际上只把浏览器当作一个容器而已。这个也带来很多问题,例如 Java Applet 的分发(记得那些个 Applet 大约几百K)。当然,后来我们也改变这种方式,转向 MVC 模式的页面开发。

2004 年前后,一些新的技术和思想开始崛起,给 Web 带来了全新的希望,现在就让我们进入这些激动人心的新领域,看看 Web 的未来会是什么样子。

Part II Web 的未来

最近的一些新的技术发展给 Web 的应用前景带来了新的希望。我们从几条线来描述这些新的发展(基本按照发展时间而不是其他顺序排列)。

一、样式表:真正的出版级输出控制

层级式样式表 CSS 诞生比 HTML 还早,但是真正被业界接受成为标准的进程到现在也还没有完全完成,这里面有些技术问题,但是更多的是商业利益——也就是著名的浏览器战争(War of Browsers)。但是随着 W3C CSS 标准[1]越来越完备,以及 Mozilla Firefox 这样的 100% 标准化浏览器的普及,即便是 MS 这样的巨人,也不得不慢慢的靠向标准,虽然还是坚持自己的一些东西,但是 MS 毕竟已经同意并且实际上实现了绝大部分的 CSS 特性,现在不兼容网页(指在不同浏览器下现实效果有明显差异的网页)越来越少就是一个明显的迹象。

CSS 目前能够提供与内容和交互脚本完全独立的样式控制,使用独立的 CSS 文件,可以给同一个 HTML 页面进行不同风格的装饰(decorate),快速的切换显示的效果。伴随着 blog 的风行,这种“模板”技术已经广为大家所熟悉。CSS 还提供可以集中管理的版式管理,包括对绝对定位、比例定位和相对定位的良好支持[2]。现在的 HTML 编写者可以很方便的切分页面区域,然后通过一个集中的 CSS 文件来管理这些区域的位置、大小、样式、显示/隐藏等。CSS 还可以实现非常结构化的交互构件,例如下拉列表、树型列表等。

CSS 成熟的巨大意义在于:Web 上的内容和样式可以非常结构化的分离,这就允许编程者可以针对内容和样式分开设计不同的处理模块,极大的提高架构的灵活性。

二、基于 RSS/XML 的内容聚合:新的超链接系统

关于这个主题,我在 2004 年写了一篇专门的文章进行了探讨,可以在我的 blog 上找到这篇文章[3]

简单的说,RSS/XML 的聚合提供了一种最简单因而也是最灵活的方式,使的跨应用的内容/数据交换成为非常容易的事情。

三、面向服务架构(SOA):应用体系架构和产业链的革命

这是另外一个巨大的话题。我会在以后更深入和大家交流。这里只提出一些关键的要点:
1、SOA 不是架构也不是产品,而是一种方法论。
2、SOA 不仅仅是 Web Service 技术(虽然 Web Servce 确实是它的核心),它要求对业务模型和产业链进行调整,以适应不同层次的服务要求。例如一层是提供基础设施服务(主机、网络、安全等),一层是提供技术平台(数据库、应用中间件等),一层提供基础公共构件,一层提供业务公共构件,一层提供流程组装和个性化,等等。每一层有自己的开发、服务和运维体系。
3、SOA 的核心包括服务的注册、组装、寻址、请求,而服务接口的中立、灵活、互操作性是其主要的难点。
4、SOA 尚未标准化。涉及到诸多环节还没有达到令人满意的互操作性,这使得 SOA 的蓝图仍然飘在空中,远未落到地面。

SOA 的价值勿庸置疑,它相当于上面第二点的超集,能够把所有软件应用服务像内容一样通过服务接口进行随意的分发,实现最大限度的重用和整合。那时候使用应用服务就像点击新闻链接一样的无缝,无疑这是应用集成的最高境界。

顺便说一句,关于 SOA,上面只是讨论它的技术实质。而 SOA 很可能会带来产业链的革命——如果它真的能够实现的话,关于这个还有很多有趣而令人兴奋的话题,我们就留到下次再说吧。

四、富客户端(RIA)技术:扩展 Web 应用范围

前面说到的 Web 页面限制了应用的范围,难以建立大规模的、包含丰富复杂交互操作的系统。RIA 技术应运而生。目前主要产生了两个大的分支:基于脚本和基于交互式插件。前者的代表是 AJAX 的各种实现,后者的代表是各种 Flash RIA 解决方案。

AJAX 的意思是:Asynchronous JavaScript + XML。这个名字来源于 AdaptivePath 公司创始人 Jesse James Garrett 在 2005 年初发表的一篇文章[4],这篇文章系统的阐述了为什么以及如何使用 XMLHTTPRequest 对象来实现 Web 页面的异步请求和处理(这里“异步”的意思是不需要同步刷新整个页面)。AJAX 技术的核心是使用页面内置的 javascript,利用浏览器提供的 XMLHTTPRequest 对象来接受远程的 XML 数据,然后使用 javascript 来修改页面上的显示和行为。这种方法的优势在于轻量级和安全性,完全使用浏览器内置技术带来最低的客户端代价。但是其问题也很明显:首先 javascript 的编码效率很低,复杂的逻辑需要非常多的代码来实现;其次 javascript 本身不是结构化的,维护、调试都很不方便,开发成本比较高;再就是著名的浏览器兼容性问题,一般来说需要针对不同的浏览器编写不同的 AJAX 库,否则很难保证兼容性。AJAX 拥有非常多的开源工具包,例如比较出名的 Bindows;厂商也有一些比较完整的开源实现,例如 Adobe 的 Spry Framework for Ajax

另外一个技术分支,也就是以前端 Flash 展现为主的 RIA,代表者是 Adobe/Macromedia 的 Flex 技术和类似思路的开源实现如 Laszlo。它们的实现方式都类似,就是通过编写一种特定的描述语言,然后在服务器端处理这种描述语言生成动态的 Flash componennt,然后在页面上用这种 componennt 处理用户交互,需要与后台交互的时候,这些 componennt 也是用远程 XML 数据或者服务接口来访问后台。这种实现最大的好处是浏览器无关,只要安装了 Flash Player,任何浏览器上的表现一定一致。问题嘛,当然就是这个 Flash Player,而且要注意,这是一个厂商专有技术,跟完全开放的 javascript 性质是完全不同的。由于后面的这个差异,现在越来越明显的,Flash-based RIA 很可能将被更多的用在企业内部应用中。有兴趣的可以自己动手试一试。我们也对 Flex 有过初步的研究和尝试,有兴趣的也可以自己试一试[5]

针对这些技术本身的问题,可以看到厂商和开源社区都在努力提升自己的产品,包括开发生产力、规范化等努力都不断在持续着。值得一提的是最近一个比较重要的方案,来自 AJAX 最实干的实践者—— Google。Google 的 GmailGoogle SuggestGoogle MapsGoogle CalendarGoogle SpreadsheetGoogle Notebook 都是 AJAX 技术和 RIA 体验的典范。最近 Google 开源了他们的 AJAX 工具包[6],其采取的是一种全新的设计,允许开发者使用完全的 java 环境进行开发调试,最后工具包自动把 java 代码编译为 AJAX 的 Web 页面和 javascript 脚本。这是一个非常 sharp 的想法,具有非常好的潜力。

RIA 是是非常新的技术体系,是 Web 页面和传统应用开发进行融合的产物。其深层包含了 SOA 的思想和服务/内容、展现、行为进一步拆解的编程模式。应用 RIA 技术,绝对不是学会 javascript 和一两个 AJAX 包,或者学会 Flex 语言就可以的,而是需要对整个开发生命周期作出规划调整,这里有一个很好的例子来自 Macromedia 的 Flex 社区,可以参考[7]

RIA 技术的价值主要在于控制和展现层的丰富化,其使命就是突破传统浏览器静态、无状态的交互限制。最终实现把桌面应用分布化扫清架构障碍。

Web 世界的诺查丹玛斯大预言

综合以上的四大领域,我们可以估计得到,未来的 Web 会具备的特性。

1、可以和桌面应用相媲美的交互性。支撑技术是:RIA。
2、内容、样式和交互分离的设计成为主流。支撑技术是:CSS、RSS、Web Service。
3、高度的可整合,每个网站都可以很容易的变成后台服务的提供者,向其他网站提供内容和服务。支撑技术是:RSS、Web Service。

这些只是技术问题。大家可能都看了 Google CalendarGoogle Spreadsheet,难道 Google 只是希望证明他们的 AJAX 能力很强,能够把在桌面上为人们所熟知的应用搬上 Web 页面么?才不是呢,仔细研究其中蕴涵着的在线协作(collaboration)和社会化软件(social software)能力——要注意,目前 Google 对这些特性还是有所保留的——就可以知道,这是真正的应用模式的革命。所以未来的 Web 所有的技术革新其实都是为商业模式服务的。这里有两篇非常精彩的文章可以帮助大家理解新 Web 环境下技术和商业模式的关系[8][9],至于这个具体的讨论,我想也放到以后来谈吧。这篇东西已经太长了,就此收尾大概还算来得及吧。


如果对于本文提到的技术和问题有兴趣的,可以选择相关的一些资源作进一步的研究。

[1] Cascading Style Sheets(W3C)
[2] Learn CSS Positioning in Ten Steps
[3] Internet 时代的出版:从猫扑和 Slashdot 到内容集成
[4] Ajax: A New Approach To Web Applications
[5] Ragnarok Studio: Macromedia Flex Starter’s Kit
[6] Google Web Toolkit
[7] Case Study: The Development Life Cycle of a Flex Application
[8] Web 2.0 Startup – The Business Model
[9] Web 2.0 编程思想:16 条法则