1. 保存。浏览器窗口内的一个frame(可被隐藏)中运行的用户程序,可以对其他frame中用户浏览的内容作索引,并按照用户的要求保存从网上获取的资料,如文档、图片、音乐、视频等(免费或已付费的)。这些资料被保存在用户自己的目录下,按照用户的意愿作整理,而不是浏览器自带的缓存中。并且,由于网上数据的显然的冗余性(如广告、边栏,又如不同日期相同网页的格式与内容的重复),程序可以帮助用户仅保存所需的资料。
2. 检索、查询。用户大多习惯于使用搜索引擎查找资料。实际上,许多查询是在已下载资料中、或是在用户此前关注过的内容中搜寻。因此,不难想象浏览器中运行的程序优先查找本地内容,然后才将搜索交给搜索引擎。官方的W3C标准的文档中将浏览器称作user agent,即用户代理,暗示浏览器超过简单显示网页之外的其他功能。用户自身的隐私也是使用本地查询的重要理由。3. 其他应用程序如小游戏,又如编辑器。HTML提供的图形工具足以帮助构造出各种游戏的支持库,使爱好者能够发挥想象力写出有趣的游戏——如果已有的游戏能够公开简单清晰的后台工具(而不是让上程序员培训班)的话。编辑器是最古老的应用程序,不过,能够在最短的时间内写出中意的编辑器向来是对程序员能力以及对编程平台的考验。传说Sun公司的创始人之一Bill Joy用一个周末写出了VI编辑器——实际上Sun公司与Web的兴盛及Netscape公司有很深的联系,这可以从javascript的名称看出。另一方面,javascript的另一个官方名称ecmascript又不能不让我们联想到emacs编辑器及其平台语言emacs lisp。
浏览器平台是“自举”的,即从它可以得到其他所需的工具。例如,不难写出调试程序在一个浏览器窗口中调试另一个窗口中javascript代码,或者在一个窗口中编写程序,在另一个窗口中看运行效果;也不难在javascript的基础上构造其他语言,并为之定制编辑器与调试器,这一点也许是javascript与lisp的相似之处。
需要澄清的是,用户有不言而喻的权利保存公开的Web资料,并自行管理。浏览器都支持下载文档,一些也支持离线浏览。(不幸的是,并非所有不言而喻的权利都被我们支持。)
另一个必须讨论的问题是网页script的权限,如读写本地文件、执行本地程序。Java Applet所采用的“同源”原则适用于此:Applet只能与自身所在的位置(网站)交互数据,而不能读取本地数据或者将数据发至其他网站。对于本地的网页与脚本,也可规定“源路径”并作类似限制。就像Java应用程序的权限配置一样,用户也可以通过配置文件或者浏览器自动弹出的授权界面增加本地网页或脚本的权限,如一个编辑器程序也可访问特定类型的源文件。浏览器平台授权的基本逻辑是,程序是用户的代理,可以为用户作任何需要的操作(如检查、索引其他网页);但另一方面,如果没有特别授权,程序只能代表自身。
Applet被禁止访问其他网站的原因之一是防止它代表用户滥用网络资源。浏览器对Web网页的限制似乎是单向的,即允许跨域发送数据,但不能跨域读取其他网站的数据(可以嵌入其他网站的图片、脚本等但无法解取)。这一限制似乎不合理地反了方向。Web网页的内容是公开的,跨域读取数据不会侵犯网站,但方便用户的浏览器程序对其他网站的内容作处理,如只显示用户需要的部分内容。确实可能出现一个网站的网页未经授权引用另一个网站的部分内容,但这很容易被检举,并且服务器端的引用是无法被浏览器禁止的。另一方面,用户允许将对某一网站的访问数据发到其他网站是对自身隐私的巨大侵犯。单独一个网站并不足以彻底分析用户,但如果所有被访问的网站都将用户的点击发至www.google-analytics.com,那么用户在Google面前就无隐私可言了(美国主要高校网页都包含对Google的引用)。这不仅是个人隐私的丧失,也是公司、学校、社会团体、乃至*部门隐私的丧失。就像支持“隐身”(incognito)浏览一样,浏览器也应当支持禁止网页访问不同网址,至少这么做需要用户授权。对隐私权的要求,以及对软件特性(如安装、升级方式,侵入性数据收集)的偏好因人而异。美国的两个大联锁书店的店名Borders与Barnes and Nobel似乎有这方面的暗示。
需要指出的是,操作系统如Linux也缺少足够的权限机制而应当改进。在Linux下应用程序自动获得了用户的代理资格(全部权限),而实际上它们应被限制在“源路径”、“源网址”或者指定的文件类型之内。此外,操作系统需要区分浏览器或是Java命令的权限,与一个网页或是一个Java应用程序的权限。值得一提的是Node.js,一个基于Google Chrome Javascript引擎的服务器端平台。它用来支持在浏览器外运行javascript程序,提供如文件系统访问与网络访问(包括web服务器)的支持。很显然,如果浏览器能够支持有充分授权的在本地运行的网页与脚本,Node.js并无必要。另一方面,Node.js也显然缺少Web页面这样的展示支持。
Node.js的一个优点是事件驱动的、非阻塞的IO模型,使之能高效运行。这是值得讨论的题目。Unix的shell程序用管道来表达数据的依赖关系,但并未给出方法表示对多个数据的依赖(即一个程序有多个管道重定向输入)。当程序依赖多个输入数据,而这些输入数据的生成没有先后顺序要求时,操作系统应能在某一个输入数据源受阻时首先获取其他数据,从而提高系统的效率。但如果缺乏这样的管道定义方法,用户通常依次生成所需数据,再交给程序处理,这就降低了系统的利用率。Node.js的异步事件驱动模型确实能够提高系统运行效率,它在获取依赖数据时不是依次完成,而是异步(并发)执行。不过,它并未给出像管道重定向那样的数据关系的清晰的表达。
实际上,类似的需要并行处理的场景有很多。例如,Asp.net在生成网页时,构成网页的多个控件可能依赖不同的数据输入(有的可能会调用Web Service),因而Asp.net可以不依次而是自行选择顺序来生成不同控件,最后再将它们合并。除IO阻塞之外,另一个影响并行处理的重要因素是程序或数据的共享。假设同时提交的多项数据要求中有一些用到同一个大的软件库,那么,加载这个软件库后首先生成与之相关的数据最为高效。不仅如此,Unix还有fork的概念,即一个进程在经过一段执行达到某一状态后,可以分出与之状态完全相同的子进程。不妨想像用相同命令行参数执行某一命令时,程序需要作相同的初始化。由于初始化需要代价,因而系统应当优化至能够共享(fork)初始化完成后的进程状态。由于计算机性能的指数增长,内存压力在很多情况下已不存在。不过,一些场合仍能成为测试性能的良好环境,如一个学校或大公司的众多用户通过X Window使用同一台Unix服务器运行各种应用程序。不同的技术环境能对计算机理论带来不同的挑战与机遇,这也许是“应用”(Application)一词的由来。印象里我是在96年首次接触Yahoo的网站,并在其中看到“What's cool”中cool一词代表“爽”的用法。
尽管Web应用程序的模式已非常普及,但并非所有程序都应当放到网上。例如,我正在写一个很基本的用Web浏览器浏览Java源代码、并支持类型链接及Javadoc链接的网页程序(已有的编辑器并不支持显示Javadoc文档与链接)。源代码显然应私下浏览而不应放到网上(配置Web服务器也很费事),但浏览器对本地网页的诸多限制(如查看其他frame中的文档内容,保存cookie等)带来很多麻烦(我目前使用--disable-web-security的选项)。实际上,Web页面为其他程序提供了很方便的用户界面,浏览器应支持与本地程序的交互。HTTP协议本身高度模拟Unix环境中的命令执行:query string代表命令行参数,而post数据则代表标准输入。这里再介绍一个可能的软件平台——操作系统桌面的文件管理器。复杂的数据关系常可以映射为文件夹,例如,学校的课程列表是一个文件夹,里面是代表每门课的子文件夹,各课程文件夹里又有说明文档,学生及成绩列表等文件;另一方面,每个学生也有单独的文件夹,其中有个人信息的文档,及所选课程与成绩的列表。当一个文件夹包含另一个文件夹的内容时(如学生文件夹包含课程),既可以直接将其放入,也可以使用链接。不同类型的文件可被绑定到不同的编辑器,如编辑学生信息与编辑课程信息使用不同的编辑器,编辑器可以内嵌入文件管理器。文件夹也可支持用不同方式显示其中内容,如将内容显示为图标,或是列表。文件夹也可以有定制的显示方式,将其子内容用更好的方式呈现。这可能是index.html标准名称的由来。(Microsoft Office中OneNote被用作文件夹与其他文档的整体呈现。)
将数据关系映射为文件夹系统与所谓的RESTful概念是相通的,后者用uri代表资源,并且强调客户端不必知道资源的内在含义就可以不加修改地为不同资源服务。为了让用户能通过文件夹操作资源,软件平台需要支持将数据关系映射为文件系统。这种映射可能是真实映射(Unix mount),也可以是实现一个文件服务器。例如,如果能为数据系统提供FTP文件服务,那么多数操作系统的文件管理器就能直接访问它;如果能将其映射为HTTP结构,那么Web客户端可以方便地访问它。将数据映射为本地的网络文件服务也是可能的,Unix系统中支持Windows网络文件服务的标准软件叫作Samba。
作为总结,我在此处也谈论一点个人观点。在生产力高度发达的现代社会,社会的资源应当保障所有人的基本收入水准(如每个求职者都必须无条件地很快找到工作),并鼓励*的选择与才能的发挥,而不是在固定的轨道上工作。公司的员工(如程序员)应当自然获得在职的学习与培训,学习的内容必须有清晰的概念,而非教训(很多学习、包括书籍实际上是虐待)。公司或社会群体必须有自己的知识库及研发,并且珍视知识的积累及成员素质,因而必须保障它们的隐私。应当鼓励不同软件产品的竞争,鼓励公司管理者自行选择软件(中国开奥运会是在2008年)。*的选择与才能发挥并不一定指IT行业的创新,学生使用Microsoft OneNote管理自己的笔记与文档、或者公司员工用Microsoft Excel管理各种记录,都是很好的能力考验。(实际上,收拾得干净有条理是重要的考评依据。对包括支票在内的纸质文档避而远之、并且采用固定的管理软件,剥夺了员工在这方面发挥才能的机会。)Microsoft的产品并不完善(如Excel不能自动根据标签计算总额),这为次生产品与服务、以及竞争性的产品留下了空间。学生与在职员工必须有能力支付购买软件、音乐、电影等,而不是牺牲隐私享受福利性的在线服务。