软件工匠熊节初当程序员的故事
本文关键词:不敢止步:一个软件工匠的12年,由笔耕文化传播整理发布。
编者按:还记得你是怎么走上程序员这条路的吗?还记得大学毕业后你的第一份职业吗?还记得你当初带着满腔热血如何开始编织你的人生吗?还记得你工作后的第一份薪水吗?希望小编能有幸听你们讲你们的故事。本文写的是2000年那个时代还是在读生熊节初当程序员的故事,希望作者的经历也能带你找回当年的回忆。
接到那个电话,是在2000年的国庆长假中。对于刚上大三的我来说,那本来只是一个普通的长假:宅在宿舍里看电视、玩游戏,或是去楼下篮球场打打球。可是那个电话改变了我的假期计划,乃至我的人生。
“喂?是熊节吗?”电话那头,一个中年男声问道。
“我是。你哪位?”
“你会C语言编程是不是?”中年男人很突兀地问。
“呃……”我脑子里飞快地转了几圈。看来是在网上发的那篇求职帖起作用了,嗯,一定是这样。于是我提起自信答道:“是,我用C语言做过好多东西。”
“那就好,那就好。”中年男人说道,“你7号下午到宣武门这边来一趟,面试,好不好?”
“好!”跟我说完时间、地点、联系电话,中年男人就挂了电话。
上大学以后,我一直在想办法打工挣钱,即使不能自给自足,至少可以补贴生活。前两年里,我发过传单、在中关村调查过硬件价格、帮人攒过电脑,甚至还试过跑到天成批发市场买一堆毛绒玩具,然后在女生宿舍楼门口叫卖。但对于酷爱编程的我来说,这些打工的方式终归都是小打小闹,我一直渴望找到一份编程的工作。所以那年暑假结束回到北京,我就在几个程序员招聘求职的论坛里发了一个简单的求职帖,留下宿舍的电话号码。手机,在那个年代还是一件奢侈品。
同样是奢侈品的还有自学编程的资源。那时候,Google、百度都还不存在,不论是想找一点自学材料,还是想找几个志同道合的朋友,都远不像今天这么容易。不过我运气挺好:大一的时候玩MUD,认识了比我高两级的师兄江焱风—这当然是游戏里的名字。江焱风是我们学校MUD的天神,我就拜在他门下做了个巫师,一开始帮着维护玩家秩序,然后也帮着写写游戏场景、写写NPC什么的。江焱风看我挺喜欢编程的,就塞给我一堆LPC(用来开发MUD的编程语言)教程,然后让我开发《笑傲江湖》里的一个新门派:衡山派。所以呢,我确实用C语言做过好多东西,最多的就是衡山派的场景、武功、道具、NPC……当然我不会随便跟别人说的。
10月7号的下午,我先坐一趟公交再换一趟地铁到宣武门,又花了一点工夫找到叫“英嘉花园”的小区。打了一个电话,中年男人告诉我一个门牌号。
敲开门,就见了他本人:四十来岁,一米八左右身高,肩挺宽,但不胖,一身深色西装,短头发梳得整整齐齐,样子看着有几分儒雅,脸上挂着和善的笑容。
“你是熊节吧?”谈吐透着一点北京口音,“来来来,进来坐。”
这是一间普通的住宅,客厅里没几样家具,沙发上已经坐了一位,大高个儿,白白胖胖的,脸上冒着几颗粉刺,一条宽松的牛仔裤上还破了几个洞,一看就觉得像北京孩子。一开口,果然是标准的京片儿。
“你好,我叫杨刚,广播学院的。”
中年男人给我倒了杯水,也自我介绍。原来他姓汪,叫汪元。他这家公司叫“北京洛普电子有限公司”,专做各种LED显示屏。如果你2000年前后去过首都机场或是西客站,你就一定看见过洛普的产品:那些滚动显示航班、车次的大屏幕,那些指引和提示旅客的滚动字幕。这时候洛普正打算升级换代一个拳头产品:证券营业厅的行情显示大屏。要做这么一个屏,就得有硬件、软件两大块。我和杨刚就是这么一个分工:杨刚做电路和单片机,我做控制程序。汪总第一次见面就把我俩叫到一块儿,他说是为了让我俩先互相认识,方便以后配合。
说是面试,其实根本没测试我会做什么,只是大致聊了一阵对这个产品的构想。汪总似乎对我俩也挺满意,于是就谈具体工作:每个礼拜来宣武门公司办公室上两个半天的班,主要目的是大家经常碰头沟通;月薪800块。说实话,我不知道月薪800块到底算不算合适,偷瞄了杨刚一眼,看他表情还挺平淡的,也没有不满意的样子。人家研究生都能接受,我一小本科肯定也能接受嘛,于是就这么定下来。
第二次去英嘉花园,汪总叫我去了另一个门牌号,说是洛普的办公室。原来上次去的那间住宅是汪总自己的房子。照着这个新的门牌号,我找到一间地下室。房门虚掩着,我推门进去,汪总一眼看见我,高兴地打着招呼:“快来快来,就等你一个呢。”
地下室里布置成一个办公室的格局,一张大沙发,三张办公桌。这会儿屋里坐着好些个人,汪总挨个给我介绍:姜哲,跑市场的;周怡,财务;李帅,工程师;杨刚,上次已经见过了;还有一位是陈老师,某高校计算机系的老师。
“咱们这个大屏,原来的控制程序就是陈老师做的。小熊你要好好跟陈老师请教,把技术学到手啊。”
陈老师是个四十多岁的中年女性,外表没什么特别,看着就是很朴实的人民教师的样子。她说本来和汪总合作也挺愉快,可是最近要评职称,抽不出工夫做新版本。讲起技术,她倒是毫不藏私,看起来也是希望我尽快接手过去。很快,我就对接下来要做什么有了个大概的了解。
做一个证券行情显示屏,主要有三部分工作。首先是硬件,16×16的LED点阵就可以显示一个汉字,4块点阵拼起来就可以显示4个字的股票名称,后面再跟上一串LED数码管,就可以显示这支股票的昨日收盘价、今日开盘价、当前成交价、当日最高价、当日最低价、成交量等信息,这就构成了大屏上的“一行”。然后是硬件控制,就是用一片8051单片机控制一行里的汉字点阵和数码管,让它正确显示信息。最后就是上位机控制程序,需要分析从卫星接收来的行情数据,然后把数据重组成适合显示的格式,分发给每一行的单片机。
在这三部分里面,硬件方案已经比较清楚,主要是汪总亲自在设计,杨刚提了一些单片机接口的建议。剩下两块,杨刚负责单片机编程,上位机控制程序则由我来负责。
听完陈老师讲解老版本的控制程序,第二天又收到她发来的源代码,我兴奋地打开Turbo C 2.0开始编程。虽说从没做过什么正经的软件,有哪些事需要做,我还是能想清楚的。这个上位机控制程序需要做三件事。第一,分析行情数据库。分析一个dBase格式的数据库文件—准确说是两个数据库文件,沪市和深市各一个,交易厅会安装卫星天线自动接收上交所和深交所传来的更新文件,我只管读取这两个文件就行了。第二,把处理好的数据按照和杨刚定好的协议格式通过串口线传给单片机。第三,做一个界面,让用户操作这个控制程序。
在这三件事里,最让我感兴趣的是界面。用Turbo C做一个在命令行里显示的菜单界面,用户可以用方向键上下选择菜单,这让我觉得非常酷—比以前做过的那些黑底白字符的程序酷多了。所以我立马就把dBase、串口什么的都扔在脑后,开开心心地做界面。这个决定后来给我带来不少麻烦,不过也让我从中学到了很多,这是后话,暂且不表。
很酷的界面做出一个雏形,我就想:得显示点真实的数据,看着才有范儿呢。于是我又开始做dBase数据库的解析。读者可能有点儿困惑:为什么数据库需要“解析”呢?别忘了,我们在讲2000年的事,那时可不像现在,各种数据库驱动一应俱全,打开Google就能找到。我花了半天工夫在网上搜索,硬是没找到一个C语言的dBase驱动库,只找到一篇描述dBase数据库文件格式的文章。好在这个文件格式够简单,无非就是把数据一行接一行地写在一个二进制文件里。老话说得好,靠猫靠狗不如自己动手,我就自己动手写了一段程序来解析dBase数据库文件、读取行情库里的数据。
程序一天天生长成型,可我一直在有意无意地回避一个重要的技术点:串口通信。因为我就只有一台电脑,连测试串口的办法都没有,这部分程序我写出来都没法知道写得对不对。汪总听我描述开发的进展也挺开心,并不催促我,倒是给我派了个新的任务:跟姜哲一起出差。
洛普这家公司虽小,产品卖得还挺好,单说证券信息大屏这个产品,华北各省各地也有好几十家营业厅用着洛普的屏。2000年,互联网还不普及,大户们要么自己家里装了网络,要么可以去大户室,散户、尤其是广大提着菜篮子炒股的中老年散户就得靠证券营业厅的大屏和交易终端来实现自己的财富梦想。所以证监会有要求,营业厅要开业,不能只开大户室,必须得有个“厅”,大厅里得有行情大屏。所以华北地区只要有新营业厅筹备,洛普就有机会。一般营业厅至少装两块屏,比较宽敞的装三块甚至四块,按一块屏50万的报价,洛普的生意是蛮好做的。而且那年业内一直在风传创业板开市在即,新营业厅想要能支持创业板的屏,老营业厅也有可能趁这个时机换一套新的屏,所以这段时间洛普的几号人都特别忙。要是那时知道创业板要到十年后才会开市,也许我就没这次工作机会了。
跑市场的姜哲更是忙得不得了。姜哲大概三十岁上下,板寸,身材结实,左眉上有条不长的疤,经常戴个墨镜,不常笑,开口也是一股京片儿,看着有点儿像胡同里的地痞流氓。这段时间汪总和工程师李帅都在家里忙着做新屏的电路板,客户服务就靠姜哲一个。可他又不懂技术,除了能查个虚焊以外解决不了别的问题。所以这就想到拉上我一起去客户现场出差,好歹我能算个技术人员。
我出的第一趟差是太原,南方证券的一个营业厅,那天有块屏彻底瞎了,客户火急火燎地打电话到洛普。那天我正好在那儿,汪总听完电话跟我和姜哲一合计,也不用带什么行李了,马上去火车站,当晚赶到太原给客户维修,务必要保证营业厅第二天早上正常开业。我跟着姜哲打车到西客站,也没买票,直接冲上最近一趟去太原的火车,然后找乘务员补了两张软座坐下,一路无话。
到太原已是夜里,我俩打上出租车就直奔营业厅。路上姜哲又接了个电话,跟对方说“马上就到”,想来是南方证券的人已经等得心焦了。车到地方,只见营业厅灯火通明,门口站着一男一女正等着我们。见我们下车,靠前的圆脸眼镜哥像是见了救星,老远就迎上来,一把握住姜哲的手:
“哎呀,你们可算是来了……今天早上都还好好的呢,快中午那会儿,这第二块屏突然就瞎了,还得让你们这么大老远的赶来,你说这事儿闹的……哟,还没请教您贵姓?”
“您放心,您放心,保证您明儿早上照常开业—免贵,姓姜,您叫我小姜就成。”姜哲脸上满是殷勤的笑容,我还从没见他这么热情过。
四个人一起往里走,另一位三十多岁的女士转头问我:“对了,这位工程师贵姓啊?”
“我?免贵……姓熊。”
“噢,是熊工啊。”
我一错愕。“熊工”这称呼,一下子真没跟自己联系起来。女士还在热情地说着话:
“熊工看着可够年轻的。”
“哦,我今年二十,大学还没毕业呢。”
一听这话,走在前面的姜哲回头狠狠地瞪了我一眼,吓得我不敢开口了。
走到大屏跟前,眼镜哥打开电源开关,只听“嘶嘶”的电流声响起,几块三米多高、四米多宽的显示屏就在我们眼前逐一亮了起来—当然第二块没亮。这还是我第一次离这么近看证券显示屏,LED点阵上一个个小黄灯闪得我眼发晕,上面显示的文字和数字都显得很不真实。
我又回头看看女士和眼镜哥,脑子里冒出了“客户”这个词:他们就是我的客户吧?以前每当这个词从那些在公司里实习的师兄们嘴里若无其事地吐出来,我都觉得好高端。现在我自己身边就站着两个客户,满脸焦急而又期盼地看着我们,一副欲言又止生怕扰乱我们的样子。原来这就是“见客户”啊。这感觉也让我觉得很不真实,再加上舟车劳顿,脑子有点儿迷迷糊糊的。
突然一阵恐慌从我的心里窜过:我不知道该干什么了。从中午到刚才,我一直在为第一次出差而兴奋着。现在这股劲儿一过,我才意识到:面对一块瞎了的屏,我根本就不知道该怎么办。是硬件故障吗?还是软件问题?怎么查?怎么修?我脑子里一片空白,愣在原地,也许就几秒钟时间,可感觉像是有一辈子那么长。
“小熊,把大褂儿穿上。”姜哲扔过一件蓝色的绝缘服,这简直就是我的救命稻草啊。我手忙脚乱地穿上绝缘服,不敢看两位客户的眼神,跟着姜哲就钻到了大屏的背后。
显示屏是用钢桁架固定在墙边,离墙根有大概一米距离,稍微侧点身就能进人。这地方平时没人会来,清洁工也不会打扫,一落手满是灰尘和蛛网。姜哲左手举着电筒走前面,右手不停地把大片蛛网拨拉到一边,我跟在后面小心翼翼往进走,不时提防着脚下的电线。走到第二块屏的位置,手上、身上早已蹭满了黑灰。
“来,帮我举着手电。”姜哲把电筒递给我,“照这儿。”他从绝缘服的兜里摸出一支电笔,从上往下测了几个点,点点头,嘟囔了一句:“嗯,行了。”说着又从兜里掏出一柄螺丝刀、一把线钳、一卷黑胶布搁在脚边,扯着嗓子喊了一声:
“哎……把电给我断了。”
不一会儿工夫,只听“咔嚓”一声,几块大屏全灭了。少了电路板缝隙透过来的LED灯光和电流声,墙角里突然变得又黑又静。我举着电筒,姜哲麻利地铰下一段像是被老鼠咬断的电源线,把两边线头重新接好,用黑胶布裹得严严实实,站起来拍拍手,又扯着嗓子喊:
“哎……打开电瞧瞧。”
又是“咔嚓”一声,过了几秒钟,跟着传来了女士和眼镜哥的欢呼声。姜哲拾起地上的工具装进兜里,冲我一摆手:“走吧。”
出了营业厅,女士和眼镜哥硬要请我们吃饭。我俩本来也饿着肚子,略微推辞一下也就客随主便了。吃完饭,眼镜哥又开车把我俩送到酒店门口方才告别。
我和姜哲只开了一个标间,两张窄床,不过对于每天住在学生宿舍里的我来说,这完全不是问题。洗完澡躺在床上,姜哲闭着眼抽着烟,一言不发。我实在按捺不住,转个身问他:
“哎,姜哥,你刚才怎么知道就是电源线的事儿呢?”
“嗨,整块儿屏黑了,不是电源线是什么?”姜哲深吸一口烟,还是闭着眼,“像这种不上电,或者上了电不出字儿的毛病,都是小毛病,就是哪根儿线折了。要是遇上出字儿出一半儿,或者出来东西是错的,那我可就没辙Up……”
“姜哥你真行。我年轻不会办事,你多教着我点。”我是真心很佩服他。
“你呀,”姜哲猛地睁开眼瞪着我,“别老跟人说你大学还没毕业,人家听了觉着不像话。”
我的脸“腾”地一下红了,嘴里嗫嗫地答应着。
“行了,睡吧。”说完他把烟头一掐,转身躺下,关了灯。
波澜不惊地写了两个月程序,中间又跟姜哲跑了一趟秦皇岛,我负责的控制程序已经大致出来了。这时已近年底,汪总拿到了一个重要项目:南方证券青岛馆陶路营业部。这个营业部位于青岛市中心,计划春节后正式营业,大屏就选购了洛普的支持创业板的新款—也就是我们正在开发的这一款。汪总看看我和杨刚的开发进度都大致不差,营业厅的装修又已经完工,大屏可以进场安装了,于是大手一挥,一行人浩浩荡荡地奔赴青岛现场施工。
刚去青岛的头几天,汪总、李帅一班人立即进场,做电源、做桁架。我和杨刚倒是不用马上进场,待在酒店完成我们的程序。这是我第一次看见真正的硬件开发,真是大开眼界。跟我这抱着一台PC过日子不一样,杨刚那一堆家伙事儿摆出来就显得很有范儿:示波器、仿真器、烧录器、芯片、电路板、电烙铁……摆了一桌子。写的程序也不是C,是汇编。那会儿我正是刚开始对技术发烧的阶段,总觉得越底层的技术就越牛,在我自己写的上位机控制程序里也嵌了几小段汇编程序,好像不写汇编就不算真的编程似的。所以,一看见杨刚摆好造型点上烟开始写程序的样子,我就特崇拜他。
“小熊小熊,赶紧来看一眼!”我正在埋头写程序,杨刚在背后叫我。
我转头一看,看见LED上显示着黄色的“1234”。杨刚一脸兴奋地搓着手。我又左看右看,也没看出什么来。
“嗯,1234,看见了。特牛是吧?”
“一看你就不懂。”杨刚鄙视地说,扔过一根“中南海”给我,“你忘了,咱这模块是红绿两色的,给个5伏的低电平就红色,15伏的高电平就绿色。”
“嗯……是啊,这黄色怎么弄出来的?”我也被他吊起了兴趣。汪总前几天看了杨刚做的第一块原型板,当时就提了意见:红涨绿跌这都没问题,平盘的时候得用黄色显示。杨刚当时还挠头说早知道这样就该选三色的LED模块。
“我让单片机控制它每秒60次在高低电平之间切换,就成黄色了。”杨刚得意扬扬地说,“你瞧这单片机忙的,啧啧……”
我一下就明白了。这就跟放电影是一样的道理,60赫兹频率切换的红色和绿色在肉眼看来就是毫无闪烁的黄色。而且稍微改变切换的节奏还可以得到橙色之类的不同颜色。这时我对杨刚那个仰慕啊,犹如滔滔江水……
类似这种有创造性的解决办法,不光杨刚有,我也想了不少。比如说自己写dBase数据库驱动,再比如说显示汉字。为了省成本,汪总和杨刚在电路板上只设计了很小的ROM,不把汉字库放在单片机上,而是由上位机把汉字传给单片机—当然就不是以内码的形式,而是一个长度为1024的数组,直接对应控制LED点阵的1024个点。如果数组的第一个元素是0,就表示点阵左上角的点熄灭。如果是1,就表示这个点被点亮。这么一来,杨刚就完全不用操心要显示的是汉字、字母还是数字,只要把我传给他的点阵图忠实地显示出来就行了。
我也觉得实现这个功能挺好玩的。为了测试它,我还写了一个模拟LED点阵的程序:在屏幕上显示16行、64列的发光点,这样我就可以看到传输出去的1024长度的数组代表了什么图形。
一个难题是汉字库:我得找到一个16×16的字库,才能知道每个汉字的内码怎么转换成一幅点阵图。在学校BBS上几番请教高人,终于让我找到了解决方案:把UCDOS里的字库抠出来,就可以得到点阵图。
和那个年代比起来,现在的年轻人刚开始工作时发挥创造性的空间就小得多了。绝大部分的开发任务,都有现成的框架提供了标准的做法,即使偶尔遇到一两个难题,Google搜索一下通常都能找到答案。虽然解决问题是更快了,留给人思考的空间也更小了。写程序如果没有充分思考,只是照搬别人的解决方案,怎么能学到东西呢?所以我还挺庆幸自己的职业生涯开始于前互联网时代的。
就这样,一个难题接着一个难题被攻克,我们摆在桌上的实验板已经连在一台电脑的串口上,显示着一支股票的名称和当前价位,当然,还不是即时刷新的。见这情形,汪总就开始催促我们去现场安装。
去现场安装也不是说去马上就能去的。我们先花了一整晚时间,烧录了400片单片机,第二天一早才拿着这些单片机去现场。这时营业厅已经准备得七七八八,大屏也已矗立起来,只是暖气没开通,给散户们准备的塑料长椅也还没运进来,整个厅里空荡荡、冷飕飕的,进去以后得把外套再裹严实一点。
我们几个人把单片机分了分,搭着梯子爬上爬下,一会儿就把四块大屏全都插好了。通上电,只见大屏从上往下先亮后灭,自检完成。我把笔记本电脑打开,杨刚从大屏脚上拖出一条串口线插在电脑上,兴奋地搓着手。我打开编译好的控制程序,在菜单里选择“开始输出”,回车……
大屏上显示出行情数据了,但每隔两三行就有一两行不亮。我退出控制程序,再来,效果还是一样—不,不完全一样,有几行刚才亮的现在不亮了,也有几行刚才不亮的现在亮起来了。再试,仍然是随机的有一小半不亮。
第一次现场实验,就这样以失败告终。
跟杨刚一块走回酒店,看我垂头丧气的样子,杨刚拍着我的肩膀安慰我:“没事儿,谁写程序不出点漏子?这点儿小问题,,咱俩很快就能弄好。”
我倒不是担心问题解决不了,虽说头一回见这么不合常规的情况,心里确实有点儿没底。刚才现场实验的时候,不光我们的人在,业主南方证券的人也在,营业厅经理魏治就站在旁边目睹了整个过程。我偷偷留意魏治的神色,一开始还只是严肃,后来脸色越来越难看,最后小声嘟哝着走回楼上去了。汪总见这情形,赶紧跟了上去,走出两步又回头对我说:
“小熊啊,赶紧跟杨刚回酒店去,再调调程序,啊?”
倒是和颜悦色,言语间也透出了几分着急。
要是把我搁在魏治的位置,我肯定也会又气又急。急的是营业厅开业在即,这关键的大屏却迟迟不能就绪。气的是汪总先是吹嘘新产品高科技云云,后是拍胸脯保证绝不会拖营业厅筹备的后腿,临了才知道原来产品都没完工,感情是把馆陶路营业厅当了小白鼠。想到这里,我心里多了几分愧疚,又加快了脚步。
回到酒店,杨刚很快搭了一个更大的实验板:5行LED显示,每行只有两列,股票名称和当前价位。我把串口线接上,运行程序,果然5行里有两行没亮。之前我们一直用单行的实验板,从来没发现过这个问题。
发现问题可不等于就能解决问题,尤其是这种随机的问题。我使出了浑身解数,别说解决问题,连到底是什么原因都找不出来。这种工控程序可不像做个网站,一个请求一个应答,报文都清清楚楚。我编程的对象是串口线,对面是杨刚的单片机,我的程序里发一个信号,不代表这个信号真的发到了串口线上,不代表单片机收到了这个信号,也不代表单片机发出了回执,更不代表我收到了回执。可以出错的地方太多了,随机的错误又增加了复杂度。杨刚说“很快就弄好”,我俩硬是折腾了两天两宿,问题依然照旧。
这会儿已经是凌晨一点多,现场实验失败之后,我俩已经连续调试了40个小时,吃盒饭、上厕所之外,脑袋全都凑在屏幕前,全靠香烟和速溶咖啡支撑着。杨刚突然一拍桌子,大喊一声:
“受不了啦!走,小熊,出去溜达会儿。”
我也着实快受不了了。于是我俩站起来狠狠地伸了个懒腰,摸下楼来,朝着街角那家饺子店晃悠过去。这家店面积不大,四五张桌子,没啥装修,就胜在夜里开得长,总有出租车司机三两成群地吃着宵夜聊着闲天。
“老板,一斤饺子,两碗儿羊肉汤。”
“好嘞……饺子您要什么馅儿的?”
“半斤白菜半斤韭菜—哎,小熊,你说你那程序怎么就能收不到握手信号呢?”
我们已经发现,之所以有几行屏显不亮,是因为控制程序跟单片机握手没握上。控制程序一开始运行,就会从串口广播一个启动信号;收到启动信号的单片机则应答一个握手信号,同时带上自己的ID号,这样控制程序就知道下面究竟有多少单片机了;接着,控制程序就会把行情数据按ID号逐行发给单片机。整个过程中,控制程序只有一次需要接收来自单片机的信号,就是这个握手信号。在出来之前我们已经发现,5块单片机都收到了广播的启动信号,也各自都发出了握手信号,但控制程序总是只能收回两三条。
“唉……”我使劲地挠着头,几天没洗澡,头皮有点儿痒,“要真是收不到还好呢,这收到仨还掉俩,这算怎么回事儿……”
“别急啊,咱再从头捋捋。你看啊,单片机肯定是没问题吧—我不是推卸责任啊,调试信号咱都看见了,再说要是发不出去握手信号肯定几块全都发不出去,不会是这个情况。”
我无奈地点点头。确实,怎么看都是控制程序的问题。
“你听完握手信号以后的程序肯定也没问题,所以只要握上手就都对了。”
我又点点头。总算有个好消息,虽然不是新消息。
“那就是握手信号没听全,有些听见了有些没听见。”
我把脑袋点得像鸡啄米一样。
“你是怎么听串口上来的信号的?”
“我埋了一个中断。一开始用C语言写的,上次跟你联调的时候发现不好使,换成拿汇编写了,你记得这事儿不?”
“记得,记得。那段儿程序是我拷给你的。应该没问题呀,怎么可能听漏呢?”
我脑子里突然灵光一闪,一拍桌子:“啊呀!”
“哎?想到什么了?”
“你说会不会是Windows先拦了一遍中断,就给拦掉了?”为了编程方便,我在Windows里开了一个DOS命令行窗口来执行控制程序。
“有这可能!”
我俩狼吞虎咽地吃完饺子,三步并作两步冲回酒店,马上动手实验:关机,重启进入DOS模式,执行控制程序……
好了。5行屏显全都乖乖地亮着。
退出控制程序,重开;再退出,再开;拔掉实验板电源,再插上……随便我们怎么折腾,程序稳如泰山,5行屏显全都亮着,一点问题都没有。
我俩大眼瞪小眼,面面相觑了大概10秒钟,然后同时蹦出两个字:“睡觉!”
以前在学校BBS上看见有人说Windows是对程序员不友好的操作系统,这时候我才知道它是有多不友好。
一觉睡到了下午,我俩把最新版本的程序拷在U盘里,兴冲冲地去了工地。听我们大致一说,汪总也露出赞许的笑容,叫我们赶快试试。
我打开放在大屏背后角落里的电脑,把程序拷进去,杨刚拖出串口线插上。我跟他对视一眼,心里居然有点儿紧张。我深吸一口气,敲下回车键。
整个大屏都亮了。像波浪一样,从上到下、从左向右,LED一行一行地挨个亮了起来,显示出股票名称和行情数据。我和杨刚兴奋得蹦了起来,击掌相庆,周怡在一旁夸我:“行啊小熊,真给弄出来了。”汪总跟魏治站得远远的说着悄悄话,魏治也在连连点头。
大家围着大屏看了一会儿,兴奋劲儿也过去了,于是又各司其职。魏治溜达到大屏跟前站定,笑眯眯地盯着大屏上看下看。看着看着,他脸上的笑容渐渐消失,脸色变得难看起来。
“这数据不对吧?”魏治终于忍不住开口了,“深发展昨天的收盘价不是这个数。还有这儿,这儿……肯定是不对。”
我和杨刚半信半疑地对望一眼,打开机器上的数据库文件跟大屏对比。果然,虽说数据都显示出来,可显示的位置都不对:今天的开盘价跑到了“昨日收盘”列,诸如此类。这点小问题还不是分分钟手到擒来?我俩这么想着,席地一坐,打开程序开始折腾。
从到青岛算起,已经过去了小一个月,直到这时,魏治才真正算是看到了这几块大屏的庐山真面目。不难想见,他会发现多少问题、有多少想要修改的需求。他这修改意见一提不要紧,我才发现自己写的程序有多糟糕:读数据、计算、显示格式、下发……所有事都搅在一起,这里一改,那里又出个错,真是牵一发而动全身。魏治提的几条修改意见,我愣是在工地又干了一个通宵才全部改完。杨刚这天表现得极其仗义,虽说都是上位机程序的修改,跟单片机没关系,他还是陪着我熬了一宿,俩人有说有笑、有咖啡有烟,倒也不觉得难受。
第二天早上,看了我们修改的结果,魏治看起来挺满意。在大屏跟前转悠了一会儿,他转身问汪总:
“老汪,回头创业板开了,咱们就拿两块屏显示沪深行情,腾出两块屏来显示创业板,你看怎么样?刚开市的时候肯定关心创业板的人特多……”
听到这儿,我心里“砰”地一跳。洛普的新款显示屏宣称的最大卖点就是支持创业板。其实,对程序来说,创业板跟主板没什么区别,都是同样的数据库文件,这也正是我们敢这么宣传的原因。然而,创业板究竟几时开市一直没有定论,所以对于魏治这样的营业厅经理来说,“支持创业板”不仅仅是能显示创业板的数据,更重要的是,能调整每一块屏显示的内容。可这个汪总着力宣传的核心卖点,我们忘了做了。我偷眼一瞅杨刚,见他正冲我吐舌头做鬼脸—没辙,赶快弄吧。
这次可不止是修改上位机程序就能解决的了。杨刚在单片机里根本没考虑一块屏能显示不同市场的情况,现在得修改单片机程序,之前烧的400片单片机就全都报废了。我俩花了几个小时修改程序,在实验板上反复核对,觉得差不多靠谱的时候,已经又是夜幕降临了。
这时已经是我俩在五天里熬的第四个通宵了,靠烟和咖啡强打精神久了以后,手就会不受控制地发抖。又赶上我们为了节省成本,买的8051单片机都是便宜货,管脚软得不行,往烧录器上插时一不小心就把管脚给撅折了。那一宿,我俩和李帅一道,喝掉了大半盒麦斯威尔速溶咖啡,抽掉了一条中南海,撅折了好几十片单片机。后来,我把这些报废的单片机收起来,把管脚全撅掉,在中间钻上孔,用细绳串起来,做了一条项链,算是对这段打工经历的纪念。从那以后,我再也不能抽混合型香烟,也不能喝速溶咖啡,全拜这几个通宵所赐。
毫不意外地,杨刚把单片机程序改完之后,连上大屏一试,我的上位机程序又出了若干bug。照原计划,第二天就是我在青岛的最后一天,剩下的应该只是些扫尾工作。虽说已经困得快要抬不动眼皮了,我还是硬打着精神继续改bug。现在回想,记忆都已经不太清晰,只记得我当时买的是晚上7点的火车票,到6点半我终于拿出了最后一个版本的程序,然后拎着行李打车、在站台上狂奔,总算在6点57分跳上了回北京的列车。
上了火车,我倒头便睡得昏天黑地。好不容易醒来以后,我呆呆地望着窗外,脑子里不断地重复着一个念头:这软件,以后不能这么做。
那时,二十岁的我知道的事情还少,也说不出什么大道理,但刚过去的一个星期已经足够让我印象深刻。我脑子里有很多“为什么”无法解答:为什么我写的程序一改就会出bug?为什么单片机上做什么修改我都得跟着改程序?为什么做了三个月的项目直到最后三天才能看见做的东西究竟是什么样?最要紧的是,为什么要五天里熬四个通宵才能把事情做完?我不知道是什么地方,但我知道,一定有某个地方不太对劲。软件不能这么做,不然我没办法拿做软件当一辈子的职业。
就这么呆着、望着、想着,北京站旁边的恒基中心远远地出现在视野里。我职业生涯的第一个项目,就在这样的忙碌奔波中结束了。
本文摘自熊节新书:《不敢止步:一个软件工匠的12年》
人邮IT书坊ID:ptpressitbooks
本文关键词:不敢止步:一个软件工匠的12年,由笔耕文化传播整理发布。
本文编号:347469
本文链接:https://www.wllwen.com/wenshubaike/mishujinen/347469.html