张宇廷在公司干了八年,交易系统是他一个人搭的。年终奖发下来,六千。隔壁工位小李,泡茶陪领导打球,八万。张宇廷没吵没闹,把工牌往桌上一拍,走了。当天下午系统崩了,订单卡死,小李改三小时代码越改越崩。赵总打电话求他回来,张宇廷报了个价:时薪五千,先打钱。三天后老板亲自上门,张宇廷正在对面楼擦桌子,新公司营业执照刚下来。前公司三个大客户跟过来签合同,小李跑来面试,张宇廷看了一眼简历:“你连我写的注释都看不懂。”
1
年终奖到账短信弹出来的时候,张宇廷正在改小李昨天提交的代码。
六千。
他盯了两秒,把手机翻过去扣在桌上。屏幕还亮着,六千这个数字在桌面上投出一小块光。
“宇廷哥,你多少?”小李端着保温杯从工位后面探出头,杯子里泡着枸杞和西洋参。
张宇廷没抬头。“够吃顿饭。”
小李嘿嘿笑了一声,转回去跟旁边人嘀咕。张宇廷听见“八万”“赵总够意思”几个词飘过来。
他手上的代码是小李上周五提交的。一个订单状态同步的接口,小李把重试逻辑写成了死循环,没设退出条件。昨晚压测环境卡了两个小时,运维打电话问怎么回事,张宇廷爬起来远程连上去杀的进程。
他花了三分钟写了个补丁,把代码提交上去,备注就两个字:“修复。”
刚提交完,赵总从办公室出来,拍了拍手。
“各位,年终奖都到了吧?今年公司效益不错,赵总我替大家争取了——”他顿了一下,“特别是小李,今年进步很大,独立负责了好几个模块,大家多向小李学习。”
小李站起来鞠了个躬:“谢谢赵总栽培,谢谢大家。”
有人鼓掌。张宇廷也鼓了两下,手没碰出声。
赵总接着说:“宇廷啊,你那个述职PPT我看了,写得太简单了,明年注意一下,格局要打开。”
张宇廷点头。“好。”
王丽敏下班来接他,车停在园区门口。张宇廷拉开车门坐进去,王丽敏看了一眼他脸色,没问年终奖的事。
“我手上有个客户,”她打着方向盘汇入主路,“做跨境电商的,招架构师。我跟他们技术VP聊了,人家盯你两年了。”
“多少?”
“翻倍。期权另算。”
张宇廷看着窗外。“我再想想。”
“想什么?”
“交接没做。小李接不了。”
王丽敏没再说话。到家之后张宇廷进了书房,打开一个加密文件夹。里面是一个系统设计文档,三百多页,从交易链路到库存锁策略,每一个模块的架构逻辑都写得清清楚楚。
这个文件夹他从没给任何人看过。当年赵总催着上线,让他“先别管文档,跑起来再说”。他就真的没写过正式文档,只在关键代码里留了注释。
那些注释,小李上周刚在代码评审会上说“写得太烂,看不懂”。
张宇廷打开文档,翻到第一页,合上电脑,走出书房。王丽敏在客厅看电视,见他出来,拍了拍沙发。
“你那个系统,”她说,“离了你转得动吗?”
张宇廷坐下来,拿起茶几上的橘子剥了一个。“不知道。”
“你知道。”
他掰了一瓣橘子塞嘴里,嚼了两下。“转不动。”
第二天早上九点,张宇廷到公司,把工牌和电脑放在赵总桌上。
赵总正在喝茶,抬头看他。“什么意思?”
“离职。”
赵总放下茶杯,往椅背上一靠。“宇廷,你这是闹情绪。年终奖的事我可以解释——公司今年调整了考核方式,管理岗和技术岗不一样——”
“我没问年终奖。”
赵总脸上挂不住,手指敲了敲桌面。“行,你考虑清楚了?你这个岗位现在可替代性很强,小李来了之后——”
“让他接吧。”张宇廷把一张A4纸推过去。“交接文档,三天写完。”
赵总拿起来看了一眼,就一页半,标题写着《交易系统部署说明》。底下就几行:“数据库地址见配置文件。启动脚本在bin目录。日志在logs目录。”
“就这些?”
“核心逻辑当面交接。”张宇廷说,“三天后我走。”
赵总挥挥手。“行行行,赶紧交接。”
张宇廷回到工位,小李已经凑过来了。“宇廷哥,真走啊?”
“真走。”
“那系统怎么办?”
“你接。”
小李脸上笑容僵了一下。“我……我那模块还没捋清楚呢,赵总就让我——”
“三天。”张宇廷打开代码仓库,“我把部署说明写了,剩下的你问我。”
接下来三天,张宇廷每天正常上下班。小李问了他七八个问题,全是“这个接口返回什么格式”“那个字段什么意思”这种。张宇廷一个一个答了,答完把代码权限转给小李。
第三天下午,张宇廷把电脑交回IT部。小李跑过来说:“宇廷哥,赵总说让把你那个加密文件夹也交接一下。”
“里面是个人文档。”
“赵总说所有工作相关文件都要——”
“里面是我写的日记。”张宇廷看着他,“你要看?”
小李缩回去了。
张宇廷走出公司大门,王丽敏靠在车边等他。她递过来一杯冰美式,张宇廷接过来喝了一口。
“对面楼。”王丽敏指了指马路对面那栋写字楼,“七层,有个三十平的工位,月租三千八,我押一付三交了。”
张宇廷差点被咖啡呛到。“你交钱之前不跟我说一声?”
“跟你说你会同意?”
他想了想。“不会。”
“所以先斩后奏。”王丽敏拉开车门,“走,看看去。”
张宇廷上了车,掏出手机看了一眼。公司技术群里,小李刚发了一条消息:“系统已全量接管,感谢宇廷哥的耐心交接,后续有问题随时请教。”
底下赵总回了一个大拇指。
张宇廷锁屏,把手机扔到副驾座位上。王丽敏看了一眼他手机,没说话,发动了车子。
下午四点,张宇廷正在对面楼擦桌子。新工位只有一张桌一把椅,窗户朝北,看不到前公司那栋楼。王丽敏在楼下便利店买了两瓶水和一包纸巾送上来,刚进门,张宇廷手机响了。
来电显示:赵总。
他接起来。
“宇廷!你现在马上远程连一下,交易系统出问题了,订单全部卡在待支付状态,小李改了半天越改越——”
张宇廷把手机拿远了一点,赵总的声音还是从听筒里漏出来。王丽敏靠在门框上,抱着胳膊看他。
“赵总,”张宇廷打断他,“我离职手续下午四点已经走完了。”
“我知道我知道,紧急情况,算你加班,回头给你补——”
“加班得签合同。”张宇廷拿起桌上那瓶水拧开盖,“时薪五千,四小时起算,先打钱,后干活。”
电话那头安静了五秒。
“五千?你抢钱啊?”
“市场价。”张宇廷喝了一口水,“外面架构师咨询费一小时八百到一千二,我收五千是因为你系统等不起。你考虑一下,我这边还要擦桌子。”
又安静了三秒。
“账号发过来。”
张宇廷挂了电话,把银行账号发过去。王丽敏走过来看了一眼他的手机屏幕:“你真回去修?”
“钱到账就修。”
“修好了呢?”
张宇廷把手机放桌上,走到窗边往下看。楼下园区门口排着一溜车,都在等红灯。他看了一会儿,转过头。
“修好了,他们还会出问题。我拿钱办事,办完走人。”
手机震了一下。银行短信:到账两万。
张宇廷坐回电脑前,打开远程工具,连上了公司的跳板机。王丽敏搬了把椅子坐在旁边看。屏幕刷新,报错日志滚了一屏,红色一片。
张宇廷扫了一眼,手放在键盘上,没急着敲。
“看出来了吗?”王丽敏问。
他指着一行日志。“小李把分布式锁改成单机锁了。”
“什么意思?”
“意思是十个人同时下单,九个人会卡死。”他打开代码文件,翻到小李上周提交的那一版,鼠标停在几行注释上。
那些注释是他八个月前写的,清清楚楚标着:“此处必须用分布式锁,单机锁不支持多节点部署,会导致订单重复和超卖。”
小李把这行注释连同代码一起删了。提交记录写着:“优化锁策略,提升性能。”
张宇廷把代码改回来,提交,重启服务。又顺手把队列堵塞的积压订单清了,前后八分钟。系统恢复,订单开始正常流转。
他给赵总发了条消息:“修好了。两万刚好四小时,剩下时间有问题再找我,重新计时。”
赵总回了一条语音,张宇廷没点开,直接转文字:“还有没有别的地方要检查的?”
张宇廷打了四个字:“另算钱。”
发完把远程工具关了。
王丽敏从椅子上站起来,拿起他没喝完的那瓶水递过去。“恭喜张老板,第一笔收入到账。”
张宇廷接过水。“第二笔也快了。”
“谁?”
“等着看。”
话音刚落,微信弹出一条好友申请。备注写着:“张工你好,我是XX商城技术负责人陈涛,我们跟你们公司对接的接口今天出了点问题,听说你离职了?方便聊聊吗?”
张宇廷把手机递给王丽敏看了一眼。她看完笑了一声:“你那个‘另算钱’发出去才三分钟。”
“他等我走了才加我,说明盯我不是一天两天了。”
张宇廷通过申请,打了六个字:“明天来我公司谈。”
对面秒回:“你公司地址?”
张宇廷看了一眼窗外,指了指楼下园区大门。“就对面楼,七层,出了电梯右转,门口还挂着前一家公司的牌子,我明天换。”
发完他把手机往桌上一扔,靠着椅背伸了个懒腰。
王丽敏问他:“明天他来谈什么?”
“谈接口迁移。他那家店在我们平台一天流水三百万,系统这么搞下去撑不过这个月。”张宇廷拿起桌上的笔在指间转了一圈,“他要是把接口迁到我这边来,我收他接口维护费一年二十万,打折十五万。”
“你才刚注册公司。”
“客户不看公司大小,看能不能解决问题。”他把笔往桌上一放,“今天我能八分钟修好他们三小时搞不定的故障,明天我就能报这个价。”
手机又震了一下。赵总发了条微信:“宇廷,明天有时间来公司一趟吗?老板想跟你聊聊。”
张宇廷回:“聊什么?”
“回来上班的事,条件可以谈。”
张宇廷打完字没发,先给王丽敏看。她看了一眼,帮他删掉,重新打了一行:“明天下午三点,对面楼七层,过时不候。”
张宇廷看着她。“你这是让我摆架子。”
“你今天是甲方。”王丽敏把手机递回给他,“得让他们知道,现在谁求谁。”
张宇廷按了发送键。赵总秒回:“行,一定到。”
2
第二天早上八点,张宇廷到对面楼七层的时候,门口那块“极客科技”的牌子已经被人拆了一半,斜靠在墙上。
王丽敏站在梯子旁边,手里拿着一把螺丝刀。“旧牌子螺丝锈死了,拧不下来。你把它掰下来,我去楼下打印店做块新的。”
张宇廷把包放地上,双手握住牌子两边,脚蹬着墙,使劲一拽。铁皮牌子“哐”一声掉在地上,墙面上留了四个孔。
“新牌子十点能做好。”王丽敏下楼去了。
张宇廷把地上的牌子拖到楼道垃圾桶旁边,回屋打开电脑。还没坐稳,微信弹出一条消息,来自一个叫“陈涛-XX商城技术负责人”的人:“张工,我九点到,方便吗?”
张宇廷回了一个字:“来。”
九点差五分,电梯门开,陈涛拎着一个牛皮纸袋走出来。四十来岁,T恤牛仔裤,头发乱糟糟的,黑眼圈挂到颧骨。他身后跟了一个戴眼镜的年轻人,抱着笔记本电脑。
张宇廷站起来。“陈总。”
陈涛快步走过来握住他的手。“别叫陈总,叫老陈就行。”他把牛皮纸袋往桌上一放,“这是合同草稿,你先看一眼。”
张宇廷没接。“先说问题。”
“接口昨天挂了之后我们查了日志,你们平台返回的订单状态全是乱的。已经付款的显示未付,未付的显示已付,客服电话被打爆了。”陈涛把眼镜摘下来擦了擦,“我们技术排查了一晚上,发现是你们那边把订单号生成规则改了,我们的系统解析不了。”
张宇廷皱了皱眉。“订单号规则没改过。”
“你们新来的那个小李,上周提交的,把订单号从十八位改成了二十位,加了时间戳和随机数。”
张宇廷敲了两下键盘,打开前公司的代码仓库。他走之前给自己留了一个只读权限的后门,赵总不知道。翻到提交记录,小李上周五提交的那条写着:“订单号规范化改造,提升系统扩展性。”
他把代码拉下来看了一眼。原来十八位订单号,前八位日期,中间六位序列,后四位校验。小李全改成二十位,加了毫秒时间戳。下游所有对接方都没收到通知。
张宇廷关掉页面。“合同不用看了,我直接说条件。”
陈涛坐直了。“你说。”
“接口我重写一套,跟你们系统对接。按年收费,一年十五万,预付半年。”
陈涛身后的年轻人小声说了一句:“陈哥,十五万比我们现在的接口费贵了……”
陈涛抬手打断他。“张工,十五万我可以接受。但我有个条件——你多久能上线?”
“三天。”
“三天?”年轻人又开口了,“我们对接你们旧接口的团队排期都排了两个月……”
张宇廷看着他。“旧接口需要排期是因为那个团队有六个人互相等。我这边就我一个人,我说三天就是三天。”
陈涛盯着张宇廷看了五秒。“签。”
他从纸袋里抽出合同,翻到最后一页,掏出笔签了名字。张宇廷接过来扫了一眼金额和条款,也签了。
陈涛把合同收进纸袋,站起来握手。“昨天你八分钟修好系统,我就知道找对人了。你前公司那个小李,今天早上还在群里问我们能不能推迟接口迁移,说他们需要‘重新评估技术方案’。”
张宇廷没接话。
陈涛走到门口又回过头。“对了,有个事跟你说一声。你们前公司老板今天是不是要来?”
“三点。”
“他早上给我打电话了,问我能不能‘再给一次机会’,说他们内部管理调整已经完成,以后不会再出这种事。”陈涛笑了笑,“我跟他说,合同签完了,对接人是你。他沉默了半天,把电话挂了。”
陈涛走后,王丽敏拿着新做的牌子回来了。“极客科技信息技术有限公司”,黑底白字,亚克力材质。张宇廷接过来,踩着梯子拧螺丝,把新牌子挂上去。王丽敏在底下扶着梯子。
“陈涛签了?”
“签了。”
“多少?”
“十五万,预付七万五。”
王丽敏掏出手机算了一下。“房租三千八,水电宽带五百,办公桌椅一千二,打印机八百,注册资本认缴不用实掏。七万五够你烧半年。”
张宇廷从梯子上下来。“半年后呢?”
“半年后你要是还靠这十五万活着,说明你不行。”
张宇廷把螺丝刀扔进工具箱,拍了拍手上的灰。“三点赵总来,你别走。”
“我本来就不打算走。”王丽敏从包里掏出一袋面包,扔给他一个,“早上没吃饭吧?先垫一口。下午谈判,你今天是甲方,别露怯。”
三点整,电梯门开。赵总走在前面,后面跟着一个张宇廷没见过的人,五十来岁,戴金丝眼镜,穿深蓝西装,皮鞋锃亮。
赵总进门先环顾了一圈这个三十平的办公室,一张桌子两把椅子一个文件柜,墙上连幅画都没有。他嘴角动了一下,没笑出来。
“宇廷,这位是孙总,咱们公司董事长。”
孙总上前一步伸出手。“张宇廷,久仰。”声音很稳,握手力度不轻不重。
张宇廷跟他握了手。“坐。椅子只有两把,赵总站着?”
赵总脸色变了变。孙总摆摆手:“没事,我坐,你站着。”他拉了把椅子坐下来,把西装扣子解开。
“宇廷,我就不绕弯子了。”孙总把眼镜摘下来搁在桌上,“昨天的事赵总跟我说了,小李那孩子确实经验不足,我已经让他停职了。今天我来的意思就一个——你回来,技术中心你说了算,薪资你开。”
张宇廷靠在椅背上。“孙总,我公司已经注册了。”
“我知道,注册资金认缴,实际没掏钱。你这间办公室月租三千八,押一付三花了一万五。”孙总扫了一眼窗外,“你手上现在有陈涛那一个客户,十五万的合同。我可以说得更直接一点——你回来,我开年薪八十万,外加技术中心负责人的头衔。”
张宇廷没马上接话。王丽敏坐在旁边工位上,手里捏着一支笔,笔尖在桌上轻轻点了两下。
张宇廷看了她一眼,开口:“孙总,我手上有三家客户在谈。陈涛只是第一个。”
孙总眉毛抬了一下。“哪三家?”
“一家是做母婴用品的,一家是做生鲜的,都是你们平台排名前二十的商家。第三家还在接触,是做数码的。”
赵总在后面插嘴:“宇廷,你这属于挖公司墙角——”
孙总抬手拦住他。“让他们自己选,不算挖。”他转向张宇廷,“那你什么条件?”
“我不回去。但你们的系统我可以接过来维护,外包形式,按年收费。”
“多少?”
“一年四十万。包括系统稳定性维护、故障响应、下游商家接口对接。小李改过的所有模块全部回滚到我走之前的状态,重新做代码审查。”
赵总在后面算了一下:“四十万比养一个技术团队便宜……”
孙总打断他:“四十万可以。但我有一个附加条件。”
“你说。”
“你回来给技术团队做一次培训,两天的课,把你那个系统的架构逻辑讲清楚。我要保证以后不管谁走,系统不能垮。”
张宇廷想了想。“培训可以,另算。两天五万。”
赵总倒吸一口气。孙总笑了一声,把眼镜戴回去。“行。合同什么时候能签?”
“明天。我今晚出合同,你们明天看完没问题就签。”
孙总站起来,扣好西装扣子,伸出手。“宇廷,你比赵总说的聪明得多。”
张宇廷跟他握了手。“赵总只看了我三页PPT。”
孙总哈哈笑了一声,往门口走。赵总跟在后面,经过张宇廷身边时脚步顿了一下,嘴唇动了动,没说出话,走了。
电梯门关上之后,王丽敏把笔往桌上一扔。“四十万加五万培训费,你一天谈下来的比我半年工资还高。”
张宇廷靠着椅背。“你那个猎头客户呢?我说了明天出合同,你帮我找个模板。”
王丽敏掏出手机。“我早就找好了,在邮箱里存着。”她把手机屏幕给他看,“还有,母婴用品那家的技术负责人是我前同事,我昨晚已经跟她打过招呼了,她说明天上午来见你。”
张宇廷看着她。“你什么时候安排的?”
“你昨晚睡着之后。你以为我光坐着看电视?”
张宇廷没说话,从袋子里掏出面包咬了一口。王丽敏走过来把面包抢走,塞给他一盒还热乎的盒饭。“中午买的,别吃面包了。”
张宇廷打开盒饭盖子,红烧肉加青菜。他吃了一口,手机又响了。一个陌生号码,归属地显示广东。
他接起来。对面一个女声:“张工你好,我是生鲜那家公司的技术总监刘颖,陈涛把你推给我的。你明天下午有时间吗?我想当面聊。”
张宇廷咽下嘴里的饭。“有。下午两点,地址我发你。”
挂了电话,王丽敏问他:“生鲜那家自己找上来了?”
“陈涛推的。”
“你那个八分钟修故障的事,传得比你想象的快。”
张宇廷扒了两口饭,站起来走到窗户边上,往楼下看。对面楼底下,赵总和孙总刚走出园区大门。赵总在跟孙总说什么,手比划得很快。孙总听了几句,回了一句话,赵总不说了。
张宇廷拉上窗帘,回到桌前。“明天签合同,你跟我一起。”
“我去干什么?”
“你来当财务。钱打到你卡上,我信不过别人。”
王丽敏看着他。“你不怕我卷款跑了?”
“你跑了谁给我买盒饭。”
王丽敏笑了一声,从包里又掏出一份文件。“喏,公司对公账户开好了,法人是你,财务负责人填的我。今天上午我去银行办的。”
张宇廷接过来看了一眼。“你到底是猎头还是我秘书?”
“我哪边工资高就是哪边。”
3
第二天上午九点,王丽敏把合同模板打印出来放在桌上。张宇廷花了一个小时填金额、改条款、调付款节点,最后在乙方那栏签了名。
“孙总那边谁签字?”王丽敏把合同收进文件袋。
“赵总送过来。”张宇廷刚说完,电梯门开了。赵总一个人来的,手里拎着一个公文包,脸上挂着笑。
“宇廷,合同我带过来了,孙总签好字盖好章了。”他把文件袋放桌上,又从包里掏出一张支票,“预付款,二十万,你数一下。”
张宇廷接过支票看了一眼金额和印鉴,递给王丽敏。王丽敏对着光看了看,朝张宇廷点了点头。
张宇廷拿起笔在合同上签了名,留下一份,另一份推给赵总。“培训安排在下周三周四,两天,地点你们定,我过去讲。”
赵总把合同收进包里,没急着走,在椅子上坐下来。“宇廷,有个事想跟你商量。”
“说。”
“小李停职之后,他那摊子没人接。你能不能回来带一带?不用坐班,每周来两天就行,薪资按日算,一天三千。”
张宇廷没接话。王丽敏在旁边翻合同,头也没抬。“赵总,他昨天跟孙总谈的是外包维护,不包括驻场带人。你要加需求,得另签协议。”
赵总脸色僵了一下。“王……王小姐是吧?我不是那个意思,就是内部协调一下——”
“内部协调走内部流程。”王丽敏把合同收进文件柜,“他现在的身份是乙方,跟你们公司是合作关系。你要加服务内容,写进合同,盖章,走付款流程。口头商量的事我们不接。”
赵总看向张宇廷,张宇廷摊了摊手。“她管合同,我管技术。她说不接就是不接。”
赵总站起来,拎着包往门口走。“行,我回去跟孙总汇报一下,有消息再联系。”
电梯门关上之后,王丽敏从文件柜里抽出一张便利贴拍在桌上。“驻场带人一天三千,一个月来八天就是两万四,他真敢开口。”
张宇廷没说话。王丽敏看着他。“你心动了?”
“没有。”
“你犹豫了两秒。”
张宇廷把便利贴揭下来贴到电脑显示器边上。“我犹豫的是怎么回绝得让他以后不敢再提。你刚才那段话就挺好,以后这种事你来挡。”
下午两点,刘颖准时到了。四十出头,短发,背一个双肩包,进门先扫了一圈办公室环境,目光在张宇廷和王丽敏之间来回看了一眼。
“张工,王姐跟我说了你的事。”刘颖坐下来,从包里掏出一个U盘放在桌上,“长话短说,我们平台生鲜类目订单量是陈涛那边的两倍。你们前公司的接口现在每天出问题,我们技术团队四个人轮班盯,一个月了,盯不住。”
“什么问题?”
“库存数据延迟。下单扣了库存,后台没同步,导致超卖。上周一上午卖了三百单车厘子,实际库存只有一百二十单。赔了客户十八万。”
张宇廷把U盘插到电脑上,打开里面的日志文件。翻了十几页,停在一段报错上。
“你们调的是旧版库存接口?”
“对,你们去年给的技术文档就是这么写的。”
“去年是去年。今年三月系统重构过,库存接口拆成了三个,读写分离。旧接口只读,写操作全部走新接口。小李接手的那个文档没更新。”
刘颖脸色沉下来。“所以这一个月我们调的接口本身就不支持写操作?”
“对。你们写进去的库存数据全部堆在缓冲队列里,过了有效期自动丢弃。等于你们只扣了订单,没扣库存。”
刘颖深吸一口气,靠回椅背。“张工,开价吧。”
张宇廷伸出手指。“三件事。第一,接口迁移到我这边来,我重写一套,跟你们系统直接对接,一年二十万。第二,你们现有的库存数据我帮你恢复,把丢掉的扣减补上,一次性五万。第三,你们技术团队我来培训,两天,三万。总共二十八万。”
刘颖从包里掏出计算器按了几下。“二十八万比我养一个技术团队便宜,而且能解决超卖。”她抬起头,“但我有个条件——上线时间。我们下个月一号大促,你得在那之前搞定。”
“今天几号?”
“三号。”
“还有二十八天。”张宇廷打开日历看了一眼,“接口迁移十天,数据修复三天,培训两天,留十三天你们测试。够。”
刘颖站起来伸出手。“签。合同今天能出吗?”
王丽敏从文件柜里抽出另一份合同模板放桌上。“模板已经准备好了,改金额和条款就行。半小时。”
刘颖坐下来,看着王丽敏改合同,转头对张宇廷说了一句:“你这公司,一个技术一个商务,挺精简。”
张宇廷指了指王丽敏:“她是老板。”
王丽敏头也没抬:“我是管钱的。他是干活的。”
刘颖笑了一声,签完合同转完账走了。张宇廷看着银行到账短信上的数字,把手机递给王丽敏。
“加上陈涛那十五万,账上四十三万了。”
王丽敏把手机推回去。“别高兴太早。刘颖那边数据修复比接口迁移麻烦,你一个人干两个项目,时间卡得死。你要不要招个人?”
“招谁?小李那样的?”
“正经招。你出技术面试题,我去平台上发招聘。”
张宇廷想了五秒。“招一个后端,能看懂我代码的。工资你定,别超过一万二。”
“一万二在市场上招不到能看懂你代码的。”
“那就一万五。剩下的从项目款里扣。”
王丽敏打开招聘平台开始发职位。张宇廷刚打开代码编辑器,手机响了。一个陌生号码,本地座机。
“张宇廷吗?我是前公司人事部。赵总让我通知你,下周三的培训地点定在公司三楼会议室,上午九点开始。赵总说让你提前一天来装环境。”
张宇廷听完直接回:“装环境算驻场,按你们赵总说的,一天三千。要装我就去,不装你们自己弄,投影仪连上电脑就能用。”
人事那边沉默了一会儿。“我跟赵总确认一下。”
“确认好了发微信。别打电话了,我干活呢。”
挂了电话,王丽敏竖起大拇指。“硬气。”
“你教的。”
“我教的是合同条款,不是让你跟谁都硬。”
张宇廷打开小李提交过的那批代码,开始逐个模块回滚。王丽敏在旁边刷招聘后台,刷了半小时,抬头说:“投了十二份简历,我筛出来三个,明天上午约面试?”
“明天上午我要写接口文档。”
“那就下午。三点开始,一人半小时,四点结束。”
“行。”
第二天下午三点,第一个面试的到了。二十八岁,简历上写“三年大厂经验”,进门先递名片,上面印着“高级后端开发工程师”。
张宇廷把笔记本电脑转过去,屏幕上是一段代码。“你看这段,十五分钟,告诉我这段代码有什么问题。”
那人看了五分钟,开口:“变量命名不规范,没加注释,函数太长应该拆分……”
“还有呢?”
“没有了。”
张宇廷把电脑转回来。“回去等通知。”
第二个面试的是个女生,二十六岁,简历上就一行“两年半工作经验,独立负责过订单模块”。进门先问了一句:“你们代码用什么规范?我之前公司用阿里规约。”
张宇廷把电脑转过去。“先看代码,十五分钟。”
女生看了七分钟,抬头。“这段代码用单机锁处理分布式事务,上线肯定会出问题。要么换分布式锁,要么改架构走消息队列。另外这段注释写得很清楚,说明写代码的人知道有坑但被要求赶工,注释里‘临时方案’四个字出现了三次。”
张宇廷看了王丽敏一眼。王丽敏在笔记本上写了一个字:“要。”
张宇廷转回头。“什么时候能来上班?”
“随时。”
“明天早上九点,带身份证和银行卡,办入职。”
女生走了之后,王丽敏把笔记本转过来给他看。“还有第三个面试的没来,已经过点了。”
张宇廷把笔记本合上。“不等了。后天刘颖那边接口开发启动,你帮我盯一下她的数据导出。”
王丽敏在笔记本上又写了一行。“周五之前把公司官网做出来,客户来了连个网址都没有。”
“你找人做,别找我。”
“已经找好了。五百块钱,明天上线。”
4
新来的女生叫孙晓,第二天早上九点准时到了。张宇廷把刘颖那边的库存接口文档发给她,让她先看,下午开始写代码。
孙晓看了两个小时,跑过来问:“张总,这个文档是你写的?”
“别叫张总,叫宇廷就行。文档我写的,有问题?”
“没有,写得挺清楚。我就是想问一下,这个库存扣减的幂等逻辑你打算用数据库唯一索引还是用Redis?”
“你判断。你选哪个方案,理由写清楚发给我,我批了你就写。”
孙晓点了点头回去了。王丽敏从外面买了两杯咖啡回来,看见孙晓在工位上埋头敲键盘,凑到张宇廷耳边问:“怎么样?”
“问的问题在点上,不蠢。”
“那就好。我跟你说个事。”王丽敏把手机递过来,“赵总在朋友圈发了一条,说公司技术团队‘引进高层次人才’,配了一张照片。”
张宇廷看了一眼。照片里赵总站在中间,旁边一个戴眼镜的男人,四十来岁,T恤扎进西裤里,看着像技术大牛。底下小李点了赞,评论写着“欢迎新同事”。
“从哪挖的?”
“我问了陈涛,他说是某互联网公司出来的,职级不低,赵总花了血本。”
张宇廷把手机还给王丽敏。“挖就挖吧,跟咱们没关系。”
“你不担心?”
“担心什么?”
“他要是真能接住系统,你那个四十万的外包合同,明年续不续?”
张宇廷把咖啡杯盖掀开,喝了一口。“明年的事明年再说。他要是真能接住,我恭喜孙总。但小李改的那批代码,没三个月捋不清楚。新人来了先替小李擦屁股,擦完了才有精力看核心模块。”
王丽敏看了他一眼。“你算准了?”
“我没算。我干了八年,知道那个系统什么情况。核心模块的设计文档在我脑子里,代码里注释写了不到三成。新人想搞明白,只有两条路——要么花时间反向啃代码,要么来问我。”
“问你收费?”
“问一次五千,包月两万,包年十五万。”
王丽敏把手机收起来。“那我是不是得准备一份技术咨询合同模板了?”
“你看着办。”
周三上午,张宇廷去前公司做培训。王丽敏背着包跟在后头,包里装着两份合同——一份技术咨询包年合同,一份驻场服务协议。
三楼会议室,赵总已经坐在里面了,旁边就是朋友圈照片里那个戴眼镜的男人。
赵总站起来介绍:“宇廷,这位是钱松,咱们新来的技术总监。今天培训他全程参加。”
钱松站起来握手,笑容很标准。“张工,久仰。你写的那个交易系统我看了一部分,架构挺有意思,有些地方我想跟你深入聊聊。”
“聊可以。今天是培训,内容按合同走。你想聊合同外的,王丽敏那边有咨询合同,你看一眼,签了咱们随便聊。”
钱松脸上笑容僵了一下,看了一眼赵总。赵总咳嗽了一声。“宇廷,钱总监刚到,很多情况不熟悉,你看能不能先带一带——”
“带人可以,驻场一天三千,我之前报过价。赵总你跟孙总汇报过了吗?”
赵总不说话了。
钱松倒是反应快,从兜里掏出名片盒,抽了一张递给张宇廷。“张工,加个微信,回头我私下请教。”
张宇廷接过名片装兜里,没掏手机。“行,回头微信上聊。现在开始培训,投影仪怎么开?”
培训讲了一整天。张宇廷把系统架构从头到尾拆了一遍,重点讲了小李改过的那十七个模块,每个模块的原始设计逻辑、小李的修改内容、回滚方案、测试用例,全部讲完。
底下坐了十五个人。钱松记了满满三页纸,中途提了五个问题,都问在关键点上。张宇廷一个一个答了,答完钱松点点头,不说话了。
下午五点培训结束。张宇廷关掉投影仪收拾电脑,钱松走过来递了瓶水。“张工,你今天讲的这些,有文字材料吗?”
“没有。要文字材料另外收费,我可以写一份完整的系统设计文档,十五万,两个月交稿。”
钱松拧开自己那瓶水喝了一口。“十五万我得跟孙总申请。”
“你申请。批了给我发微信。”
回到对面楼七层,王丽敏把培训合同和签到表收进文件柜。“两天培训费五万,孙总那边验收单签了字,钱明天到账。”
张宇廷坐在椅子上没动。孙晓从工位探出头:“宇廷哥,刘颖那边的库存数据恢复方案我写完了,你审一下?”
张宇廷接过来翻了翻,在第三页停住。“这个修复脚本为什么加这个循环?重复执行会锁表。”
孙晓凑过来看了一眼。“我考虑到数据量大的时候分批处理……”
“分批处理用游标,别用循环。循环一锁表,线上还在跑业务,直接挂。”
孙晓拿回方案。“我改。”
张宇廷看着她的背影跟王丽敏说了一句:“这姑娘不错,说一遍就能改。”
“比小李强?”
“小李说三遍都不改,第四遍跟你说‘这是产品需求’。”
王丽敏笑了一声,手机响了。她接起来听了几秒,捂住话筒转头对张宇廷说:“陈涛电话,说他那边接口联调出问题了,问你今晚能不能加个班。”
张宇廷伸出手。王丽敏把手机递给他。
“陈总,什么问题?”
“张工,你给我们写的新接口,订单状态同步延迟有点高,五秒到八秒不等。我们客服那边要实时查订单,等不了这么久。”
张宇廷打开陈涛那边的后台日志看了一眼。“你们查订单状态用的哪个接口?”
“就是你文档里写的那个queryOrderStatus。”
“那个接口是异步的,走消息队列,本来就有延迟。要实时查,用queryOrderDetail,同步接口,毫秒级返回。”
电话那头安静了几秒。“你文档里写的queryOrderStatus是主要接口……”
“文档第一页第一行写的什么?”
陈涛翻文档的声音传过来。“‘本接口为异步查询接口,实时场景请使用queryOrderDetail’……”
“看到了?”
“看到了。我让开发改。”
“改完告诉我,我远程看一眼。”
挂了电话,王丽敏把手机接回去。“陈涛这个人怎么样?”
“技术底子薄,但肯认错。比赵总强。”
“那你收他多少钱?”
“该收多少收多少。他肯认错是他的事,我该收费是我的事。”
孙晓改完方案又拿过来了。张宇廷看了一遍,改了几个参数,批了。“明天开始执行,三天跑完。跑完之后把结果导出来给我看。”
孙晓拿了方案回去。张宇廷打开微信,看到钱松发来的好友申请,备注写着:“张工,十五万文档的事孙总批了,合同什么时候签?”
张宇廷把手机递给王丽敏。“你回。合同你出,钱到账我开工。”
王丽敏接过手机打了几个字发过去,然后把手机还给张宇廷。“钱松这个人比赵总靠谱,问的问题都在点上,你以后可以多跟他聊聊。”
“聊可以。按合同来。”
晚上九点,张宇廷关电脑准备走。王丽敏在门口等他。“今天一天你签了三份合同,培训五万、文档十五万、陈涛那边接口维护续了半年七万五。账上现在六十五万。”
张宇廷把灯关掉,锁上门。“明天把公司官网挂上去,招聘信息加上后端开发两名,测试一名。”
“你招人了?”
“刘颖那边数据修复完,接口迁移上线,后面还有维护和迭代。孙晓一个人撑不住三个项目。”
“工资预算?”
“后端一万八,测试一万二。你谈。”
电梯里王丽敏看着手机上的招聘后台。“今天投了四十份简历,我筛出来八个,后天面试?”
“后天不行,后天我去刘颖那边现场看数据修复结果。大后天。”
电梯到一楼,门打开。对面楼底商新开了一家面馆,门口挂着“试营业八折”的牌子。张宇廷看了一眼,抬脚往面馆走。
王丽敏跟在后面。“你请客?”
“我请。今天进账二十七万五,吃顿面不过分。”
两人坐下来,张宇廷点了两碗牛肉面加一份凉拌黄瓜。面上来之前,他掏出手机看了一眼前公司技术群的聊天记录。钱松在群里发了一条消息:“今天张工的培训内容我整理了一份笔记,发到共享盘了,所有人下载学习,下周考试。”
底下赵总回了一个大拇指。
张宇廷把手机扣在桌上。王丽敏看了一眼他的表情。“怎么了?”
“钱松在群里发培训笔记。”
“说明他听进去了。”
“听进去是好事。”张宇廷拿起筷子掰开,“但他发的是我讲的内容。我讲的时候他说‘记下了’,转头就发群里当自己的笔记。这个人比赵总聪明,但做事的路数是一样的。”
王丽敏把筷子放下。“那你那个十五万的文档……”
“合同已经签了,钱到账我照写。但我写文档的时候会留一手。核心模块的设计逻辑写七成,剩下三成写‘见代码注释’。”
“代码注释你不是没写全?”
“所以我让他来问我。问一次五千。”
王丽敏笑出了声,面馆老板端着两碗面过来放在桌上。张宇廷拿起醋瓶往面里倒了两圈,搅了搅,低头吃面。
5
大后天早上九点,张宇廷到公司的时候,门口排了四个人。王丽敏在楼道里摆了张折叠桌当面试台,桌上放着四份简历和一支笔。
“八点就来了俩,在楼下便利店坐了半小时。”王丽敏把简历递给他,“我筛过一轮了,这四个技术底子还行。”
张宇廷翻了翻简历。第一个,三十岁,五年经验,上一家公司在做金融系统。第二个,二十七岁,三年经验,独立写过支付网关。第三个刚毕业一年,简历上写着“熟悉分布式架构”。第四个三十三岁,简历附了一段GitHub链接。
他把第四份简历抽出来。“这个先面。链接我昨晚看了,代码写得干净,注释也全。”
九点十分,第四个人进来了。叫周明,穿格子衬衫,头发理得短短的,进门先鞠了个躬。
张宇廷把电脑转过去。“这段代码,十五分钟,找问题。”
周明看了三分钟抬头。“这个锁的粒度太粗了,并发一高就排队。另外这个异常处理只打了日志没往外抛,上游调用方根本不知道出错了。”
“还有呢?”
“第六行的数据库连接没关,没走try-with-resources,时间长了连接池会满。”
张宇廷把电脑转回来。“你期望薪资多少?”
“一万八。”
“明天能来上班吗?”
“能。”
周明出去之后,王丽敏在表格上画了个勾。“剩下三个还面吗?”
“面。孙晓那边缺个测试,看看有没有合适的。”
第二个面试的叫吴倩,二十六岁,做了三年测试。张宇廷给了她一份接口文档。“你看这个文档,列一下你觉得需要测的场景。”
吴倩看了十分钟,在纸上写了十二个测试点,从正常流程到并发超卖到重复下单到网络超时。张宇廷接过来看了一遍,十二个点里有十一个是正确的,剩下一个偏了方向。
“一万二,明天能来吗?”
“能。”
剩下两个面完,一个基础太差,一个期望薪资超了预算。张宇廷在简历上画了个叉。王丽敏把合同拿出来,给周明和吴倩各打了一份,拍照发过去,让他们明天来签。
刚忙完,电梯门开了。钱松拎着一个公文包走出来,看到张宇廷在楼道里摆的面试桌,脚步顿了一下。
“张工,你们公司招人?”
“招。坐。”张宇廷把折叠桌收了,让钱松进屋。
钱松坐下来,从包里拿出一份合同。“孙总批了,十五万文档合同,你看看条款有没有问题。”
王丽敏接过去翻了翻,拿笔改了两处付款节点。“首付改四成,交稿后付四成,验收后付两成。孙总要是没意见,就按这个签。”
钱松看了一眼改动的地方,掏出手机拍了张照。“我发给孙总确认一下。”他发完消息,没急着走,靠在椅背上,“张工,你那天培训讲的交易链路拆解,我回去对着代码捋了一遍,有个地方没想通。”
“哪里?”
“库存扣减的补偿机制。小李改过之后现在走的是定时任务补偿,每五分钟扫一次异常订单。但你原来设计的时候是同步扣减,失败了马上回滚。我不太明白为什么不用同步回滚,要改成异步补偿。”
张宇廷手指在桌上敲了两下。“因为库存扣减是跨库操作。订单库和库存库是两个数据库,同步回滚需要分布式事务。我们当时没上Seata,用的最终一致性。失败订单进异常表,定时任务补。这个逻辑我培训的时候讲过。”
“培训笔记我看了,你只讲了‘怎么做’,没讲‘为什么不做同步’。”
“因为同步回滚的锁持有时间长,大促期间并发一高就雪崩。宁可先放过去,事后补偿,也不能把主链路卡死。这是取舍,不是最优解。”
钱松沉默了几秒。“明白了。那这个补偿机制现在跑着有没有问题?”
“有。定时任务是单节点跑的,没做分布式调度。小李加了一个节点之后,两个节点同时扫表,重复补偿。你看一下日志,每隔五分钟就有一批订单被补偿两次。”
钱松脸色变了。“这个会导致什么?”
“库存多扣一次,实际库存比系统库存少。卖超了客户收不到货,投诉。”
钱松站起来。“我回去改。”
“改可以。咨询费一次五千,微信转账,我远程给你看代码。”
钱松掏出手机转了五千,备注“技术咨询费”。张宇廷收了钱,打开远程工具连上钱松的电脑,指了指那几行代码。“这里加一个分布式锁,用Redis的setnx,过期时间设短一点,五分钟。节点加锁成功才扫表,扫完释放。两个节点就只会有一个在跑。”
钱松照着改了,部署上去看日志,重复补偿消失了。他松了口气,合上电脑。“张工,你这五千花得值。”
“还有别的问题吗?”
“暂时没了。文档合同孙总确认了,就按王小姐改的条款签。”钱松把合同翻到最后一页,掏出章盖上去,又从包里掏出一张支票放桌上,“首付六万,你查一下。”
王丽敏收了支票,开了张收据给他。钱松走了之后,她把支票举起来看了一眼。“六万。你刚才远程五分钟挣了五千。”
“我前面八年就学会这一件事,知道问题在哪。”
“那你以后多教几个钱松这样的,一次五千,一天教五个,比你写代码来钱快。”
张宇廷没接话,打开代码编辑器继续写刘颖那边的库存接口。下午两点,刘颖打来电话。
“张工,数据修复方案跑了两天了,你来看一眼结果?”
“我四点过去。”
四点张宇廷到刘颖公司,刘颖在会议室等他。投影仪上放着修复报告,三天前堆在缓冲队列里的丢失库存数据已经补回来了一部分。
“跑了七十二小时,修复了九成。剩下的一成订单时间太久,原始数据被覆盖了,补不回来。大约损失了四万左右的库存。”
张宇廷翻了翻报告。“四万我赔。”
刘颖愣了一下。“你赔?”
“接口文档是我们公司没更新,导致你调错了接口。责任在我们这边,四万从合同款里扣。”
刘颖看了他一会儿。“张工,我做了十几年技术管理,头一回见乙方主动认赔的。”
“该是谁的责任就是谁的责任。你后面接口迁移和培训还要用我,我不把这事认下来,你下次不找我了。”
刘颖笑了一声。“行,扣四万。剩下的二十四万按合同走,上线验收之后付。”
回公司的路上,王丽敏一边开车一边问:“你真赔啊?”
“赔。四万买一个长期客户,值。”
“你什么时候这么会算账了?”
“跟你学的。”
第二天上午,周明和吴倩来签了合同。张宇廷把刘颖那边的接口代码分给周明一半,让他写库存写入模块。吴倩开始建测试用例库,把陈涛和刘颖两边的接口全部过一遍。
中午吃饭的时候,王丽敏把公司官网链接发到工作群里。张宇廷点开看了一眼,设计简洁,首页一行字:“极客科技——解决你系统里的真问题。”底下三块业务:系统架构咨询、接口开发对接、技术培训。
“五百块钱做的?”
“五百。我挑了十家比价,这家最便宜,交付最快。”
张宇廷把链接转到朋友圈,配了两个字:“开张。”
发出去不到五分钟,底下冒出来十几条评论。陈涛点了赞,刘颖评论“合作愉快”,钱松评论“张工威武”。赵总没点赞,但在评论区问了一句:“宇廷,你们公司接不接驻场开发?”
张宇廷回:“接。按人天算,一人一天两千五,最少十人天起。”
赵总没再回。
王丽敏凑过来看了一眼他的手机。“赵总问驻场,你报两千五一天,他肯定嫌贵。”
“他嫌贵说明他还没搞清楚状况。系统崩一次损失多少?大促那天他们赔了客户和商家加起来过百万。两千五一天请个人盯着系统,便宜得跟白送一样。”
“那你少报点,一千八?”
“不降。降价他以为我不值这个钱。等他再出一次事故,自然会回来找我。”
王丽敏看了他一眼。“你变了。以前你只会写代码,现在你也会拿捏人了。”
“被你带坏了。”
6
一周后,刘颖那边的接口迁移上线了。晚上八点,张宇廷和周明留在办公室盯着后台数据。吴倩在旁边跑自动化测试,屏幕上一排绿色通过。
八点半,第一笔订单进来。库存扣减成功,订单状态同步,回调通知发出,全程三百毫秒。周明刷新了一下监控面板,数据曲线平稳。
“宇廷哥,没报错。”
“继续盯。盯到十点,没问题就下班。”
九点四十分,陈涛打来电话。“张工,你们那个新接口上了?我这边数据同步快多了,延迟从五秒降到零点三秒。”
“上了。你那边还有问题吗?”
“没了。对了,跟你说个事。你们前公司那个钱松今天给我打电话,问我接口维护合同到期之后要不要续。我说我已经签了你这边,他说‘张工确实比我们内部团队响应快’,让我有需求随时找他。”
张宇廷把手机开免提放在桌上。“他还说什么了?”
“他说他们技术团队现在也在做接口优化,下个月能上线。让我到时候对比一下性能再决定。”
周明在旁边听了一句,小声说:“钱松在挖你墙角。”
张宇廷对电话里说:“陈总,你到期之后续不续我不强求。你对比性能可以,把我这边接口的稳定性指标拿过去比,同口径。他要是能做到延迟半秒以内、可用性四个九,你续他我没意见。”
陈涛在那头笑了。“张工,你这话说得硬气。行,我按你说的比。”
挂了电话,王丽敏从外面回来,手里拎着三杯奶茶。“刚在楼下碰到赵总了,他从孙总办公室出来,脸色不好看。”
“说什么了?”
“他没看见我。我听见他跟旁边人抱怨,说钱松来了一个月,系统又出了两次小故障,孙总在会上拍了桌子。”
张宇廷把奶茶接过来插上吸管。“钱松技术底子不差,但他一个人改不动整个团队。赵总把小李招进来的时候埋的坑,靠钱松一个人填不完。”
“那孙总会回头找你?”
“找过了。四十万外包合同还在走,他找我最多是加钱加需求,不会让我回去。”
“那你加不加?”
张宇廷吸了一口奶茶。“看需求。驻场不接,培训可以加,文档可以加,系统重构可以报方案。钱到位什么都好说。”
十点整,监控面板没再报警。张宇廷关了电脑,对周明和吴倩说:“明天开始陈涛那边的接口做性能压测,周明你写压测脚本,吴倩你出压测报告。周五之前给我。”
两人应了一声走了。王丽敏把奶茶杯扔进垃圾桶,从包里掏出一张纸拍在桌上。
“今天收到一份简历,你看看。”
张宇廷拿起来一看。姓名:李志强。工作经历:前公司交易系统运维,三个月。自我评价:熟悉交易系统全链路,具备独立排障能力。
“小李投的?”
“投到我猎头公司邮箱里了,没投你们公司招聘后台。估计是不知道咱俩的关系。”
张宇廷把简历翻到背面,拿笔在空白处写了一行字:“不适合,建议转岗。”然后把纸递回去。
“你就写这个?”
“不然写什么?写他把我分布式锁改成单机锁的事?”
“你可以写‘暂不匹配’。”
“那就写‘暂不匹配’。”他拿起笔把刚才那行划掉,重新写了一行。“建议他去考个公务员,那边不用改代码。”
王丽敏把简历收进包里。“人家好歹跟你干过三个月。”
“我跟他干了一个月,他把我八个月的设计毁了。”
第二天下午,钱松发了一条微信过来:“张工,我们这边想加一个驻场服务,每周来一天,帮我们做代码审查。价格你开。”
张宇廷回:“一天三千,最少一个月起签,先付后干。”
“我跟孙总申请一下。”
“行。另外提醒你一句,你们那个定时任务补偿机制加了分布式锁之后,锁过期时间设太短了,网络一抖动锁提前释放,还是会重复补偿。把过期时间从五分钟改成十五分钟,给足补偿时间。”
钱松回了一个抱拳表情:“收到,马上改。”
王丽敏凑过来看了一眼聊天记录。“你主动告诉他?”
“他改好了系统少崩一次,我少挣一次五千的咨询费。但系统稳定了,孙总才会继续跟我续外包合同。四十万比五千多。”
“你算得真清楚。”
“你不也一样。你那个猎头公司,帮我对接客户收不收佣金?”
“收啊,陈涛和刘颖都收了,各收他们首年年费的百分之十五。你管不着,我赚的是他们的钱。”
张宇廷没说话,打开电脑看了一眼公司账户余额。王丽敏凑过来看了一眼数字。“别看了,扣掉房租工资和税款,净剩四十二万。”
“周明和吴倩的工资发了?”
“发了。下个月开始给他们交社保,每人多支出一千八。”
张宇廷把网银页面关了。“刘颖那边上线验收之后付尾款十二万,陈涛那边七万五,再加上孙总的驻场服务费,下个月账上能过六十万。”
“然后呢?”
“然后招个前端,把公司官网重做一下。五百块钱做的那个太丑了。”
王丽敏拿出手机开始刷招聘后台。“前端预算多少?”
“一万五。要求能写小程序,以后客户接口管理后台得有人做。”
“行,我明天发职位。”
正说着,电梯门开了。孙晓从外面跑进来,手里攥着手机,脸色不对。
“宇廷哥,出事了。小李在技术群里发了一条消息,说你那个交易系统的核心代码里有安全隐患,他整理了一份报告发给孙总了。”
张宇廷把手机接过来看了一眼。小李发的截图是一段代码,底下配了一段文字:“系统存在SQL注入风险,可导致数据泄露。该模块由张宇廷编写,建议公司立即排查。”
张宇廷把截图放大了看那段代码。看了五秒,笑了。
王丽敏问:“真有问题?”
“这段代码是我写的,但不是他截的这段。他截的是我上周回滚之前他改过的那一版。他把参数化查询改成了字符串拼接,然后截图发出来说是我写的。”
“你有证据吗?”
张宇廷打开代码仓库,翻到提交记录,把小李的提交时间、修改内容、前后对比截图全部导出来,打包发给了孙总,抄送钱松,附了一句话:“建议查一下小李在职期间的代码提交记录,看看到底是谁改的。”
十分钟后,孙总回了一条:“宇廷,明天上午来我办公室一趟,带上你那份完整记录。”
王丽敏把手机还给张宇廷。“你要去?”
“去。带上合同,他要是想借这事压外包费用,我直接给他看证据。他要是想处理小李,我配合。”
“你站哪边?”
“我站合同这边。谁给钱我站谁。”
7
第二天上午九点,张宇廷到前公司楼下,王丽敏跟在后面,包里装着打印好的代码提交记录和外包合同副本。
前台换了人,不认识张宇廷,拦着让登记。张宇廷签了名,写“极客科技张宇廷”。前台看了一眼公司名,拿起电话拨了个内线,说了两句,放下电话递了张访客卡。
孙总办公室在走廊尽头。门开着,孙总坐在办公桌后面翻一沓纸,钱松站在窗边,赵总坐在沙发上,小李站在赵总旁边,手里攥着一个U盘。
张宇廷进门,王丽敏跟在后面。孙总抬头看了他一眼,指了指对面的椅子。“坐。”
张宇廷坐下来,王丽敏站在他身后。孙总把那沓纸往桌上一推。“小李写的报告我看了。宇廷,你说他截图那段代码是你写的,证据呢?”
张宇廷从王丽敏手里接过文件夹,抽出一张打印纸放在桌上。“代码仓库的提交记录。三月十七号,小李提交的,改了三个文件。他把参数化查询改成字符串拼接,注释写‘优化查询性能’。我离职之前回滚了这段代码,仓库里有回滚记录。他截图用的是他改过的那一版。”
孙总拿起来看了一遍,递给钱松。钱松看了半分钟,抬头看了一眼小李。“李志强,你提交记录里确实有这一条。你截图的时候用的是哪个版本的代码?”
小李脸涨红了。“我……我截图的时候没注意版本,可能是缓存没刷新——”
“缓存不会改代码。”钱松把打印纸放在桌上,“你提交的这版代码确实有注入风险,但宇廷回滚之后风险已经消除了。你拿回滚前的代码截图,说成是宇廷写的,这个事性质不一样。”
赵总坐直了。“钱松,你说话注意点。小李可能是操作失误,不是故意的——”
“赵总。”孙总开口了,声音不大,但赵总立刻闭嘴。“小李,你自己说。”
小李攥着U盘的手在抖。“孙总,我真不是故意的,我就是整理代码的时候看错了版本……”
孙总看了他三秒。“你停职期间工资照发,回家休息一个月,写一份检查交上来。这一个月的活让钱松安排人接。”
小李张了张嘴,看了赵总一眼。赵总没看他,低头翻手机。
“出去吧。”孙总摆了摆手。小李把U盘放在桌上,转身走了。门关上之后,孙总转向张宇廷。“宇廷,这事是小李不对,但系统安全确实是我关心的。你那个外包合同里写没写安全审计的条款?”
王丽敏从包里抽出合同翻到第三页。“第七条,乙方负责维护系统的安全性,包括代码审查和漏洞修复。安全审计单次两万,一年四次打包六万。”
孙总看了一眼赵总。“签。一年六万,四次审计,这个季度做第一次。”
赵总张了张嘴:“孙总,这个预算——”
“从技术部团建费里扣。”孙总把合同推到赵总面前,“签字。”
赵总掏出笔签了字。孙总把合同递给王丽敏,转头看着张宇廷。“宇廷,驻场服务的事钱松跟我说了。一周一天,做代码审查,三千一天,一个月一万二。签三个月,先试。”
“行。”
“还有件事。”孙总靠在椅背上,“小李停职这一个月,他手上负责的那几个模块谁接?钱松一个人盯不过来。”
张宇廷没接话。王丽敏在旁边开口:“驻场一天三千是代码审查,不包含接手模块开发。如果要接手具体模块,按人天算,周明一天两千五,吴倩一天一千八。”
赵总在后面算了一下。“一个月二十二个工作日,周明来半个月就是三万七——”
“赵总。”孙总打断他,“你算算系统崩一次赔多少钱,再算算这个贵不贵。”
赵总不说话了。
孙总把眼镜摘下来擦了擦。“行,宇廷你回去出一份驻场排期和报价单,明天发给我。钱松你对接一下。”
从办公室出来,走廊里没人。王丽敏快走两步跟上张宇廷。“你刚才一句话没说,全让我开口。”
“你比我专业。合同条款、报价、排期,你说比我管用。”
“那你干什么?”
“我负责修代码。谈判的事你来。”
电梯门开了,钱松从后面追上来。“张工,等一下。”
张宇廷站住。钱松递过来一张名片。“下周一我来你们公司一趟,把驻场服务的排期定了。顺便,我有个事想跟你单独聊。”
“什么事?”
“我想从你们那边买一套监控系统的搭建方案。我们现在的监控太原始了,出问题全靠人盯。预算五万以内,你出方案我出钱。”
张宇廷看了一眼王丽敏。王丽敏点头。
“方案可以出,五万包含部署和培训。你下周一来了聊。”
钱松握了握手走了。王丽敏在电梯里对张宇廷说:“钱松这个人比赵总上路。他花钱解决问题,不跟你绕。”
“所以他能在孙总手底下待住,赵总不一定。”
周一上午,钱松准时到了对面楼七层。周明和吴倩已经入职一周,工位上堆着打印出来的代码文档。钱松看了一圈,找了个空椅子坐下来。
“张工,你这边人手比我们技术部还齐整。”
“三个兵一个将,够用。”张宇廷把驻场排期表推过去,“一周一天,我亲自去。时间定周四,你把你那边代码提交记录整理好,我当场审。审出问题你自己改,我不动手。”
钱松翻了翻排期表。“周四行。监控方案呢?”
张宇廷打开投影仪,把方案投到墙上。“三块。第一块,日志采集。用开源方案,Filebeat加Elasticsearch,部署五台服务器,一天搭完。第二块,告警推送。钉钉机器人加短信网关,你们有现成的短信通道,直接对接。第三块,监控大盘。Grafana,我出五个模板,交易链路、库存、订单、接口延迟、错误率,你们照着配。”
钱松拿手机拍了几张照。“部署要多久?”
“两天部署加一天培训,总共三天。五万包含第一年维护,第二年开始一年一万。”
“行,我报给孙总。”钱松把方案收起来,“还有个事。我们技术部现在有个人在跟你们对接,叫王强,做了两年运维。孙总的意思是想让他跟着你学一学监控这块,以后我们自己能维护。”
张宇廷想了想。“跟可以。跟班学习一天一千五,跟三天四千五。学完能独立操作才算数,学不会不收钱。”
钱松笑了一声。“你这收费方式挺自信。”
“自信不自信看结果。三天学不会,说明他不适合干这个,你也别在他身上浪费时间。”
钱松走了之后,王丽敏从工位探出头。“钱松这个人可以长期合作,他知道花钱买时间。”
“嗯。赵总只想省钱,钱松想的是怎么把事办了。”
下午,王丽敏把驻场排期表和监控方案报价单发给了孙总。半小时后孙总回了一条微信:“都签。钱松对接。”
8
第二周周四,张宇廷第一次去前公司驻场。三楼技术部给他留了个工位,靠墙角,对面坐着钱松。王强搬了把椅子坐在旁边,手里拿了个新笔记本。
“宇廷哥,我从哪开始学?”
“先看日志。你把昨天交易系统的错误日志导出来,按错误类型分类,统计每种错误出现的次数。”
王强打开终端开始敲命令。张宇廷打开钱松传过来的代码仓库,从最近一周的提交记录开始审。
审了半个小时,停在一段代码上。“钱松,你过来看。”
钱松凑过来。张宇廷指着屏幕。“这段缓存更新逻辑,先删缓存再更新数据库。高并发下会出问题。A线程删了缓存还没更新数据库,B线程读缓存发现空,去数据库读了旧数据写回缓存,A线程再更新数据库,缓存里就是脏数据。”
钱松看了一会儿。“改成先更新数据库再删缓存?”
“对。但删缓存要加延迟,更新完等五百毫秒再删,给读请求一个缓冲。这段代码谁写的?”
“王强写的。”
王强在旁边抬起头。“那个……我是照着网上博客写的,说先删缓存再更新数据库能减少缓存穿透……”
“博客没告诉你并发场景下的时序问题。”张宇廷把键盘推到王强面前,“你改,我看着。”
王强改完之后张宇廷看了一遍,点了点头。“下次写缓存逻辑之前先想三个事:谁读、谁写、读写交叉的时候数据以谁为准。”
王强在笔记本上写了三行。钱松在旁边看着,没插话。
中午吃饭的时候,钱松端着餐盘坐到张宇廷对面。“张工,你审代码的方式跟我们内部评审不一样。我们内部评审看规范看格式,你看时序看并发。”
“规范格式是给人看的,时序并发是给系统看的。系统崩了不看你的代码格式好不好看。”
钱松笑了一声。“下周孙总想请你给技术部做一次分享,不讲代码,讲讲你这些年碰过的线上事故。预算五千,一小时。”
“事故可以讲,但客户名和项目名我得脱敏。”
“那肯定。”
下午回公司的路上,张宇廷接到刘颖的电话。“张工,尾款十二万今天打过去了,你查一下。另外有个事,我们集团旗下还有一家做跨境支付的子公司,技术负责人是我朋友,他们系统最近老出问题,我让他加你微信了。”
“什么问题?”
“他说是接口偶发超时,排查一个月没找到原因。你帮他看看,收费你跟他谈。”
刚挂电话,微信弹出一条好友申请:“赵恒-跨境支付技术负责人,刘颖推荐。”
张宇廷通过之后打了三个字:“什么问题?”
对面秒回:“接口超时,日志里找不到异常,但每天总有几十笔订单卡住。已经排查一个月了。”
“远程看一次五千,找到问题另报价。”
“行,账号发我。”
张宇廷把账号发过去。两分钟后到账五千。他打开远程工具连上赵恒的服务器,翻了十分钟日志,停在一行WARN上。
“赵恒,你们这个接口调用了外部支付网关,网关超时时间是三十秒,你们自己接口的超时时间是十秒。网关还没返回,你们这边已经超时了。查一下网关最近的响应时间分布。”
赵恒在那头查了五分钟。“最近网关响应时间确实变长了,平均二十五秒……”
“把你们接口超时时间改成三十五秒,比网关多五秒。另外加一个重试机制,第一次超时之后隔两秒重试一次,重试还超时再报错。别直接超时把订单扔了。”
赵恒照着改完,观察了一晚上,第二天早上发消息:“昨晚零超时。张工,这五千花得太值了。我们老板想见你,谈年度框架合同的事。”
张宇廷回:“下周。”
王丽敏把公司账本翻到最新一页。“账上现在七十八万了。赵恒那边框架合同一签,加上孙总的驻场和监控,下个月能过百万。”
“把公司官网重做一下。五百块钱那个太丑了。”
“已经找人在做了,这次两千,下周上线。”
正说着,周明从工位跑过来。“宇廷哥,陈涛那边的压测结果出来了,峰值并发五千,响应时间稳定在两百毫秒以内,零报错。”
“报告发我,我转发给陈涛。”
张宇廷把报告转过去,附了一句话:“压测通过,下周可以签全年维护续约合同。”
陈涛秒回:“签。年度合同你出,我这边盖章。”
周五下午,张宇廷坐在办公室里算账。王丽敏把下个月的排期表贴在墙上:孙总驻场四天,监控部署三天,赵恒框架合同谈判一次,陈涛续约盖章一次,刘颖那边接口迭代两个小版本。
“下个月排满了。”王丽敏说。
“排满了好。排满了说明在挣钱。”
“你累不累?”
张宇廷靠着椅背想了想。“累。但以前在那个工位上坐着,拿六千的时候更累。”
王丽敏看了他一眼,没说话。手机响了,赵总发来的微信:“宇廷,小李检查交上来了,孙总让我转发你一份。你看看有什么意见。”
张宇廷打开附件扫了一遍,关掉。
“写的什么?”王丽敏问。
“三千字检查,核心就一句话——他没错,是代码版本没管好。”
“你回什么?”
张宇廷打了几个字发过去:“建议他下次截图之前先刷新缓存。”
9
赵恒那边的框架合同谈了两轮。第一轮赵恒的老板派了个商务总监过来,姓方,四十来岁,穿白衬衫黑西裤,进门先递名片,然后从包里掏出一份采购模板,上面印着“年度框架协议”,报价栏空着。
“张工,我们赵总说了,技术这块你开价,但流程得走我们公司的供应商入库。你先填一下资质表,营业执照、开户许可证、近三年业绩证明、团队简历……”
张宇廷把资质表推到一边。“方总监,赵恒那边的问题我远程看一次五千,改一个超时参数收五千。你现在让我填资质表走流程,走完流程一个月过去了,你们系统这一个月出不出问题?”
方总监推了推眼镜。“流程是必要的,我们公司规定——”
“你们公司规定是给你们自己人看的。你回去跟赵恒说,框架合同我只有三条:一年二十万,包含远程技术支持不限次数,现场服务另算一天三千。能签就签,不能签我继续按次收费,一次五千。”
方总监合上采购模板。“二十万我得回去汇报。”
“汇报可以。你告诉赵恒,下周之前签合同,我给他排月度巡检。过了下周我排满了,他再有问题得等。”
方总监走了之后,王丽敏从文件柜里抽出一份空白合同。“你真不填资质表?”
“填了显得我求着他。不填,他反而觉得我有底气。”
“万一他真不签呢?”
“赵恒昨天又给我介绍了一个客户,做本地生活的,下周一见面。赵恒这个人技术出身,知道流程是给大公司病用的。他老板要是卡着不签,赵恒自己会想办法。”
果然,第二天下午赵恒亲自打来电话。“张工,方总监回来说你不填资质表?我跟老板拍了桌子,说你要是不签,系统再出问题你一个人扛。老板松口了,框架合同按你说的三条走,我这边盖章,今天寄给你。”
“合同我出。”
“行,你出我盖。”
挂了电话,王丽敏把合同模板调出来改金额和条款,半小时搞定。张宇廷签完字让周明拿去寄顺丰。
周明刚出门,电梯门开了,钱松拎着一个纸袋走进来。
“张工,孙总批了监控方案。五万预付款今天打过来了,你看一下。”他把纸袋放桌上,里面是一张支票和一份签好的合同。
张宇廷看了一眼支票,递给王丽敏。“监控部署下周一启动,三天完事。王强跟班学习的事你跟他确认一下时间。”
“王强下周一早上九点到你这边来,跟三天。”钱松坐下来,没急着走,“另外,孙总让我带句话。小李检查交上来了,孙总看完不太满意,想让他走人。赵总在中间和稀泥,说小李年轻给个机会。孙总问你的意见。”
张宇廷靠在椅背上。“我的意见?我跟他什么关系?他是你们公司的人,留不留是孙总的事。”
“孙总的意思是,你这边外包维护系统,如果小李还在,以后代码提交难免还有交叉。他怕再出类似的事。”
张宇廷想了几秒。“你回去跟孙总说,小李留不留跟我没关系。但代码仓库权限得管住,核心模块只给钱松和王强开写权限,其他人只能提PR,不能直接推代码。这是流程问题,不是人的问题。”
钱松点头。“我回去传达。”
王丽敏在旁边插了一句:“钱总监,顺便跟你确认一下,驻场服务下周四照常?”
“照常。宇廷来了先审王强写的缓存逻辑。”
钱松走了之后,王丽敏把支票收进保险柜。“孙总在借你的嘴处理小李。”
“他知道我跟小李不对付,让我给个态度,他好跟赵总摊牌。”
“你给的态度够圆滑的,什么都没说又什么都说了。”
“跟你学的。”
下周一到周三,张宇廷带着周明去前公司部署监控系统。王强跟全程,第一天装Filebeat和Elasticsearch,第二天配Grafana和告警规则,第三天培训操作。王强脑子快,第二天就能自己配大盘了。
第三天下午,钱松过来看部署结果。张宇廷把五个大盘挨个点开:交易链路状态、库存同步延迟、订单成功率、接口响应时间分布、错误率TOP10。
钱松看了五分钟。“张工,这个大盘上了之后,我至少能提前半小时发现问题。”
“之前你们出问题多久能发现?”
“等客户投诉才知道。”
“以后不用等投诉了。告警规则我配了短信和钉钉,阈值我写在文档里了。你让人盯着钉钉群就行。”
钱松把文档收进文件夹。“培训费四千五我转你微信了。”
周四驻场审代码,王强把改好的缓存逻辑拿过来。张宇廷看了一遍。“可以。延迟删除改成异步了?”
“用消息队列延迟投递,五百毫秒之后删。”
“行。”张宇廷在审查记录上签了字。“下周开始你独立审代码,审完发给我抽查。”
周五回公司,赵恒的框架合同寄到了。王丽敏拆开看了一眼,对方盖了公章,签字栏写着赵恒的名字。“合同生效了。二十万,季度付,第一笔五万下周一打过来。”
“好。”
王丽敏把合同收进文件柜,拿出一张打印好的招聘广告。“本地生活那家客户今天加了微信,说下周二见面。另外,公司官网新版上线了,你看看。”
张宇廷打开链接。这次页面干净多了,首页是业务介绍,底下三个客户案例,陈涛、刘颖、赵恒的项目各占一栏。案例里没写客户全名,写的是“某头部电商平台”“某生鲜电商”“某跨境支付机构”。
“两千块钱做的?”
“两千。做网站那小孩顺便把SEO做了,百度搜‘系统架构咨询’我们排第三页。”
“第三页有什么用?”
“总比没影强。你再攒几个案例,我让他把SEO再优化一轮,争取上首页。”
张宇廷把官网链接转发到朋友圈。这次评论更多了,有人问收不收学徒,有人问接不接小程序开发。张宇廷统一回复:“业务范围看官网,咨询加微信。”
下午,孙总打了个电话过来,不是微信,是直接手机打过来的。
“宇廷,监控系统我这几天用了,确实好用。钱松说王强跟着你学了三天,现在也能独立配大盘了。”
“王强脑子快,学得快。”
“是这样,我这边有个事想跟你商量。赵总那边我打算动一动,让他去管行政。技术部以后钱松说了算。但钱松一个人撑不住整个部门,我想让你回来挂个技术顾问,不坐班,每周来半天,看看代码审审方案,一个月两万。你考虑一下。”
张宇廷把手机开免提放在桌上。王丽敏凑过来听。
“孙总,顾问可以挂。但我有个条件。”
“你说。”
“技术部所有人的代码提交权限走我这边审一遍。钱松批了不算,我批了才能推。我不在的时候钱松代审,但我保留抽查权和一票否决权。”
孙总在电话那头沉默了几秒。“一票否决权……宇廷,你这是要管我的人。”
“我不管人。我管代码。人你管,代码我管。我否的是代码,不是人。”
孙总笑了一声。“行。顾问费两万一个月,每周四半天,跟驻场同一天。合同你出,我签字。”
挂了电话,王丽敏看着张宇廷。“你现在是两个身份了。一个是外包服务商,一个是顾问。”
“顾问费两万一个月,加驻场一万二,加监控维护一年一万,加赵恒那边二十万,加陈涛和刘颖的合同。”王丽敏在计算器上按了一串数字,“你这一年,光前公司相关收入就过五十万了。”
“还有本地生活那家没谈呢。”
“对。下周二见面。”
10
周二下午,本地生活那家客户来了。两个人,一个技术负责人姓周,一个产品经理姓吴。周负责人进门先看了一眼办公室,目光在周明和吴倩的工位上停了一下。
“张工,你这公司人不多。”
“够用就行。什么问题?”
周负责人打开电脑。“我们平台做同城配送,骑手端和商家端的数据同步延迟。商家出了餐骑手不知道,骑手到了商家说没出餐。客诉率这个月涨了百分之三十。”
张宇廷看了一眼周明。“你来看。”
周明把电脑接过来,翻了十分钟日志。“你们用的是轮询?”
“对,商家端每十秒轮询一次订单状态。”
“轮询间隔太长,改成WebSocket长连接推送。商家出餐后服务端直接推给骑手端,毫秒级。”
周负责人看了吴经理一眼。“WebSocket我们试过,维护成本太高,断线重连处理不好。”
张宇廷开口了:“你们什么量级?”
“日订单三万左右,高峰期并发两千。”
“这个量级WebSocket扛得住。断线重连用心跳机制,三十秒一次,断了自动重连,重连失败降级到轮询。代码我这边有现成的模块,改一改就能用。”
周负责人想了一会儿。“张工,改造周期多久?”
“两周。第一周写推送模块和降级逻辑,第二周你们测试上线。费用八万,包含三个月维护。”
周负责人算了一下。“八万比我们招一个高级开发便宜。签。”
合同当场出了。吴经理签完字转完账,临走前问了一句:“张工,你们接不接小程序开发?我们骑手端想做个轻量版。”
张宇廷看了一眼王丽敏。王丽敏接话:“接。小程序五万起,看功能复杂度。”
“那回头我让产品出个需求文档。”
人走了之后,周明凑过来。“宇廷哥,WebSocket那个模块你真要给我写?”
“你写。写完我审。两周时间,第一周出代码,第二周测试。”
“我没写过WebSocket……”
“没写过就学。我当年也没写过交易系统,不也写出来了。”
周明点了点头回去了。王丽敏从工位走过来,把手机递给张宇廷。“赵总发朋友圈了。”
张宇廷看了一眼。赵总发了一张办公室照片,配文:“新的岗位新的开始,感谢孙总信任,行政部工作同样重要。”底下小李点了赞,评论“赵总威武”。
“赵总去行政部了。”
“孙总动作挺快。”张宇廷把手机还回去。
“你那个顾问合同什么时候签?”
“明天。孙总说让钱松带过来。”
第二天上午钱松来了,带着孙总签好字的顾问合同。张宇廷签完字,钱松从包里掏出一个U盘。
“张工,这个月的代码提交记录都在里面。你周四来的时候审。”
“行。小李的事怎么处理了?”
“孙总让他自己提离职,给了半个月补偿。赵总去了行政部之后老实多了,没再掺和技术部的事。”
“王强现在怎么样?”
“你带了他三天,他现在天天盯着大盘看,比我盯得还勤。昨天他发现一个库存同步的小问题,自己查日志查出来了,改完发给我审,我批了。”
张宇廷点了点头。“下次驻场我带他做一次完整的代码审查。从提PR到合并,全流程走一遍。”
钱松走了之后,王丽敏把公司账本翻到最新一页。“这个月进账:赵恒框架合同首付五万,孙总顾问费两万,驻场一万二,监控部署五万,周明那边配送平台八万,陈涛续约七万五。总进账二十八万七。支出:房租三千八,水电宽带五百,工资四万三,社保五千四,差旅杂费两千。净剩二十万。”
张宇廷靠着椅背。“下个月把赵恒那边的月度巡检排上,每月一次,一次三千。”
“已经排了,每月第二个周五。”
“周明那边WebSocket写完之前,你盯着他点,别让他卡住。”
“我盯着呢。他昨晚加班到十点,今早九点又来了。”
张宇廷站起来走到窗边。对面楼底下,前公司的员工正陆陆续续出来吃午饭。他看了一会儿,转身把窗帘拉上。
“王丽敏,你说我要不要租个大点的地方?三十平有点挤了。”
王丽敏抬起头。“你终于想通了?”
“周明和吴倩两个人挤在角落里,来客户了连个坐的地方都没有。”
“我上周看过了,隔壁楼八层有个六十平的,月租六千五,押一付三。你要看今天下午就能去看。”
张宇廷看了她一眼。“你是不是早就等着我问这句话?”
“我等了半个月了。”
下午去看房。六十平,两个独立房间加一个开放工位区,窗户朝南。张宇廷在屋里走了一圈。“签。”
王丽敏掏出手机给房东打电话。张宇廷站在窗户边上往外看,这个角度正好能看到前公司那栋楼的全貌。
他掏出手机拍了张照,发到工作群里:“下周搬新办公室,每人配一把人体工学椅。”
周明秒回:“宇廷哥威武。”
吴倩回了一个鼓掌表情。
王丽敏挂了电话走过来。“房东说下周一可以搬。”
“行。周末找人把网线和工位布好。”
晚上回到家,张宇廷坐在沙发上翻手机。前公司技术群里,钱松发了一条消息:“本周五下午技术分享,主题:分布式锁的正确使用方式,主讲人:张宇廷。”
底下十几个人回复“收到”。
张宇廷把手机扔到茶几上。王丽敏从厨房端了碗汤出来放在他面前。“喝汤。明天周六,陪我去趟家具城,你那把椅子坐了八年了,换一把。”
张宇廷端起汤碗喝了一口。“那把椅子挺舒服的。”
“那把椅子是公司配的,你离职之后就没椅子了,现在坐的是我从家里搬过去的餐椅。”
张宇廷想了想。“行,明天去。顺便给周明和吴倩也挑一把。”
“预算多少?”
“一把两千。别超过这个数。”
王丽敏坐在他旁边,把手机计算器打开。“四把椅子八千,新办公室布网线三千,搬家两千,这个月多支出一万三。”
“值。人坐舒服了干活才快。”
王丽敏看了他一眼。“你以前在那边坐硬板凳加班到凌晨两点,也没见你给自己换把好椅子。”
“以前我是打工的,椅子是公司的。现在椅子是我自己的,干活也是给我自己干的。”
11
周六上午,张宇廷和王丽敏去了家具城。挑了四把黑色网布椅,一把两千,王丽敏砍到一把一千七,四把六千八,包送货。
从家具城出来,王丽敏开车拐了个弯。“去趟商场,给你买两件衬衫。你现在见客户还穿那件领子磨破的。”
“那件穿着舒服。”
“舒服归舒服,客户看了以为我们公司快倒闭了。”
张宇廷没再争。在商场买了两件白衬衫一条西裤,花了九百。王丽敏又给自己添了一件外套,张宇廷扫码付的钱。
周一搬办公室。新地方六十平,朝南,两个独立房间。张宇廷把靠里那间当自己办公室,外面开放区给周明、吴倩、孙晓。王丽敏在门口摆了一张桌子,旁边放了台打印机。
椅子送来了,周明和吴倩一人一把装好,坐上去试了试。吴倩说这椅子比她上一家公司配的还好。孙晓从刘颖那边驻场回来,看到新办公室愣了一下,把包往桌上一放,在椅子上转了两圈。
“宇廷哥,这椅子比我租的房子里那张床都贵。”
“好好干活。下个月给你涨工资。”
孙晓跳起来鼓了两下掌。
周三下午,张宇廷去前公司做技术分享。钱松把三楼会议室收拾了一遍,投影仪换了个新的,底下坐了二十来号人。王强坐在第一排,笔记本摊开,笔准备好了。
张宇廷讲了四十分钟分布式锁,从原理讲到坑,从坑讲到解决方案。讲完提问环节,王强第一个举手。
“宇廷哥,你之前在我们代码里写的那把锁,过期时间设了十五分钟,为什么不能设短一点?”
“你设短了锁提前释放,两个节点同时进来,数据就乱了。宁可锁的时间长一点,等业务跑完再释放。”
王强在本子上记了一笔。底下又有人问:“张工,你当时写这个锁的时候,为什么要用setnx不用Redisson?”
“Redisson封装太重,我们那个场景简单,setnx加过期时间足够了。用什么工具看场景,不是看哪个流行。”
分享结束,钱松把张宇廷送到电梯口。“孙总让我跟你说一声,顾问合同下个月续签,条件照旧。”
“行。”
回到新办公室,周明跑过来说WebSocket模块写完了,让张宇廷审代码。张宇廷看了半小时,指了三个地方:心跳间隔太长、重连退避策略太简单、消息格式没做版本兼容。
“改完再给我看。”
周明拿回去改。吴倩那边把本地生活那家的测试用例跑完了,通过率百分之九十七,剩下三个用例是边界场景,需要张宇廷确认预期结果。
张宇廷看完把预期结果写上去,让吴倩重新跑。下午五点,周明改完代码又拿过来,张宇廷审完批了。
“明天部署到测试环境,让本地生活那边联调。”
周明松了口气,回工位收拾东西准备走。王丽敏从外面回来,手里拿了一份快递文件,拆开看了一眼,递给张宇廷。
“赵恒那边的月度巡检报告出来了。他那边系统跑了一个月,零故障。”
“巡检记录归档。下个月继续。”
王丽敏把文件收进柜子,从包里掏出一个本子。“这个月账算完了。收入合计四十二万八,支出五万六,净剩三十七万二。账上趴着九十五万。”
张宇廷看了一眼数字。“够发一年工资了。”
“够发一年半。你明年什么打算?”
“把赵恒那边框架合同续了,本地生活那家尾款收了,陈涛和刘颖的维护续上。前公司那边顾问加驻场加监控,一年固定收入二十万出头。这些加起来保底六十万。”
“然后呢?”
“然后我想做点自己的东西。”
王丽敏把本子合上。“什么东西?”
“一套通用的接口管理平台。中小公司都能用,接了就能管接口文档、监控、告警、限流。市面上有现成的,但太复杂,小公司用不起来。我做一个轻量版,年费制,一年几千块,卖给几十家小公司就是几十万。”
王丽敏看着他的眼睛。“你想做产品?”
“做了八年项目,给别人搭了八年系统。我想做一个自己能卖的东西。”
“需要投多少钱?”
“前期不用投钱。我和周明两个人写,服务器用云主机,一个月几百块。先做个MVP,找陈涛和刘颖试用,跑通了再往外卖。”
王丽敏把本子翻到新的一页。“行,我记上了。明年业务规划第一条:接口管理平台产品化。预算另行核算。”
周四去前公司驻场,王强把自己审的代码拿给张宇廷看。张宇廷翻了翻,批了两处,放行一处。
“王强,你现在审代码的速度比我刚来的时候快多了。”
“盯着大盘看了两周,什么代码容易出问题心里有数了。”
“下周开始你审完的代码直接推,我不看了。”
王强愣了一下。“你不看了?”
“你审过的我抽查。抽查有问题再打回来。”
钱松在旁边听见了,插了一句:“张工,你这放手放得够快的。”
“他审得没问题,我压着不放是浪费我自己的时间。”
回办公室路上,张宇廷接到赵恒电话。“张工,月度巡检报告收到了,我们老板说想再加一个接口限流的模块,你报个价。”
“限流模块单独做五万,包含部署和培训。跟明年框架合同打包报八万,省两万。”
“打包报八万,我这边走采购流程。”
“行。合同我出,明天寄你。”
挂了电话,王丽敏从后视镜里看了他一眼。“赵恒那边又加需求了。”
“加了两次了。这个人尝到甜头了,后面还会加。”
“加得越多你挣得越多。”
“产品做出来之后,这些需求就不用一个一个写了。平台里自带限流模块,客户自己配就行。”
12
元旦前一天,张宇廷把公司所有人叫到新办公室。周明、吴倩、孙晓,加上王丽敏,五个人围着一张桌子。
张宇廷把投影仪打开,屏幕上是一份产品原型图。
“明年开始,我们做自己的产品。接口管理平台,名字我暂时叫‘极客接口管家’。周明负责后端,吴倩负责测试,孙晓负责前端和文档。王丽敏管合同和钱。我写核心模块。”
周明看了一眼原型图。“宇廷哥,这东西市面上有竞品。”
“竞品卖一年十万起,目标客户是大公司。我们卖一年五千,目标客户是二十人以下的技术团队。陈涛和刘颖那边先免费试用,跑三个月没问题再推。”
吴倩举手。“我能不能也参与写代码?光测试没意思。”
“你先测完周明写的模块,测完了我分你一块前端逻辑。”
孙晓翻开原型图看了一眼。“宇廷哥,这个前端要重写啊,之前官网那套框架太老了。”
“你重写。两周时间够不够?”
“够。”
王丽敏把合同模板打印出来,一人发了一份。“新劳动合同,薪资普调百分之十,元旦后生效。签完字给我。”
周明接过合同看了一眼,转头看张宇廷。“宇廷哥,涨工资了?”
“涨。明年做产品,大家活多了,钱也得跟上。”
孙晓签完字问了一句:“宇廷哥,产品做出来之后卖给谁?”
张宇廷指了指窗外。“对面那栋楼,前公司,就是第一个客户。钱松那边已经跟我提了,说想买一套轻量接口管理工具。我说等三个月。”
王丽敏把合同收齐,放进文件柜。“明年目标,产品上线三个月签五家客户,一家五千,两万五。加上现有项目收入,全年保底八十万。”
张宇廷看着她。“你算得真清楚。”
“你负责干活,我负责算账。”
元旦后第一周,张宇廷带着周明开始写产品核心模块。孙晓重写前端,吴倩一边测接口一边把测试用例整理成产品文档。王丽敏联系代理记账公司把公司财务规范化。
周五下午,张宇廷收到一条微信。钱松发来的:“孙总看了你那个顾问报告,批了明年续签。另外,你说的那个接口管理平台,我们技术部想先试用。能不能给我个测试账号?”
张宇廷回:“下周一给你开账号。试用三个月,不收钱。用好了帮我写个案例。”
钱松秒回:“没问题。”
王丽敏凑过来看了一眼聊天记录。“第一个客户来了。”
“试用而已,还没掏钱。”
“试用完掏钱,你等着。”
张宇廷把手机放下,打开代码编辑器继续写。周明在旁边敲键盘,孙晓戴着耳机改页面,吴倩对着屏幕跑测试用例。王丽敏坐在门口接电话,声音压得低,但听得出来是客户。
张宇廷写了一会儿代码,抬头看了一眼窗外。对面那栋楼,前公司的招牌在日光底下反着光。
一年前他在那个楼里,年终奖六千,被关系户当众说代码写得烂,离职当天系统崩了。
一年后他在这个楼里,账上趴着近百万,手底下四个人,客户排着队,前公司成了他最大的稳定收入来源。
王丽敏挂了电话走过来。“发什么呆?”
“没发呆。想一个问题。”
“什么问题?”
“明年这个时候,账上能不能过两百万。”
王丽敏把计算器拍在他桌上。“你先把代码写完。账我来算。”
张宇廷笑了一声,低头继续写。键盘声、鼠标声、孙晓跟吴倩讨论页面的声音混在一起,办公室里没停过。
傍晚六点,王丽敏关了电脑站起来。“今天周五,都早点走。下周一开始忙产品,周末好好休息。”
周明关了电脑,吴倩把测试报告存盘,孙晓把设计稿保存。三个人打了招呼走了。
张宇廷还在写。王丽敏靠在门框上等他。“走不走?”
“写完这个函数。”
“你去年在那家公司加班到凌晨,也是这么说的。”
张宇廷敲完最后一行代码,点了保存,合上电脑。“去年加班是给别人干,今天加班是给自己干。”
“有什么不一样?”
“不一样。去年我改完代码,年终奖六千。今天我自己改的代码,明年能卖五千一年。”
王丽敏把灯关掉,两人出门锁门。楼道里灯有点暗,张宇廷走在前面,王丽敏跟在后面。
下了楼,对面那栋楼的灯还亮着几盏。张宇廷看了一眼,转过头往家走。
王丽敏问他:“你恨他们吗?”
张宇廷想了想。“不恨。”
“为什么?”
“要不是他们,我可能还在那个工位上坐着,以为自己只值六千。”
王丽敏没再说话。两人走到路口等红灯。张宇廷的手机响了一声,微信推送。孙总发了一条朋友圈,配图是公司年会照片,底下写着“感谢团队一年付出,明年再创辉煌”。
张宇廷点了个赞,锁屏。
绿灯亮了,两人过了马路。王丽敏说:“明天去趟超市,家里冰箱空了。”
“买什么?”
“买点肉和菜,把周明他们叫家里来吃顿饭。新办公室搬了,还没庆祝过。”
“行。你定。”
两人往小区门口走。张宇廷掏出手机看了一眼公司账户余额,又锁了屏,揣回兜里。
“明年这个时候,”他说,“我要让钱松来跟我们签年度合同,不是我们去前公司驻场。”
“那你得先把产品做出来。”
“已经在做了。”
走到楼下,张宇廷按了电梯,王丽敏站在旁边刷手机。电梯门开,两人进去。
张宇廷按了楼层,电梯往上走。他看着电梯门上的倒影,忽然说了一句:“王丽敏,谢谢你。”
“谢什么?”
“谢谢你当初把那张猎头名片放在餐桌上。”
王丽敏看了他一眼。“那张名片你一直没打。”
“没打是因为当时还没想通。想通了之后发现,自己干比打名片上的电话强。”
电梯到了,门打开。王丽敏先走出去,掏钥匙开门。张宇廷跟在后面,进门换了拖鞋,往沙发上一坐。
茶几上放着一份打印好的文件。他拿起来看了一眼,是王丽敏打印的公司明年业务规划,第一页第一行写着一句话:
“目标:把‘极客接口管家’卖给五十家公司,年费收入二十五万。”
张宇廷翻到第二页。底下还有一行小字,是王丽敏的笔迹:
“张宇廷,你值多少钱,你自己说了算。”
全文完。