1996,屏幕还很小,世界刚变大
原创 · 约 29 分钟阅读 · 阅读 --

1996,屏幕还很小,世界刚变大

作者: 字与码


古董级程序员,大厂出来后一直在创业公司,现在仍活跃在一线做 AI 相关开发。更完整的更新写在微信公众号「字与码」:工作经历、对新技术的想法,以及这些年折腾工具、模型和工程系统的记录,会不定期发在那里。

很多年以后,我再回想自己和 IT 的关系,总觉得它不是从互联网开始的。

它更像是从一台很重的电脑开始的。

大约 1994 年,我有了自己的第一台电脑。现在看配置,会觉得像博物馆标签:386DX40,4MB 内存,210MB 硬盘,双倍速光驱,双软驱,14 寸 CRT 显示器。那时的电脑没有今天这种“轻薄”“静音”“续航”的说法,机器摆在那里就是一件家具,开机声、硬盘声、风扇声,都像在提醒你:这不是一个随便能驾驭的东西。

那台机器的屏幕很小,世界也显得很小。

但后来我才明白,世界变大之前,通常先会以一种很笨重的样子出现在你桌上。

AMD 386DX-40 处理器

AMD Am386DX-40 处理器。图片来源:Wikimedia Commons。

386DX40 这几个字符,在当年不是参数表里的冷冰冰数字,而是你对一台机器的全部想象。40MHz 意味着它比 33MHz 快,4MB 内存意味着你能不能更顺畅地跑起某些程序,210MB 硬盘意味着你要不要删掉一个工具才能装另一个工具。今天我们买电脑时会讨论显卡、内存、硬盘、屏幕、散热、接口;那时每一个指标都更接近“边界”本身。

边界会塑造人的性格。

硬盘小,你就会整理目录;内存小,你就会关心程序占用;机器慢,你就会忍受等待,也会天然对“效率”这个词敏感。后来很多程序员在不同年代形成的习惯,其实都和第一批机器有关。有人从大型机和小型机来,习惯严谨;有人从 PC 机来,习惯折腾;有人从 Web 来,习惯兼容;有人从移动互联网来,习惯产品体验。

我的起点,大概是在“机器很弱,但人很想让它多做一点”的地方。

1995 年前后,我还在这台 386 上装过 Linux。

发行版是 Slackware Linux,内核版本印象中应该还是 1.x.x。安装介质不是今天这种随手下载的 ISO,而是一张买来的光盘。那时装 Linux 不是“下一步、下一步、完成”,更像一次小型探险:硬盘怎么分区,启动怎么处理,显卡和显示器能不能配起来,网络暂时用不上也没关系,先让系统起来再说。

Slackware 给人的感觉很硬,也很干净。它不像后来的桌面发行版那样努力替你做完所有选择,而是把很多东西直接摊在你面前。你要知道目录在哪里,配置文件在哪里,系统启动时发生了什么。它对新手并不温柔,但会逼着你理解一个 Unix-like 系统的骨架。

这件事后来回看很有意思。

我真正进入 Linux 行业,是 2002 年以后的事;但 Linux 的种子,其实在 1995 年那张 Slackware 光盘里就已经埋下了。那时我还不知道以后会在做 Linux 的公司待很多年,会接触国产 Linux 的黄金年代,会接待 Richard Stallman,会在 Mountain View 的办公室里待一个月。只是当时坐在 386 前面,看着一个陌生系统一点点启动起来,觉得电脑原来还可以长成另一种样子。

从 PDP-11 到 386

1992 年,我进上海交通大学计算机专业。那时计算机专业的气味和今天完全不同。今天的学生一入门就是 Python、Web、App、AI、云服务。当年的入口更硬,也更慢。

计算机组成原理学的是 PDP-11。对很多后来才接触电脑的人来说,PDP-11 只是教科书里的旧机器;但在那个年代,它代表的是一种计算机教育的方式:先让你知道机器是怎么被组织起来的,寄存器、指令、总线、内存、寻址、控制流,一层一层往下拆。

PDP-11 等 DEC 小型机实物

博物馆中的 DEC 小型机,包括 PDP-11。图片来源:Wikimedia Commons。

PDP-11 这种机器有一种很强的历史感。它不像后来 PC 那样摆在每个人桌上,也不像今天的云服务器那样只剩控制台上的一个实例名。它有柜体,有开关,有面板,有磁带,有一种“计算资源很稀缺”的气味。

我们在课堂上学它时,当然已经不是在学习一台最先进的机器。但它适合教人理解计算机,因为它离“抽象之前的样子”更近。指令并不是魔法,函数调用也不是魔法,内存地址更不是魔法。机器怎么取指、怎么跳转、怎么保存状态,这些东西一旦进入你的脑子,后来再看高级语言、操作系统、虚拟机、容器,都会多一层底色。

后来我做过很长时间的工程,越到后面越觉得这种训练有用。不是因为工作里真的天天写汇编,而是因为你知道软件并不是飘在空中的。每一层抽象下面都有代价,每一次“方便”都有人替你把复杂性藏起来。

图形学课更有意思。俞勇老师布置的课程设计是光线跟踪。今天我们在浏览器里拖一个实时 3D 场景,或者让模型生成一张图,几秒钟就能看到结果。当年很多小组改一次代码,需要一晚上才能渲染完。第二天早上起来,发现阴影错了、反射不对、球体边缘有瑕疵,再改,再等。

那是一种很古老的耐心。

它让人天然相信一件事:程序不是写完就结束的,程序要经过机器的审判。机器不解释,也不安慰。它只给你一个结果,慢慢地给。

所以到了 1996 年,我做汇编级开发时,并没有觉得那是很奇怪的事情。那时写程序本来就离硬件更近,离操作系统更近,离今天这种“业务逻辑”和“产品体验”更远。你要知道指令怎么走,内存怎么动,一个字节错了,结果就完全不一样。

这也是我这三十年 IT 经历的起点:不是“互联网改变世界”的豪言壮语,而是一个年轻人盯着屏幕,试图让机器按自己的想法动起来。

IBM PC 5150 与 CRT 显示器

IBM PC 5150。它不是我的 386,但这种米黄色机箱、CRT、软驱组合,就是那个时代个人电脑的共同视觉记忆。图片来源:Wikimedia Commons。

一张桌面就是一个生态

现在的电脑桌面,往往只剩一台笔记本、一根充电线、一个外接屏。1990 年代的电脑桌不是这样。主机、显示器、键盘、鼠标、音箱、软盘、光盘、电话线、说明书、驱动盘、安装盘,堆在一起才叫一台电脑。

那时候的“安装软件”也不是今天点一下下载。你要从软盘或光盘开始,知道哪个盘先插,哪个盘后插,安装到哪个目录,环境变量怎么设,驱动是否冲突。系统坏了,重装一次不是几分钟的事。一个工具如果能稳定工作,你会很珍惜它。

这也是为什么那代程序员对 IDE、编译器、编辑器有很强的感情。工具不是网页里随手注册的服务,而是你花了很多时间装好、调好、摸熟的东西。它不只是功能集合,也是一种工作方式。

到了后来,我会在很长时间里觉得 Delphi 是最好用的 IDE。那不是简单的怀旧。Borland 的工具让很多人第一次感受到:写程序可以不只是跟命令行、库文件、头文件和链接错误搏斗,也可以有很顺手的界面设计、事件模型和数据库开发体验。它让 Windows 桌面应用开发变得亲切,这件事对 1990 年代末的企业软件非常重要。

但在 1996 年,那个桌面还没有完全走向 Delphi,也还没有完全走向 Web。它像一个正在换季的房间:一边是软盘、汇编、DOS/Windows、CRT;另一边是浏览器、脚本、电话线和即将变大的网络。

1996 年,Web 还没有长成今天的样子

如果只看今天的结果,我们很容易把 Web 想成一个理所当然的东西:HTML、CSS、JavaScript,浏览器打开,页面显示,交互发生。

但 1996 年不是这样。

那一年,Web 正在从静态页面走向可交互应用,但标准、实现和商业竞争还搅在一起。Netscape 和 Microsoft 都想控制浏览器入口。页面作者一边兴奋,一边痛苦:同一段代码,在不同浏览器里可能不是同一种结果。

1996 年 8 月,Microsoft 发布 Internet Explorer 3.0。它支持 CSS、JScript、ActiveX 等技术,明显是在追赶和反击 Netscape。也是那一年,W3C 发布 CSS Level 1 推荐标准。今天看 CSS1 的能力很朴素,字体、颜色、间距、边框、简单布局,但它真正重要的地方在于:Web 不能永远靠浏览器厂商各玩各的。

标准开始试图把这个混乱的世界拉回一张桌子上。

不过,标准写在纸上,浏览器跑在用户机器上,中间有很长一段路。1996 年的程序员和网页作者,很多时候不是在“写 Web 标准”,而是在“驯服浏览器差异”。一个页面要兼容多个浏览器,往往要写判断、写分支、写各种只有当年人才记得的技巧。

早期浏览器兼容性想象图

同一个页面在不同早期浏览器窗口里呈现不一致。图为按年代氛围生成的示意图。

我 1997 年用 JavaScript 写过一个小程序,一只蝴蝶可以在页面上飞舞。今天听起来像儿童玩具,甚至不值得写进简历。但放在当时,它是很鲜活的。因为那只蝴蝶不是在一个成熟、统一、稳定的平台上飞,它是在浏览器战争的缝隙里飞。

你以为自己写的是动画,其实写的是妥协。

那只蝴蝶后来在我记忆里越来越像一个隐喻。

它很小,不复杂,也不解决任何严肃问题。但它说明浏览器已经不满足于显示一份文档了。页面开始会动,会响应,会表现出一点点“应用”的样子。今天我们说前端工程、Web App、SPA、低代码、在线 IDE,回头看都能在那些粗糙的小脚本里找到影子。

历史真正改变方向的时候,往往不会以宏大场面出现。它可能就是一个按钮变色,一个弹窗出现,一只蝴蝶在页面上飞了几下。

汇编和浏览器之间,隔着一个时代

回看 1996 年,最有意思的是割裂感。

一边是汇编。你面对的是指令、寄存器、内存地址、机器状态。世界很小,边界很清楚。程序跑不起来,多半是你错了。

另一边是 Web。你面对的是浏览器、网络、脚本、标准、厂商竞争。世界突然变大,边界开始模糊。程序跑不起来,不一定是你错了,也可能是浏览器理解得和你不一样。

这两种调试体验差别很大。

汇编的问题通常残酷但直接。寄存器值不对,跳转地址错,栈被破坏,内存写坏了。它难,但你知道自己在和机器较劲。

Web 的问题更像在和一群人较劲:浏览器厂商、标准组织、操作系统、网络、用户习惯、屏幕尺寸、插件、安全限制。到了后来,前端工程会发展出构建工具、兼容层、Polyfill、框架、测试工具,本质上都是在处理这种不确定性。

这两种经验,对后来程序员的影响完全不同。

汇编训练的是确定性。你相信机器是严格的,底层是可解释的,问题总能一路追下去。Web 训练的是不确定性。你开始接受环境差异、版本差异、网络差异、用户差异。你写的不再只是“程序”,而是运行在一堆现实条件里的东西。

后来我做 MIS、做银行前置机、做 Linux、做大厂平台、做移动端接口、做大数据平台、做 AI 工具,很多问题其实都在这两种经验之间摇摆:一边要理解底层,另一边要接受世界不受你控制。

1996 年就是这个分叉点。

那一年,我还在和底层打交道。但另一个方向已经出现了。浏览器把用户、页面、网络、脚本和商业公司都卷进来,软件不再只是“安装在机器上的东西”。软件开始变成入口,变成服务,变成连接人的东西。

那时我还不知道,这条路会走到门户、搜索、IM、电商、社交网络、移动互联网、云计算,再走到今天的 AI 和 Agent。

如果知道,估计也不会真的相信。

当年的工具,也有自己的性格

1996 年前后的工具有一种很强的“物理感”。

软盘会坏,光驱会挑盘,硬盘空间要精打细算。210MB 硬盘听起来像一个笑话,但当时已经能装下不少东西。装系统、装编译器、装文档、装几个游戏,再留一点工作空间,日子也能过。

3.5 寸软盘特写

3.5 寸软盘。图片来源:Wikimedia Commons。

软盘在今天看起来只是一个保存图标的原型,但在当年它真的是“可移动存储”。一张 1.44MB 的软盘,容量小到可怜,却承载了很多人的作业、源码、驱动、工具、小程序。你会在软盘标签上写字,会担心磁盘坏道,会因为少带一张盘而白跑一趟。

这种容量限制很具体。一个源码目录、几个对象文件、一个小工具,就可能让你开始考虑哪些东西必须保留,哪些东西可以删掉。今天我们讨论“技术债”“依赖膨胀”“镜像体积”,其实只是换了一种规模继续面对同一个问题:资源看起来变大了,但软件总能把它重新吃满。

今天的软件太轻易就能下载、升级、重装。那时候不是。一个开发工具、一张光盘、一本厚书,都会在桌上待很久。你会反复翻它,熟悉它的脾气。

这种关系后来在 Delphi 身上体现得更明显。虽然 Delphi 对我更重要的时间在 1998 年以后,但它代表了那个时代优秀开发工具的一个高峰:打开 IDE,拖控件,写事件,连数据库,编译成一个像样的 Windows 程序。Borland 这家公司值得单独写,它给过很多程序员一种很强的错觉:原来软件开发可以这么顺手。

但 1996 年我还没走到那里。那时我的一只脚还踩在汇编、硬件和课程训练里,另一只脚才刚刚要迈向 Web、企业软件和更复杂的商业系统。

三十年后再看 1996

1996 年在 IT 史里不算最耀眼的一年。

它不像 2007 年有 iPhone,不像 2012 年有 AlexNet,不像 2022 年有 ChatGPT。它更像一段转场:旧世界还很结实,新世界已经开始冒头。

但对我来说,这一年很重要。

因为它让我站在两种程序员之间。一种程序员相信机器,相信确定性,相信代码最终要落到指令和内存上。另一种程序员开始相信网络,相信入口,相信标准和生态,相信软件会跑到你控制不了的环境里。

后来这两种程序员一直在我身体里打架。

写 C/C++、调 Redis、做图数据库、写 Rust 的时候,前一种会出来。做 Web、做大数据平台、做移动接口、做 AI 工具链的时候,后一种会出来。到了今天用 Codex 和 Claude Code 写代码,又出现了第三种程序员:你不只是写代码,还要学会和会写代码的工具协作。

但无论走到哪里,我都没有忘记那台 386 和那个 14 寸 CRT。

屏幕很小,世界刚刚变大。

下一篇,我想写 1997 年。那一年,我用 JavaScript 写了一只会飞的蝴蝶。它飞得当然很粗糙,但它飞在一个浏览器标准混乱、每个厂商都想定义未来的时代。现在想想,那只蝴蝶挺像 Web 自己。

1996 年 IT 大事记

  • Java 1.0 发布。 Sun 在 1996 年正式发布 Java 1.0。那句后来被反复引用的“Write Once, Run Anywhere”,放在当时的语境里非常有诱惑力:PC、服务器、浏览器、操作系统都在快速变化,开发者希望有一种语言能跨过平台差异。Java 后来会深刻影响企业软件、互联网后端、Android 生态,也会和 1998 年以后大量 MIS、银行和企业系统开发发生关系。
  • CSS1 成为 W3C 推荐标准。 1996 年 12 月,CSS Level 1 成为 W3C Recommendation。它看起来只是字体、颜色、边距、边框这些表现层能力,但意义很大:Web 不能永远靠 HTML 标签硬排版,也不能永远让浏览器厂商各自定义表现方式。HTML 负责结构、CSS 负责表现,这个分工从这里开始变得清晰。
  • Internet Explorer 3.0 发布。 IE3 支持 CSS、JScript、ActiveX 等能力,Microsoft 开始在浏览器战场上真正发力。对当时写网页的人来说,这不是一个单纯的软件发布,而是兼容性时代的开始:你要同时面对 Netscape 和 IE,也要面对两个厂商对 Web 未来的不同想象。
  • Windows NT 4.0 发布。 1996 年的 Windows NT 4.0 把更像 Windows 95 的用户界面带到 NT 系列上,同时继续面向服务器和工作站市场。后来很多企业系统、开发环境和服务器软件,都会在 Windows NT 这条线的影响下成长起来。
  • USB 1.0 规范发布。 USB 在当年还不是每个人桌面上的日常接口,但它代表了个人电脑外设连接方式的一次长期转向。键盘、鼠标、打印机、U 盘、移动硬盘、各种开发板和调试设备,后来都会被这个接口重新组织。
  • Hotmail 和 ICQ 出现。 Hotmail 在 1996 年上线,ICQ 也在同年推出。前者让很多人第一次意识到邮箱可以是网页服务,后者让“在线状态”和即时通讯进入大众视野。它们都是后来互联网服务从“看网页”走向“个人在线生活”的早期信号。
  • BackRub 开始出现。 Larry Page 和 Sergey Brin 在 Stanford 做的搜索项目 BackRub 出现在这一时期。它还不是后来的 Google,但已经把网页链接关系看成可以计算的信号。几年后,搜索引擎会成为互联网最重要的入口之一。

参考资料

微信公众号

欢迎关注「字与码」

如果这篇文章对你有用,也欢迎在微信里继续关注后续更新。

微信公众号字与码二维码