校园青春剧
剧本 · Script · 8 章 · 6/22/2026
第一章:代码与青春
# 第一章:代码与青春
九月的硅谷,阳光像被人用4K高清滤镜过了一遍——亮得有点不真实。
林凯背着一个快被撑破的双肩包,站在帕洛阿尔托联合高中的正门前,抬头看了看那块镶嵌在红砖墙上的铜牌。学校建于1962年,比他老爸的公司还年长三十岁。他在心里默默记下这个数字,然后迈步走了进去。
十七岁,新学期,新学校。
他在上一所学校只待了一个学期。原因很简单:太无聊了。
---
开学第一天的课间,林凯坐在图书馆角落的一张圆桌旁,笔记本电脑打开着,屏幕上跳动的不是教材,而是一段密密麻麻的Swift代码。他把耳机塞进耳朵,音量调到刚好能屏蔽外界噪音的程度,开始调试一个已经折腾了三个星期的小程序。
那是他自己做的一款App,名字叫**Lunchbox**。
功能说起来很简单:扫描学校的午餐菜单二维码,App会根据你当天的课程表、运动量和个人口味,自动推荐最适合你的午餐搭配,还能帮你在十五分钟的课间窗口里规划好取餐路线,避开最拥挤的窗口。
林凯把最后一个bug压下去,点开真机调试,满意地看着界面流畅地跑起来。他顺手截了个图发到学校新生群里,附了一句话:
> \"自制的,有需要的同学可以扫码下载,免费。\"
他以为只会有几个闲得没事的同学试着玩一玩。
他完全没想到,二十分钟后,图书馆门口开始排队。
---
\"你就是发那个App的人?\"
一个女生站在他桌子对面,手里攥着手机,屏幕朝他亮着——正是Lunchbox的下载页面。林凯摘下一边耳机,抬头看了看她。
扎着高马尾,一件宽松帽衫,五官清淡,但眼神沉静有力,带着一种不动声色的观察力,像是已经在心里把他判断了一遍,只是还没开口说结论。
\"对。\"林凯说。
\"这个推荐算法,你用的是什么模型?\"
\"协同过滤加了一点规则引擎。\"他顿了顿,\"数据集是我从学校官网爬的,加上这两周在几个午餐评价论坛手动标注的。大概三千条样本,不多。\"
女生沉默了两秒。
\"你自己标注的?\"
\"嗯。课上没什么事做。\"
她低下头,在随身带着的一叠便利贴上写了什么,撕下来折进口袋,然后不置可否地走开了。
林凯重新塞上耳机,继续盯着代码。
---
到了午餐时间,他的手机震动得根本停不下来。
Lunchbox在短短一上午里积累了将近四百次下载——这个数字对一所中学来说,已经是相当夸张的传播速度。有人把截图发到了学校论坛,标题写着:**\"新来的转校生,一个人做了一个比学校官方App好用一百倍的东西。\"**
林凯拿着托盘在人群中穿行,试图找到一个安静的角落坐下来。但他发现这件事已经完全超出了他的控制——走廊里有人认出他,冲他举起手机挥了挥;食堂广播还在放歌,却已经有人在角落里窃窃私语,目光不时扫向他的方向。
他有点不自在。
这种感觉他不是没经历过。上一所学校,他因为用脚本刷破了学校图书馆借阅系统的一个权限漏洞(只是为了能提前预约热门书籍),被班主任找去谈了一次\"影响不好\"的话。
他找到一张靠窗的空桌,刚坐下,就看见三个人向他走来。
走在最前面的男生比他高出半个头,穿着一件合身衬衫,头发整齐,手臂交叉搭在胸前,表情算不上友好。他把手机往桌上一拍——屏幕上是Lunchbox的评论区,最新的一条评论下面,挂着一长串技术讨论。
\"你叫林凯?\"
\"对。\"
\"我叫杰克。\"他拉开椅子坐下,完全没有等林凯邀请的意思,\"学校Coding Club的部长。\"他顿了顿,\"你这个App,数据是从哪儿来的,你刚才在图书馆说的那些,是真的吗?\"
林凯挑了挑眉:\"你在图书馆?\"
\"我在你旁边两排的位置。\"杰克说,\"你声音不小。\"
林凯想了想,把笔记本推过去,打开了项目文件夹。
\"代码都在这儿,你可以看。\"
杰克低头扫了一遍,神情有些微妙。他旁边两个人也凑过来看,其中一个压低声音说了句什么,另一个轻轻咳了一声。
\"这段推荐逻辑,\"杰克用手指点了点屏幕,\"有个地方会造成冷启动问题。新用户第一次使用的时候,推荐结果会退化成纯随机。\"
\"我知道。\"林凯说,\"还没修,打算这周末加一个基于人口统计的兜底策略。\"
杰克沉默了片刻。
\"你转学过来多久了?\"
\"今天是第一天。\"
又是一段沉默。
然后杰克站起来,把手机推回林凯面前。他没有再多说什么,转身对旁边的人说:\"走吧。\"
走出几步,他回过头,语气平淡得像在读一条系统消息:
\"Coding Club今天下午四点,B栋207。如果你想来的话。\"
然后他就走了。
林凯看着他们离开的背影,低头看了看自己的午餐托盘。
今天Lunchbox给他推荐的是:烤鸡胸肉、凯撒沙拉、一杯橙汁。
还不错。
---
下午最后一节课是物理,林凯坐在倒数第三排,把课本翻开压着,手机屏幕调到最低亮度,悄悄查看Lunchbox的崩溃日志。
有个边缘场景没覆盖到:当用户同时选了两种含花生的菜品时,过敏提醒会触发两次,弹窗叠在一起,UI乱掉了。
他在备忘录里记下来,顺手又记了一条:*冷启动兜底 / 人口统计 baseline。*
窗外,硅谷的阳光还是那么亮,像是永远不会暗下去。
操场上,有几个男生在踢足球,笑声隔着玻璃窗传进来,被物理老师讲解牛顿第三定律的声音轻轻淹没。
林凯盯着那行崩溃日志,嘴角微微动了一下。
新学校,第一天。
目前来看,还可以。
---
放学后,他把双肩包往肩上一甩,出了教室,在走廊路口停了停。
左边是校门,右边是B栋。
他掏出手机看了看时间:三点五十二分。
他往右拐,走进了B栋的走廊。
第二章:黑客马拉松的邀请
# 第二章:黑客马拉松的邀请
B栋207的门虚掩着。
林凯在门口停了两秒,听见里面有人在争论什么,声音压得很低,却带着某种克制的火药味。他推开门走进去。
教室不大,前排摆着六张拼在一起的课桌,上面密密麻麻地摆着笔记本电脑、移动电源和各种线缆。墙上投影着一张架构图,几行字用红色马克笔圈出来,旁边打了好几个问号。
杰克站在投影旁边,手臂交叉,看到林凯进来,只是微微抬了抬下巴。
"来了。"
他旁边坐着四个人。林凯扫了一眼——其中两个是中午跟着杰克一起来的,还有一个戴眼镜的女生在低头敲代码,完全没抬头。
最后一个人,坐在最角落里,正把一张便利贴贴到白板上。
是那个图书馆的女生。
高马尾,同一件帽衫。
她感觉到林凯的目光,侧过脸看了他一眼,没说话,把便利贴贴稳,转回身去。
---
**内景:B栋207教室——下午,放学后**
*(教室里,六个人围坐在拼起来的长桌前。投影上是一张黑客马拉松的报名简章,页面顶端印着:**"Bay Area High School HackFest · 第七届 · 赛期48小时"**。)*
**杰克**
*(点开PPT,语气平稳,像在做项目复盘)*
规则你们看一下。今年比赛在下个月第三周,周五下午六点开始,周日下午六点截止,全程四十八小时不间断。主题是"for campus"——面向校园场景的技术产品。评审是斯坦福两位教授加三个业内导师,今年还加了一个新规:作品必须在比赛结束前完成至少三十名真实用户的可用性测试。
**戴眼镜的女生(陈安妮)**
*(头也不抬)*
三十个测试用户,四十八小时,还得写文档,还得做演示……
**杰克**
去年我们拿了第三。今年目标是第一。
*(短暂沉默)*
**杰克**
*(转向林凯)*
你的Lunchbox,今天下载量多少了?
**林凯**
*(坐下,把包放到椅背上)*
刚过七百。
*(几个人互相看了一眼)*
**杰克**
七百,第一天,零推广。你的协同过滤冷启动问题怎么解决?
**林凯**
人口统计兜底,加上新用户引导时做一个轻量偏好标注,五道选择题,三十秒以内。
**杰克**
上线时间?
**林凯**
周六。
**杰克**
*(点点头,像是在心里确认某个判断)*
好。今年我们想做一个面向全校的课业协作平台——选题、组队、进度追踪、截止日期提醒、资源共享,一套打通。你加进来,负责推荐模块。
*(林凯没有立刻回答)*
**杰克**
怎么了?
**林凯**
这个方向,去年第一名做的是什么?
*(短暂停顿)*
**杰克**
……课业管理工具。
**林凯**
今年主题一样。
**杰克**
我们的执行比他们强。
**林凯**
评审见过一次的东西,印象分会打折。
*(杰克的眉头微微皱了一下,但没有说话)*
---
角落里的女生这时候开了口。
她没有站起来,只是把那叠便利贴往桌上一放,声音不高,却很清楚:
"他说得对。"
杰克转过头。
"苏雨晴。"
"重复的选题不是不能做,但你得有差异化。"
苏雨晴站起来,走到白板前,拿起马克笔,在"课业协作平台"这几个字旁边画了一条斜线。
"我上周找了去年前三名的作品复盘报告看了一遍。"
---
**内景:B栋207教室——连续**
**苏雨晴**
*(在白板上写下几个词:**"情绪"、"疲劳度"、"隐性需求"**)*
去年的工具都在解决"我要做什么"的问题。没有人在解决"我现在有没有状态做"的问题。课业压力最大的节点,不是你不知道deadline,而是你知道、但就是打不起精神动。
*(她停顿一下,看了看在场的人)*
**苏雨晴(续)**
如果推荐模块能引入用户的状态感知——睡眠、上课时长、近期测验分数、甚至今天打开App的时间段——给出的不只是"你要做什么",而是"你现在适合做什么"……这个才有意思。
*(短暂的安静)*
**陈安妮**
*(终于抬起头)*
状态感知的数据从哪儿来?总不能让用户每天填问卷吧。
**苏雨晴**
手机自带的健康数据API,睡眠和步数都有。加上App内的行为日志——开了多少次又关掉的,完成率,做题间隔时长——被动采集,用户无感知。
**陈安妮**
隐私协议……
**苏雨晴**
本地计算,不上传,用户随时可以关。
*(陈安妮若有所思地低下头,重新开始敲键盘)*
**杰克**
*(看着白板,沉默片刻)*
这个想法是你什么时候想到的?
**苏雨晴**
今天中午。
*(杰克看了她一眼,没有接话)*
---
林凯一直在听,没有打断。
等苏雨晴说完,他才开口:
"状态感知这个思路,算法上可以做。但有一个问题——"
苏雨晴转过头,眼神里有一点等待。
"用户状态是动态的,模型需要反馈信号来校准。你怎么设计这个闭环?"
苏雨晴没有立刻回答。
她想了大概三秒,然后拿起马克笔,在白板上写了两个字:
***任务完成。***
"最简单的反馈信号。用户完成了推荐给他的任务——不管是主动标记还是系统检测到——就是一次正向反馈。没完成,推后再推,或者换一个更轻量的任务替代。"
"这个完成率,"林凯说,"会有很强的时间偏差。晚上十一点完成一道题,和下午三点完成一道题,权重能一样吗?"
"当然不一样。"苏雨晴说,"所以要带时间戳。"
"那模型的训练周期怎么定?数据量不够的时候怎么冷启动?"
"你刚才不是说了吗,"苏雨晴语气淡然,"人口统计加轻量偏好标注,三十秒,五道题。"
林凯停了一下。
她在用他自己说过的话怼他。
他有点想笑,但忍住了。
---
**内景:B栋207教室——稍后**
*(杰克把架构图重新拉出来,红色圈注的问题部分已经被人用橡皮擦掉了一半。)*
**杰克**
*(看着林凯)*
你怎么看?加不加?
**林凯**
*(顿了顿)*
方向可以。但我有一个条件。
**杰克**
说。
**林凯**
推荐模块的技术方案我来定。不投票,不讨论,出了问题我负责。
*(杰克眯了眯眼)*
**杰克**
Coding Club是集体决策。
**林凯**
我不是Coding Club的人。我是你们今天邀请进来的。
*(又是一段沉默。杰克和林凯对视了几秒)*
**杰克**
*(慢慢开口)*
……可以。推荐模块,你说了算。其他模块,集体过。
**林凯**
行。
*(他拉开椅子,把笔记本放到桌上)*
**林凯(续)**
那我们从数据结构开始讨论。
---
会开到将近六点。
临散场的时候,苏雨晴把白板上的便利贴收了下来,叠整齐放进一个透明文件夹。林凯收拾着电脑,侧眼看见她在便利贴背面用细字记号笔写了一排数字——看起来像是某种分层标注体系的初稿。
他想了想,开口:
"你不是Coding Club的人吧?"
苏雨晴把文件夹装进包里,没有回头:
"观察很准。"
"那你今天为什么在这儿?"
她拉上包的拉链,站起来,终于转过脸来看他。
"因为我也想赢。"
她走到门口,停了一下,没有回头:
"你那个Lunchbox,花生过敏那个bug,记得改。我试了一下,弹窗叠了三层。"
然后门关上了。
林凯看着那扇门,低头看了看自己的备忘录:
*冷启动兜底 / 人口统计 baseline。*
*花生过敏 UI bug——弹窗去重。*
他在第二条下面,顿了顿,加了一行:
*苏雨晴。状态感知。闭环设计。*
窗外的硅谷天色开始暗下去,但那种亮度还是在的,像某种不肯轻易收场的东西,留在玻璃上,留在屏幕的反光里。
林凯关上笔记本,把包背上,走出了B栋。
今晚有两件事要做:
修那个弹窗bug。
还有,想清楚状态感知的模型架构。
顺序无所谓,反正都得做。