下午三点,阳光照在街角那家培训机构的玻璃门上。“启航编程培训”几个字有点刺眼。陈峰推开门,冷气扑面而来,一下子觉得凉快了。他摸了摸右耳垂,那里有颗小痣,以前同事总说像程序出错的小红点,现在没人提了,他自己也快忘了。
教室里已经有七八个人。有人翻讲义,有人盯着电脑发呆。陈峰走到后排坐下,把背包放在脚边。拉链没拉好,露出半把伞和一把螺丝刀。他没管,只拿出笔记本和笔,摆在桌上。本子是超市五块钱买的,封面印着兔子举气球。他已经用了一大半,纸都卷了边,角落还有点泡面汤渍。
讲师三十多岁,穿一件皱格子衬衫,说话带南方口音。他打开投影,PPT第一页写着“异步函数与事件循环机制”,下面一行小字:“别怕,咱们慢慢来。”
陈峰低头翻开本子,写下日期:2025年4月6日,星期六。然后画个框,写标题:“异步处理基础”。他写字很慢,一笔一划对准横线,像小学生抄课文。投影上出现代码图,箭头弯来弯去,变量全是英文缩写。他一边听一边记,遇到不懂的词就标出来,比如“Promise(?)”、“回调地狱(听过但没懂)”。
讲到一半,讲师突然加快语速,跳过解释直接放运行结果。陈峰的手停住了,笔尖卡在纸上。他抬头看屏幕,发现笔记断了,后面接不上。他皱眉,没说话,也没举手。教室很安静,只有空调嗡嗡响。前排有人刷手机,屏幕一闪一闪。
他合上笔帽,往后翻了几页,重新看前面的内容。手指顺着自己画的箭头走了一遍,又一遍。还是不对。他从背包侧袋拿出红笔,在空白处画了个简单流程图:左边写“请求发出”,中间画圈写“等待响应”,右边写“处理数据”。他又加两个分支,一个写“成功”,一个写“失败”,最后用波浪线连回主干。
讲台上的声音继续,他已经跟不上了。但他不急,只是反复看那段内容,嘴里轻声念:“先注册监听,再触发执行……不是同步阻塞……”
等讲师开始下一节时,他终于在本子角落补了一句:“相当于先打个预约单,事办完了系统自动通知你。”他画了个对勾,打开笔帽,继续记下一页。
课上到一半,讲师放了个视频案例,让大家动手做。屏幕上是一段完整代码,效果是动态加载用户信息卡片。陈峰照着敲了一遍,按回车,弹窗报错:“TypeError: Cannot read property 'data' of undefined”。
他愣了一下,抬头看别人。好几个人已经翻页了,有个戴眼镜的女生甚至开始收拾包。他没动,手指悬在键盘上,盯着错误提示看了几秒,然后一点一点检查自己的代码。拼写没错,括号对得上,变量名也一致。他退出编辑器,重新打开文件夹,确认路径没问题,又查配置文件,发现少填了一项API地址。
他补上地址,重新运行。页面刷新,三张用户卡依次出现,头像、昵称、签名都有了。他松了口气,嘴角动了动,没笑出来,肩膀却放松了。
他没关电脑,新建了一个文本文件,把刚才排查的过程写下来:
错误类型 → 数据未定义
检查输入源 → 配置文件缺失关键字段
补全参数 → 重新运行验证
最后写了一行字:“别急着跑通,先搞懂为什么不通。”写完读了一遍,觉得这话挺有用,就用方框框了起来。
下课铃响了,外面天色暗了些。讲师站在门口跟人打招呼,说下周讲“状态管理与组件通信”。有人问难不难,讲师摆摆手说“也就那样”。陆续有人起身,椅子拖地的声音不断响起。两个男学员边走边聊晚上吃烧烤,另一个掏出手机约健身。
陈峰还坐着。他的练习题只做了一半,最后一道是用异步方式批量上传图片,他卡在并发控制这里。他看了看手机,五点四十二分,地铁晚高峰快来了。他把手伸进背包,把伞和螺丝刀挪开,腾出地方摊开资料。他决定再留半小时,先把题目拆开看看。
他拿笔在草稿纸上画三个框:第一个写“接收文件列表”,第二个写“逐个上传并返回状态”,第三个写“汇总结果”。中间加一条:“同时最多上传两个”。他想起课上提到的“信号量控制”,虽然没细讲,但有点印象。他试着在代码里加个计数器,用if判断当前请求数是否超限,再配合回调释放资源。
敲完保存,运行测试。第一次失败,提示“超出最大并发”。他检查发现释放时机错了,应该在请求完成时减一,而不是一开始。改完重试,这次成功了。四张图分两批上传,日志输出清楚。
他看了眼时间,五点五十八分。广播开始提醒闭馆,走廊灯一盏接一盏灭了。他快速合上电脑,把笔记本折好塞进包内侧夹层,拉紧拉链。背包背上肩,手里拿着手机,解锁看了眼地铁线路图。
他站起来,椅子轻轻撞了桌子一下。教室空了,只剩他一个。黑板上还留着他写的最后一道题的伪代码,没擦。他看了两秒,转身往外走。
玻璃门外,街上车很多,尾灯连成一片红。他站在台阶上,没急着下去。先调整了下背包带,右手握紧手机,指尖滑动地图软件,选了步行换乘最少的路线。风吹过来有点凉,他把卫衣帽子往后甩了甩,迈步下了台阶。
脚步踩在地上,发出轻微声响。他往前走了几步,身影混进路边的人流,没有回头。