1. "We ran out of columns" (jimmyhmiller.github.io)
文章摘要:"We ran out of columns"
本文作者回顾了其第一份软件工作的经历,描述了一个堪称“最差也是最佳”的遗留代码库,并通过一系列荒诞却真实的例子,揭示了大型遗留系统中数据库、代码和流程的独特生态与内在逻辑。
数据库的“奇观”
- 列数限制:系统核心的
merchants(存储客户信息)表因列数超过SQL Server当时的限制(1024列),不得不创建了拥有500多列的merchants2表来分担数据。 - ID生成机制:存在一个名为
SequenceKey的极简表,仅有一列一行,用于为系统中新建的所有实体生成ID,从而在不同表之间建立了隐式关联。 - 手动维护的依赖:系统登录依赖一个名为
calendar的日历表,此表由手动填充日期;一次日历耗尽导致系统无法登录,后由实习生手动添加了5年数据。 - 每日重置的数据:
employees表每天早晨被清空,并从ADP的CSV文件重新导入,此过程会导致系统暂时无法登录,数据后续还需人工同步至总部。
混乱的代码库与工作流
- 技术栈混杂:主代码库混合使用VB和C#,运行于IIS,依赖Session状态,导致不同访问路径下页面显示内容不同。仓库中还混入了多种带有自定义修改的JavaScript框架。
- 依赖“硬盘”上的代码:开发者Gilfoyle编写的“船运管理器”应用等代码未提交至版本控制,其个人硬盘以RAID配置长期保留,以应对此类“幽灵应用”的bug报告。
- 离奇的销售数据修正:销售订单修正的需求从个案演变为常态,最终导致三名实习生全职编写SQL语句进行人工修改,开发应用程序被认为“太困难”。
“美丽混乱”的开发哲学
- 无规划的演进:代码库缺乏统一设计、API规范或架构审查。开发者无法理清庞大的单体应用,转而在其边缘创建独立、小规模的功能模块,并逐步用新链接替代旧入口,孤立旧代码。
- 意外获得的解耦:这种看似混乱的方式意外地实现了代码解耦。开发者专注于解决具体问题、最小化影响范围,代码易于替换。例如,开发者Justin通过将商家搜索页的各区块改为独立端点并行加载,将页面加载时间从分钟级降至秒级以下。
- 直接连接与快速反馈:作者怀念当时没有中间需求层、开发者直接与用户对话、快速获得反馈并解决简单问题的开发模式。这种“美妙而可怕”的代码库体验,在其职业生涯中再未重现。