第二百二十一章 算法之外
方小满房间的门关上之后,客厅里只剩下路灯从窗帘缝隙挤进来的那道光。
林知行没有去睡。
他坐在那把二手椅子上,椅子的靠背已经松了,往后仰的时候会发出一声闷响。这把椅子是他和方小满从四环外的旧货市场搬回来的,花了三十块。方小满当时说"三十块的椅子配五百万的公司",说完自己笑了。
他坐在椅子上,没有动。
笔记本还在桌上。合着的。黑色硬皮封面,右下角有一个被泡面汤溅出来的褐色斑点,擦不掉了。
他伸手翻开。
笔记本不是按时间顺序写的。
有些页是从前面开始用的,有些页是从后面倒着翻过来写的。中间还有几页被撕掉了——那是他在灵犀科技时写的"项目路线图v1.0",他走的那天把它们撕了。撕痕还在,纸边参差不齐,像一排不整齐的牙齿。
他没有从头开始翻。他从中间打开,随便落在一页上。
页面的左上角写着一个数字:72%。
那是长沙十家门店的库存预测准确率。旁边画了一条上升曲线,从58%到72%,用红色签字笔标注了每个节点——"接入天气API""王老板反馈""加入区域消费数据"。曲线在72%的位置停住了,后面是一条虚线延伸到85%,旁边打了一个问号。
他盯着这条曲线看了很久。
不是在想准确率的事。他是在想画这条曲线的那天晚上——方小满不在,陈小川还没招进来,周然刚入职第三天。他一个人坐在合租房的折叠桌前,笔记本摊开,手边是一碗已经凉透的泡面。窗外在下雨,雨点打在防盗窗的铁栏杆上,嗒嗒嗒嗒。
那天晚上他画完曲线,在旁边写了一行字:"数据不够。模型太粗。但方向对。"
这行字的墨水比页面上其他的字都淡。不是因为时间久,是因为那天晚上他的笔快没墨了。他记得自己用力甩了两下笔,又在纸角试了试,才继续写的。
他往后翻了几页。
一页上只有两行字。第一行:"短期确定性 vs 长期自由度。"第二行:"我到底怕什么?"下面没有答案。那是他离开灵犀之前的那个晚上写的。纸面上有一个圆形的水渍——是水杯留下的印子。
再往前翻。
一页的边角被折过。折痕很深,折了很多次。他把那页展开,看到上面画了一张关系图——中心节点是沈渡,连着灵犀内部和外部的各种线条。有些线条是用铅笔画的,有些是用签字笔,有些是用红色圆珠笔——在不同时间用不同的笔加的。整张图看起来像一张蛛网。
图的右下角,他写了一行小字:"可能想多了。但也可能没有。"
他盯着这行字,嘴角动了一下。
再往前翻。
纸张的质感变了。前面的页数用的是另一种笔记本——不是现在这本硬皮的,是那种校园超市里两块钱一本的薄本子。两本笔记被他用胶带粘在了一起,中间有一段页码的纸特别厚。
那是大专时候的笔记本。
他翻到第一页。
页面上画着一棵二叉树。不是正式的数据结构图,是用圆珠笔随手画的,节点大小不一,有的圆有的扁。树的根节点写着"选择",左子节点写着"专升本",右子节点写着"直接工作"。
这是他第一次用算法思维分析人生。
他记得那天下午。数据结构课上,老师随口提到了时间复杂度。O(n)、O(n²)、O(log n)——这些符号击中了他。不是因为它们有什么了不起,是因为他忽然发现了一种语言,可以描述他一直在想但说不出口的事。
他的人生是O(n²)的。把所有可能的路径穷举一遍,看哪条能走通。每条路的复杂度都高得离谱,而他的时间有限。
他在二叉树的下方写了一行字:"是否存在O(log n)的人生路径?"
圆珠笔的蓝墨水已经褪色了,从深蓝变成了浅蓝。但字迹还在。他的字以前很潦草,笔画之间不连,写得急,像是怕停下来就会忘记自己在想什么。
现在他的字变了。比以前慢,比以前稳。每一笔都有落点。
他翻到二叉树那页就不翻了。那是起点。
他想起画这棵树的那个下午。宿舍里只有他一个人。方小满在隔壁寝室打牌,隔壁在喊"炸弹"。窗外有人在楼下打篮球,球弹地的声音一下一下传上来。
那时候他不知道自己会走到今天。
那时候他只知道一件事——他不满足。不满足于"大专生就是混日子的"。不满足于投简历被系统自动过滤。不满足于父亲跑一趟长途挣两千八。
他不知道出路在哪里,但他知道现在的路走不通。
四年过去了,他可以回答那个问题了。
"是否存在O(log n)的人生路径?"
答案是:不存在。
人生没有O(log n)的路径。没有哪条路是"每次砍掉一半可能"的。每一步都是全量遍历,每一步都有不确定性,每一步都可能走错。
但人生有一种算法无法描述的东西。
叫做选择。
他把笔记本翻到最后一页。
前面三行字是今晚写的。方小满关灯之前他写的。
"做一个让人信任的人。"
"信任是人和人之间最短的距离。"
"从不会听人说话,到教别人听人说话。"
这三行字下面还有一大片空白。
他拿起笔。
笔是黑色签字笔,0.5的笔尖,按压式的。外壳被汗浸得有点发黄,按压弹簧的声音不太脆了。
他把笔尖放在纸面上。
不是马上写。他在想。
他在想这四年里他写过多少段伪代码。在大专宿舍里写过,在灵犀的角落工位上写过,在青旅的上铺写过,在四环外合租房的折叠桌上写过。每一段都是他试图用算法描述人生的尝试。
function decide(创业, 大厂, 专升本)——三个选项之间犹豫不决的夜晚。
function survive(原则, 钱)——那个让他觉得恶心的函数,if (钱 < 阈值) return 放弃(原则)。
function split(方小满, 林知行)——方小满出走之后他写的,注释是"没有最优解"。
每一段伪代码都是一次失败。不是代码写错了,是问题定义错了。他一直在试图把人生塞进一个函数里——输入参数,计算输出,按输出执行。但人生不是一个函数。人生是一段运行中的代码,它不接受输入,也不提供输出。它只是在运行。
笔尖触到了纸面。
他写了一段伪代码。
function decide(原则, 商业) {
return 原则 + 商业;
}他看着这段代码。
之前写的所有伪代码,参数之间都是冲突的。"原则"和"钱"是互斥的。"创业"和"大厂"是二选一的。"方小满"和"林知行"是分裂的。函数体里全是if-else,全是取舍,全是痛苦的判断。
但这一段不一样。
没有if。没有else。
原则和商业,不是两个互斥的变量。它们可以相加。
他在代码下面写了一行注释:
// 原则和商业不是互斥的。它们可以共存。写完他放下笔,靠在椅背上。椅子的靠背发出那声闷响。
他看着这行注释,想起了很多事情。但没有一件需要再写下来。
那些事情已经在这本笔记本里了。从第一页的二叉树,到最后一页的伪代码。每一页都是一个决策,每一个决策都是一次尝试——把人生塞进一个函数里,看输出是什么。
输出从来都不是他想要的。
但他不再失望了。
因为他花了四年才明白——做对的事,同时也是做赢的事。只是"赢"的定义变了。以前他以为赢是"打败对手",现在他知道赢是"让行业变好"。
这不是算法的结论。这是经验的结论。
他把笔记本合上,放在桌上。
客厅很安静。窗外的风不知道什么时候停了。路灯的光从窗帘缝隙挤进来,在地板上画了一条线。
他站起来,走到白板前面。
白板上有些字已经被擦掉了,只留下淡淡的痕迹。有的字用红色马克笔写的,擦了很多次还有残影。右下角贴着那张K572时刻表。边角已经卷起来了,透明胶带的边缘发黄。但父亲画的那个红圈还在——K572,始发07:15,次日05:38到北京西。
他没有去细看白板上的字。他只是站在那里,站了一会儿。
然后他走到窗边。
窗外是四环外的夜景。远处的写字楼有几层还亮着灯,近处的居民楼大部分已经黑了。楼下便利店的招牌闪着白光。
他想起第一次来北京的那个凌晨。K572次列车,五点三十八分到站。他从出站口出来,背包勒着肩膀,箱子轮子在地砖上嗒嗒响。那时候他什么都没有。
现在他有了很多东西。但他最重要的不是这些。
他最重要的东西,是这四年里听到的那些话。
方小满说:"有些问题不是算法问题。"
姜意说:"你的方案只考虑技术可行性,没有考虑用户的学习成本。"
父亲说:"你做的事我看不懂,但我知道你在做对的事。"
方小满又说:"沈渡用控制来保护自己,你用信任来保护自己。"
这些话都不是算法。算法不会说"做对的事"。算法只会在参数之间做取舍,只会在if和else之间选一条路。
但人不一样。人可以把两个看起来互斥的东西加在一起。
他在注释下面又加了一行。不是代码,不是注释,是一句话:
"这是最后一段伪代码了。"
然后他把笔记本合上,把笔放在上面。
不知道过了多久。
他靠在椅背上,看着天花板。天花板上那个问号形状的污渍还在。从他们搬进来的那天就在,两年了,没人擦过。
方小满出走之后的那个晚上,他一个人躺在方小满的床上,盯着那个污渍。那时候他觉得那个问号在问他:你怎么办?
现在他看着同一个问号。它还是问号的形状,没有变。但它不再是一个问题了。
它只是天花板上的一块水渍。
卧室的门响了。
方小满穿着拖鞋走出来,头发乱着,眼睛半眯着。他没有开灯,摸着墙走到客厅。
"你怎么还没睡?"
"坐一会儿。"
方小满揉了揉眼睛。他看到了桌上的笔记本,翻开的。他走过来,低头看了一眼。
那段伪代码就摊在纸面上。方小满看了几秒。然后他抬起头,看着林知行。
他的眼睛还带着睡意,但那层睡意下面有别的东西。是方小满从大专时候就有的那种表情,像在看一个终于想通了什么的人。
"你又在算什么?"方小满问。
"在算一个有解的算法。"
方小满的嘴角动了一下。"什么解?"
林知行指了指笔记本上的注释。
方小满又低头看了一眼。他念了出来,声音带着刚睡醒的沙哑:
"原则和商业不是互斥的。它们可以共存。"
他念完,抬起头。安静了两秒。
然后他拍了拍林知行的肩膀。手掌很重,带着体温。
"知行。"他说。
"嗯。"
"你终于超越了算法。"
林知行笑了。
不是那种咧嘴大笑,是嘴角往上提了一下。很轻。
"是你们教会我的。"他说。
方小满的手还搭在他肩上。
"谁们?"
"你。姜意。赵鸣岐。陆可盈。沈渡。我爸。"林知行顿了一下,"你们每个人都教会了我一点东西。"
方小满的手在他肩上拍了两下,收了回去。他打了个哈欠,用手背擦了擦嘴。
"行了,别煽情了。"他说,"睡觉。明天还有会。"
他转身往卧室走。走了两步,停下来,回头看了一眼。
"知行。"
"嗯?"
"那个笔记本,留着。"方小满说,"以后给小孩看。告诉他你爸以前也是个不会听人说话的人。"
林知行没接话。方小满的拖鞋在地板上趿趿拉拉地响,卧室的门关上了。
客厅又安静了。
门后面传来方小满倒在床上的声音,弹簧嘎吱响了一下,然后是翻身的声音,然后是均匀的呼吸声。
方小满睡着了。三秒钟。
这个人从来都是这样。想睡就睡,想醒就醒。不像他——想太多,睡不着。
他转过头,看着窗外。天边开始发白了。不是亮,是黑在变淡。四环外的路灯还亮着,但光线开始变弱。
他看了看手机。四点四十七分。
他没有关灯。窗帘外面的天已经够亮了,灯的光开始变淡。
他走到自己的床边——折叠桌旁边的那张行军床。行军床的帆布已经塌了,躺上去会凹下去一大块。
他躺下来。
帆布陷下去,发出一声轻响。
他看着天花板。那个问号形的污渍还在那里。但他看着它,不再觉得它是一个问题了。
它只是天花板上的一个形状。
他闭上眼睛。
脑子里没有在跑算法了。
以前他闭上眼睛的时候,脑子里总是在转——数据结构、系统架构、客户方案、竞争分析、资金流预测。他的大脑像一台永远不关机的服务器,后台进程数满了,CPU使用率99%。
现在后台进程全停了。
不是因为问题解决了。是因为他终于知道——不是所有问题都需要解决。有些问题只需要接受。有些关系只需要维护。有些路只需要往前走,不用算到终点。
超越算法不是不再用算法。是知道算法的边界在哪里。
算法能算出最优路线,但算不出司机想不想走那条路。
算法能算出利润最大化的定价,但算不出老顾客对招牌菜的感情。
算法能算出两个选项的期望值,但算不出自己想做什么样的人。
这些东西在算法之外。
窗外的天彻底亮了。
四环外的车声开始变多。楼下有人按了一下喇叭,很短的一声。
林知行没有睡着,但他也没有想什么。他只是躺在那里,听着这些声音。
方小满的鼾声从卧室里传出来,隔着一扇门,变成了很轻的嗡嗡声。
客厅的白板上,K572时刻表的边角在晨风里微微翘起。
桌上的笔记本合着,黑色签字笔放在上面。
他翻开了很多页。从O(n²)开始,到今天的function decide(原则, 商业)。每一页都是一个决策,每一个决策都是一次尝试。
输出从来都不是他想要的。
但他不再失望了。
因为他在笔记本的最后一页找到了答案。答案不是算法,不是代码,不是技术文档。
答案是一行注释:"原则和商业不是互斥的。它们可以共存。"
答案是一个人在凌晨四点从卧室里走出来,揉着眼睛,拍了拍他的肩。
答案是"你终于超越了算法"。
晨光从窗帘缝隙里挤进来,和路灯的光混在一起。
林知行睁开眼睛,看着天花板上的那个污渍。
不是问号了。
是天花板上的一块水渍。仅此而已。
他翻了个身,面朝墙壁。墙上贴着一张纸——是姜意公众号的一篇旧文章打印件,标题被折到背面去了,只露出一行正文:"AI创业者最容易犯的错:把解决方案当产品。"
他看着这行字,笑了一下。
然后他闭上眼睛。
这一次,他睡着了。
(全书完)