背景
最近单枪匹马来到了上海, 我有很多的行头其实都没有带, 只有一台笔记本电脑, 所以以前周末的一些习惯都已经在无法复刻, 再加上网友们一个一个慢慢的回归生活, 以及最后又一次融入新环境的不适感, 每到周末的情感的复杂程度总让我想写点东西.
BoJack Horseman
久仰大名。之前公司里,好些同事的头像都来自这部剧;加上心里一直搁着“好好学英语”的念头,便慢慢追了起来。
阅历上来之后,眼睛会变。看到的不再只是大浪淘沙后留下的佳作,也会遇到不少被营销号一路吹捧、点进去才发现名不副实的东西。小时候不是这样——那时的互联网似乎更纯粹;或者说,那个年代的创作者,是真的想留下点好东西,而不是赚一笔快钱就走。这些年,看过不少冲击我价值观的作品,审视作品的能力也水涨船高,所以打开这部剧时,我原本没抱多大期望。
但我错了。
诚然,它有吸引眼球的网剧成分,也有大量无厘头的搞笑与色情。可与这些表层元素相对的,是它出奇纯粹的主线——在这么长的剧集里,该过渡的地方就老实过渡,绝不强行升华;该爆发的时候一定爆发,绝不含糊。这种分寸,只有自己也攒下了一点审美,才分得清它的可贵。作为一部彻头彻尾虚无主义的成人向作品,它铺开的,全是些不可名状的无奈:童年、友情、婚姻与亲情。
真正留下来的,并不只是台词,而是几层近乎残酷的提醒:
- 有些事会一天天变容易,但前提是每天都得继续。
- 母亲死了,痛苦却没有结束,一切反而变得更糟。
- 人有时只能想象一个终将好起来的未来;哪怕明知它是假的,也要靠它撑过今天。
- 救人同样有边界。有些人救不了,他们会在挣扎中把施救者一起拖下水。
这些话之所以能留下来,是因为每次想起,对应的那一幕都会自己浮上来。每一季的最后几集总让人惊叹,看完只想立刻点开下一季。可它同时也是我最盼着完结的一部——因为我清楚,剧一天不结束,笔下的主角就一天成不了好人,只能一遍又一遍地在同样的错误里打转。
关于几处争议,我也想说说自己的看法。
猫和老鼠看似情投意合,可从“猫”和“老鼠”这两个名字落定的那一刻,结局就已经写好了——这两个物种,天生就不可能在一起。
至于最后一集到底是不是幻想——我倾向于不是。理性地讲,主角到了后期早已支离破碎,再没有被彻底修复的可能,于是只能借这样一种方式,让他和所有人在最后一集好好告别。也正因如此,最后一季的结尾比从前和缓许多。戴安说的那些话,其实就是节目组在向观众告别:哪怕你曾是无比重要的同行者,哪怕你早已长在了我的生活里,到头来,也终究要学会分开。
网、线、点——写给《博德之门3》的遗憾
手边只剩一台 MacBook,主机被我扔回了家,娱乐选择所剩无几,这才想起《博德之门3》已经在库里躺了许久。
说实话,之前从未接触过 D&D 类游戏,光是入门就学了许久。可它确实不愧“最佳游戏”之名——我甚至很难挑出几处体验糟糕的地方。硬要说,游玩途中偶尔冒出来的 Bug 确实让人扫兴;但比起 Bug,我更想聊的是遗憾。
初入这个世界,第一章的难度高得吓人,可与之相对的,是几乎铺满整章的探索。你可以先接下营地的任务,也可以转身走向另一片区域;无论从哪里开始,对话和后续经历都会随你的选择发生变化。一张近乎网状的结构就这么铺开——几乎每一次重开都是全新的体验,你也不必担心错过了什么就够不到完美结局,因为它早已为每一个选择备好了回应。这是我第一次意识到,原来“选择”可以做成世界本身的一部分,而不是几个摆在面前的分支。
但网,是会收的。
第一章的后半段,那种近乎任性的自定义能力已经在悄悄退潮。到了第二章,甚至可以说只剩两条路,而这两条路早已被排好了先后。大多数玩家会从幽暗地域进入第二章,先抵达终焉光芒旅店,体验相对完整;可偏偏有我这样从“养鸡场”一头扎下去的人,先撞上月出之塔,之后几乎没有任务引导,只剩满头雾水。
第三章尤其无奈。每一个副本单拎出来都足够好玩,设计也自有考量,在我看来已经足够精妙——我玩惯了《魔兽争霸》的 RPG 地图,对这种密度并不陌生。可它们只是一个个“点”,没连成“线”,更谈不上第一章那张“网”。加上队伍此时早已成型,绝大多数 Boss 活不过一个回合,探索的欲望便一路走低。地图很乱,各个副本之间也像是没来得及串联起来——这才是真正该被诟病的地方。
还有善线与恶线的失衡。恶线的回报实在太薄,起码该有些额外奖励,甚至可以让一些善线中与你为敌、最终死在你手里的 NPC,在恶线里转身成为盟友,长出独立的内容。
话又说回来,即便带着这些遗憾,也足够让它在游戏史上名留青史。后半程如何收束,本就是这类作品最难的一关,强如 R 星也未必逃得过。
《博德之门3》从来不是一款没有遗憾的游戏。它的后半程节奏、探索结构与善恶两线,都留着许多可供争论的余地。可真正令人敬佩的是,即使把这些遗憾悉数摆上台面,它依然稳稳站在这个时代最优秀的 RPG 之列。
我之所以会为那张“网”逐渐收成“线”、再缩成“点”而怅然,从来不是因为它做得差。
而是因为它曾经让我见过更高的可能。
写到这里才意识到,我对一款游戏的遗憾,与最近工作中的不适,其实来自同一个地方:因为见过完整的“网”,所以越来越难对眼前的“点”与半成品视而不见。
旁观者
不知怎的,最近情绪似乎出了些问题,总会想起过去。我原本不是一个容易怀旧的人。走出那段阴霾后,也在慢慢学着重新热爱生活;可最近,心里总压着一些说不清的执念。
先是又一次踏上了减肥的路。上海的饮食清淡,公司的盒饭也寡淡,加上自己还有些恒心,瘦下来本该是水到渠成的事。只是低热量摄取久了,人也会身心俱疲——热量低下去,快乐好像也跟着低了。
再就是进了新公司。这里处处带着一股半成品的味道:环境尚未分层,协作工具彼此割裂,组织关系有些模糊,支撑音频产品的技术积累也留着许多空白。每一项都能勉强运转,又都离完整差了一点。
真正勾起回忆的,是我打开了这里的代码仓库。过去每到一个项目,我几乎都是那个维护基础设施的人,也习惯了去看别人的地基是怎么搭的。日志、设计系统、动画、弹窗、网络请求、网络图片——眼前的每一项工程,都像是我曾经做过的影子,只是换了名字,又重新摆到面前。那些我以为已经走远的日子,也就这样一起回来了。
他们招我过来,原本就是想改变一些东西;好在重构没有遇到什么阻碍,甚至是被欢迎的。后来项目开始做一个大功能,我也分到了其中一部分。这类需求我之前做过,正因为做过,才很难只满足于把功能完成;我知道哪些地方还可以更好,也想把上一次留下的遗憾补上。为了加快进度,项目安排了结对开发。
开工前,两个人都把话摆上了桌:我说我有代码洁癖,经我手的东西,得好好设计;她说她不想加班。需求被分成两期,而她手上还有别的任务,一期的大部分工作便落到了我身上。项目的基建不足,每往前走一步,都要先补一补脚下的地基;而我又做过类似的需求,实在无法忍受第二次的结果还不如第一次。于是从方案到实现,从基础设施到细节调整,我几乎习惯性地全揽了过来。好在最后压着线,赶上了一期的验收。
没错,看到这里你会发现,我漏了一个人——结对的另一个人,我把她忘了。我原本只想守住开工前的约定,尽量不影响她的休息,便选择自己加班,自己把体验补到完整。有一天晚上,她来找我对进度。那时我刚下楼,又折返回去;看了看剩下的工作,大多要先调研再实现,便还是没有分给她。后来我们一起散步,聊起了项目的过去和未来。她仍然觉得未来充满希望;我却更悲观,习惯把所有希望,换算成必须有人亲手落实的工作量。
散步快到头时,她问了我一个扎心的问题:
“你是不是不够信任我?”
我愣住了。从头到尾,我压根没有往那个方面想,只想着把需求提速,赶在 DDL 前收工,甚至当场随口敷衍了过去。可这句话让我辗转反侧,久久不能释怀。我曾以为穿过那场大雪,就能看到春暖花开;后来才明白,穿过大雪的意义,只是证明我能在这冰天雪地里,一个人活下来。那场大雪之后,我习惯了独自承担,也总下意识地相信,到了最后,只有自己能为自己的未来负责。说到底,我很难再全身心地信任别人了。
到了二期,我还是把核心交互交给了她,目前看来,结果也不错。即使没有那晚的问题,我大概也会作出同样的安排。她的话没有改变我的决定,只是让我第一次看清,自己早已把独自承担变成了一种本能。那些我以为已经过去的事,其实并没有真的过去;它们只是换了一种方式,留在了我的选择里。
这边 iOS 组有一个习惯,每到周会,会留出一点时间分享东西。有一周恰好轮到我。怎么说我也是几个小开源库的作者,能讲的东西不少,便没怎么提前准备,只想着端午返程还有五个小时,怎么也该想出来了。
刚入行时,iOS 生态里还找不到一个真正能满足需求的图片压缩开源方案。于是我从项目里的真实问题出发,一点点调研、学习,再一周接一周地调整策略。需求方提供场景,QA 一次又一次地协作测试,我再把这些经验从业务项目里抽象出来,才终于把它做成一个开源库。
所以我一直为它骄傲。它不只是我一个人写下的代码,而是一群人从真实问题出发,一起拼出的一个从 0 到 1 的答案。它的 Star 数不多,但直到今天,去搜索 iOS 图片压缩相关的内容,仍然有机会看到它的名字。它确实应验了那句话:Always leave the campground cleaner than you found it.
压缩库之外,我也无比怀念写《聊聊 Markdown 中的 LaTeX》的那段时光。它最终没有沉淀成一个完整的开源库,却同样是在几乎无人铺路的地方,一点点把答案推出来。那篇文章里,几乎每一个关键知识点,我都花上一周去调研、验证。那并不是一次豁然开朗,而是一寸一寸地柳暗花明;可正是那一寸一寸的推进,让我感到自己真的在理解问题。如今再把同样的课题摆在面前,我却已经完全不想再这样做了。也正因如此,我才格外怀念当时那个愿意用一周换一个答案的自己。
可在返程的车上,当我把旧实现和当年的选择交给 AI 重新推演时,它却给出了一条完全不同的技术路线。
我之所以强调那时候刚入行,是因为一个 iOS 开发者的知识,原本就是这样一层层生长的:先学会使用 UIImage,再在业务不断触碰边界时,慢慢接触 Data 与更底层的 ImageIO。当年的我以 UIImage 为核心,先借助它已经完善的 resize 能力,只有在它无法覆盖的场景下,才继续往下寻找答案。
也就是说,我只能从已经掌握的 UIImage 往 Data 推,再在有必要时下探到 ImageIO。我很难在刚入行时就跳出已有的知识边界,先站在 ImageIO 上,反过来向上搭建整个库。这不是因为当年的选择不够认真,而是人往往只能在自己已知的世界里,一点点向外修路。
AI 给出的方案恰好相反。它不需要重走我的学习路径,而是直接从问题的本质出发:图像处理的输入与输出本就是 Data,因此应该用 ImageIO 贯穿整条处理链路,再把 UIImage 降成靠近业务层的桥接工具。核心逻辑不再依赖某个 UI 框架,iOS、macOS 与 SwiftUI 都只需在上层适配;图像格式、色彩空间、HDR 与转换策略,也能在更靠近数据源的地方统一处理。
这才是真正让我震撼的因果倒置。当年的我从“我会什么”出发,一步步走向“我能怎么做”;AI 却先回答“这个问题应该怎样解决”,再反过来推导上层应该如何接入。它不只是比我多知道几个 API,而是跳出了我的知识生长路径,重新划定了整个库的抽象边界。
我反复追问、验证,最后不得不承认:它的整体方向是对的,新方案也比当年的版本更加完整。几个小时里,AI 就走过了我们当年需要一周又一周才能走完的路,甚至走得更远。
这当然是件好事。可正因为我知道那个库是如何一步步走来的,这几个小时才显得尤其锋利。从前的我,会很开心地写下如何发现问题、如何调研实现、又如何把它解决;这一次,结论来得太快,又太对,几乎没有留下再优化、再商量的余地。分享欲也就这样被击碎了。之前的我是统领协作的指挥家,而现在的我,只是一个连一句话都插不上的旁观者。
还有件又尴尬又可笑的事。平时开发强度高,我基本在工作日就会耗尽整周的 Agent 额度,于是周六周日反倒成了无事可做的空档。往常我会跟朋友开黑,游戏未必尽兴,可聊天总能稀释些什么。如今电脑没搬来,新机器又迟迟舍不得买,只能对着那台 Mac 发呆。那个周末实在太长,我逼着自己玩了两天《鸣潮》。
也算写了几年文章,现在的我对文字的要求,比最初高了太多。以前可能只像 CSDN 上的一篇小短文:发现一个问题,顺手记下,用一两百字把问题和结论说清楚,就可以发布。后来有好多篇,我反复写了几遍,又统统扔进废纸篓,因为它们没有一点情感的出口。我不知道这是好事还是坏事,只知道在这个时代,自己很少再因开发本身产生情绪波动了。这个站上大半的文章,大概都要变成“后日谈”。
更让我毛骨悚然的是,我把最近与 AI 的对话和过去那些随笔一并喂成语料,蒸馏出了一个属于我写作风格的 Agent。等我把基础的内容写完、说完,再交给它,它就能替我改成我的腔调。
甚至,它比我更像我自己。
于是从代码到文字,我作为创作者的参与感都在一点点消失。我越来越像一座连接 AI 的桥:只要把经验都收进一个仓库,变成一个挂满 Skill 的 Agent,再交给 AI 去跑,似乎就够了。而随着更强的模型一个个到来,我甚至不知道,自己还能不能算那个发号施令的人。
写这篇的同时,我恰好读到了喵神的《当编程变得不再有趣》。读下来满是同感,也有些羡慕:他已经能接受魔法换了一种讲法,并重新找到自己站立的位置;我却还停在变化发生的正中央,看不清下一步应该走向哪里。
说实话,未来会怎样,我不知道。一个无法描绘的未来,也很难让人立刻爱上它,去期待每一次重新升起的太阳。
我还不知道未来的自己会站在哪里。也许正因为看不清,最近才总忍不住回头。但人不能永远依靠回忆生活。无论代码、文字,还是别的什么,我仍想找到一件值得浪漫以待的事,也必须找回继续期待未来的勇气。
至少此刻,我还不甘心只做一个旁观者。