选择工具

作者:Reuven M. Lerner

如果有人问你市场上最好的汽车是什么,你可能会告诉他们答案取决于谁将使用这辆车。毕竟,一个住在曼哈顿的八口之家可能需要与一个住在北达科他州乡村的单身黑客不同类型的车辆。编程语言和开发工具包也是如此。每种语言和工具包都有其用武之地,并且适用于解决不同类型的问题。

尽管这似乎是显而易见的,但许多程序员认为他们使用的语言或工具包非常优秀,应该用于解决所有问题,始终如此。正如老话所说,如果你唯一的工具是锤子,那么每个问题看起来都像钉子。没有哪种编程语言最适合所有问题,这就是为什么经验丰富的程序员知道并使用多种语言,并且不断学习新的语言。

直到几年前,程序员主要关注优化程序的运行速度和内存使用率。毕竟,处理器相对较慢,而且 RAM 相当昂贵,因此任何没有尽力榨干硬件性能的程序都被视为臃肿软件。

然而,今天,我们很幸运拥有廉价、快速的计算机和廉价、充足的 RAM。这意味着软件工程师可以而且应该使用鼓励快速开发和长期程序维护的语言。我并不反对优化程序的运行速度或内存使用率,但它们不如快速、轻松地创建稳定、可维护的软件重要。

大约两年前,我决定用一个长期的专栏系列来专门介绍四种基本的 Web 开发技术:mod_perl/Mason、J2EE、Zope 和 OpenACS。这些技术不仅有趣且实用,而且还发人深省,为 Web 开发人员提供了新的视角和想法。尽管这些社区之间偶尔会就哪个产品更优秀而争论不休,但事实是,每种产品都试图解决略有不同的问题类型。

本月,我们将花一些时间总结一下我们在过去几年中探索过的思想和框架。我不期望每个阅读我专栏的人都会立即跳到使用我在这里列出的所有技术;但是,我确实希望为即使是最顽固的爱好者提供一些思考的食粮。

mod_perl/Mason

Apache 理所当然地成为开源运动的代表之一。它可靠、高度可配置、文档齐全、稳定且可扩展。您可以使用 Apache 做令人惊叹的事情,并且可以通过多种方式自定义它以满足您的需求。如果您正在编写一个必须尽可能快速执行的 Web 应用程序,您可以使用 C 语言编写一个新的模块,该模块可以无缝地挂钩到 Apache 中。

尽管 C 程序执行速度很快,并且 Apache 库(现在称为 Apache Portable Runtime)为模块作者提供了大量有用的基础设施和支持,但使用 C 语言进行开发比使用 Perl 或 Python 等高级语言更慢且更容易出错。因此,毫不奇怪,有一些 Apache 模块将这些语言嵌入到 Apache 服务器内部。mod_perl 允许您使用 Perl 而不是 C 语言编写 Apache 模块,从而为您提供对服务器的几乎无限的控制,并兼具 Perl 的速度和灵活性。

实际上,每当有人要求我创建一个高性能的 Web 应用程序,尤其是涉及文本处理或关系数据库的应用程序时,我都会想到 mod_perl。我可以用 C 语言编写模块,但何必呢?有时用 C 语言编写代码是有意义的,但我通常发现 mod_perl 对于即使是高性能应用程序也足够快。

当然,当平面设计师进入现场时,mod_perl 的奇妙之处在某种程度上会减弱。设计师对在他们想要更改给定页面上的样式(或内容)时修改程序代码没有任何兴趣,并且让他们访问 Perl 模块的源代码简直是自找麻烦。因此,有数十种不同的模板系统可用,每种系统都允许您以略有不同的方式混合 Perl 和 HTML。其中最受欢迎的之一是 Mason,它多年来一直被用于大量的重型发布站点。

Mason 确实是一个很棒的工具,它在快速开发(感谢 Perl)、易于维护(感谢 Mason)和快速执行(感谢 mod_perl)之间提供了出色的权衡。Mason 电子邮件列表是获取有用信息和支持的来源,并且软件包维护者在随着时间的推移稳步改进它方面做得非常出色。配置、使用和调试现代版本的 Mason 使我几年前首次使用的版本相比之下显得原始。

与此同时,Mason 是一个用于创建您自己的应用程序的基础设施和框架。诚然,您可以轻松使用 Apache::Session 来生成 cookie 并将用户与唯一 ID 关联起来,但是任何与用户注册、组和权限有关的事情,更不用说功能齐全的应用程序了,都需要您自己负责实现。对于某些项目来说,这很好,因为它为您提供了可能需要的灵活性。但是,当您第五次发现自己正在创建一个用于创建和管理用户、组和权限的系统时,您可能会认为您需要一些具有更多基础设施的东西。

Java 和 J2EE

Sun 多年来一直大力推广 Java 作为服务器端解决方案,而 J2EE(Java 2,企业版)是旨在帮助开发人员创建此类解决方案的各种技术的总称。Servlet 是在服务器上执行代码的类;JavaServer Pages (JSP) 是 Java/HTML 模板,它们在运行时被编译成 Servlet。JDBC 允许您访问数据库,而 Enterprise JavaBeans 为您提供事务和自动关系到对象的映射。进入 Java 世界需要学习大量的首字母缩略词和技术,以及学习不同标准的各种版本。

自从 Java 首次发布以来,我一直在不同的时间使用它,几乎每次,我都发现自己想要对它感到兴奋,但却无法做到。Java 本身并不差,它带来的不同技术都相当令人印象深刻。Servlet 很容易编写;JSP(尤其是您可以为 JSP 创建的自定义标记)是一个成熟且令人印象深刻的模板系统,JDBC 提供了您在数据库接口中可能想要的一切。尽管 EJB 对于大多数项目来说无疑是过度的,但它对于 Sun 正在瞄准的大型企业开发团队来说非常有用。此外,包括优秀的开源应用服务器和工具在内的多种实现方式令人印象深刻且令人鼓舞。

实际上,Java 似乎是 Web 开发界的“大公司”。它可靠地完成工作;它拥有庞大的人才库可供支配,并遵循大量的标准;大量的开发工具可用,并且很多人都在使用 Java。但是,与 Java 项目相关的开销对于我来说太大了。仅仅学习哪个版本的哪个标准与哪个版本的 Jakarta 子项目相匹配就可能花费相当长的时间。正如在小公司工作通常比在大公司更有趣一样,我发现用 Perl 或 Python 编程比用 Java 更有趣。

此外,J2EE 也存在与我描述的 mod_perl 和 Mason 类似的问题,即它纯粹是基础设施,没有关注内置应用程序。开发人员可以创造出令人惊叹的东西,但必须为每个项目重新发明轮子。

也许我对 Java 世界最喜欢的部分是对可维护和可靠软件的关注。大量的测试和开发工具,如 Ant、Cactus、JUnit 和 log4j,使程序员有可能(甚至相对简单)在软件发布之前创建和管理对软件的全面测试。

那么,Java 是 Web 开发的好选择吗?我认为,您的项目越大,您就越应该认真考虑 Java。但是对于小型商店处理的典型基本 Web 应用程序来说,与开发相关的开销太大了,不容忽视。

Zope

Zope 清楚地证明了开源软件不仅仅是模仿其专有竞争对手。Zope 将对象数据库与多协议服务器相结合,并通过一组丰富的对象和一个简洁的基于 Web 的管理界面将它们连接在一起。Zope 具有创新性、巧妙性,使用起来令人愉快,并且是少数几个为最终用户而设计的开源项目之一,而不仅仅是黑客。平面设计师喜欢听到他们可以使用基于 Web 的管理界面中的撤消功能来恢复到文档的任何先前版本。

Zope 有许多编程接口,每个接口都在简单性和功能之间进行权衡。您可以创建简单的 DTML 模板和 Python 脚本,使用引人入胜的 ZPT 模板来完全分离程序和显示逻辑,或者您可以全力以赴并创建一个新的 Zope 产品。Zope 产品是真正力量所在,并且由于每个产品都是一个类,因此您可以在不同的 URL 上创建产品的多个实例。由于对象除了其原生对象层次结构之外,还通过 URL 层次结构(获取)继承,因此产品实例的权限、行为或外观可能会根据其 URL 而有所不同。

到目前为止,听起来 Zope 似乎是自 HTTP 以来 Web 发生的最好的事情。实际上,越来越多的 Zope 黑客意味着大量的免费下载产品,以及越来越多的使用 Zope 作为其底层基础设施的商业产品。

然而,Zope 也有一些问题,第一个也是最大的问题是学习曲线可能相当陡峭。即使您是一位经验丰富的 Web 开发人员,Zope 也要求您从头开始重新学习几乎所有的概念,改变您多年来养成的几乎所有习惯。这不一定是一件坏事,因为 Zope 将其实现得非常好,但这可能是一个惊喜,也是一个值得警惕的原因,仅仅是因为使用 Zope 不可避免地会在初始启动期间减慢速度。

我对 Zope 的另一个问题是它的对象数据库。对象数据库在历史上有很多问题,而 ZODB 似乎正在很好地打破这种趋势。与此同时,关系数据库仍然非常标准,人们期望(并且经常需要)使用它们。理论上,这不是问题。Zope 内置的 ZSQL 方法允许您在无需过多思考的情况下,使用关系数据库查询做令人着迷的事情。问题是,您的数据分布在两个不同的位置:ZODB 和您的关系数据库。我喜欢将我的所有数据保存在一个中心位置,这意味着这种分离可能会让我有些沮丧。

还有速度问题。Zope 复杂的权限和获取机制可能比您或我可以自己实现的要快,但它仍然可能相对缓慢。Zope 针对此问题的官方解决方案是 ZEO(Zope 企业对象),它允许多个 Zope 服务器访问单个对象数据库。这显然可以扩展到每天一百万次点击,这对于我工作的大多数站点来说已经足够了。但是,超大型站点可能需要担心 Zope 的运行速度,或者考虑为中央 ZODB 服务器投资一些高端硬件。

最后,Zope 产品往往相对独立。好消息是,这允许开发人员并行工作,而不会互相拖累。坏消息是,事物不像它们可能的那样统一,存在重复的功能和缺乏协调。这在如此规模的开源项目中可能是不可避免的,但有时会令人沮丧。

在过去一两年中,Zope Corporation 一直在推动使用 Zope 进行内容管理,而不是用于应用程序开发。当然,任何体面的内容管理系统都需要根据客户的需求进行修改和重新编程,因此差异并不那么明显。尽管 Zope 不是市场上唯一一款开源内容管理系统,但它无疑是最复杂、最成熟的系统之一。

在我自己的工作中,我向那些项目将涉及大量棘手开发、需要相对易于使用的界面或需要内容管理的客户推荐 Zope。我继续对它印象深刻,并期待在未来几年与 Zope 进行大量合作。

OpenACS

OpenACS 最初是一个用于社区网站的复杂数据模型,以及大量用 Tcl 编写的 Web/数据库模板。随着时间的推移,它已发展成为一个更大的项目,具有许多方面:可以升级程序和数据模型的独立软件包、与 Oracle 或 PostgreSQL 无缝协作的能力,以及将程序与 HTML 输出分离的复杂模板系统。而且,OpenACS 配备了大量的预构建应用程序,可以完成您为社区网站想要做的一切,从网络日志到论坛和常见问题解答,再到电子商务商店。仅需您的 Web 浏览器,您就可以在很短的时间内创建一个站点。

实际上,我发现自己一次又一次地向希望创建在线社区、联系其成员、在成员之间进行讨论或轻松宣传信息而无需了解太多技术知识的非营利组织推荐 OpenACS。

话虽如此,OpenACS 也有一些问题。首先也是最重要的是学习曲线。Zope 的学习曲线很困难,因为有很多技术需要理解。OpenACS 有一个更简单的模型,但它将所有内容都存储在关系数据库中。这意味着数据都集中在一个地方,但关系数据库在处理层次结构方面出了名的糟糕,世界上所有聪明的 OpenACS 开发人员都无法掩盖这一点。

因此,学习使用 OpenACS 需要您学习如何实现一个简单的对象继承系统以及允许您执行此操作的广泛 API。如果您从未编写过存储过程或使用包含数十个或数百个表的数据库,那么您可能会被使用 OpenACS 所需的知识所淹没。

OpenACS 还存在开发人员文档很少,最终用户文档没有的问题。不可否认,OpenACS 是一个复杂的系统,可能难以向非技术人员描述,但找不到任何帮助文档可能会令人恼火。值得称赞的是,主要的 openacs.org 站点在我撰写本文之前不久进行了重新设计和重写,并且似乎在这个方向上取得了一些积极进展。

最后,我发现有些讽刺的是,OpenACS 随着时间的推移变得越来越慢。诚然,这是因为最新版本(截至本文撰写时为 4.x)在用户、组和权限方面比其前身更智能,并且每次 HTTP 请求都检查这些内容需要时间。此外,开发人员知道仍然可以进行许多优化,这样每个请求就不需要那么多数据库查询。

结论

在我撰写本文的前几天,Web 上出现了一份新报告,描述了 Yahoo 如何确定 PHP 作为 Web 编程环境。我个人更喜欢使用其他语言工作,并且不愿意用一种新语言重写所有 Yahoo。但对于 Yahoo 的特定需求而言,PHP 似乎确实是一个不错的选择。我赞扬他们考虑了所有选项,权衡了优缺点,并得出了一个符合他们需求的结论。

正如我在本文开头所说的那样,我坚信找到一种满足手头问题需求的技术。作为一名开发人员,这意味着我不断被迫学习新的语言、技术和技巧。与此同时,这意味着我的客户可以获得适合他们问题的解决方案,并且我作为一名软件工程师获得了更广泛的技能和深度。

这些系统通过互联网免费提供的事实意味着,阻止您尝试它们的唯一因素是时间和一些努力。我强烈建议您抽出时间来使用它们;您和与您一起工作的人无疑会享受成果。

资源

电子邮件:reuven@lerner.co.il

Reuven M. Lerner 是一位专门从事 Web/数据库应用程序和开源软件的顾问。他的著作《Core Perl》于 2002 年 1 月由 Prentice Hall 出版。Reuven 与他的妻子和女儿住在以色列的莫迪因。

加载 Disqus 评论