第三十七章 :室友林浩
安奕站在校门口的商业街边,午后的阳光将他的影子拉得很长。远处那几个老生已经走远,但他们的对话还在耳边回响。网吧管理混乱,老板头疼,市面上系统昂贵且难用——每一个词都像一块拼图,在他脑海中拼凑出清晰的商机图景。他转身向宿舍楼走去,脚步比来时快了一些。背包里的软盘盒随着步伐轻轻晃动,发出细微的摩擦声。四楼,412房间。门虚掩着,里面传来敲击键盘的急促声响,噼里啪啦,像一场小型的暴风雨。
推门进去。
宿舍里只有李想一个人,正坐在书桌前看书。听到开门声,他抬起头,推了推眼镜:“回来了?”
“嗯。”安奕把背包放在自己床上。
宿舍是标准的四人间,左右各两张床,上面是床铺,下面是书桌和衣柜。安奕的床在靠窗的左侧,李想的床在对面。另外两张床还空着,床板上堆着学校发的被褥和枕头,用塑料膜包着,在阳光下反射着刺眼的光。
“张伟呢?”安奕问。
“和他高中同学去逛校园了。”李想合上书,封面上写着《C语言程序设计》,“说是要熟悉环境。”
安奕点点头,开始整理自己的东西。
他从行李箱里拿出几件衣服,叠好放进衣柜。衣柜是铁皮的,门开合时发出吱呀的响声,里面有一股淡淡的樟脑丸味道。然后是洗漱用品,牙膏、牙刷、毛巾,一一摆放在床下的脸盆里。脸盆是塑料的,红色,边缘有些磨损。
最后是那三张软盘。
他拿起软盘盒,塑料外壳在手里有些凉。盒子里整齐地排列着三张3.5英寸软盘,标签上分别写着“磐石V1.2主程序”“磐石V1.2数据库”“磐石V1.2安装包”。这是他前世花了三个月时间开发、今生又用暑假优化完善的网吧管理系统,也是他计划中在BJ打开市场的第一把钥匙。
他把软盘盒放进书桌抽屉的最里层,用几本书压住。
抽屉是木质的,推拉时有些卡顿,发出沉闷的摩擦声。关上抽屉,他坐在椅子上,目光扫过书桌——桌面是淡黄色的复合板,有些地方已经磨损,露出下面的纤维。桌上放着一盏台灯,灯罩是绿色的,灯绳垂下来,末端系着一个小塑料球。
窗外传来篮球场上的呼喊声,还有球撞击地面的砰砰声。阳光透过玻璃窗照进来,在地板上投下一块明亮的光斑,光斑里有细小的灰尘在飞舞。
安奕闭上眼睛。
脑海里开始规划——明天先去HD区转转,找几家网吧实地看看。要了解他们的管理痛点,要评估他们能接受的价格,要设计一套适合BJ市场的销售策略。还有,要找一个试点客户,最好是新开的、老板有魄力的……
正想着,门被猛地推开了。
砰的一声,门板撞在墙上,发出巨大的响声。
安奕睁开眼睛。
门口站着一个男生,个子不高,大概一米七左右,瘦得像根竹竿。他戴着一副厚厚的黑框眼镜,镜片厚得让人怀疑他能不能看清路。头发乱糟糟的,像被风吹过的鸟窝,有几缕还翘着。他穿着一件洗得发白的蓝色T恤,胸前印着一个模糊的卡通图案,下身是条灰色的运动裤,裤脚有些短,露出脚踝。
最引人注目的是他怀里抱着的东西——一台老旧的台式机主机。
主机是米白色的,机箱侧面有几道划痕,光驱面板已经松动,随着他的动作微微晃动。机箱上贴着几张褪色的贴纸,一张是Windows 98的logo,一张是某个游戏角色的头像,还有一张写着“程序员改变世界”的字样,字迹已经模糊。
男生抱着主机,气喘吁吁,额头上全是汗珠。汗水顺着脸颊流下来,滴在眼镜片上,形成细小的水渍。他站在门口,胸口剧烈起伏,呼吸声粗重得像拉风箱。
“呼……呼……累死我了……”
他喘着气,目光在宿舍里扫了一圈,最后落在安奕身上。
“你……你好,我是林浩。”他说话有些结巴,可能是累的,“计算机系的,住这个宿舍。”
安奕站起来:“你好,安奕。”
“李想。”对面的李想也打了个招呼。
林浩点点头,抱着主机走进来。他的脚步有些踉跄,主机显然不轻。走到靠窗右侧的空床前,他弯下腰,小心翼翼地把主机放在地上。
咚。
主机落地时发出一声闷响。
林浩直起身,擦了擦额头上的汗,长长地舒了口气。然后他开始打量宿舍,目光从床铺扫到书桌,从窗户扫到天花板,最后又落回安奕身上。
“你们……都是计算机系的?”他问。
“对。”安奕说。
“太好了。”林浩脸上露出笑容,那笑容很真诚,但配上他乱糟糟的头发和厚厚的眼镜,显得有些滑稽,“我还怕室友是其他系的,聊不到一块去。”
他走到自己的书桌前,从背包里拿出一个键盘和一个鼠标。键盘是机械的,按键很大,上面印着英文字母,有几个键帽已经磨损得看不清字了。鼠标是老式的滚球鼠标,线很长,绕成一团。
接着是显示器。
他又从门外拖进来一个笨重的CRT显示器,屏幕是球面的,边框很厚,后面拖着一条粗粗的电源线和一条VGA线。显示器放在书桌上时,桌面都震了一下。
“你……你就带这些来学校?”李想有些惊讶地问。
“对啊。”林浩一边接电源线一边说,“电脑就是我的命,不带怎么行?”
他蹲在地上,把主机电源线插到墙上的插座里,又把显示器的线接上。插头插进插座时发出啪的一声轻响,插座面板上那个红色的指示灯亮了起来。
然后他按下主机电源键。
嗡——
主机风扇开始转动,发出低沉的轰鸣声。机箱前面板上的绿色电源灯亮了,硬盘指示灯开始闪烁,发出有节奏的哒哒声。显示器屏幕亮起,先是黑屏,然后出现一行白色的英文字母,是BIOS自检信息。
林浩坐在椅子上,身体前倾,眼睛紧紧盯着屏幕。
屏幕的光映在他脸上,让他的眼镜片反射出蓝白色的光。他的表情很专注,嘴唇微微抿着,手指放在键盘上,随时准备敲击。
自检通过,进入Windows 98启动画面。
蓝天白云的logo出现,进度条开始缓慢移动。林浩盯着进度条,手指在桌面上轻轻敲击,显得有些焦急。
终于,系统启动完成。
桌面是默认的蓝天草原背景,图标很少,只有“我的电脑”“回收站”等几个系统图标。林浩移动鼠标,双击打开一个文件夹。
文件夹里全是程序文件。
文件名都是英文和数字的组合,像“sort_algorithm_v3.c”“data_struct_test.cpp”“optimization_proj_final.exe”之类的。密密麻麻,至少有几十个。
林浩点开其中一个文件。
屏幕上弹出一个黑色的命令行窗口,里面开始滚动输出数据。数据是数字和字母的组合,滚动得很快,看得人眼花缭乱。
“这是什么?”李好奇地凑过来问。
“一个排序算法的测试程序。”林浩头也不回地说,“我在优化它的效率,但遇到瓶颈了。”
他敲了几下键盘,程序停止运行。窗口底部显示出一行结果:
“执行时间:3.28秒,数据量:100000条”
“三秒多?”李想有些惊讶,“这已经很快了吧?”
“不够。”林浩摇摇头,眼镜片后面的眼睛里闪过一丝焦躁,“理论上可以优化到两秒以内,但我试了好几种方法,都卡在二点八秒左右。”
他又打开源代码文件。
屏幕上瞬间被密密麻麻的代码填满。绿色的注释,黑色的关键字,蓝色的变量名,红色的字符串……各种颜色交织在一起,像一幅抽象画。代码行数很多,滚动条缩得很小,显然这个程序规模不小。
林浩开始一行行地看代码。
他的眼睛离屏幕很近,鼻尖几乎要碰到显示器。手指在键盘上无意识地敲击着,发出轻微的嗒嗒声。宿舍里很安静,只有主机风扇的嗡嗡声和键盘的敲击声。
安奕站在旁边,目光扫过屏幕上的代码。
只看了几秒钟,他就看出了问题。
那是一个经典的快速排序算法的变种,但林浩在实现时加入了一些不必要的边界检查,还用了多层嵌套的条件判断。这些操作在数据量小的时候影响不大,但当数据量达到十万级别时,每一次多余的判断都会累积成显著的时间开销。
更关键的是,林浩在内存分配上用了动态数组,但释放内存的时机不对,导致有内存碎片产生。虽然不影响功能,但在频繁调用的排序算法中,内存碎片会严重影响缓存命中率,从而拖慢速度。
还有循环展开的问题。
林浩只做了简单的循环展开,但展开的粒度不对,反而增加了分支预测失败的概率。
安奕看着那些代码,脑海里瞬间浮现出前世自己优化类似算法时的经验。那是他在一家互联网公司做后台开发时积累的,当时为了把某个核心服务的响应时间从五十毫秒优化到二十毫秒,他花了整整一个月研究各种优化技巧。
那些经验,现在成了他的本能。
“第47行。”安奕突然开口。
林浩愣了一下,转过头:“什么?”
“第47行,那个边界检查可以去掉。”安奕平静地说,“你的数据已经预处理过,不会越界,那个检查是多余的。”
林浩眨了眨眼睛,显然没反应过来。
他看了看屏幕,又看了看安奕,表情有些困惑:“你怎么知道……”
“还有第89行到第92行。”安奕继续说,“那四行条件判断可以合并成一个三元运算符,减少分支。”
林浩的手指停在键盘上。
他盯着安奕看了几秒,然后转回头,找到第47行代码。那是一行if语句,检查数组索引是否超出范围。
“这个……真的可以去掉?”他小声嘀咕。
“试试看。”安奕说。
林浩犹豫了一下,然后删掉了那行代码。接着找到第89行,那是一个if-else结构,他按照安奕说的,改成了三元运算符。
改完后,他保存文件,重新编译。
编译器运行,命令行窗口里滚动过一行行编译信息。最后显示“编译成功,0错误,0警告”。
林浩运行程序。
黑色的窗口再次弹出,数据开始滚动。这一次,滚动速度似乎快了一些。
结果输出:
“执行时间:2.91秒,数据量:100000条”
“降了零点三秒!”李想惊呼。
林浩盯着那个数字,眼镜片后面的眼睛睁大了。他张了张嘴,想说什么,但没说出来。手指在鼠标上握紧,指节有些发白。
“还不够。”安奕又说。
林浩猛地转过头:“还有什么问题?”
“内存分配。”安奕走到他身边,指了指屏幕上的某段代码,“你用malloc动态分配临时数组,但每次排序都分配释放,会产生内存碎片。改成静态数组,或者用内存池。”
“可是数据量不固定……”
“预分配一个足够大的缓冲区,重复使用。”安奕说,“你的测试数据最大就是十万条,那就按十万条分配。”
林浩愣住了。
他盯着那段代码看了很久,然后开始修改。手指在键盘上敲击的速度很快,噼里啪啦,像雨点打在窗户上。改完后,他又看向安奕,眼神里多了些东西——不再是困惑,而是期待。
“还有吗?”
“循环展开。”安奕说,“你现在的展开粒度是4,改成8试试。但要注意对齐问题,不对齐的话缓存性能反而会下降。”
林浩又开始修改。
这一次他花了更长时间,因为要调整循环体内的操作顺序,还要考虑内存对齐。安奕站在旁边,偶尔指点一两句。
“这里,把这两个变量声明成register。”
“那个函数调用可以内联。”
“这段代码的局部性不好,调整一下访问顺序。”
林浩一一照做。
他的额头上又冒出了汗珠,但这次不是因为累,而是因为兴奋。眼镜片上起了雾,他摘下来用衣角擦了擦,又赶紧戴上,生怕错过屏幕上的任何一个细节。
终于,修改完成。
他深吸一口气,按下编译键。
编译器再次运行。这一次编译时间更长,因为加入了内联和优化选项。等待的几十秒里,林浩坐立不安,手指在桌面上敲击的节奏越来越快。
编译成功。
运行。
黑色窗口弹出,数据开始滚动。这一次,滚动的速度快得让人看不清具体内容,只能看到一片模糊的字符流。
然后,结果出来了。
“执行时间:1.87秒,数据量:100000条”
宿舍里一片寂静。
主机风扇的嗡嗡声显得格外清晰。窗外篮球场上的呼喊声飘进来,但仿佛隔着一层玻璃,变得遥远而不真实。
林浩盯着那个数字,一动不动。
他的嘴唇微微张开,呼吸变得很轻。眼镜片后面的眼睛睁得很大,瞳孔里倒映着屏幕上的蓝光。手指还放在鼠标上,但已经停止了动作。
一秒。
两秒。
三秒。
突然,他猛地站起来,椅子腿在地板上刮出刺耳的响声。
“一点八七秒!”他的声音因为激动而有些颤抖,“真的降到两秒以内了!”
他转过身,看向安奕。
眼神变了。
之前的困惑、怀疑、好奇,全部消失了。取而代之的是一种近乎狂热的崇拜,那种只有技术极客看到真正高手时才会露出的眼神。
“你……你怎么做到的?”林浩的声音还在抖,“那些优化思路,我查了好多资料都没想到……你只看了一眼代码,就看出了所有问题?”
安奕平静地说:“经验而已。”
“经验?”林浩摇头,“这不是经验的问题。那些优化技巧,有些我连听都没听过。内存池、循环展开粒度、缓存局部性……这些概念我们专业课都还没讲!”
他向前走了一步,距离安奕很近。
安奕能闻到他身上的味道——汗味,还有一股淡淡的电子产品特有的塑料味。能看到他眼镜片上残留的指纹,能看到他因为激动而微微发红的脸颊。
“哥们儿,你太神了。”林浩说,每个字都咬得很重,“你绝对不是普通的高中毕业生。你是不是……早就自己搞过项目?做过实际开发?”
安奕没有回答。
林浩却更激动了。他抓住安奕的胳膊,手指很用力,隔着衣服都能感觉到那份力道。
“能不能带我看看?”他的眼睛在发光,“你做的项目,你写的代码……我想看看!真的,我特别想看看!”
安奕看着这个前世未曾深交但知其才华的技术天才。
前世,林浩后来去了美国硅谷,在一家顶尖的科技公司做到了首席架构师。他的技术博客在业内很有名,写的开源项目被无数开发者使用。安奕曾读过他的文章,曾用过他写的库,但从未想过,有一天会以这种方式与他相遇。
而现在,这个未来的技术大牛,正用崇拜的眼神看着自己,抓着自己的胳膊,请求看自己的代码。
安奕心中一动。
机会。
组建技术团队的机会。
“磐石”系统需要维护,需要升级,需要根据BJ市场做定制化开发。他一个人可以做,但会很累,而且会占用大量时间。如果有林浩这样的技术天才加入……
但需要测试。
需要看看林浩的真实水平,需要评估他是否值得信任,需要知道他除了技术之外,还有什么样的性格和价值观。
安奕沉吟了几秒。
然后,他开口了。
“我确实做过一个项目。”他说,声音很平静,“一个网吧管理系统。”
林浩的眼睛更亮了:“网吧管理系统?具体是做什么的?”
“收银、计费、会员管理、机器监控、库存管理……基本上覆盖了网吧运营的所有环节。”安奕说,“我用C++写的,数据库用的Access,网络通信用的TCP/IP套接字。”
“你一个人写的?”
“嗯。”
“写了多久?”
“三个月。”安奕说,“暑假写的。”
林浩倒吸一口凉气。
他的手指松开了安奕的胳膊,但眼睛还盯着安奕,像在看什么不可思议的生物。
“三个月……一个人……写完一个完整的商业系统……”他喃喃自语,“这效率……这架构能力……”
突然,他又抓住安奕的胳膊。
“代码呢?”他急切地问,“代码带来了吗?能不能给我看看?就一眼!我保证不泄露!”
安奕看着他。
宿舍里很安静。李想坐在对面,也好奇地看着这边。窗外的阳光斜射进来,在地板上投下长长的光影。主机风扇还在嗡嗡作响,硬盘指示灯有规律地闪烁。
几秒钟后,安奕做出了决定。
他走到自己的书桌前,拉开抽屉。木质的抽屉发出沉闷的摩擦声。他拿出那几本书,露出下面的软盘盒。
塑料外壳在阳光下反射着淡淡的光。
他拿起盒子,转过身,递给林浩。
“这是源代码。”安奕说,“还有可执行文件和安装包。你可以看看。”
林浩接过软盘盒,手有些抖。
他打开盒子,看到里面三张整齐排列的软盘。标签上的字迹很工整,“磐石V1.2”几个字在光线下清晰可见。
他抬起头,看向安奕。
眼神很复杂——有激动,有感激,有崇拜,还有一种技术人看到优秀作品时特有的渴望。
“谢谢。”他说,声音很轻,但很认真,“我一定会好好看的。”
安奕点点头。
然后,他补充了一句。
“不过,记住保密。”
林浩愣了一下,然后重重地点头:“我明白。这是商业项目,代码是核心资产。我绝对不会泄露,也不会复制,就看一看学习一下。”
他的表情很郑重,像在做一个庄严的承诺。
安奕看着他,心里有了初步的判断。
技术天才,有热情,懂规矩。
也许,真的是个不错的合作伙伴。
窗外,夕阳开始西沉。天空被染成橙红色,云朵像燃烧的火焰。篮球场上的呼喊声渐渐稀疏,取而代之的是远处食堂传来的喧闹声。
宿舍里,林浩已经坐回自己的位置,小心翼翼地把一张软盘插入驱动器。驱动器发出咔哒的响声,然后是读盘的吱吱声。
屏幕亮起,文件目录展开。
“磐石”系统的源代码,第一次展现在这个未来的技术大牛面前。
而安奕站在窗边,看着窗外逐渐暗下来的天空,嘴角微微上扬。
第一步,已经迈出去了。
