2004,语言开始变成工具箱
原创 · 约 25 分钟阅读 · 阅读 --

2004,语言开始变成工具箱

作者: 字与码


古董级程序员,大厂出来后一直在创业公司,现在仍活跃在一线做 AI 相关的开发。这个专栏会慢慢写从 1990 年代到今天的 IT 变化,也会夹带一些自己的旧事。更完整的更新写在微信公众号「字与码」,若觉得这些回忆和观察对你有用,欢迎顺手关注。

前几篇写到 2001 到 2003 年,国内 Linux 公司最热闹的那一段时间。那时候谈 Linux,谈桌面,谈自由软件,谈国产操作系统,很多话题都有一点理想主义的光。到 2004 年,气氛开始变得不一样。

不是理想消失了,而是系统变重了。

浏览器不再只是打开网页的工具,Web 应用开始有了桌面软件的野心;搜索引擎不再只是一个入口,开始变成广告、数据和基础设施的中心;开源也不再只是“能不能替代 Windows”,而是进入服务器、开发工具、语言生态、桌面发行版和社区协作的细枝末节。

这一年我仍在那家做 Linux 的公司。日常工作并没有一条特别整齐的主线:有时是 Perl 处理日志和文本,有时是 PHP 做内部系统,有时是 Java 做更重的业务模块,有时是 Shell、Makefile、配置文件和各种脚本把系统粘起来。Python 也开始进入我的工具箱,但那时还远不是后来那个无处不在的 Python。

回头看,2004 年给我留下的一个很深印象是:编程语言不再只是“我喜欢什么语言”,而是“这个活用什么最快、最稳、最容易交出去”。

那时的程序员,身边常备一只工具箱

今天说“全栈”,大家很容易想到前端、后端、数据库、云服务、CI/CD、监控和一大堆框架。2004 年当然没有这么标准化的说法,但工程现场已经有类似味道了,只是更粗糙。

一个 Linux 公司里的开发任务,很少只停留在某一种语言里。

要处理大量配置、日志、文本文件,Perl 很顺手。它的语法今天看起来有点像密电码,但在那个年代,能用几行脚本把一堆文本翻来覆去地处理干净,就是非常实用的能力。很多系统管理员、后端开发、运维人员都会留一把 Perl 在身边。

要做内部网站、论坛、后台页面,PHP 很自然。安装门槛低,部署直接,和 Apache、MySQL 搭在一起,几乎就是当时很多中小型 Web 系统的默认组合。我之前在公司内部用 Perl 做过论坛,后来看到越来越多的 Web 工具转向 PHP,会感觉这种变化不是因为 PHP 多么优雅,而是因为它足够贴近需求。

要做更重的服务、接口、企业级系统,Java 的位置越来越明显。J2EE 那一套在今天看起来有些沉重,可在当时,它代表着“正规军”:分层、组件、容器、规范、可维护性、团队协作。很多项目一旦进入企业客户现场,Java 的存在感就会变强。

Shell、Makefile、配置模板、启动脚本,则像空气。没人会在简历上把它们写得特别显眼,但没有它们,系统根本跑不起来。很多时候,真正把一套 Linux 产品从源代码变成可交付系统的,不是一段华丽的业务代码,而是一堆朴素、脆弱、但又非常关键的脚本。

Python 当时对我来说还不是主力,更像是一种清爽的新工具。它比 Perl 更容易读,比 Shell 更适合写复杂逻辑,比 Java 更轻。那时还没人会说“Python 是 AI 时代的基础语言”,但它的气质已经很明显:语法干净,写脚本舒服,处理工程杂事不费劲。

但如果只写 Perl、PHP、Java、Python,也会把那段经历写轻了。那几年我也写 C。不是课堂上的 C,也不是练习题里的 C,而是给真实系统打补丁的 C。

我给 Samba、AppleTalk 相关的东西打过 patch。Samba 解决的是 Linux/Unix 和 Windows 文件共享之间的互通问题;AppleTalk 则是苹果早期网络协议栈里的老东西,后来越来越边缘。最近几年,AppleTalk 相关代码从 Linux Kernel 中被移除,也算给这一类上世纪网络协议画了一个句号。现在回头看,这些工作没有 Web 产品那么显眼,却很能说明当时 Linux 公司面对的真实世界:客户环境复杂,异构系统很多,文件共享、网络协议、老设备兼容,都是产品能不能落地的一部分。

2004 年的老协议兼容和 C patch

2004 年的语言工具箱

后来我越来越不爱参与语言之争,大概就和这一段经历有关。真实项目里,语言不是旗帜,是扳手、螺丝刀、电烙铁和万用表。你当然可以喜欢其中某一件,但系统坏在那里时,先把活修好。

Gmail 出现后,浏览器不再只是浏览器

2004 年 4 月 1 日,Google 发布 Gmail。因为日期太像玩笑,很多人一开始以为这也是一个愚人节产品。结果它不是玩笑。

Gmail 最刺激人的地方不只是 1GB 邮箱容量。更重要的是,它让很多人第一次意识到:浏览器里的应用可以不再像“点一下、刷一页、再点一下、再刷一页”的传统网页。邮件搜索、会话组织、快捷操作、异步交互,这些东西把 Web 应用的体验往前推了一大截。

那时还没有今天这样成熟的前端框架,也没有“SPA”成为日常词汇。可 Gmail 已经让人看到,浏览器可以承载更复杂的交互。几年后 AJAX 这个词变热,Web 2.0 成为流行标签,很多东西都能在 2004 年看到影子。

对程序员来说,这意味着 Web 不再只是页面拼装。后端、前端、数据、缓存、异步交互、用户体验,会越来越纠缠在一起。语言工具箱也因此变得更复杂:PHP 可以快速出页面,Java 可以撑住大系统,脚本语言可以清洗数据和跑任务,浏览器端的 JavaScript 也从“小玩具”慢慢变成绕不开的主角。

我在 1997 年用 JavaScript 写过一只在页面上飞的蝴蝶。那时的 JavaScript 更像浏览器里的小魔术,还要小心不同浏览器标准不一致。到了 2004 年,虽然它还没有后来那样强势,但方向已经变了:它不再只是给页面加点动态效果,而是在朝应用逻辑的一部分移动。

Firefox 和 Ubuntu,让开源变得更贴近日常

2004 年 11 月,Firefox 1.0 发布。那几年 Internet Explorer 的市场地位很强,但也因为过于强势,浏览器创新开始变慢。Firefox 的意义不只是多了一个浏览器选项,它让普通用户能明显感觉到:开源软件不一定只是服务器上的东西,也可以是每天打开、每天使用的产品。

同年 10 月,Ubuntu 4.10 发布。Ubuntu 后来的影响力很大,原因并不复杂:它把 Linux 桌面的安装、使用和社区支持做得更友好。早些年装 Linux,往往会变成硬件识别、显卡驱动、中文输入、网络配置和软件源的一串考验。Ubuntu 没有一下子解决所有问题,但它把“让普通人使用 Linux”这件事往前推了一大步。

这对当时做 Linux 的公司也有刺激。国内发行版有自己的机会,也有自己的困难。机会在于政策、教育、政府、行业客户都需要国产化和本地化;困难在于社区生态、应用生态、驱动支持、桌面体验、开发者心智都不是单靠热情能补齐的。

我那几年所在的公司,同事里有很多来自清华、北大等学校的优秀工程师,大家能力都很强。可做操作系统这件事,光靠一群聪明人是不够的。它需要硬件厂商、应用开发者、社区、商业客户、渠道、文档、培训一起往前走。一个发行版不是代码包的集合,而是一整个生态的协商结果。

2004 年的 Firefox 和 Ubuntu,都提醒了这一点:开源真正进入大众视野时,靠的不是“源代码开放”这几个字本身,而是把产品体验、社区协作和工程质量一起做出来。

Google IPO、MapReduce,以及数据时代的前奏

2004 年 8 月,Google 上市。今天看 Google 的体量,容易忘记当时它仍然带着一种技术公司的锋利感。搜索质量、广告系统、基础设施、工程文化,组合在一起,让“用技术改变商业”的故事变得非常具体。

同一年,Google 发表 MapReduce 论文。对很多做数据系统的人来说,这篇论文后来几乎成了一个路标。它把大规模数据处理拆成 Map 和 Reduce 两个阶段,用一种工程上可落地的方式描述了如何在集群上处理海量数据。

那时我还没有进入后来那些大数据平台的工作,但回头看,2004 年已经把很多线埋下了。搜索引擎需要处理网页,广告系统需要处理点击和转化,社交网络会产生用户关系和动态,邮箱、地图、视频、游戏也都会积累数据。数据不再只是数据库里几张表,而是整个互联网产品的燃料。

这件事也会改变语言生态。

脚本语言负责 glue code,Java 适合写稳定服务,C/C++ 仍然在性能敏感的地方占据位置,SQL 管结构化数据,Shell 负责系统边界。后来 Hadoop、Hive、Spark、Flink、Python 数据生态、机器学习框架陆续登场,其实都和这条线有关:当数据规模变大,语言和工具会围绕数据重新分工。

2004 年我在公司里做的很多活,还远没有这么宏大。可那些琐碎脚本、部署工具、日志处理、内部系统,已经在训练一种工程直觉:系统不是由一种语言写成的,系统是由很多边界拼出来的。

Facebook、Rails 和《魔兽世界》:产品正在变成长期在线的系统

2004 年 2 月,Facebook 在校园里启动。它当时当然还不是后来那个全球社交平台,但“真实身份 + 关系网络 + 信息流”的方向已经出现。几年后社交网络会变成互联网流量和应用形态的核心之一。

同一年,Ruby on Rails 开始出现。Rails 给 Web 开发带来的冲击,不只是 Ruby 这门语言,而是“约定优于配置”“快速构建产品”的工程审美。它告诉很多开发者,Web 应用不一定非要被沉重的企业框架压住,也可以用更清晰、更快速的方式推进。

11 月,《魔兽世界》发布。它通常被放在游戏史里讨论,但从工程角度看,它也是一个长期在线系统的样本:账号、服务器、地图、任务、经济系统、社区、运营、版本更新、客服、数据监控,这些东西组合在一起,已经非常接近后来很多互联网服务的复杂度。

把这些事情放在一起看,2004 年并不只是“又有几个新产品出现”。它更像一个提示:软件正在从“发布一个版本”变成“运营一个系统”。系统上线之后并不会结束,反而才刚开始。

这也解释了为什么语言会变成工具箱。一个长期在线的系统,需要页面,需要服务,需要脚本,需要监控,需要数据处理,需要后台工具,需要部署和回滚。只靠一种语言当然可以做很多事,但现实里,团队往往会沿着成本、历史包袱、人才结构和生态工具做选择。

语言之争背后,是工程复杂度变高了

年轻时很容易喜欢语言之争。C 和 C++ 谁更纯粹,Java 是不是太啰嗦,PHP 是不是“不够优雅”,Perl 是不是太难读,Python 会不会太慢。每个问题都能吵很久。

但 2004 年前后的工程现场,会让人慢慢明白:语言之争往往只是表层。真正的问题是,你面对的是哪种复杂度。

文本处理的复杂度,Perl 很合适;小型 Web 系统的交付复杂度,PHP 很合适;企业服务和大型团队协作的复杂度,Java 有优势;系统自动化和部署复杂度,Shell、Makefile、配置管理绕不开;需要快速表达业务逻辑和自动化任务时,Python 会越来越舒服。

这些选择没有绝对正确,只有上下文。

一个人如果只学一种语言,很容易把所有问题都看成这门语言能解决的问题。一个团队如果只从语言出发选型,也容易忽略真正的工程约束:人员水平、上线节奏、故障恢复、客户环境、已有系统、可观测性、长期维护成本。

2004 年对我来说,是这种认知逐渐成形的一年。我开始不太相信“某种语言代表未来”这种说法,也开始更在意“这个系统的边界在哪里”“哪部分需要稳定,哪部分需要快”“哪些代码三个月后还会有人看懂”。

这听起来没有语言信仰那么热血,但更接近真实工作。

国贸楼下的可乐,和刚起步的电商

还有一个很生活化的记忆,适合放在 2004 年这一篇里。

当时公司在国贸 A 座。资料显示,京东的早期公司可追溯到 1998 年,JD.com 作为线上零售公司的发展则从 2004 年开始更清晰地进入公开叙述。它那时当然还不是今天这个庞然大物,更像中关村电子产品零售向互联网迁移过程中的一个小信号。我印象中,京东早期做推广时曾经免费送过一提可乐。这个细节我没法从公开资料里严格核验,所以只能当作个人记忆写下来。

但这个记忆很有年代感。

那个时候电商还没有变成日常基础设施。网上买东西仍然带着一点尝鲜的味道,支付、配送、信任、售后都还在建立。公司楼下、办公室里、论坛上、邮件里,各种新网站用很朴素的方式拉第一批用户。免费可乐这种促销,放在今天看很不起眼,放在当时,却能让人感觉到互联网正在从“看内容”走向“买东西、送到手里、形成履约网络”。

国贸 A 座办公室里的早期电商记忆

这条线后来会变得非常大:电商、支付、物流、仓储、推荐、广告、云计算、供应链系统,都会长出来。2004 年我当然看不到这么远,只记得国贸 A 座的公司、刚起步的电商,以及那种“网上竟然还能这么卖东西”的新鲜感。

下一站,是更近距离地看硅谷

2004 年还只是铺垫。

后来我有机会去美国 Mountain View 的公司待过一段时间。老板在美国和 Linus 是朋友,我虽然没见到 Linus,却拿到过一个据说是 Linus 家孩子用过的婴儿奶瓶消毒锅。这个故事今天听起来有点荒诞,但它很符合那个年代开源圈的气质:技术、社区、公司、个人关系,经常交织在一起。

那段经历更适合放到下一篇写。2005 年,Web 2.0 的味道越来越浓,开源商业化也开始进入新的阶段。对我来说,那一年不只是继续写代码,也开始更近距离地看见技术中心地带的样子。

2004 年 IT 大事记

  • Facebook 启动。 2004 年 2 月,Facebook 在校园场景中启动。它后来会把真实身份、关系链、动态消息和社交广告推到互联网中心位置,成为移动互联网前夜最重要的平台雏形之一。
  • Gmail 发布。 2004 年 4 月 1 日,Gmail 发布。它用大容量邮箱、搜索式邮件管理和更强的浏览器交互体验,提醒开发者:Web 应用不必只是传统桌面软件的简化版。
  • Google IPO。 2004 年 8 月,Google 上市。搜索、广告、数据中心和工程文化组合成新的商业样本,也让互联网公司第一次如此清楚地展示基础设施能力的商业价值。
  • MapReduce 论文发表。 Google 在 2004 年发表 MapReduce 论文。它把大规模数据处理的工程范式讲清楚,为后来的 Hadoop、Hive、Spark 和一整套数据平台生态提供了思想源头。
  • Ruby on Rails 出现。 Rails 强调约定优于配置和快速 Web 开发,降低了构建 Web 应用的复杂度。它代表了框架开始替开发者组织大量重复工程细节的趋势。
  • Ubuntu 4.10 发布。 Ubuntu 以更友好的安装、桌面体验和社区方式进入 Linux 世界。它让 Linux 桌面不再只是高手玩具,也影响了后来很多开发者对 Linux 工作站的选择。
  • Firefox 1.0 发布。 Firefox 1.0 让开源浏览器重新进入主流视野,也重新激活浏览器竞争。Web 标准、插件生态和浏览器性能在后面几年都会因此变得更重要。
  • 《魔兽世界》发布。 这款长期在线服务把账号、服务器、社交、经济系统、版本更新和运维压力放在同一个产品里。大型在线游戏也在提醒软件行业:持续运营本身就是一种复杂工程。
  • Web 开发框架化。 2004 年前后,CGI、脚本、模板、Java 企业应用和新兴 Web 框架并存。软件开发开始从“能跑起来”走向更明确的工程分层和框架复用。
  • 企业系统混合演进。 老协议、脚本语言、文件共享和 Web 应用同时存在,说明企业软件现场不会按技术潮流整齐换代。新旧技术长期共存,是后来所有工程改造都必须面对的现实。

参考资料