正午十一点三十分,驻厂办公楼的走廊准时响起此起彼伏的键盘归位声。
“轮到我们这批去吃饭了,走大家拿上饭盒吃饭去” 宋哥站在白板前敲了敲手中的不锈钢饭盒,白板上用红笔标注着分批次就餐时间 。
食堂位于办公楼后侧的红砖建筑,推开门时蒸腾的热气裹挟着红烧肉的香气扑面而来。十二排长条桌被金属隔板分成规整的就餐区,十张原木色餐桌铺着蓝白格桌布,每张桌中央立着写有编号的铜牌。李君浩注意到靠墙处的消毒柜正发出嗡鸣,墙上贴着 “光盘行动” 标语,角落的绿萝垂着蔫头耷在灭火器上。
李君浩所在的 7 号桌很快坐满了人,大家把自带的碗筷整齐摆放在桌角。阮星超伸长脖子张望着:“怎么还不开饭啊,我都快饿扁了!” 话音刚落,就见食堂张阿姨系着碎花围裙,和另一位师傅推着餐车走了过来。餐车上码放着五个硕大的不锈钢碗,盖子掀开的瞬间,土豆烧鸡块的香气、酸辣土豆丝的酸香、蒜蓉油麦菜的清香,还有冬瓜丸子汤的鲜香顿时弥漫开来。
“大家久等啦!” 张阿姨笑着将四菜一汤依次摆上餐桌,“这是土豆烧鸡块、酸辣土豆丝、蒜蓉油麦菜和冬瓜丸子汤,不够吃随时叫我!” 她又从推车上拿下三个装有公筷的消毒盒,“每桌配了三双公筷,大家用公筷夹菜啊,讲究卫生!”
吴经理此时也走了过来,在主位上坐下,顺手把西装外套搭在椅背上:“听说今天有新菜,我也来凑凑热闹。” 他拿起公筷,先给林夕若夹了块鸡块,“小姑娘多吃点肉,看你瘦的。”
林夕若连忙道谢,耳尖泛红:“谢谢吴总!”
“都别客气,放开了吃!” 吴经理一边说,一边给大家盛汤,“这次 pcb 计价平台项目时间紧、任务重,大家辛苦了!吃饱了才有力气干活!”
阮星超早就迫不及待,用公筷夹了个大丸子放进碗里:“哇,这丸子看着就好吃!阿姨,明天还有什么好菜啊?”
“就你小子馋!” 张阿姨笑着点了点他的额头,“明天有啤酒鸭,管够!”
李君浩尝了口土豆烧鸡块,肉质鲜嫩,汤汁浓郁,忍不住赞叹:“阿姨,这菜烧得太好吃了!”
“好吃就多吃点!” 张阿姨笑得眼睛眯成了一条缝,“你们这些孩子,大老远来驻厂开发,可不能亏待了自己。有什么想吃的尽管说,阿姨给你们做!”
宋哥咽下嘴里的饭菜,擦了擦嘴:“吴总,关于项目和工厂对接的事,您看什么时候方便?”
吴经理放下筷子,认真说道:“下午我就带你们去车间,让老师傅给你们详细讲讲 pcb 的工艺流程。还有那个 bom 成本核算模块,得结合实际生产来优化。” 他转头看向褚砚兵,“小褚,听说你技术很扎实?有什么想法尽管提,咱们一起把项目做好!”
驻厂办公室的白炽灯在头顶嗡嗡作响,李君浩擦了擦手心的汗,将投影仪遥控器握得发烫。十二张折叠椅围成半圈,阮星超抱着笔记本电脑瘫在角落,褚砚兵的笔记本已经密密麻麻写满两页,宋哥翘着二郎腿,手里的红塔山在烟灰缸边缘轻轻叩击。
“大家看这个解决方案。” 李君浩按下遥控器,大屏幕跳出分层架构图,不同颜色的类库像精密齿轮咬合在一起,“咱们先从最核心的 domain 层开始。” 他用激光笔点向标注着 dto 和 Entity 的模块,“Entity 是实体类,就像 pcb 订单,每个字段对应数据库表结构;dto 是数据传输对象,比如用户在前台提交的计价参数,经过 dto 封装后再传递给后端,这样能避免直接暴露敏感数据。”
“等等!” 林夕若举起涂着紫色美甲的手,“那 Entity 和 dto 为什么不合并?多写一层好麻烦。”
李君浩点开示例代码,光标在屏幕上快速跳动:“举个例子,用户注册时填的手机号需要脱敏处理,但数据库存的是明文。用 dto 就能在接收数据时直接处理,而 Entity 保持纯净,只负责和数据库交互。这就像快递包装,dto 是外面的纸箱,Entity 是里面的易碎品。”
阮星超突然笑出声:“那 dao 层就是快递小哥?”
“差不多。” 李君浩被逗乐,切换到 dao 类库界面,“data Access object 专门负责数据库操作,增删改查都封装在这里。比如查询订单列表,业务层只需要调用 dao 的 GetorderList 方法,不用关心具体的 SqL 语句怎么写。” 他调出一段 EF 代码,“这里用了 EF 的仓储模式,以后换数据库都不用大改代码。”
宋哥掐灭香烟,往前坐了坐:“业务层的业务逻辑怎么划分?”
“看这个计价算法模块。” 李君浩放大代码窗口,注释用红色高亮标出,“用户提交板材尺寸、层数这些参数后,bussiness 层先验证数据合法性,再调用 dao 获取工艺参数,最后用计算公式生成报价。每个功能都拆分成独立方法,比如 calculateprice、Validateparameters,方便测试和维护。”
沈杰突然开口,手指在数位板上快速滑动:“那 mVc 控制器就是连接前后端的枢纽?”
“完全正确!” 李君浩切换到 controllers 文件夹,“前端发送的 http 请求都会经过控制器。比如处理用户登录,Logincontroller 接收请求,调用业务层的验证方法,再把结果封装成 Json 返回给前台。这里用了依赖注入,解耦了控制器和具体业务类。”
褚砚兵突然举手,声音有些发闷:“通用类库 层的工具类,像日志记录、加密算法,为什么不直接放在其他层?”
“这就是分层架构的精髓。” 李君浩调出通用类库层的目录树,“公共类库是独立的‘瑞士军刀’,哪个层需要就引用。比如日志记录,dao 层增删数据要记日志,bussiness 层处理异常也要记,统一放在 m 层避免重复开发。” 他点开加密类的代码,“这里的 AES 加密算法,前台传输敏感数据时用,后台保存密码时也用。”
会议室突然陷入沉默,只有空调外机的轰鸣声。李君浩翻到最后一页 ppt,上面用加粗字体写着 “高内聚,低耦合”:“大家别被这么多层吓到,其实就像搭积木,每个模块只做一件事。有问题随时问,这三天我会带着大家把代码撸熟。”
“小李可以啊!” 宋哥笑着鼓掌,烟头在烟灰缸里碾出火星,“讲得挺好。明天开始,按这个架构分模块开发,遇到卡点随时叫我。”
刚吃完晚晚饭, 发现林夕若还趴在电脑前,\"你的饭,带过来了 ,快吃吧,解决了没\",李君浩把帮林夕若带的饭递过去!
“又卡住了?” 李君浩把新冲的美式放在她桌上,瞥见屏幕上密密麻麻的原生 JavaScript 代码,“还在用 var 声明变量?”
林夕若苦着脸转椅,马尾辫扫过设计稿:“救命!我按 bootstrap 模板写的登录页,点击按钮没反应。用 console.log 查了半天,就是找不到问题!” 她把显示器转过来,滚动条划过数百行未封装的函数。
李君浩拖过椅子坐下,随手打开 VS code:“你看,这里的点击事件直接写在 htmL 里,耦合度太高了。试试 ES6 的模块化封装。” 他快速新建一个login.js文件,“把所有交互逻辑抽出来,像这样 ——”
手指在键盘飞舞,屏幕跳出箭头函数:“用const loginbutton = document.getElementbyId('login-btn');获取 dom 元素,再绑定事件。注意,ES6 里let和const声明的变量才有块级作用域,你之前用var,肯定会出变量提升的问题。”
林夕若托着下巴凑近屏幕:“可是这样写,htmL 怎么引用啊?”
“这就用到 ES6 的模块化了。” 李君浩在index.html里添加<script type=\"module\">标签,“在 script 标签里引入login.js,记得加上type='module'。模块之间可以用export和import传值,比如 ——” 他新建一个utils.js,导出加密函数,“你想在登录页用 md5 加密密码,直接import { md5 } from '.\/utils.js';就行。”
“哇!好简洁!” 林夕若眼睛发亮,突然又垮下脸,“可是 ES6 语法好多新东西,箭头函数、promise、async\/await... 我看得头都大了。”
李君浩点开官方文档:“别着急,咱们先从箭头函数学起。比如这个验证手机号的函数 ——” 他把原来的function validatephone(phone) {... }改写成const validatephone = (phone) => \/^1[3-9]\\d{9}$\/.test(phone);,“箭头函数不仅代码量少,而且this指向更明确。”
林夕若突然拍手:“我懂了!就像把一大段话浓缩成关键词!那 promise 呢?上次调用接口,回调函数嵌套得我快晕了。”
“promise 就是用来解决回调地狱的。” 李君浩模拟 ApI 调用,“以前你得这样写 ——” 他敲出多层嵌套的代码,“现在用 promise 链式调用。” 屏幕上出现.then(result => {... }).catch(error => {... }),“成功和失败的处理分开,代码是不是清爽多了?”
窗外突然传来闷雷,林夕若的手机在桌上震动,是宠物医院发来的猫咪体检提醒。她盯着屏幕上撒娇的布偶猫照片,声音突然低落:“君浩,你说... 写代码和画画是不是一样?都要把零散的东西拼成完整的作品?”
李君浩望着她电脑里未完成的登录页设计图,想起林语雪朋友圈里孩子们的画作:“大概吧。不过代码更像精密仪器,每个零件都得严丝合缝。” 他把咖啡推过去,“先把这个登录页用新写法重构一遍,遇到问题随时叫我。”
当第一滴雨点砸在玻璃窗上时,林夕若的屏幕终于跳出绿色的成功提示。她兴奋地晃着李君浩的胳膊:“成功了!用 ES6 写的登录验证,比原来快了三行代码!” 而李君浩看着她重新封装的模块,忽然觉得这些冰冷的代码,也能像画笔一样,勾勒出理想的模样。
忙到很晚,宋哥说今天先忙到这,大家一起回宿舍,李君浩、阮星超、褚砚兵和陆骁四人踩着路灯昏黄的光影,拖着疲惫的身躯往宿舍走去。一公里的路程在加班后的此刻显得格外漫长,直到宿舍楼熟悉的轮廓出现在眼前,带着些许烟火气的归属感才慢慢涌上来。
推开 302 寝室的门,闷热的空气裹挟着洗衣液和汗味扑面而来。阮星超第一个冲进去,把工牌随手一甩,瘫倒在床上:“可算回来了,今天调接口调得我眼睛都快瞎了!” 他扯松领带,转头看向正在铺凉席的李君浩,“浩子,你说咱天天闷头写代码,啥时候才能看看厂里的妹子啊?”
褚砚兵原本正低头整理洗漱用品,听到这话手微微顿了顿,耳朵悄悄红了起来。陆骁从柜子里翻出泡面,嗤笑一声:“你小子,就惦记着这事呢?我今天路过电子装配车间,倒是瞥见几个穿工服的姑娘,不过都忙得很,哪有空搭理咱们。”
阮星超像弹簧似的从床上弹起来,眼睛放光:“真的?快说说,长得咋样?有没有咱研发部林夕若那么漂亮?” 他边说边用手比划着,脸上满是期待。
“比林夕若文静些,” 陆骁撕开泡面包装,往里面倒调料包,热气瞬间升腾起来,“有个扎马尾的,眼睛特别亮,我路过的时候,她正蹲在流水线旁调试设备,认真的样子还挺好看。”
褚砚兵突然开口,声音小得像蚊子哼哼:“是不是... 左眼角有颗泪痣?” 话一出口,整个寝室突然安静下来,三道目光齐刷刷地射向他。
阮星超一下子扑到褚砚兵床边,坏笑着问道:“老褚!老实交代,你是不是早就盯上人家了?” 他挤眉弄眼的模样,逗得李君浩也放下手中的毛巾,饶有兴趣地看过来。
褚砚兵的脸涨得通红,结结巴巴地解释:“我... 我就是上次去送资料的时候见过一次,随便问问。” 可他躲闪的眼神,反而让阮星超更加确信自己的猜测。
“行啊你褚砚兵,平时看着闷声不响的,原来早有目标了!” 阮星超拍着大腿,笑得前仰后合,“快说说,还有什么情报?知道人家叫什么不?有没有男朋友?”
陆骁也凑过来,脸上挂着促狭的笑:“说不定咱老褚早就偷偷打听过了,对吧?”
在两人的追问下,褚砚兵的耳朵红得几乎要滴血,支吾了半天才说:“我... 我就知道她好像是质检部的,姓陈。其他的... 真不知道了。”
李君浩看着褚砚兵窘迫的样子,笑着打圆场:“好了好了,别逗老褚了。不过说真的,咱们封闭式开发这段时间,确实都没怎么接触外面的人。等项目结束,说不定有机会认识认识。”
阮星超撇了撇嘴:“等项目结束,黄花菜都凉了!要不明天中午吃饭的时候,咱去电子装配车间那边碰碰运气?” 他眼睛滴溜溜一转,“就说去学习生产流程,顺便... 咳咳,拓展拓展社交圈。”
“得了吧你,” 陆骁白了他一眼,“宋哥要是知道我们打着学习的旗号去看妹子,非扒了咱们的皮不可。” 他端起泡好的泡面,吸溜了一大口,“不过话说回来,咱研发部全是糙汉子,偶尔看看漂亮妹子,养眼也好。”
寝室里爆发出一阵哄笑, 。