2011 年,我发表了《DBA 日记》。那个年代,剧情围绕着 LTO 备份磁带、SQL Server 2000 数据库、僵化的代码,以及一个每天 11 点 32 分才踏进办公室的老板。十五年过去了。DBA 进化成了数据工程师,老旧的磁带变成了 lakehouse,MSN 让位给了 Slack……那我呢?我依然自欺欺人地相信,这一次能准点下班。如有雷同,依旧绝非巧合。
上午:机器(和 Slack)的苏醒
07:50。我提前十分钟打开笔记本电脑,天真地幻想能在每日站会前把活儿赶一赶。Slack 已经用 137 条通知迎接了我。一位同事在早上八点前就往 #random 频道轰炸了十四段足球视频;现在又发来一句紧接着一篇硕士论文的"早安!",论文主题是昨天 VAR 判罚的种种失误。有些东西在任何基础设施上都能完美运行。
08:10。快速分拣:三条毫无紧急可言的全体提醒(@channel),八条来自一位用户、坚称面板"昨天显示的是另一个数字"的消息,HR 给一位我根本不认识的寿星发来的自动祝福,以及两名 LinkedIn 招聘官向我抛来 DBA 职位(算法没忘记我的过去)。凌晨的系统告警都自动恢复了。这固然很好,但也深深令人生疑。
08:50。我们消息队列系统的处理延迟已经超过 4000 万个事件。原因?客户的 DBA 没打招呼就重启了分公司的服务器——十五年过去,这句话一个标点都没变。我重启了我们这边的连接,压力随之缓解,我们每天 20 亿个事件又平静地流淌起来。与此同时,在支持频道里,我看着老员工教实习生怎么对客户说"系统因用户操作失误导致不稳定"(翻译:他点错了按钮)。
09:05。该我当公司的官方催办员了。有代码待评审已经搁了一周,云端扩容申请拖着没批,系统升级被推迟了三个 sprint(我早就数不清了),还有一条防火墙放行"误"被拦截了第三次。哦,对了:我在 HR 那儿开的第二块显示器工单,也已经三周了。上次他们给我寄了个鼠标垫。
09:25。咖啡时间。胶囊用完了;我把昨天的重新加热,恪守 IT 界的神圣传统。从旁边的视频通话里,我听到一位分析师对客户抛出那句经典台词:"你是想让我用对的方式解决,还是用快的方式解决?"我心想:好戏要来了。
09:50。紧急工单!客户那边有人跑了一条没加过滤条件的更新语句,一万两千条记录"消失"了。在 2011 年,这意味着要去翻一盘备份磁带、借一台服务器,再赔上一整个下午。如今,多亏了现代的数据time travel技术,我用一条 30 秒的命令就能搞定。我是说……本来能搞定,如果清理例程没在早上六点把历史记录删掉的话。云备份提示:"恢复已启动,最长 12 小时内可用"。最糟的是?那位分析师已经向客户承诺"这事儿"五分钟内解决。这场灾难所在的遗留服务器,有个亲切的名字叫 Lady Aracnea II。
10:15。我输了一个赌。每天我们都赌那位人称"兄弟"的同事会几点上站会。今天:10 点 15 分,摄像头关着,声称"网络有问题"。离他的纪录还差得远——11 点 40 分,用一张定格的头像假装是视频。实习生用 PIX 把我的七毛五收走了。
10:45。那一万两千条记录回来了:一份被遗忘的副本在系统某个角落幸存了下来。谢谢你,过去的我。我回到手头的活儿:重构一段怪物级代码,它一次性查询一张八十亿行的表,把一切都卡死。那些列叫做 tmp_final_v2 和 saldo_NOVO_usar_esse。糟糕的习惯进化了,但没死绝。
11:15。气候大战,混合办公版。在实体办公室里,一半人想把空调开到 18°C,另一半人裹着外套。在远程这边,战争是客户会议上的"开摄像头 × 关摄像头"。我在 #geral 频道里听到了磨刀霍霍的声音。
11:32。合伙人的小圆点在 Slack 上变成了绿色。十四个"正在输入……"的图标同时消失。背景里,几乎能听到帝国进行曲。
11:45。#almoco 频道里的讨论:带券的 iFood vs. 自带便当 vs. 日式称重自助。我说只要餐补能覆盖、又还算能吃,什么都行。就在这一刻,财务告警响了:有人在云上跑了一个庞大的、没加过滤条件的进程。成本预测两小时内涨了 1,400 美元。在 2011 年,我们撑爆的是服务器内存;如今,我们撑爆的是公司的信用卡。我准备好了我的电击枪——如今 HR 管它叫"反馈会议"。
11:59。没人敢喘气。所有状态都即将同时变成汉堡图标(🍔)。而我还在那儿排查是谁把数据库压垮了:一个第三方服务,每秒把同一该死的那行查十次。十五年后。一模一样的毛病。只不过现在跑在云上。
下午:幻想与承诺
13:05。午饭回来,迎面撞上那个经典请求:"能不能直接在我的考勤记录上做个小调整?"在 2011 年,我会说我"考虑考虑"。如今,我解释说系统在云上,有不可篡改的审计轨迹,还受 LGPD 保护。然后,我说我考虑考虑。
13:20。该制定数据清理策略了。自 2009 年以来积累了 40 TB "总有一天会用到"的无用文件——这是我 2011 年那位老板以数据保留策略形式的转世。区别在于,如今这套"什么都留着"每个月都会以美元计价出现在 AWS 账单上。云端冷存储是我们新的"壁虎柜"。
13:45。午睡时间,远程版。午饭后三个摄像头同时熄灭,紧接着一句"能再说一遍吗?这边卡了",骗不了任何人。在现场办公室里,这项运动依旧是看谁先拍下在椅子上睡着的人。
14:00。与客户 IT 部门的"战略对齐"会议。我催促放行防火墙、开通所需权限。作为回报,他们恭喜我发现他们的瓶颈原来是杀毒软件卡住了数据库。五分钟后,会议被手机通知吞没而告终。Google 日历自己把一切都改到了下周——嘿,至少这一点变好了。
14:30。一位客户的分析师让我评审他的"数据架构":那是 300 张用 VLOOKUP 缝在一起的电子表格,喂给一个每逢周一必卡的面板。当我提到最佳实践和数据契约时,他露出一副见了鬼的表情。有些 IT 经典永不过时。
14:52。客户的经理绝望地打来电话,嘴里还嚼着甜点:董事会要求明天就要一个"基于我们数据"的原型。从来没人能在一个下午搭出这种东西。我翻出一段旧代码,把三个数据源拼凑起来,撑起一个面板——你要是眯着眼看,它甚至有点像高层战略。剩下的一天我都在试图解释,为什么那个漂亮的数字在送到董事会之前需要先复核。这部分,没有任何捷径能解决。
15:20。客户的连接断了,认证系统决定不发 token。一有全面不稳定的苗头,办公室里就凭空冒出一副国际象棋、一副扑克牌,还有——我对天发誓——一只口琴。我趁机第四次催我那块显示器的工单,又花了 15 分钟向供应商解释"不测试恢复的备份策略不是备份,只是信仰"。这句话我从 2011 年一直重复到现在。
16:00。客户的经理进入虚拟危机会议室,发来一张有人捶桌子的 GIF。奇迹般地,网络两分钟后就恢复了。
16:20。真正的严重工单:工资单结算系统卡住了。"如果不恢复,没人能拿到工资,都怪 IT"。当初负责搭这套东西的分析师已经离职了;接手这个烫手山芋的人根本不知道代码在干什么。文档倒是有的:漂亮、无可挑剔,但它描述的是一个自三月起就不存在的系统版本。我像侦探追查线索一样梳理代码的依赖网络,结果——瞧:一处表连接把行数翻倍,把一切都卡死了。
17:00。修复、测试、发布完毕。终端用户的回复:"还好这次 IT 解决了"。又一个开心的用户,完全没意识到,在他的点击和屏幕上那个数字之间,隔着五十个集成系统、每天 20 亿个事件,以及一个情感上被一台叫 Lady Aracnea II 的服务器绑架的数据工程师。
17:05。经理通知:董事会取消了那个他们急着要的原型演示。这决定是五分钟前做的。加班时间进了那个神话般的"工时银行",将来"再谈"。有几位分析师默默在 LinkedIn 上打开了"Open to Work"标签。我回到我的数据清理工作。
值班:夜晚是个(哭闹的)孩子
17:40。我交叉着手指更新任务看板。意识到已经十天没能在 19 点前合上笔记本电脑,一阵伤感袭来。
17:55。大家状态都已经是"下班啦 👋",值班警报响了。没人敢喘气。没人敢看。但排班表上是我:客户数据库所在的区域宕机了,而明天是营收高峰日。当我的自动化代码试图从零重建基础设施时,我看着 Slack 上的绿色小圆点一个接一个熄灭,伴随着关于"背着 pager 的人日子多苦"的告别玩笑。
19:35。任务完成。基础设施重建完毕,备用数据库已提升,备份已验证,权限已恢复,测试已跑通。全部在一个半小时内搞定。在 2011 年,同样的灾难光是找安装 CD 就要花我三个小时的深夜时间。是啊,我想我在这方面越来越拿手了。
我合上笔记本电脑,"下班回家":走八步到客厅的沙发。至少现在停车免费了。工时银行,一如既往,将来再谈。
技术改变了一切:磁带变成了时序数据库,走廊里的物理服务器变成了云上的代码。但归根结底,什么都没变:用户依然会删错行,老板依然要项目昨天就交付,而完美的文档依然是个神话——只不过如今,是个排版精美得多的神话。