第二天早上七点二十,林深提前十分钟出现在飞讯办公室。
他象个猎手,精准的等待猎物。
七点二十五,老吴出现在办公室,他先是给自己冲泡了杯速溶咖啡,然后对着计算机屏幕皱眉,屏幕上大概又是哪个改不完的bug列表。
林深起身,用指节不轻不重地敲了敲门。
“进。”老吴头也没抬。
林深推门进去,站在那张堆满文档的办公桌前。老吴这才抬眼看他,眉头立刻习惯性地皱起来:“有事?晨会马上开始了。”
“吴经理,”林深的声音平静得有点不象他这个年纪该有的样子,“昨天部署的那个监控工具,在夜间低负载环境下运行数据我分析过了,基本平稳。
但我怀疑它在早高峰并发场景下可能有隐藏问题——比如缓冲区竞争或者锁粒度不合适。我需要去机房做实地压力观测,最好能抓到底层的包交互原始数据。”
老吴放下咖啡杯,盯着他看了好几秒:“现在?马上要开晨会了,今天还有三十多个bug要分。”
“问题可能只在特定时间窗口出现。”林深语调依然平稳,“现在不去抓数据,等到明天早高峰万一真出问题,又得全组熬夜。当然,如果您觉得等出了问题再救火更符合团队节奏,那我现在就回去参加晨会。”
他说完,静静等着。
老吴的手指在桌面上敲了敲,发出“嗒、嗒、嗒”的闷响。他看看林深,又看看计算机屏幕上那片红色的bug列表,最后烦躁地挥了挥手:“行行行,去吧去吧。记住,只读权限,别碰任何生产配置!”
“明白。”
林深走回自己工位,从抽屉里拿出了书包,里面装了他的个人笔记本计算机、充电器和一瓶水,他又在工位上抓起白纸和笔,慢条斯理地拉好拉链,然后在一片键盘敲击声中穿过办公区,走向楼梯间。
机房的金属门在身后“咔嗒”一声合上。
世界瞬间换了种声音。
几十台服务器风扇低沉持续的嗡鸣像某种巨型生物的呼吸,密集的指示灯明灭闪铄,空气里是微弱的臭氧味和金属散热片特有的气息。
这里的温度比外面高至少五度。
但林深没的选,他在角落找到一个运维用的临时工位,打开机房计算机,又打开了自己的笔记本计算机。
和办公区一模一样。
林深看着那个数字,扯了扯嘴角。系统果然冷酷——就算待在离公司“心脏”最近的地方,只要做的事本质还是重复性维护,系数就不会变。
他看了眼时间:七点四十。
距离上午十点的笔试还有两小时二十分钟。
够用!
林深在终端里输入几条监控命令,让服务器日志和数据流在屏幕上开始滚动,然后他把身体往后一靠,转椅发出“吱呀”一声呻吟,他把双脚抬起来,直接架在旁边一台闲置的服务器机箱上,鞋底蹭着机箱表面冰凉的金属。
姿势放松得象在自家沙发上。
摸鱼时间开始累计,林深在脑海中复习着昨天【快速归档】整理过的那些知识点。
9点半,机房门被老吴第二次推开。
老吴走了进来。
他先是习惯性地抬头看了看墙上的监控大屏——上面滚动着各服务器cpu、内存、网络流量的实时曲线。确认所有指标都在绿色区间后,他才把目光移向机房深处。
然后他的脚步顿住了,这小子在偷懒?不对……
只见角落那台掉漆的铁桌子前,林深正以一种极其怪异的姿势瘫在转椅上:头向后仰着,脖子弯成几乎九十度的角度,喉结突兀地凸出来;眼睛半睁半闭,目光涣散地盯着天花板上某块污渍;嘴唇在轻微翕动,念念有词却听不清内容;两只手垂在身体两侧,手指却象弹钢琴似的在空气里一下下敲着,仿佛面前有架看不见的键盘。
更让老吴心里发毛的是林深脸上的表情。
嘴角向上翘着,是个笑的模样,但眼睛里没有一点笑意,反而空洞得吓人。整张脸在荧光灯下泛着一种不健康的青白,配上那涣散的眼神和神经质的手指动作,活象个……沉浸在自己世界里出不来的疯子。
“林深?”老吴试探着叫了一声,声音在空旷的机房里显得有些虚。
没反应。
老吴皱着眉走近几步,提高音量:“林深!”
林深猛地转过头。
动作快得象个弹簧,脖子发出“咔”的一声轻响。他的眼睛瞬间聚焦,瞳孔收缩,直直盯在老吴脸上。那眼神亮得反常,像烧着两簇幽暗的火,看得老吴下意识往后退了半步。
“吴经理。”林深开口,声音有点沙哑,却透着一股压不住的兴奋,“您来得正好,我发现了一件特别有意思的事。”
老吴被他看得心里发毛:“什、什么事?”
“您看这台服务器,”林深指着旁边一台正在低鸣的戴尔机架服务器,手指几乎戳到机箱外壳上,“我监控了它半个小时的风扇转速曲线和tcp重传率波动,您猜怎么着?”
老吴盯着那台黑乎乎的机箱,完全不知道该怎么猜。
“存在一种奇妙的相位差!”林深自己揭晓答案,声音因为兴奋而微微发颤,“风扇每加速一次——嗡!三百毫秒后,网络栈的缓冲区就会有一次微小的溢出倾向。您看这个图。”
他迅速在键盘上敲了几下,屏幕跳出一张红绿交织的波形图。
“这两个波形的峰值,永远差三百毫秒。严丝合缝,分秒不差!”林深转过身,眼睛亮得吓人,“吴经理,您说这是不是某种共振效应?机械振动传导到主板,影响了网卡芯片的电气稳定性?还是说……这栋楼的地磁场有什么异常?”
老吴盯着屏幕上那些起伏的曲线,完全看不懂。他只能看见林深那张因为激动而泛红的脸,那双亮得不正常的眼睛,还有那挥舞着手臂、语速越来越快的样子。
“更妙的是,”林深突然压低声音,身体前倾,象要分享什么惊天秘密,“吴经理,您知道吗?这就象人生!”
老吴彻底懵了:“……什么象人生?”
“丢包啊!”林深双手一摊,象个在街头布道的狂热信徒,“一个数据包发出去了,没收到ack。它可能是真丢了,永远到不了对端;也可能只是延迟了,正在某个路由器的队列里排队,过一会儿就能到——就象你付出的努力,不一定马上有回报,可能只是时机未到。”
他站起来,在狭窄的过道里踱步,手指在空中划着看不见的轨迹:“但如果你不停地重传,发一个包,等两百毫秒,没回应,再发,再等……系统就会拥塞,带宽就会被占满,真正重要的数据反而过不去。人生也是这样啊,如果你对一件事执念太深,不停地‘重传’,不停地强求,生活就会陷入死循环,其他重要的可能性反而被堵死了……”
他说得手舞足蹈,眼神飘忽,脸上泛起一种病态的红晕。
老吴张着嘴,完全接不上话。
他看着眼前这个实习生:袖子卷到肩膀,头发因为激动而有些凌乱,眼睛亮得象要烧起来,嘴里说着他完全听不懂的“技术哲学”,他心里此时只有一个念头:
这小子……是不是连续加班加疯了?
不对啊,这两天他都是正常下班……
“所以有时候,”林深突然停下来,转过身,直直盯着老吴,“得学会放手。让该丢的包丢掉,让该走的人走掉。系统会自己调整拥塞窗口,人生……也会自己找到出路。您说对不对,吴经理?”
老吴喉结动了动,干巴巴地说:“你……你先把该干的活儿干完。这些……这些玄乎的东西,少想点。”
“干活?对,干活。”林深咧嘴笑起来,那笑容璨烂得有些过头,“我一定‘好好’干活。毕竟工作是为了生活嘛。但是吴经理——”
他往前凑了凑,压低声音,象在说什么了不得的秘密:
“您有没有想过,如果生活本身就成了工作,起床是上班,吃饭是加油,睡觉是关机维护……那我们到底在为什么而活呢?就为了明天继续起床‘上班’吗?”
老吴被他问得头皮发麻。
他觉得林深今天格外不对劲,但又说不出具体哪里不对——人家确实在“工作”,屏幕上是监控数据,嘴里说的也好象跟技术有关,就是那状态……那眼神……那笑容……
瘆得慌。
“……你继续吧。”老吴最终选择了撤退。他转身,脚步比来时快了不少,几乎是逃也似的走向机房门口。
走到门边时,他还是忍不住回头看了一眼。
林深已经重新瘫回了转椅上。头仰着,脖子弯成那个怪异的角度,眼睛盯着天花板,手指又在空气里一下下敲着。嘴里念念有词,脸上挂着那种似笑非笑的表情。
象个沉浸在自我世界里、完全与外界隔绝的疯子。
老吴心里嘀咕着推门离开,决定今天下班前不再来机房了,眼不见为净。
机房门“咔嗒”一声合上。
林深脸上的“疯癫”表情瞬间收敛。
他坐直身体,揉了揉后颈——刚才那个姿势保持久了,脖子确实有点酸。
【累计摸鱼币:102】
刚才和老吴扯淡也被算在了摸鱼里,完美!
要不是怕老吴在他笔试时进来,他还真不演这一出,够癫的!
九点五十五分,笔记本连上手机网络。
九点五十八分,打开流览器,输入腾讯笔试系统的网址。
九点五十九分,登录——账号密码他早就背熟了。
十点整,笔试页面准时刷新。
第一部分,计算机基础,30道选择题。
林深扫了一眼题目,嘴角扯了扯。大部分都是死记硬背的东西:osi七层模型每层的功能、进程和线程的区别、死锁的四个必要条件……对他来说,这些知识点就象呼吸一样自然。
二十二分钟后,第一部分完成。
系统自动跳转到第二部分:逻辑推理,20题。
图形推理、数字符串行、语言逻辑……林深遇到第三题时卡住了——那是一道复杂的立方体展开图旋转题。他盯着屏幕看了半分钟,直接点了“标记,稍后回答”。
跳过去。
他做得很从容,甚至有点……享受。每解出一道题,他就在心里对自己说:看,这就是不用加班、不用改“按钮向左移2象素”的bug、不用听老吴吼叫的生活。纯粹的逻辑,干净的思维,多好。
四十五分钟时,前两部分全部完成。
系统跳转到编程题环节。
第一道:给定一个字符串,找出其中最长的回文子串。
经典题。林深几乎不用思考,手指就在键盘上飞起来。他写了一个中心扩展算法,时间复杂度o(n2),空间o(1)。写完后,他想了想,又在注释里加了一段:
这既展示了知识面,又体现了工程权衡。
第二道:两数之和的变种,找出数组中所有不重复的和为目标值的元素对。
又是昨晚重点复习过的题型。林深先排序,再用双指针,同时小心处理重复元素。代码写完,他特意测试了几个边界用例:空数组、所有元素相同、目标值比所有元素都小……
十一点零五分,两道编程题提交。
系统最后一次跳转。
最后一道题:系统设计。
题目描述简洁得让人心悸:“设计一个简易的实时通讯系统,支持一对一文本消息发送。请从客户端、服务器、协议、存储等角度简要阐述你的设计思路,并重点说明如何保证消息的可靠投递。”
林深盯着这行字,沉默了很久。
机房的嗡鸣声在耳边持续。
他有答案。他太有答案了——前世在微信团队七年,参与过消息系统从简单到复杂、从单机到分布式的整个演进过程。他知道每一个坑在哪里,每一种权衡背后的代价,每一次架构升级的痛苦。
但他不能写。
现在是2010年。。他不能把2018年的微信架构直接搬过来。
他需要写一个“2010年的聪明人会想出来的方案”。
一个符合当时技术现实、却又隐约透出一点前瞻性的方案。
一个既扎实、又有点“小聪明”的方案。
林深开始敲字。
他写得很快,但很克制:
客户端:基于tcp长连接,心跳保活(30秒一次),断线自动重连(指数退避)。
服务器:简单的连接管理(用字典存erid->socket映射),消息路由(查字典转发),消息先存内存队列,再异步刷到磁盘文档。
协议:自定义二进位协议,包头包含消息类型、长度、串行号、发送者、接收者、时间戳。
可靠投递:发送方等待服务器ack,服务器存储成功后回ack,接收方收到后回送达回执。每个环节都有超时重传,最多三次。
写到这里,他停下来。
他看着屏幕上自己写的东西,眉头慢慢皱起来。
太普通了。
这就象一份教科书式的标准答案,每个学过网络编程的大学生都能写出来。挑不出错,但也绝不会让人记住。
他需要一点……不一样的东西。
林深看了眼时间:十一点二十分。还剩四十分钟。
用。
【是】
一瞬间,世界变了。
不是时间停止,而是……思维的速度被强行拔高了一个维度。
耳边服务器群的嗡鸣声陡然退远,变得象隔着厚厚的水层,模糊而缓慢。眼前屏幕上的文本却异常清淅,每一个象素都锐利得刺眼,光标每秒一次的闪铄慢得象在呼吸。
但他的思维在狂奔。
前世那些记忆碎片——技术讨论会的争吵、架构文档的版本变迁、在线事故的复盘报告——此刻不再是零散的画面,而是被某种无形之力串联、编织,形成一张立体的知识网。
他想到了几个关键点:
移动特性。现在是2010年,智能机正在崛起。设计不能只考虑稳定的wi-fi环境,还要考虑蜂窝网络的不稳定、高延迟、频繁切换。可以在协议头里加一个“网络类型标记”,客户端根据这个标记决定一些行为——比如在2g下,不发大的图片预览;在电量低于20时,主动告诉服务器“进入节电模式”,让服务器延迟非紧急消息的推送。
状态同步的简化。当时的i系统,比如手机qq,喜欢搞复杂的用户状态:在线、离开、忙碌、隐身、q我吧……其实大部分都没用。他可以提出一个极简理念:只区分两种状态——“可送达”和“不可送达”。在线、离开但可接收消息?都是“可送达”。脱机、隐身?都是“不可送达”。干净,省资源,减少同步开销。
存储的演进路径。不要一上来就设计一个复杂的、能支撑亿级用户的存储架构。那太假,面试官反而会觉得你不踏实。他应该写一个“演进式设计”接用文档存储+内存缓存;用户上十万了,迁移到ysql单表;上百万了,ysql分库分表;上千万了,引入nosql做冷热数据分离,热数据存redis,冷数据存hbase。这叫务实的前瞻性——我知道未来会怎么样,但我从最简单、最靠谱的开始做。
一个小创新点。可以在消息头里加一个“内容特征标记”——比如这条消息是纯文本、是图片、是语音、是文档。客户端根据当前网络状况和电量,决定是否预载非文本内容。比如在wi-fi下,自动预载小图预览;在3g下,只载文本,图片要用户点开才下载。这在2010年还是个很新的概念。
思路如溃堤的洪水,汹涌而出。
林深的手指在键盘上疯狂敲击。不是写代码,而是写设计思路。他摒弃了冗长的段落描述,采用清淅的条目式结构。
他写得飞快,手指几乎在键盘上留下残影。
五分钟,三百秒。
当【子弹时间】效果结束的提示浮现时,林深已经写满了整整两屏的答题区。
他停下手,快速滚动浏览自己写的内容。
逻辑清淅,层次分明。基础部分扎实得无懈可击,创新部分又恰到好处地亮眼——既不过分超前到脱离2010年的技术现实,又隐约指向了移动互联网未来的发展方向。
完美。
他长长呼出一口气,感觉太阳穴在突突地跳。高强度思维加速的后遗症开始显现,有点晕,有点反胃。
但他没时间休息。
十一点二十五分,还剩三十五分钟。
他重新回到试卷开头,从第一道选择题开始,一道一道检查。修正了两处粗心导致的选项错误,优化了一道编程题的边界条件注释。
十一点五十五分,距离截止还有五分钟。
他最后一次滚动页面,确认没有遗漏。
然后,光标移到页面最下方的“提交”按钮。
点击。
页面跳转,出现一行简洁的蓝字:
“笔试已完成,感谢参与。结果将在3-5个工作日内通过邮件通知。”
林深靠在椅背上,闭上眼。
哈?
考试也被算在了摸鱼里?
林深几乎在此时拥有了双倍的快乐。
只是,【子弹时间】的后遗症还在,但那种在子弹时间里思维清淅、灵感迸发、仿佛能看见知识脉络在眼前流动的感觉——真的,会让人上瘾。
他在椅子上坐了很久,直到心跳慢慢平复,直到晕眩感退去,才开始慢条斯理地收拾东西。
“吴经理,工具包部署好了!”