特伦顿的风从教堂门口灌进来的时候,陈拙正弯着腰,把一箱临期罐头搬出来。
箱子不算轻。
纸板外壳被雪水打湿了一角,边缘有些发软,手指稍微一用力,就能摸到里面铁罐冰冷的圆弧。
亚伯拉罕站在後面,一边用胳膊挡开几个试图提前往前挤的流浪汉,一边用那根旧棒球棍敲了敲地面。
「排队。」
神父的声音不大,但在这条泥泞街道上足够有用。
「今天没人饿死,但谁抢,谁最後拿。」
人群里传来几声不满的咕哝。
一个裹着脏毯子的男人骂了两句,看到亚伯拉罕手里的棒球棍,又把嘴闭上了。
阿米尔站在教堂侧门旁,沉默地接过陈拙搬来的箱子,脸上没有多余表情,只在箱子堆歪的时候伸手扶正。
伊利亚则完全是另一种状态。
他站在泥水边缘,穿着那双已经被特伦顿毁掉的佛罗伦斯手工皮鞋,双手抱着一箱切片面包,嘴里从俄语骂到英语,又从英语骂回俄语。
「我发誓,如果上帝真的爱世人,他至少应该先让这个街区有一条像样的排水沟!」
亚伯拉罕头也不回。
「上帝可能也没想到,会有人穿着这双鞋来特伦顿搬面包。」
伊利亚冷笑了一声。
「我也没想到。」
他把箱子重重放在门边,又低头看了一眼自己的鞋,表情像是在参加一场小型葬礼。
陈拙从车斗里搬下最後一箱罐头,刚准备转身,口袋里的手机忽然震了一下。
起初他没听见。
101看书 101 看书网超便捷,.轻松看 全手打无错站
特伦顿的街道太吵。
有人在吵架,有人在咳嗽,远处还有警笛声被风吹得忽近忽远,伊利亚正对着一块溅到大衣下摆上的泥点发表长篇控诉。
手机又震了一次。
陈拙把箱子交给阿米尔,空出一只手,从大衣内袋里摸出诺基亚。
屏幕亮着,来电显示是一串跨洋转接後的号码。
下面跳着两个字。
楚戈。
陈拙看着那个名字,停顿了半秒。
这个点打国际长途,不是电脑炸了,就是人快炸了。
按楚戈的性格,前者的可能性还大一点。
在他的记忆里,这个名字通常和淩晨一点的宿舍灯光,乱糟糟的网线,半瓶可乐,以及键盘敲击声联系在一起。
楚戈不是一个喜欢打电话求救的人。
哪怕当年在学校,他写程序写到满脸发青,也更愿意先自己把问题拆成一地零件,再把其中最硬的那块丢到陈拙桌上。
陈拙按下接听键。
电话接通後,对面没有立刻说话。
听筒里先传来一阵很轻的电流声,然後是一个空旷而压抑的呼吸声。
隔了几秒,楚戈的声音才从地球另一端传过来。
「拙哥。」
声音很低。
有点哑,还带着一种很久没有睡觉後的乾涩。
陈拙站在教堂侧门旁,背後是灰白色的天空和泥泞的街道,前方是正在排队领取食物的人群。
他没有问「怎麽了」。
楚戈能在这个点打来,肯定已经不是一句「怎麽了」能解决的事。
「你说。」
陈拙换了一只手拿手机,另一只手从旁边的箱子里取出两罐肉酱,递给一个排到面前的老妇人。
老妇人接过罐头,嘟囔着道谢。
电话那头,楚戈沉默了两秒。
「我先说清楚。」
楚戈的声音压得很低,像是站在一个封闭的楼梯间里。
「我不是让你帮我写代码,也不是让你管我们公司的事。」
陈拙擡起眼,看了一眼正拿棒球棍维持队伍秩序的亚伯拉罕。
「嗯。」
「你也不懂计算机。」楚戈又说。
这句话说得很直,像当年宿舍里几个人互相拆台时的语气。
陈拙点了点头。
「对,我对计算机的理解,主要停留在别把水泼键盘上。」
电话那头沉默了一下。
楚戈像是想笑,但没笑出来。
那口气憋在嗓子里,最後只变成了一声很轻的呼吸。
「我就是想问你一个数学上的问题。」
陈拙从箱子里又拿出一袋临期面包,放到阿米尔递过来的桌板上。
「你问。」
电话那头,楚戈的声音顿了顿,开始尽量平静地描述。
他说得不快。
从三十万并发开始说。
说他们复现了波士顿那几篇预印本里公开出来的底层逻辑,写了两个月代码,买了能买到的最好商用伺服器,三十万并发时,系统跑得像一块凉水里的石头,纹丝不动。
然後是五十万。
一开始能撑,後面响应时间越来越长,内存堆积,主进程被系统杀死。
八十万。
死机。
一百万。
瞬间CPU拉满,内存见顶,伺服器像被人把脑子里所有神经同时点燃,直接宕掉。
後来他们试图在工程外围挂强制回收脚本。
楚戈说到这里的时候,声音里终於出现了一点压不住的疲惫。
「然後烧了一台伺服器的电源。」
陈拙安静地听着。
他没有插话。
特伦顿这边的队伍向前移动,陈拙跟着往旁边挪了一步,把手机夹在肩膀和耳朵之间,双手搬起一箱新的面包。
伊利亚看了他一眼,皱眉。
「你在跟谁讲电话?你现在像一个在战场上接听银行推销的人。」
陈拙偏过头,用肩膀压着手机,腾出一只手扶了一下快要滑下去的纸箱。
「等一下。」
他用中文对电话那头说了一句,又转头看向伊利亚。
「我朋友的机器快死了,情况比你的鞋严重。」
伊利亚低头看了一眼自己的皮鞋,脸色明显更差了。
「这很难说。」
陈拙没再理他。
阿米尔从他手里接过面包箱,目光落在陈拙耳边的手机上,又很快移开。
楚戈那边似乎也听到了这一句,但没有追问。
他继续说。
「代码我们查了三遍。」
「没有内存泄漏,没有指针越界,也不是线程池逻辑写错。」
「工程上的问题能试的都试了,但一到极值点,那个矩阵就太大了,机器吃不下。」
他的声音低了一些。
「拙哥,我现在就想问你一句。」
楼梯间里似乎有风声。
「你那个代数底座,是不是本来就不该这麽用?」
陈拙终於停下了手里的动作。
他站在教堂侧门旁,转过身,看向远处那条被雪水和泥巴混成灰黑色的街道。
陈拙沉默了几秒。
「你们直接用了完整结构?」
楚戈那边安静了一下。
「嗯。
「」
「完整矩阵?」
「嗯。」
「没有在生成前拆域?」
楚戈愣了一下。
「我们是在调度层之後做的切分。」
「那就是生成完再切。」
电话那头没有声音。
陈拙伸手从箱子里取出一罐肉酱,放到桌板上,又顺手把旁边那袋快滑下去的面包扶正。
「那不死才奇怪。」
这句话说得很轻。
没有责备,也没有嘲笑。
就像在说一件非常普通的事实。
电话那头,楚戈呼吸停了一瞬。
「什麽意思?」
陈拙看了一眼身边正在排队的流浪汉,转身往教堂里面走了几步,避开最吵的人群。
前厅里稍微安静一些。
亚伯拉罕看了他一眼,没有跟上,只是继续站在门口守着队伍。
陈拙靠在一张破木桌旁,低头看着桌面上散落的面包屑。
「那篇东西不是给你们这种机器直接跑的。」
他说。
「它是一个数学闭环。」
「我写它的时候,讨论的是高维并发对象在代数空间里的完整映射和一次性降维,它默认的是,在极值点出现时,承载它的系统有能力把完整对象先托住,再压下去。」
楚戈没有说话。
陈拙继续道:「你们现在的问题不是代码错了,也不是伺服器坏了。」
「是你们让那个完整对象出现了。
17
电话那边,楚戈的声音变得更低。
「完整对象不能出现?」
「在你们的机器上,不能。」陈拙说。
「完整矩阵一旦生成,就已经超过你们硬体能承受的范围了。後面再写回收脚本,就像盘子已经扣在地上了,你再研究怎麽端稳,来不及。」
「剪得动吗?」
楚戈没有回答。
陈拙听见电话那头有很轻的呼吸声。
他知道楚戈听懂了。
所以他没有继续解释「为什麽剪不动」。
楚戈不是数学家,但他是一个足够优秀的工程师。
陈拙只需要把那条线指出来,楚戈自己就能看到线後面的墙。
过了一会儿,楚戈才开口。
「可是原论文里的结构就是完整闭合的。」
「对。」
「如果不完整,数学上不就塌了吗?」
「看你在哪个层面上要求完整。」
陈拙说。
他低头看着桌面上的面包屑,伸出手指,在木桌上随手划了一下。
「你还记得以前宿舍里,大勇问过一个材料受力的问题吗?」
「哪次?」
「他用钢管和铝棒抵消热膨胀那次。」
楚戈沉默了一下。
「记得。」
「那不是完美材料。」
陈拙说。
「它只是让两个不完美的东西在某个局部区间里互相抵消,整体上当然不优雅,也不纯粹,但在那个温度范围内,它稳定。」
「你们现在也一样。」
陈拙停顿了一下,听见外面伊利亚又在抱怨有人踩了他的鞋。
「你们不需要完整的全局最优。」
「你们只需要局部不炸。」
电话另一端,楚戈的呼吸声变重了一点。
「怎麽做?」
「你别问我代码。」
陈拙说得很乾脆。
「我看你们那东西,大概跟你看大勇的合金配比差不多。」
电话那头,楚戈终於低低笑了一声。
很短。
但那股压得快要发硬的东西,似乎因为这一句松了一点。
陈拙继续道:「但从数学上说,你们不该让那个矩阵完整出现。」
「别等所有并发请求汇成一个整体再降维。」
「在它进入完整映射之前,先把输入域拆开。」
楚戈没说话。
陈拙擡起头,看向礼拜堂的方向。
门缝里能看见那块破旧黑板的一角。
「比如一百万。」
陈拙说。
「你们现在把它当成一个一百万的整体去算,所以它会生成一个你们机器托不起的高维对象。」
「但一百万不是一百万。」
楚戈听到这句话,忽然有一种很熟悉的感觉。
当年在科大宿舍里,陈拙给王大勇解释实变函数的时候,也曾用这种像拆积木一样的语气,把一个看起来庞大而沉重的东西拆成很多个简单到令人发愣的部分。
陈拙继续道:「一百万可以是二十个五万,也可以是五十个两万,重点不是数字怎麽分,重点是每一块内部必须能够独立闭合。」
楚戈的手指下意识地按在楼梯间粗糙的墙皮上。
「局部闭合?」
「嗯,每一个局部块内部,保留完整映射,块和块之间,不传递完整矩阵,只传递边界量,边界量必须低维,必须固定,必须允许误差。」
电话那头安静了足足五秒。
然後楚戈的声音忽然变得快了一点。
「也就是说,不能做全局调度,要做分片局部调度。」
「这是你的说法。」
陈拙纠正道。
「我的说法是,不要把整个空间一次性擡起来,你们擡不动。」
「那块和块之间的数据冲突呢?」
「用边界常数处理。」
「常数C?」
「别用那个。」
陈拙几乎没有停顿。
「那个太重。」
楚戈愣住了。
「太重?」
「嗯。
「」
陈拙看了一眼自己的鞋尖。
「原始常数C是为了证明用的,不是给几台商用伺服器硬背的。」
他说这句话的时候,没有任何不好意思。
好像一篇震动数学、物理和计算机世界的东西,在他这里本来就只是某种不适合普通机器的理论工具。
「你们需要一个简化的边界常数。」
「它不必维持全局代数优雅,只要能保证两个局部块拼接时不发生数据冲突。」
楚戈的眼睛慢慢亮了起来。
「牺牲一部分全局最优?」
「对。」
「换局部稳定?」
「对。」
「那用户请求在块之间迁移的时候怎麽办?」
「那是你的问题。」
陈拙回答得非常自然。
「你是写代码的。」
楚戈张了张嘴,忽然又有点想笑。
这个回答太陈拙了。
他确实不懂计算机。
他甚至懒得假装懂。
可他偏偏把最核心的那道数学门槛,直接踹开了一条缝。
「拙哥。」
楚戈低声说。
「我能不能理解成,你让我把完整空间拆成很多个小盒子,每个盒子里自己算自己的,盒子之间只交换一个很轻的边界标记?」
「差不多。」
「这个边界标记不追求数学上的完美闭合,只保证工程上不冲突?」
「不是工程上。」
陈拙又纠正了一次。
「是局部代数关系不冲突。」
楚戈立刻改口。
「对,局部代数关系不冲突。」
陈拙想了想,又补充了一句。
「还有一点。」
「你说。」
「不要在映射之後回收。」
「那在哪?」
「映射之前。」
楚戈整个人猛地站直,楼梯间里的灯因为他的动作闪了一下。
「映射之前?」
「你们之前的外挂回收为什麽烧机器?」陈拙问。
楚戈立刻答道:「因为强制回收切断了同调映射,矩阵找不到对应节点,疯狂重试。」
「所以不要切已经映射过的东西。
陈拙说。
「在它成为矩阵的一部分之前,就决定它属於哪个局部块。」
「如果它不属於任何块,就先让它等。」
「别让它进去。」
楚戈握着手机的手指慢慢收紧。
这不是代码,这也不是一个可以直接复制粘贴的解决方案。
但这是一条路。
一条他们自己可以走的路。
输入域前置分片。
局部闭合。
低维边界量。
简化边界常数。
映射前限流,而不是映射後回收。
这几句话在楚戈脑子里迅速拼成了一张新的架构图。
不是原论文里那个巨大,完美,漂亮到不讲道理的数学圣殿。
而是一排低矮,结实,能扛风雨的仓库。
不好看。
但能用。
电话那头,特伦顿的声音忽然又变得嘈杂起来。
有人大声争执,亚伯拉罕低沉的警告声从远处传来,伊利亚用他那极具穿透力的俄式英语骂了一句什麽。
陈拙侧过头,看见救济队伍前面有两个男人因为多拿一袋面包推搡起来。
亚伯拉罕的棒球棍已经擡了起来。
阿米尔默不作声地走过去,站在两人中间。
陈拙收回目光,对电话那头说:「我这边快从分面包变成分人了。
楚戈怔了一下。
他这才重新意识到,自己这通电话并不是打到了普林斯顿某间安静的办公室里。
对面很吵。
有风声,有人的争执声,有箱子拖动的声音,还有一个陌生男人用带弹舌的口音不耐烦地骂街。
「你在哪?」楚戈下意识问。
「特伦顿。」
「干嘛?」
「分面包。」
楚戈一时间没反应过来。
「啊?」
陈拙看着门外泥泞街道上排队的人群,语气很平常。
「帮一个神父分临期食品。」
电话那头沉默了两秒。
楚戈忽然不知道该说什麽。
深市南山科技园的楼梯间里,白炽灯忽明忽暗。
门後是十几台伺服器,是合同,是上线时间,是百万并发,是一家公司生死存亡。
而电话另一端,陈拙站在新泽西某个贫民区破旧教堂的门口,手里可能还沾着面包屑正在给流浪汉分食物。
两个世界隔着半个地球。
却被一通国际长途勉强连在一起。
楚戈靠着墙,忽然笑了一下。
「你还真是......在哪都挺忙。」
陈拙没有接这句。
他只是说:「楚戈。」
「嗯。」
「别去碰完整模型。」
陈拙的声音在嘈杂背景里依然稳定。
「你们用不起,不丢人。」
楚戈喉咙动了一下。
这句话比任何安慰都有用。
不是你们差。
是这东西本来就不是这麽用的。
「我知道了。」
楚戈低声说。
陈拙继续道:「你们现在要做的,是写一个你们自己的版本。」
「不是复现我那篇东西。」
「是借它的骨架,重新搭一个能在你们机器上站住的东西。」
楚戈闭上眼睛,深吸了一口气。
「明白。」
「别问我代码。
「」
「不会问。」
「别问我商业。
「不问。」
「你们自己决定能牺牲多少延迟,能接受多少等待,能把输入域拆成多碎。」
「好。」
陈拙看了一眼教堂门口,亚伯拉罕已经把那两个推搡的男人分开了。
「我挂了。」
楚戈握着手机,忽然开口。
「拙哥。」
「嗯?
「谢了。」
电话那头安静了一下。
然後陈拙的声音传来。
「别烧第二台伺服器了。」
楚戈愣了半秒,随即低低笑出了声。
「尽量。
"」
>