“搞定!”
陈浩猛地一拍桌子,震得显示器晃了晃。他整个人向后仰倒在椅背上,双手高举过头顶,像刚完成一场马拉松。
“最后那个同步bug修好了!林默,你来看看!”
林默从自己的屏幕前抬起头,食指习惯性地推了推镜梁。宿舍里只有他们两人,傍晚的光线斜斜照进来,在陈浩兴奋的脸上镀了层暖色。他头顶的数字是【+73】,比一周前又涨了三点。
“我看看日志。”林默滑动椅子靠过去,努力将注意力集中在屏幕上滚动的调试信息,而不是去感知宿舍楼里其他房间隐约传来的嘈杂人声。这种一对一的、有明确目标的对话,是他少数能应付的社交场景。
屏幕上显示一切正常。这个被他们命名为“简课表”的Android应用,经过两周的迭代和三天内测,终于达到了林默心中“可以见人”的标准。
“怎么样?”陈浩凑过来,呼吸都带着紧张,“这次没问题了吧?”
“嗯。”林默点头,手指在键盘上敲了几下,调出性能监控界面,“内存占用峰值不超过12M,课程数据本地AES加密存储,同步用的是我们自己写的差分算法,单次同步流量不到50KB。”
“而且界面超简洁!”陈浩抢过鼠标,点开应用演示,“你看这个课程卡片的设计,我参考了……嗯,怎么说,一种‘卡片式’的UI理念,我在一些国外的设计博客上看到的雏形。颜色按院系区分,轻触展开详情,长按拖拽调课……”
他说得眉飞色舞,手在空中比划。
林默安静地听着,视线扫过陈浩头顶。数字轻微波动了一下,从【+73】跳到了【+74】。这种因纯粹成就感带来的好感度提升,稳定而坚实。
“做得很好。”林默说,声音比平时轻了半分,“比我想象的还要好。”
陈浩愣了一下,随即咧嘴笑了:“真的?我靠,你居然夸人了!我得记下来,今天什么日子——”
“但是。”林默打断了他的兴奋,深吸了一口气,才用尽可能平静的语气说,“发布的时候,不要署我们的真名。”
“啊?”陈浩的笑容僵住,“为什么?这又不是什么商业项目,就班里同学用用……”
“正因为是同学用,才要匿名。”林默转回自己的电脑,打开一份他昨晚写的文档,“你看这个。”
陈浩凑过去看。文档标题是《简课表V1.0用户协议与隐私条款草案》。
“这……有必要吗?”陈浩挠头,“就一个课程表而已。”
“有必要。”林默的声音很平静,但拇指无意识地摩挲着食指侧,“应用会请求存储权限,用来保存课程数据。虽然我们不做任何上传,但用户不知道。所以这里要明确写明:‘所有课程数据仅存储在设备本地,不会上传至任何服务器’。”
他滚动文档,指向另一段。
“还有这个:应用不会收集任何个人信息,包括但不限于姓名、学号、联系方式。如果未来需要添加社交功能,必须单独弹窗征求用户同意。”
陈浩盯着屏幕,表情渐渐认真起来。
“你是怕……惹麻烦?”
“是规避风险。”林默纠正道,视线扫过窗外——楼下有几个学生走过,头顶都是【+/-1】的路人值,没有异常,“现在移动应用刚起步,很多人还没意识到隐私问题。但我们作为开发者,得提前想到。”
他顿了顿,补充道:“而且匿名发布,可以避免不必要的关注。如果有人反馈bug,我们就修;如果没人用,也无所谓。就当是个练手项目。”
陈浩沉默了几秒,忽然问:“林默,你是不是……在躲什么?”
宿舍里的空气凝滞了一瞬。
林默的手指停在键盘上。他透过镜片看向陈浩,对方头顶的数字依然稳定在【+74】,但旁边多了一个小小的❓符号——代表困惑和好奇。林默看着那个问号,心里微微一紧。陈浩的困惑是纯粹的好奇,而非怀疑,这份纯粹反而让他更难用谎言完全搪塞。
“算是吧。”林默最终说,语气尽量轻松,“我不太喜欢被人盯着。你知道的,我有点社恐。”
这个解释半真半假。陈浩接受了,❓符号慢慢消失。
“行吧,听你的。”他坐回自己座位,“那咱们叫什么?总不能叫‘无名氏出品’吧?”
“就叫‘简工作室’。”林默说,“简单,好记,不惹眼。”
“成!”
发布是在周五晚上。陈浩在班级QQ群里发了下载链接,附言:“推荐个课程表应用,挺简洁的,我自己在用。”
没有多余的话。
林默盯着群聊窗口。几秒钟后,第一条回复跳出来。
【张伟:下了,界面可以啊】
【李婷:比教务处那个反人类的系统强多了】
【王磊:同步功能怎么用?】
陈浩立刻回复,耐心解释操作步骤。林默看着他打字的速度越来越快,嘴角不自觉地扬起。
又过了十分钟。
【刘薇:谁做的啊?挺好用的】
这条消息让林默的手指收紧。
陈浩转头看他,用眼神询问。林默摇头。
“就说不知道,论坛上找的。”他低声说。
陈浩照做了。刘薇没再追问。
但林默注意到,在接下来的半小时里,班级群里陆续有十几个人表示已下载使用。陈浩头顶的数字开始缓慢而坚定地攀升。
【+75】。
【+76】。
最终停在【+77】。
“我靠……”陈浩盯着不断刷新的好评消息,声音有些发颤,“他们真觉得好用?”
“因为你做得确实好。”林默说。
“是我们做得好。”陈浩纠正他,眼睛亮得惊人,“林默,这感觉……这感觉太他妈棒了!”
林默笑了笑,没说话。他点开应用后台埋的简易统计——匿名的那种,只记录启动次数和崩溃日志。发布两小时,已有二十三个独立设备激活。
零崩溃。
“第一阶段目标达成。”他说,“接下来看用户反馈。”
反馈来得比想象中快。
周六上午,陈浩还在睡觉,手机就震个不停。他迷迷糊糊抓起来看,顿时清醒了。
“林默!有bug!”
林默正在阳台上晾衣服,闻声走进来:“什么情况?”
“张伟说,他调了课之后,应用就闪退。”陈浩已经跳下床,光脚冲到电脑前,“我看看日志……妈的,空指针异常!”
两人挤在屏幕前,陈浩飞快地敲击键盘,调出源代码。
“这里。”林默忽然伸手,指向一段代码,“你假设调课后的课程列表不会为空,但用户可能把全天课都删了。”
“啊!”陈浩一拍脑门,“我忘了加判空!”
他立刻开始修改。手指在键盘上飞舞,嘴里念念有词:“先检查列表长度……如果是零,就显示空白状态……好了!编译!”
林默看着他工作。陈浩的表情完全变了——不再是平时那个嘻嘻哈哈的室友,而是一个专注的、眉头紧锁的程序员。他头顶的数字稳定在【+77】,但旁边的情绪符号变成了💡,代表专注和思考。林默看着那个发光的灯泡符号,仿佛能看见陈浩大脑中高速运转的逻辑齿轮。
五分钟后,陈浩上传了新版本。
“通知张伟更新一下。”林默说。
“已经发了!”陈浩头也不抬,眼睛还盯着屏幕,“等等,李婷也反馈了个问题……她说课程颜色有时候会错乱。”
“可能是异步加载UI时没考虑页面生命周期。”林默说,“我看看渲染逻辑。”
陈浩盯着代码,犹豫地说:“是不是……内存泄漏了?颜色资源没释放?”
林默没有直接否定,而是引导他看日志里的异常堆栈:“你看这个NullPointerException的调用链。”
陈浩看了半天,恍然大悟:“哦!是Activity被销毁后,AsyncTask的回调还在更新视图!我懂了!”
接下来的两个小时,他们处理了三个反馈。陈浩从一开始的慌张,逐渐变得沉稳。到第三个bug时,他已经能独立分析出可能的原因,并提出修复方案。
“这里用Handler延迟刷新,但没加弱引用。”他指着一段代码说,“如果用户在刷新完成前退出,可能会内存泄漏。”
“解决方案?”林默问。
“用静态内部类加弱引用,或者……算了,2012年还没那么多现成框架。”陈浩挠挠头,“那就手动在onDestroy里移除回调。”
“可以。”林默点头,“你写吧。”
陈浩开始编码。林默退到一旁,静静观察。
这个曾经需要他一步步指导的室友,正在以肉眼可见的速度成长。不仅仅是技术,更是一种责任感——对代码的责任,对用户的责任。
下午四点,最后一个bug修复完毕。陈浩长舒一口气,整个人瘫在椅子上。
“累死了……”他嘟囔道,“但爽。”
林默递给他一瓶水。
“谢谢。”陈浩接过,灌了一大口,然后转头看林默,“说真的,要不是你拉着我做这个项目,我可能到现在还在混日子。上课,打游戏,等毕业……就这样。”
他的声音低了下去。
“但现在我觉得,我好像……能做出点东西了。真的有人用,真的能帮到人。”
林默看着他头顶的数字。依然是【+77】,但那个数字此刻承载的重量,已经和昨天完全不同。
“你本来就可以。”林默说,“只是需要机会。”
陈浩笑了,笑容里有种林默从未见过的、属于成年人的沉稳。
“所以,林默。”他忽然坐直身体,“接下来呢?这个应用,咱们就放在班里用,还是……”
“先这样。”林默说,“观察一段时间,收集更多反馈。如果稳定,可以考虑加一些新功能——比如考试倒计时、成绩记录。”
“那要不要开源?放GitHub上?”
“暂时不要。”林默摇头,“保持低调。”
陈浩盯着他看了几秒,最终点头:“行,听你的。你是项目经理,你说了算。”
这句话让林默微微一怔。
项目经理。合作者。
陈浩头顶的数字没有变,但两人之间的关系,已经悄然完成了某种转换。
一周后,“简课表”在班级的普及率超过了百分之八十。陈浩建了个匿名反馈邮箱,每天都能收到几条建议。他认真地整理成需求列表,和林默讨论优先级。
周二的晚上,两人在食堂吃饭。陈浩一边扒饭,一边刷手机看邮件。
“又有新建议……有人想要教室地图功能。”他说,“这个有点意思,不过得搞到学校的平面图数据——”
他忽然停住了。
林默抬起头:“怎么了?”
陈浩的表情有些古怪。他放下手机,压低声音:“林默,有件事……我不知道该不该说。”
“说。”
“昨天,我在实验室碰到个学长。”陈浩的声音更低了,“不是咱们院的,好像是经管那边的。他问我,知不知道‘简课表’是谁做的。”
林默的筷子停在半空。
“你怎么回答的?”
“我说我不知道,我也是从网上下载的。”陈浩说,“但他好像不太信。又问了我几个技术问题,什么用的什么框架、数据怎么同步之类的……我按咱们之前对好的说辞应付过去了。”
“他长什么样?”
“戴眼镜,挺斯文的,穿得也挺讲究。”陈浩回忆道,“说话特别客气,但就是……让人不舒服。感觉像在套话。”
林默慢慢放下筷子。食堂的嘈杂声在耳边模糊成背景噪音,他的视线快速扫过周围——没有异常的数字,没有可疑的人。
但那种感觉又回来了。
被注视的感觉。
“他还说什么了?”林默问,声音保持平静。
“他说……”陈浩犹豫了一下,“他说这个应用做得挺专业的,不像学生作品。还问,开发者是不是有业界经验,或者……有没有接外包的打算。”
林默的拇指无意识地摩挲着食指侧。
“你怎么说?”
“我说我真不知道。”陈浩耸肩,“然后他就笑笑,说‘那算了’,走了。”
两人沉默了一会儿。食堂的灯光在餐桌上投下模糊的光晕。
“林默。”陈浩忽然开口,声音很轻,“那个学长……他走的时候,我注意到他手表挺贵的。江诗丹顿,我在杂志上见过,至少十几万。”
他顿了顿。
“一个学生,戴十几万的手表。而且他问问题的方式……不像普通好奇。”陈浩说完,自己都有些惊讶,“我靠,我怎么跟个侦探似的……可能跟你待久了,我也疑神疑鬼了。”
林默没有说话。他端起汤碗,喝了一口已经凉掉的紫菜汤。
经管、戴昂贵手表、问话专业……林默在脑中快速建立着人物画像。这不像随机的好奇,更像有目的的侦察。侦察者背后是谁?Observer_01?还是表哥林绍辉那早已伸进校园的触手?
无论哪种,都意味着他的“简课表”伪装,可能已经引起了不该引起的人的注意。
“我知道了。”他最终说,“这件事别跟其他人提。如果有人再问,一律说不知道。”
“明白。”陈浩点头,但眉头还皱着,“林默,你是不是惹到什么人了?”
“也许。”林默放下碗,看向窗外渐暗的天色,“但没关系。”
他转回头,对陈浩露出一个很淡的笑容。
“我们有应用要维护,有bug要修,有用户反馈要处理。这才是正事。”
陈浩盯着他看了几秒,然后也笑了。
“行。”他说,“反正我跟你混。管他什么牛鬼蛇神,代码写好了才是硬道理。”
他头顶的数字依然稳定在【+77】。
但林默知道,有些东西已经不一样了。这个曾经只需要考虑游戏副本和期末考试的室友,现在开始观察手表的价格,分析问话的意图,主动提醒潜在的风险。
从跟随者,到合作者。
再到……盟友。
离开食堂时,天色已完全暗下来。校园路灯次第亮起,在柏油路上投下一个个昏黄的光圈。林默走在回宿舍的路上,手指在口袋里无意识地收紧。
校外的人在打听。
被动等待只会让迷雾更浓。这个打听的学长,或许就是迷雾投下的第一道影子。他必须尽快破译沈星言留下的脉络图,主动去弄清影子的来源。
回到宿舍,林默打开电脑。屏幕上还停留着“简课表”的代码仓库。他凝视着那些整齐的commit记录,陈浩的名字和邮箱并列在他旁边。
然后他最小化窗口,点开了另一个文件夹。
里面是沈星言留下的那张香樟树叶脉络图的扫描件。复杂的纹路,手写的频率数值,那句“惊蛰未至,雷在云中”。
他需要尽快破译它。
在更多的“打听”找上门之前。