
前几篇写到 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 公司面对的真实世界客户环境复杂异构系统很多文件共享、网络协议、老设备兼容都是产品能不能落地的一部分。后来我越来越不爱参与语言之争大概就和这一段经历有关。真实项目里语言不是旗帜是扳手、螺丝刀、电烙铁和万用表。你当然可以喜欢其中某一件但系统坏在那里时先把活修好。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 codeJava 适合写稳定服务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 年开始更清晰地进入公开叙述。它那时当然还不是今天这个庞然大物更像中关村电子产品零售向互联网迁移过程中的一个小信号。我印象中京东早期做推广时曾经免费送过一提可乐。这个细节我没法从公开资料里严格核验所以只能当作个人记忆写下来。但这个记忆很有年代感。那个时候电商还没有变成日常基础设施。网上买东西仍然带着一点尝鲜的味道支付、配送、信任、售后都还在建立。公司楼下、办公室里、论坛上、邮件里各种新网站用很朴素的方式拉第一批用户。免费可乐这种促销放在今天看很不起眼放在当时却能让人感觉到互联网正在从“看内容”走向“买东西、送到手里、形成履约网络”。这条线后来会变得非常大电商、支付、物流、仓储、推荐、广告、云计算、供应链系统都会长出来。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 应用同时存在说明企业软件现场不会按技术潮流整齐换代。新旧技术长期共存是后来所有工程改造都必须面对的现实。参考资料MozillaFirefox 1.0 Release NotesUbuntuUbuntu ReleasesGoogleGmail at 20Google Investor Relations2004 Founders’ IPO LetterMetaCompany InfoGoogle ResearchMapReduce: Simplified Data Processing on Large ClustersRuby on RailsHistoryBlizzardWorld of WarcraftForbesJD.com company profileJD.comOur HistoryPhoronixLinux Finally Ends AppleTalk Protocol Support阅读原文https://zicode.com/blog/it-thirty-years-2004-script-language-toolbox/