唐果发完那条消息,手机屏幕就黑了。陈峰站在写字楼B座门口,低头看了眼时间,六点五十二分。面试是七点开始,还剩八分钟。
风吹过来,把他的连帽卫衣帽子吹得往后滑了一下。他抬手按了按帽子,顺手摸了下右耳的小痣,像是在确认自己没走神。
电梯间很亮,他站在角落里。背包侧袋里的折叠伞和螺丝刀随着电梯上升轻轻撞着腿。镜面墙上照出他的样子:旧卫衣、工装裤、头发乱翘着一撮,看起来像个刚干完活的维修工。
他抿了嘴,没笑也没叹气。简历从包里拿出来又塞回去,这个动作他在便利店门口做过三次。每次投完简历都这样,像在重新检查一遍。
“陈先生?”前台小姑娘抬头,“三楼会议室,右边。”
他点头,走上楼梯。三楼很安静,能听见空调的声音。会议室门开着,里面坐着一个穿浅灰衬衫的男人,四十岁左右,戴金丝眼镜,手里拿着一支笔,正在看他的简历。
“坐。”男人没抬头。
陈峰坐下,桌上有瓶水,他没动。
“你六年做了四份工作。”男人终于看他,“最长十一个月,最短三个月。为什么?”
“第一家项目没了,第二家工资拖着不发,第三家让我去做推广,我不擅长说话。”陈峰声音平稳,“第四家……房东卖房,我搬到城中村,上班太远,就辞职了。”
男人看了他两秒,忽然笑了:“你是被房租逼走的?”
“算是。”陈峰也笑了笑,“我还记过九次搬家的经验,要不要听?比如签合同前要看房产证,厨房排水管要有存水弯……”
“不用。”男人打断,“我们招的是程序员,不是租房顾问。”
陈峰收起笑,手指在膝盖上敲了两下,像在试键盘。
“不过,”男人顿了顿,“你的生活经验跟工作没关系。我们要的是能解决问题的人,不是有故事的人。”
陈峰点头:“我明白。”
“那我问个实际问题。”男人站起来,走到白板前,“如果让你做一个登录系统,支持手机号、邮箱、第三方账号三种方式,还要防刷、防恶意注册、防数据泄露,你怎么做?”
陈峰没动。
他脑子里想了几种方案,又推翻。这不是考理论,是考能不能用。答得好能进下一轮,答不好直接走人。
他站起来,接过笔,在白板上写“API网关”。
“所有请求先经过这里。”他说,“记录IP、设备ID、请求次数。超过一定数量就拦住,日志发到监控平台。”
男人没说话,但用笔尖点了点本子。
陈峰继续画,“认证模块单独放,密码加密存,用bcrypt加盐。手机号接短信服务,邮箱走邮件队列,第三方用OAuth2.0。”
他在白板上分出三条线,标上“短信”“邮件”“第三方”。
“注册时加图形验证码,再加行为检测,比如鼠标怎么动、点击间隔多久,防止机器人批量注册。登录失败五次,账号锁三十分钟,后台提醒风险。”
男人微微点头。
陈峰擦掉一部分,重新画流程图,“如果一个人用手机号注册,又用微信登录,其实是同一个用户,系统要能合并。需要一个统一ID,用一张表记录每个账号来源和唯一标识。”
他停了一下,“以前公司有个用户,用手机号注册后用微信登录,购物车没了。后来发现是没做关联,两边生成了两个账号。我们加了个提示,下次登录会问‘是否合并数据’。”
男人开口:“你怎么保证不会合并错?”
“比对注册时间、登录设备、常用地址。”陈峰说,“比如两个账号都在同一台手机登过,或者收货地址一样很多,系统标记为可能是一人。可以人工查,也可以让用户自己选。”
男人写下几个字,抬头:“最后一个问题——上线当天凌晨三点,系统突然报错,提示‘数据库连接超时’,日志显示请求正常,但响应特别慢。你怎么办?”
陈峰深吸一口气。
他想起上个月在上家公司值夜班,半夜两点收到报警,APP卡住不能用。他蹲在机房啃关东煮,一边看监控一边找问题。那次是连接池设错了,最多二十个连接,高峰时直接崩了。
“先看监控。”他说,“CPU、内存、磁盘有没有异常。如果没有,查数据库连接池状态。可能是连接没释放,或者死锁。”
他用手比划,“登录服务器,查当前连接数。如果快满了,说明有泄漏。再查日志,找到哪个接口没关连接。修好后热更新,重启服务。”
“如果不能重启呢?”
“那就切流量。”陈峰说,“把出问题的机器从负载均衡拿下来,让别的机器扛住。同时保存日志,留证据,第二天开会复盘。”
男人合上本子,盯着他看了五秒。
“你之前做过外卖骑手?”
“嗯,大四实习。”
“客服也做过?”
“毕业第一年。”
“那你为什么一直做编程?换个轻松的工作不行吗?”
陈峰愣了一下。
他没说“因为喜欢”,也没说“想改变生活”。他想起第一次写出能跑通的登录接口那天,去便利店买了瓶可乐,坐在台阶上喝完,打了个响亮的嗝。那时候他觉得,自己总算做出了一点真正属于自己的东西。
“因为我修电脑的时候,总有人说‘你挺聪明的,可惜没走对路’。”他说,“后来我学会写代码,才发现以前那些修理,其实也是在写逻辑——一个是硬件,一个是软件。”
男人眨眨眼,忽然笑了:“有意思。”
他站起来,伸出手:“我们会认真考虑你的申请。”
陈峰握手,手心有点出汗,但他没擦。
走出大楼时,天快黑了。晚霞藏在高楼后面,只剩一点橙红压在城市边上。他站在路边,背包斜挎肩上,右手插进卫衣口袋,摸到一张折好的纸——是早上在便利店抄的天气预报,背面写着“周三可能下雨”。
他没扔。
抬头看天,云很厚,看不出会不会下雨。但他知道,明天得带上伞。
地铁口就在五十米外,他往前走,脚步比来时轻了些。路过一家水果店,玻璃上贴着“今日特价:苹果12元/斤”,他想给妈妈寄点老家没有的水果,又算了算卡里余额,决定再等等。
等什么?他自己也不清楚。
也许是等一个电话。
也许是等一次机会。
他走进地铁闸机,刷卡时听见广播:“下一班车将在两分钟后进站,请乘客注意安全。”
他站在黄线后,看着隧道深处慢慢亮起灯光。