移植的政治
在过去八年中我工作过的每家公司,我都以某种身份引入了 Linux。这通常看起来是显而易见的选择,但对我和其他同事来说显而易见的事情,对其他人来说却并非如此。有些人需要被说服,才会接受在他们看来非常规的解决方案。在大多数情况下,基准测试和成本因素足以扭转局面。对于另一些人来说,新颖性和对新思想的开放性就足够了。但是,对于顽固的少数人来说,什么都无法说服他们。尽管他们参与了辩论,但在他们看来,讨论似乎只是一种避免实施的策略。
面对这样的反对,争论是毫无意义的,演示是浪费时间。在这些情况下,需要采取其他策略。在这里,我描述了我是如何在管理层反对派不知情的情况下,说服我的雇主将公司的旗舰应用程序移植到 Linux 的。
1998 年,我是一家名为 Constellar Ltd. 公司的 UNIX 和 Oracle 管理员。他们专门为全球 2000 强公司提供数据迁移和企业应用集成 (EAI) 解决方案。这意味着什么?最简单地说,这可能意味着转换旧式大型机数据库中的数据,以便插入到新准备的数据库中。此类任务本质上是重复且耗时的。它们是自动化的理想候选者,而这正是 Constellar Hub 的用武之地。
在世界不同地区增加几个办事处,为客户数据、仓库库存和订单跟踪添加更多数据库,并想象如何使这些各种数据存储和应用程序无缝协同工作。考虑到实时环境和一家依赖准确可用数据的公司,您开始了解任务可能变得多么复杂。
主要应用程序是一个名为 Constellar Hub 的客户端服务器,它旨在从不同的来源提取数据,进行处理、筛选和集成,然后将转换后的数据写入或流式传输到其目的地。
服务器依赖 Oracle 数据库来存储传输中的数据,以及业务规则、数据类型定义以及各种数据源和目的地之间关系的元数据。
组合的瞬态数据和元数据存储在 200 多个数据库表中,其中包含许多触发器和约束,以强制执行数据在应用程序内部流动时的完整性。应用程序引擎主要由 C 和 SQL 代码组成,但 API 提供了在需要时扩展功能的机会。
在一个大型项目中,可能需要两个或多个 Hub 服务器,有时位于世界各地的远程站点,通过帧中继或不太可能的互联网馈送或被馈送数据。通常,一个平均项目将处理数百兆字节的数据,并且通常会定义数百、数千或更罕见的数万条业务规则。
在许多情况下,整个项目(Hub 只是其中的一部分,尽管是核心部分)将耗资数百万美元,并涉及数十名技术和业务人员。
潜在客户将获得在该工具在测试数据上运行的相对简单的演示,通常在 Sun 硬件上。该服务器已移植到 UNIX 的各种其他变体,包括 Dynix、Data General UNIX、AIX 和 Digital UNIX。
大约在同一时间,Windows NT 也被宣传为一种企业级操作系统,注定要在以前被认为是 UNIX 专属领域的许多领域中取代 UNIX。事实上,我们的工程副总裁深信未来是微软的,并告诉我们。他说,将来,我们的大部分销售额(如果不是全部)将来自 Windows NT 版本的 Hub。作为第一步,他们已经在开发 Windows NT 端口,并在 1998 年 2 月宣布了 Beta 版本。这种观点是可以理解的,因为 Windows NT 主机与各种 UNIX 平台的成本相比,往往只突出了 UNIX 解决方案的费用。Linux 注定要改变这一切。
那时,我已经在我所有的家用 PC 以及我的工作站上使用 Linux。我还密切关注 Linux 的发展,特别是任何可能影响 Linux 在企业工作场所采用的因素。像许多其他 Linux 倡导者一样,我看到了一个计算未来的可能性,这个未来可能不会局限于一家公司强加给受众客户群的产品,我想知道 Constellar Hub 是否可以移植到 Linux。
但是,有两个问题。首先,Hub 广泛使用了 Oracle 数据库和特定于 Oracle 的功能,将这些依赖项移植到 Linux 友好的等效项将是一场噩梦。其次,更难克服的障碍是,公司中的一些人并不倾向于看到 Linux 端口带来的机遇。
我曾隐约向一两位中层管理人员建议,或许应该有一个 Linux 端口,但我收到的回应是,Linux 对于一群业余爱好者来说是一个了不起的产品,但它还没有完全准备好进入大型联赛,而且公司负担不起移植到 Linux 的时间和费用,因为还有重要的业务要处理。从那以后,我多次听到这种论点,并了解到这在很大程度上是为不思考找借口。
两件事改变了游戏规则的性质。首先,在 1998 年 9 月,拉里·埃里森 (Larry Ellison) 适时地宣布,Oracle 将发布其数据库服务器的 Linux 版本,并免费下载用于开发用途。这产生了双重影响。它表明一些非常大的公司正在认真对待 Linux,同时,它使 Constellar Hub 的 Linux 端口成为可能。
我决定,如果我无法说服他们移植 Hub,我就自己做,所以我复制了 Hub 源代码,并着手提供概念验证。我认为这要么会让我被解雇,要么会造成既成事实,让那些反对者无法辩驳。
此时我应该说“不要做我做过的事”。未经许可复制雇主的源代码是违法的,如果一切都搞砸了,您很可能会发现自己面临诉讼,但有时严峻的情况需要采取极端的解决方案。
1998 年 11 月下旬,我签出了一整套源代码,并连同新下载的 Oracle 8.0.4 副本,我在家里的 PC 上设置了开发环境;使用来自 Solaris 开发目录的未经编辑的 Makefile,我运行了make。毫不奇怪,一切都乱成一团,抛出了一页又一页的编译错误。
我每天晚上花一两个小时来逐步检查错误并进行调试。那些我不理解的错误,我会向 Constellar 的高级 UNIX 开发人员之一 Richard Glover 提出。他也是 Hub 各种 UNIX 版本的发布经理,所以他是值得认识的人。
大多数问题都围绕 Oracle ProC 预编译器,它无法识别某些特定于 Linux 的指令,例如 Linux 头文件中的 include_next 语句。这可以通过复制相关文件、剥离#include_next语句并首先将我们自定义版本的这些文件的位置放在包含路径中来解决。
库路径也存在各种问题。这些问题微不足道,仅与我家用 PC 上的设置有关。通过向 LD_LIBRARY_PATH shell 变量添加条目(就像在 Solaris 中一样)来解决这些问题。我当时使用的 Red Hat 副本中缺少一些宏定义——ULONG_MAX、INT_MIN、INT_MAX、LONG_MAX。我从相关的 Solaris 头文件中复制了它们作为临时修复。
我留下了一些小问题未解决,因为我的资源有些有限。例如,Hub 需要连接到许多不同的数据源,其中一些数据源需要使用 IBM MQ 系列库,而我当时没有这些库。无论如何,我没有在家测试此类功能的条件。我编辑了主 Makefile 以禁用这些库的链接,并接受我的 Hub 版本将是一个轻量级、更动态的 Hub。如果它能编译通过,我就很高兴了。
通过编辑脚本以反映特定实用程序的正确调用,解决了一些在 Linux 版本中发现的各种实用程序中的差异。我解决了其中一些问题,并忽略了其他问题以节省时间。Richard 稍后会追踪所有这些问题的根源,并在工作场所官方构建环境中各种构建脚本的平台特定部分中考虑到这些问题。需要更改标准构建脚本的实用程序包括各种编译器和链接器标志。我们有义务为官方 Solaris 构建使用 Sun 编译器,因此移动到 Linux 和 GCC 需要在标志和开关方面进行一些转换。df、shell 内置 echo 命令、ftp、ldd、mknod、nm、ps 和 lex/yacc(用于专有的转换定义语言)的调用都需要更改。
正如 Richard 几周后指出的那样,bash 中的 set -o posix 选项几乎解决了所有 shell 脚本差异,而且在任何情况下,命令行差异都非常微不足道,解决方案也很明显。在某些情况下,这只是提供 Berkeley 版本的实用程序而不是 System V 版本的实用程序,反之亦然。今天的情况会有所不同,因为 Linux 上许多标准的 GNU 实用程序现在都作为标准包含在 Solaris 中,因此两者之间的移植变得更加简单。
总而言之,获得一个粗略的端口,其中包含至少看起来像可执行文件的二进制文件,可能花费了大约两天的人工。
我已经有了一个二进制文件,现在我需要测试它。我签出了工作中每日冒烟测试中使用的一套测试脚本和数据。在设置冒烟测试的环境变量后,我启动了测试工具。
通常的冒烟测试包含 200 多个事务,在其他平台上,UNIX 版本需要 6 个小时到 Windows NT 版本需要 24 个多小时不等——这在测试每日构建时并不好。我在我自制的 Linux 端口上运行了测试,在一两分钟内,屏幕上就滚动显示了错误。灾难。我检查了错误日志,但它们毫无帮助。由于某种原因,日志没有为最初的几十个事务提供任何诊断信息,这让我感到困惑。
花了一段时间才弄明白,最初一组事务的错误日志中没有诊断信息的原因仅仅是因为 Linux Hub 已经成功运行了最初的几十个事务!这最初很难相信,因为同一组事务在 Hub 移植到的大多数其他平台上运行的时间要长得多。这意味着,我粗略的自制 Linux 版本的 Hub,在未经优化的情况下,在我家里的 PC 上已经比某些其他 UNIX 端口更快,并且比 Windows NT 端口快几倍。即使考虑到运行这些不同端口的硬件规格之间的差异,它看起来也不错。
我确信,如果这些结果可以在工作场所重现,就必须有一个官方的 Linux 端口。
我之前曾向我接触过的中层管理人员建议将 Hub 移植到 Linux,但得到的反应并不热烈,因此我决定这次采取不同的策略。
其他人也表示有兴趣了解更多关于 Linux 的信息,因此在几个月前,我们成立了一个公司 Linux 用户组,在公司邮件服务器上有一个邮件列表,每周举行一次会议讨论技术。我让其他成员——Ngozi Mayo、Anthony Durity 和 Olusola Ojeje——知道了我一直在做什么,他们提供了有用的反馈和建议。
经过一番思考,我意识到我不知道高级管理层中是否有人会支持 Linux 端口的想法。我决定给他们所有人以及董事会成员发送电子邮件,并希望他们中的某个人会感兴趣。
我计划以新闻稿的形式宣布 alpha 端口,看看这是否会让我被解雇。我写了一份带有若干要点的发布稿草案,并提交给 LUG 成员审查。我根据建议进行了更正,简化了公告,并缓和了语气,然后我发出了修改后的发布稿,等待回复。
在 1999 年 2 月 26 日,我在我的新闻稿中指出,该端口没有花费公司任何费用,Linux 端口运行冒烟测试的速度比 Windows NT 版本快几倍,并且至少与其他 UNIX 端口一样快,企业软件的 Linux 端口呈上升趋势,现在 1999 年是加入的时候了。我要求公司提供硬件以支持官方公司 Linux 端口,并将其定义为三级平台以赋予其官方地位。IDC 的引言强调当年 Linux 销量增长了 212%,企业市场份额为 17%,这有助于震惊那些自满的人。对于许多电子邮件收件人来说,这些事实和数据令人震惊。
这封电子邮件立即引起了反响和广泛的讨论。有些人发来祝贺,另一些人则推测可能的营销角度。一位高级销售咨询经理质疑是否有必要开发 Linux 端口,他指出,在过去的两年里,没有一位客户提出过这样的要求。如果这种态度盛行,我们仍然会骑着马车兜风。有人建议“企业交易是在企业平台上达成的”,但没有解释为什么 Windows NT 是“企业”平台,或者 Linux 不是。其他人不太了解 Linux 是什么,LUG 尽力解释。
最终发言权归我们的 CEO Nic Birtles 所有,他被证明既有洞察力又令人鼓舞。在他对正在进行的辩论的简洁电子邮件回复中,他只是询问了需要做些什么才能宣布 HUB 的 Linux 版本。辩论结束。
我们获得了用于专用 Linux 开发机器的硬件,并且 Linux 端口成为官方的三级平台。仅仅为了证明一个观点而制作了一个粗略的端口后,制作一个强大的 Linux 二进制文件的任务交给了 Richard Glover。
一切都平静了一段时间,然后有一天在 1999 年 5 月初,Richard 悄悄地顺便提了一句,Linux 端口在前一天晚上的通过率为 100%,并且只用了五个小时就完成了。好消息。Windows NT 版本需要多长时间?在顺利的情况下需要 15 个小时,尽管有些晚上该过程不得不被终止,因为一天的时间不够用。
为管理层和高级职员准备并发送了另一份内部新闻稿,以宣布 Beta 版本和惊人的测试结果。它引起了广泛的评论,包括正面和负面。在后者中,我们的欧洲营销总监在她的电子邮件中对双方都表示赞赏:“干得好”,但随后又说我们不想成为 Linux“领域”的开拓者,无论 Linux 端口的运行速度比任何其他端口都快,并且比 Windows NT 版本快三倍。幸运的是,大多数反应都更加积极,最重要的一次,CEO 的反应既祝贺又有所帮助。他建议 Linux 端口现在可以成为与 Windows NT 和其他 UNIX 并列的二级平台。只有 Solaris 和 AIX 是一级平台。
到 1999 年 7 月,Linux 端口已添加到官方应用程序 CD 中。
当我们在 CD 上发布 Constellar Hub 的官方 Linux 版本时,25% 的英国员工加入了 Linux 用户组,而 Linux 反对者则是一小部分沉默寡言的少数派,他们将自己的想法藏在心里。
Constellar Hub 随后被 Data Mirror 收购,后者继续提供和支持 Linux 版本,该版本目前为 3.8 版。感谢一点游击移植和一个在看到划算交易时心知肚明的 CEO,这款 Linux 应用程序最终得以公之于众。
那么,为什么在如此具有启发性的基准测试面前,说服某些人如此困难呢?移植的成本接近于零,性能优于几乎所有其他端口,并且生成的 Linux Hub 非常稳定。
我认为这个问题的答案取决于相关个人的性格。似乎有两种人参与了这场辩论,尽管每个人都可能接受论证,但他们的本能使他们倾向于支持特定形式的软件解决方案。
一组人更喜欢清晰而严格的等级制度。他们想知道他们对谁负责,谁对他们负责。他们希望一个组织提供一个解决方案,并希望摒弃其他选择。他们尊重占主导地位的参与者,无论他是谁。他们对循规蹈矩感到自在,并希望你也循规蹈矩。
另一方面,第二组人重视选择自由。他们往往不会将任何事物视为理所当然,在考虑产品时希望了解其内部结构,并且始终准备好考虑替代方案。他们当然不想被人告知该怎么做,但乐于接受论证和辩论。
这两组人可以分别被称为狗和猫。狗听从主人的声音,保卫自己的领地和主人的领地。他们知道自己的位置和你的位置,并且希望保持这种状态。
第二组是猫。他们不认识主人,更不用说主人的声音了。他们的领地没有限制,他们活动范围很广。他们好奇,寻求新的牧场,并且对不熟悉的事物感到自在。
下次您在工作场所引入 Linux 时遇到问题,您遇到的阻力可能与正在讨论的软件的优缺点无关。这可能仅仅是因为您是一只酷猫,试图说服一只老狗学习新把戏。
Stephen C. Forster 在 IT 行业工作了九年,主要担任 UNIX/Linux 管理员,尽管他必须编写代码并管理 Oracle 数据库。在另一种生活中,他还曾在军队服役,并拍摄了阿富汗战争的新闻片段。可以通过 steve@kidik.net 与他联系。