七月一日,建党节,县城有庆祝活动。街道上掛起了红色横幅,广场上在搭舞台,准备晚上的文艺演出。但科技街的网吧里,一切如常。烟雾、泡麵、键盘声、游戏音效,和外面的热闹是两个世界。
林浩走进“蓝海”网吧时是下午三点。他穿著最简单的白t恤、牛仔裤,帆布书包斜挎在肩上。收银台还是那个黄毛,在打《传奇》,看见他,抬了抬眼皮:“上次那个?37號还空著。”
“我等个人。”林浩说。
“哦。”黄毛没再理他,继续打游戏,屏幕上的道士正在用毒咒杀怪。
林浩找了个靠墙的位置站著,这里能看见门口。他从书包里拿出一本《c primer》——昨天刚从省城书店买的,2002年最新版,花了68元。他翻开,但没看进去,只是做样子。
他在等阿坤。
阿坤是“半夏”的真名,赵坤。昨天在qq上,他们约了今天下午三点在“蓝海”见面。林浩没说怎么认人,只说“你看到我就知道了”。阿坤问为什么,林浩说:“因为这里只有一个人会在这个时间看书。”
现在,他站在这里,手里拿著书。窗外的阳光斜射进来,在水泥地上投出窗框的阴影。空气里有灰尘在光柱里飞舞。
三点零五分,门被推开了。
进来的人很瘦,高,但背有点驼。穿一件洗得发白的灰色短袖衬衫,领子磨破了边。裤子是校服裤,蓝白条纹,膝盖处磨得发白。脚上一双旧球鞋,鞋头开了胶。背著一个黑色双肩包,包很旧,拉链坏了,用绳子绑著。
头髮很长,遮住了半边眼睛。皮肤很白,是不见阳光的那种苍白。下巴尖削,嘴唇抿得很紧。眼睛很大,但眼窝深陷,有黑眼圈,像很久没睡好。
他站在门口,眯著眼適应了一下室內的昏暗。然后目光扫过来,扫过收银台,扫过打游戏的少年,扫过烟雾繚绕的角落,最后停在林浩身上。
他看见了那本书。
他走过来,脚步很轻,几乎没声音。走到林浩面前,停下,看了他几秒,然后开口,声音很轻,有点沙哑:
“horizon?”
“是我。”林浩合上书,“阿坤?”
“嗯。”
两人对视。阿坤的眼睛很亮,是那种专注的、锐利的亮。他盯著林浩看,目光里有审视,有疑惑,也有一丝好奇。他在打量这个在网上出题考他们、一个人做出《细胞吞噬》的“大佬”。
林浩也在打量他。十九岁,但看起来更小,像个高中生。不,比高中生还憔悴。衣服不合身,袖口长出一截,肩膀处松松垮垮。手指细长,骨节分明,指甲剪得很短,很乾净。右手食指和中指的第一节有茧,是长期敲键盘磨出来的。
“找个地方说话?”林浩说。
阿坤点点头。
他们没在网吧里说话。林浩在前,阿坤在后,走出网吧。外面的阳光很刺眼,阿坤眯起眼,抬手挡了一下。
“去哪?”他问。
“找个安静的地方。”林浩说,“跟我来。”
他推起自行车,阿坤步行跟在旁边。两人沿著科技街往西走,过了两个路口,拐进一条小巷。巷子很窄,两侧是老旧的红砖房,墙根长著青苔。巷子尽头有一棵老槐树,树下有几块水泥板,是附近老人下棋乘凉的地方。现在是下午,没人。
林浩把自行车支在墙边。阿坤在水泥板上坐下,背包放在腿上,双手抱著。
“喝水吗?”林浩从书包里拿出两瓶矿泉水,递过去一瓶。
阿坤接过来,拧开,喝了一小口。他的喉结动了动,喝水的声音很轻。
“你从哪来?”林浩也在水泥板上坐下,和他隔著一米距离。
“合肥。”阿坤说,“坐夜车来的,早上刚到。”
合肥。中科大就在合肥。他果然是中科大的学生。
“輟学了?”
阿坤沉默了两秒,点点头:“上学期的事。”
“为什么?”
“没意思。”阿坤说,声音很平淡,“老师教的我都会,不会的他们也不懂。考试、作业、论文……浪费时间。我想做自己的事。”
“家里同意吗?”
“不同意。”阿坤扯了扯嘴角,一个很浅的、几乎看不出的笑,“我爸说要打断我的腿。我妈哭了三天。我弟说我疯了。”
“那你还出来?”
“在家也做不了事。他们整天念叨,邻居指指点点。”阿坤看著手里的水瓶,“我需要电脑,需要网,需要安静。家里没有。”
林浩没说话。他能想像那个画面:一个十九岁的少年,执意退学,家人反对,邻居非议,他把自己关在房间里,对著电脑,写那些没人理解的代码。饿了吃泡麵,困了趴在桌上睡,一天说不了三句话。
“你住哪?”林浩问。
“车站旁边的招待所,一天十五块。”阿坤说,“钱快用完了。”
“你哪来的钱?”
“以前存的。做家教,写小程序,攒了两千。用了三个月,还剩三百。”
三个月,两千块,在合肥生活。平均一天二十多块,要吃饭,要住宿,要上网。很难。
“你做的题我看了。”林浩换了个话题,“47行,sph简化版。怎么想到的?”
阿坤的眼睛亮了一下。那是说到他擅长领域时的光芒。
“sph標准算法在flash上跑不动,粒子一多就卡。我简化了核函数,只保留密度项和压力项,粘性项用人工粘性代替。交互半径固定,不用kd树搜索邻居,用均匀网格加速。时间积分用显式欧拉,虽然精度低但快。”他说得很快,很流利,不再是刚才那种迟疑的语气,“最后加了简单的边界处理,粒子出界就反弹。”
“性能呢?”
“100个粒子,24帧。200个粒子,15帧。够用了。”
“代码风格很乾净。”林浩说。
“嗯,我喜欢乾净。”阿坤说,“多余的代码就像噪音,干扰思考。”
林浩点点头。他懂这种感觉。好的代码像诗,简洁,准確,有力。
“你为什么出那道题?”阿坤突然问。
“找能做事的人。”
“找到了吗?”
“找到了三个。你是其中之一。”
阿坤沉默了一会儿,看著树影在地上摇晃。
“horizon工作室,”他说,“到底是做什么的?”
“现在做什么不重要。”林浩说,“重要的是未来做什么。”
“未来做什么?”
“做別人做不到的事。”
阿坤转过头,看著林浩。他的眼睛在树荫下很亮,像某种夜行动物的眼睛。
“比如?”
林浩没回答。他从书包里拿出那本《c primer》,翻开,里面夹著一张纸。纸上是他手写的一段代码。
“你看看这个。”他把纸递给阿坤。
阿坤接过,看了几行,眉头皱起来。
“这是……什么语言?”
“c ,但又不太像。”林浩说。
阿坤继续看。他的眉头越皱越紧,嘴唇抿成一条线。他看得很慢,很仔细,有时会停住,手指在纸上虚点,嘴里无声地念著什么。
那是一段关於並行计算的代码。用到了c 11的线程库、原子操作、无锁数据结构。在2002年,c 98都还没普及,c 11要等九年后才出现。这段代码里的概念,对现在的程式设计师来说,是天书。
阿坤看了整整五分钟。然后他抬起头,眼睛里是一种林浩从未见过的神色——震惊,困惑,但更多的是狂热。
“这……这是谁写的?”
“我。”
“不可能。”阿坤说,声音很肯定,“这些语法,这些库,我从来没见过。这个『std::atomic』,这个『std::thread』,这个『lock-free queue』……现在的c 没有这些。”
“如果我说,这是未来的c 呢?”
阿坤盯著他,像在看一个疯子。
“未来?”
“嗯。十年后的c 。”
沉默。只有风吹过树叶的声音,沙沙响。
“你……”阿坤的声音有点抖,“你怎么知道?”
林浩没回答。他收起那张纸,从书包的夹层里,拿出那台黑色的手机。
电量:0.7%。红色警告標誌在闪烁。
他按亮屏幕。在阳光下,屏幕有点暗,但还能看清。他点开一个文件——那是他用最后一点电量,从小艺的离线资料库里导出的,一段真正的、2028年的代码。关於分布式系统中一致性算法的实现,用了一种现在还没有的程式语言。
他把手机递给阿坤。
“看看这个。”
阿坤接过手机。他的手在抖。他盯著屏幕,眼睛几乎贴上去。他滑动,翻页,手指在颤抖。
他看了很久。久到林浩以为他要看完了,他突然抬起头,眼睛血红。
“这……这是什么?”
“未来的代码。”
“从哪来的?”
“我不能说。”林浩说,“但你相信我吗?”
阿坤没说话。他低下头,继续看。他的呼吸变得急促,胸口起伏。他翻到某个地方,停住,手指悬在屏幕上,颤抖。
然后他做了一件林浩没想到的事。
他跪下了。
不是那种电视剧里的夸张下跪,是很自然的,像腿软了一样,噗通一声,单膝跪在地上。手机还握在手里,屏幕朝上,代码在闪烁。
“这……这是……”他的声音哽咽了,“这是怎么做到的?这个算法……这个架构……我……我想了三年,没想明白……这里,这里用了一个我从来没见过的数据结构……还有这个,这个並发模型……”
他语无伦次。眼泪从他的眼眶里涌出来,顺著苍白的脸颊流下。但他没擦,只是盯著屏幕,像朝圣者看见了神跡。
林浩静静地看著他。这个十九岁的少年,这个数学天才,这个被家人视为废物、被社会拋弃的怪胎,此刻跪在地上,对著一段代码流泪。
他懂这种感觉。当年他第一次看到华为的鸿蒙架构时,也是这样。不是嫉妒,不是自卑,是一种纯粹的、对智慧的敬畏,对美的震撼。
“起来。”林浩说。
阿坤没动。他还在看代码,嘴里喃喃自语,声音很轻,很快,在说那些算法的细节,在说那些他看不懂但觉得惊艷的设计。
“阿坤。”林浩加重了语气。
阿坤抬起头,泪眼模糊地看著他。
“你想学这个吗?”林浩问。
阿坤用力点头,点得很重,像要把脖子点断。
“你想做这个吗?”
点头。
“那你愿意跟我干吗?不是打工,是伙伴。我们一起,把这个未来,变成现在。”
阿坤的嘴唇在颤抖。他想说什么,但发不出声音。他又低头看了一眼手机,看了一眼那段代码,然后抬起头,看著林浩。
“我……”他的声音哑了,“我可以吗?”
“为什么不可以?”
“我只是个輟学生,我什么都不会,我……”
“你会。”林浩打断他,“你能看懂这段代码,能看出它的精妙,这就够了。其他人,连看都看不懂。”
阿坤的眼泪又流下来。这次他没忍住,哭出声来。是那种压抑了很久的、崩溃的哭声。他跪在地上,抱著手机,肩膀剧烈地抖动。
林浩没劝他,让他哭。这个少年,背负了太多:家人的失望,旁人的嘲笑,自己的迷茫。他需要一场释放。
哭了大概五分钟,阿坤慢慢平静下来。他用袖子擦了擦脸,擦得脸上红一道白一道。他站起来,腿有点软,扶了一下树。
“手机……”他把手机递给林浩,动作很小心,像在递一件圣物。
林浩接过,看了一眼电量:0.3%。他关掉屏幕,放回书包。
“所以,”阿坤看著他,眼睛红肿,但眼神很亮,“你真的是从未来来的?”
“我不能说。”林浩说,“但你相信我吗?”
“信。”阿坤毫不犹豫,“我信。”
“为什么?”
“因为那段代码。”阿坤说,“那不是人能写出来的。不是现在的人。那里面……有未来的味道。”
“未来的味道?”
“嗯。”阿坤想了想,“简洁,优雅,但又复杂,深邃。像……像看到了星空。现在的代码,像地上的石头,能看得到边界。那段代码,看不到边界。”
很诗意的描述。但林浩懂。
“好。”林浩说,“那从现在开始,你就是horizon的第一位正式成员。负责算法和核心架构。第一个项目是网吧游戏更新系统,我需要你设计增量更新算法和压缩传输方案。”
“好。”阿坤说,声音很稳。
“你住的地方不行,太吵,也不安全。我帮你找个房子。”
“我没钱。”
“工作室预付。从你未来的分成里扣。”
阿坤沉默了一下:“分成……怎么算?”
“项目净利润的20%,按贡献分配。你是核心,至少能拿5%。如果项目成功,一个月应该有三五千。如果失败,一分没有。敢赌吗?”
“赌。”阿坤说,“反正我也没什么可输的。”
很实在。
“那走吧。”林浩推起自行车,“先带你去看房子。”
他们走出小巷,回到大街上。下午的阳光还是很烈,但阿坤没再眯眼,他挺直了背,脚步很稳。
林浩带他去了一家房產中介。在县城边缘,租了一个一室一厅的老房子,月租两百,押一付一。房子很旧,墙皮剥落,但安静,有简单的家具,床、桌子、椅子。窗户朝南,下午有阳光。
“电脑我明天给你弄一台。”林浩说,“今天你先收拾一下,买点生活用品。这是一千块,预付工资。”
他从书包里拿出一个信封,里面是十张一百的。这是他昨天从邮局取的,连环画稿费剩下的。
阿坤接过信封,手指收紧。
“谢谢。”他说,声音很轻,但很重。
“不用谢。这是你应得的。”林浩说,“明天早上九点,我来找你,开项目会。带上脑子。”
“嗯。”
林浩走了。他骑上自行车,在夕阳里往回走。风吹在脸上,很舒服。
他有了第一个伙伴。一个数学天才,一个代码疯子,一个和他一样相信未来的人。
虽然前路依然艰难,虽然电量只剩0.3%,虽然一切都还是未知。
但他不孤单了。
晚上回到家,父母在吃饭。母亲做了红烧鱼,庆祝他“找到工作”——他是这么跟父母说的,说有个公司看上他的技术,让他远程工作,预付了工资。
父母將信將疑,但看到真金白银,也就信了。
“什么公司啊?”父亲问。
“科技公司,做软体的。”林浩说,“总部在北京,我这边是分部。”
“哦……那你要去北京吗?”
“暂时不用,在家办公。”
“那好,那好。”母亲说,“在家好,妈能照顾你。”
吃完饭,林浩回到房间。他打开电脑,登录qq。阿坤已经在线了,头像亮著。
他发消息:“房子怎么样?”
阿坤:“很好,很安静。我买了泡麵、火腿肠、矿泉水。够吃一周。”
林浩:“別光吃泡麵,对身体不好。”
阿坤:“没事,习惯了。”
林浩想了想,打字:“明天开始,你跟我吃饭。我让我妈多做一份,每天给你送。”
那边沉默了很久。然后发来一句:“不用麻烦。”
“不麻烦。我妈喜欢做饭。”
又沉默。然后:“谢谢。”
“早点睡。明天九点。”
“嗯。”
林浩关掉qq,打开文档,开始写项目的详细设计。键盘声在夜里响起,嗒,嗒嗒,嗒。
窗外的县城渐渐安静下来。远处广场的演出结束了,人群散去,路灯一盏盏熄灭。
只有这个房间的灯还亮著。
林浩写著写著,停下来,看了一眼抽屉。
手机在那里,电量0.3%。
他想起阿坤跪在地上的样子,想起他看代码时的眼神。
那是火种。他要做的,就是保护这火种,让它燃烧,让它燎原。
他继续写。夜还很长,路也很长。
但至少,有人同行了。