第13章 字母排序
达斯汀蹲在客厅地板上,面前摊着三台笔记本电脑,屏幕上密密麻麻全是代码。他的头发比平时更乱,嘴里叼着一根已经嚼烂的铅笔,脸上的表情像是刚被人从被窝里拎出来扔进了考场。
“我真的不是故意按字母顺序排的。”他第五次重复这句话。
扎克伯格站在他身后,卫衣帽子拉得严严实实,手里端着一杯已经凉透的咖啡。他没有骂人,但那种沉默比骂人更让达斯汀难受。
陈舟推开门的时候,看到的就是这个场景。玛利亚坐在角落里,面前屏幕上滚动着服务器日志。她今天把头发放下来了,棕色的长发遮住了半边脸,但遮不住嘴角那一丝极淡的弧度——那种弧度只有在她觉得某件事很好笑但又不打算说的时候才会出现。
“什么问题?”陈舟把背包放在折叠桌上。
“你来看。”达斯汀把一台笔记本转向他。
屏幕上是一个Facebook内测页面。所有好友动态按照用户名的字母顺序排列——A开头的在最上面,Z在垫底,中间是一堆杂乱无章的动态。Amy的生日祝福旁边紧挨着Adam的派对照片,紧接着是Bob发的猫咪视频。完全没有任何时间线逻辑。
“我本来想优化好友排序算法的。”达斯汀的声音越说越小,“结果改了一个索引变量,跑完之后就变成这样了。我不小心把所有动态按照名字首字母重新排了一遍。”
“你知道这意味着什么吗?”扎克伯格说,“如果Adam今天过生日,他的生日动态会永远置顶。而Zachary哪怕发了一条地震警报,也会被压在最下面。”
“我知道!所以我在修!”
“修了多久了?”
达斯汀看了一眼屏幕右下角的时间,沉默了一瞬:“……四个小时。”
陈舟走到达斯汀旁边坐下,接过笔记本开始翻代码。他看了大概两分钟,然后停下来。前世他在阿里见过无数次类似的bug——有一个bug导致所有商品价格按商家注册地邮编排序,损失了上百万。字母排序算什么。
“索引变量写错了。”陈舟指着屏幕上某一行,“你把用户的姓名首字母赋值给了时间戳的排序权重。系统现在不是在按时间排序,是在按名字排序。”
达斯汀凑过来看了一眼,然后整个脑袋垂了下去,额头几乎碰到了键盘。
“……我就是个白痴。”
“不是。”陈舟把笔记本转回来,“你只是没睡够。你上次睡觉是什么时候?”
达斯汀没有回答。
“他上次睡觉是三天前。”扎克伯格说。
“那破案了。”陈舟站起来,去厨房倒了杯水放在达斯汀面前,“喝完。然后去睡两个小时。等你醒了,这个bug我帮你修。”
“你不应该帮我修。你是产品经理。”
“在这个房间里,所有人都是修bug的人。先去睡。”
达斯汀捧着水杯,嘴唇动了动,想说什么但没说出口。他站起来,脚步虚浮地走向那张旧沙发,人还没躺平眼睛就闭上了。三十秒后,客厅里响起了轻微的鼾声。
扎克伯格走到陈舟旁边,看着达斯汀毫无形象的睡姿,沉默了一会儿。
“你让他去睡是对的。”
“疲劳状态下改代码,只会改出更多bug。前世——以前我见过太多人犯同样的错。”
“你刚才想说‘前世’?”扎克伯格的目光从达斯汀身上移开,落在了陈舟脸上。
客厅里的声音突然变轻了。玛利亚的键盘声停了一瞬,然后重新响起来,但节奏比刚才慢了半拍。
“口误。”陈舟说。
扎克伯格没有继续问。他靠在桌边,双手插在卫衣口袋里,眼睛看着白板上那三行字——照片标记已完成,News Feed后面打了一个勾,公开注册还标着“时机未到”。
“News Feed内测的bug不止这一个。”他说,“用户隐私设置的面板还没调好。达斯汀改完排序之后又崩了权限模块。玛利亚的服务器负载报告今早刚出来——如果按现在这个增长速度,公开注册上线那天服务器绝对扛不住。我们可能需要把News Feed推迟。”
“推到什么时候?”
“六月下旬。甚至七月。”
陈舟靠在椅背上。前世News Feed在2006年9月上线,引发了一场席卷全美的舆论风暴——数十万人抗议,媒体口诛笔伐,扎克伯格被骂成“侵犯隐私的疯子”。但也正是这个功能,让Facebook从校园黄页变成了全球社交网络的基础设施。
而现在,因为蝴蝶效应的累积——帕克提前加入、双层股权结构落地、团队扩招——News Feed被提到了2005年夏天。这比前世早了将近一年。
“六月下旬可以。”陈舟说,“但我建议在公开测试之前加一个阶段——封闭邀请测试。”
“封闭邀请?”
“从现有用户里挑五千人,给每个用户发三个邀请码。只有被邀请的人才能体验News Feed。这样既能控制服务器压力,又能制造稀缺效应。”
扎克伯格推了推眼镜,没有立刻回答。他在思考——陈舟很熟悉这种沉默。
“如果用户拿到邀请码之后在社交媒体上炫耀,等于免费帮我们造势。”扎克伯格慢慢说,“而且封闭测试出任何问题,影响面都是可控的。”
“对。”
“这个方案比直接公开测试更稳。”
“更稳”这个词,从扎克伯格嘴里说出来比从任何人嘴里说出来都更有分量。不是因为这个卷毛小子喜欢稳重——是因为他不喜欢。他只有在真正被说服的时候,才会承认某个方案“更稳”。
“那就按这个方案来。”扎克伯格走到白板前,在News Feed旁边加了一个新标签——封闭邀请测试,“你这套东西,不像是临时想到的。”
“提前想好的。”
“你一直在提前想好所有事,对吗?双层股权、YouTube、公开注册、News Feed、封闭邀请。你好像永远知道下一步该怎么走。”
陈舟看着白板上那些潦草的字迹。2005年4月22日,距离他重生已经整整五周。五周前他推开扎克伯格宿舍那扇门的时候,他还是一个刚刚从2025年穿越回来的陌生人。现在他是这间屋子里产品决策的核心,是YouTube的天使投资人,是江晚秋半年赌局的对手,是杭州那间五金店在太平洋彼岸的守护者。
“我只是比较擅长想。”陈舟说。
扎克伯格没有再追问。他把马克笔放在白板下面的凹槽里,转身走回自己的大桌子前,重新打开电脑。但陈舟注意到他在坐下的时候,回头看了自己一眼。那个眼神里没有怀疑,只有一种很奇怪的东西——像是认同,但比认同多了一层什么。
下午,拉杰带着他的服务器架构改造方案来找陈舟。这位新来的运维工程师入职不到两周,已经把Facebook现有的服务器拓扑结构全部画成了详细的拓扑图。他把图纸铺在陈舟桌上,指着其中一处标注了红色感叹号的位置。
“这个节点是单点故障风险。如果它挂了,整个西部高校的用户都会受影响。我建议在公开注册之前加一组冗余服务器,成本大概会增加百分之十五,但能保证故障切换时间控制在三十秒以内。”
“玛利亚看过这个方案吗?”
“看过。她说行。”
“那就做。预算我去跟马克谈。”
拉杰收起图纸,转身走了两步,又停下来。
“陈舟。”
“嗯?”
“玛利亚说你是这个房间里唯一一个不问‘什么时候修好’的人。我现在明白她为什么这么说了。”
拉杰说完就走了,没有等陈舟回答。和玛利亚一样,他也是那种不习惯等回答的人。大概运维工程师都有这个职业病——说话的时机永远在服务器不报警的间隙里,说完就得马上回去盯着屏幕。
傍晚的时候,达斯汀从沙发上醒了。他揉着眼睛走回自己的工位,发现排序bug已经被修好了。陈舟在他的代码注释里写了一行字://下次改索引变量之前,先睡够。
达斯汀盯着那行注释看了很久,然后在下面加了一行://下次睡觉之前,先备份代码。
扎克伯格从大桌子那边飘来一句:“你们两个人,把注释当聊天群在用吗?”
晚上,陈舟一个人坐在门前的台阶上。
加州的暮色比杭州来得更慢。太阳落下去之后,天边会拖很久才彻底变黑。大学路上的路灯一盏接一盏亮起来,暖黄的光晕里有飞虫打转。远处汉堡店里又响起吉他的声音,这次弹的是《Vincent》,梵高那首歌。很老,很安静,适合加州的夜晚。
他掏出那部诺基亚1100,打开记事簿。在那一长串未来大事记的最下面,他又加了几行字。
2005.4.22达斯汀字母排序bug。Facebook史上经典bug,在这个时间线上提前发生了。
2005.4.22 News Feed决定加封闭邀请测试阶段。蝴蝶翅膀继续扇动。
2005.4.22拉杰入职第二周。服务器冗余方案启动。
他合上手机,抬头看着头顶那片深蓝色的天空。
前世他在阿里见过无数这样的傍晚——加班到天黑,走出办公楼的时候路灯已经亮了,附近便利店的灯箱在夜色里发着白光。那时候他是一个人在看这些。现在他坐在帕洛阿尔托的台阶上,身后是一间亮着蓝光的老房子,里面有一个刚睡醒的达斯汀在改bug,有一个戴着卫衣帽子的扎克伯格在盯数据,有一个不说话的玛利亚在角落里看着服务器日志,有一个刚到两周的拉杰在画他的拓扑图,有一个不知道去哪了的肖恩·帕克。
还有一个刚被他投了天使轮的YouTube,正在圣马特奥那间车库里默默地增长用户量。
杭州那边,江晚秋应该已经把公司注册的文件准备好了一半。
蝴蝶翅膀正在扇动越来越多的风。有些风他知道会吹向哪里,有些风他也不知道。
但这正是“再来一次”的意义——不是把所有事情都做对,而是把所有事情都做得比上一次更好。

