軟件工匠熊節(jié)初當程序員的故事
本文關(guān)鍵詞:不敢止步:一個軟件工匠的12年,由筆耕文化傳播整理發(fā)布。
編者按:還記得你是怎么走上程序員這條路的嗎?還記得大學畢業(yè)后你的第一份職業(yè)嗎?還記得你當初帶著滿腔熱血如何開始編織你的人生嗎?還記得你工作后的第一份薪水嗎?希望小編能有幸聽你們講你們的故事。本文寫的是2000年那個時代還是在讀生熊節(jié)初當程序員的故事,希望作者的經(jīng)歷也能帶你找回當年的回憶。
接到那個電話,是在2000年的國慶長假中。對于剛上大三的我來說,那本來只是一個普通的長假:宅在宿舍里看電視、玩游戲,或是去樓下籃球場打打球?墒悄莻電話改變了我的假期計劃,乃至我的人生。
“喂?是熊節(jié)嗎?”電話那頭,一個中年男聲問道。
“我是。你哪位?”
“你會C語言編程是不是?”中年男人很突兀地問。
“呃……”我腦子里飛快地轉(zhuǎn)了幾圈?磥硎窃诰W(wǎng)上發(fā)的那篇求職帖起作用了,嗯,一定是這樣。于是我提起自信答道:“是,我用C語言做過好多東西!
“那就好,那就好。”中年男人說道,“你7號下午到宣武門這邊來一趟,面試,好不好?”
“好!”跟我說完時間、地點、聯(lián)系電話,中年男人就掛了電話。
上大學以后,我一直在想辦法打工掙錢,即使不能自給自足,至少可以補貼生活。前兩年里,我發(fā)過傳單、在中關(guān)村調(diào)查過硬件價格、幫人攢過電腦,甚至還試過跑到天成批發(fā)市場買一堆毛絨玩具,然后在女生宿舍樓門口叫賣。但對于酷愛編程的我來說,這些打工的方式終歸都是小打小鬧,我一直渴望找到一份編程的工作。所以那年暑假結(jié)束回到北京,我就在幾個程序員招聘求職的論壇里發(fā)了一個簡單的求職帖,留下宿舍的電話號碼。手機,在那個年代還是一件奢侈品。
同樣是奢侈品的還有自學編程的資源。那時候,Google、百度都還不存在,不論是想找一點自學材料,還是想找?guī)讉志同道合的朋友,都遠不像今天這么容易。不過我運氣挺好:大一的時候玩MUD,認識了比我高兩級的師兄江焱風—這當然是游戲里的名字。江焱風是我們學校MUD的天神,我就拜在他門下做了個巫師,一開始幫著維護玩家秩序,然后也幫著寫寫游戲場景、寫寫NPC什么的。江焱風看我挺喜歡編程的,就塞給我一堆LPC(用來開發(fā)MUD的編程語言)教程,然后讓我開發(fā)《笑傲江湖》里的一個新門派:衡山派。所以呢,我確實用C語言做過好多東西,最多的就是衡山派的場景、武功、道具、NPC……當然我不會隨便跟別人說的。
10月7號的下午,我先坐一趟公交再換一趟地鐵到宣武門,又花了一點工夫找到叫“英嘉花園”的小區(qū)。打了一個電話,中年男人告訴我一個門牌號。
敲開門,就見了他本人:四十來歲,一米八左右身高,肩挺寬,但不胖,一身深色西裝,短頭發(fā)梳得整整齊齊,樣子看著有幾分儒雅,臉上掛著和善的笑容。
“你是熊節(jié)吧?”談吐透著一點北京口音,“來來來,進來坐!
這是一間普通的住宅,客廳里沒幾樣家具,沙發(fā)上已經(jīng)坐了一位,大高個兒,白白胖胖的,臉上冒著幾顆粉刺,一條寬松的牛仔褲上還破了幾個洞,一看就覺得像北京孩子。一開口,果然是標準的京片兒。
“你好,我叫楊剛,廣播學院的!
中年男人給我倒了杯水,也自我介紹。原來他姓汪,叫汪元。他這家公司叫“北京洛普電子有限公司”,專做各種LED顯示屏。如果你2000年前后去過首都機場或是西客站,你就一定看見過洛普的產(chǎn)品:那些滾動顯示航班、車次的大屏幕,那些指引和提示旅客的滾動字幕。這時候洛普正打算升級換代一個拳頭產(chǎn)品:證券營業(yè)廳的行情顯示大屏。要做這么一個屏,就得有硬件、軟件兩大塊。我和楊剛就是這么一個分工:楊剛做電路和單片機,我做控制程序。汪總第一次見面就把我倆叫到一塊兒,他說是為了讓我倆先互相認識,方便以后配合。
說是面試,其實根本沒測試我會做什么,只是大致聊了一陣對這個產(chǎn)品的構(gòu)想。汪總似乎對我倆也挺滿意,于是就談具體工作:每個禮拜來宣武門公司辦公室上兩個半天的班,主要目的是大家經(jīng)常碰頭溝通;月薪800塊。說實話,我不知道月薪800塊到底算不算合適,偷瞄了楊剛一眼,看他表情還挺平淡的,也沒有不滿意的樣子。人家研究生都能接受,我一小本科肯定也能接受嘛,于是就這么定下來。
第二次去英嘉花園,汪總叫我去了另一個門牌號,說是洛普的辦公室。原來上次去的那間住宅是汪總自己的房子。照著這個新的門牌號,我找到一間地下室。房門虛掩著,我推門進去,汪總一眼看見我,高興地打著招呼:“快來快來,就等你一個呢!
地下室里布置成一個辦公室的格局,一張大沙發(fā),三張辦公桌。這會兒屋里坐著好些個人,汪總挨個給我介紹:姜哲,跑市場的;周怡,財務(wù);李帥,工程師;楊剛,上次已經(jīng)見過了;還有一位是陳老師,某高校計算機系的老師。
“咱們這個大屏,原來的控制程序就是陳老師做的。小熊你要好好跟陳老師請教,把技術(shù)學到手啊!
陳老師是個四十多歲的中年女性,外表沒什么特別,看著就是很樸實的人民教師的樣子。她說本來和汪總合作也挺愉快,可是最近要評職稱,抽不出工夫做新版本。講起技術(shù),她倒是毫不藏私,看起來也是希望我盡快接手過去。很快,我就對接下來要做什么有了個大概的了解。
做一個證券行情顯示屏,主要有三部分工作。首先是硬件,16×16的LED點陣就可以顯示一個漢字,4塊點陣拼起來就可以顯示4個字的股票名稱,后面再跟上一串LED數(shù)碼管,就可以顯示這支股票的昨日收盤價、今日開盤價、當前成交價、當日最高價、當日最低價、成交量等信息,這就構(gòu)成了大屏上的“一行”。然后是硬件控制,就是用一片8051單片機控制一行里的漢字點陣和數(shù)碼管,讓它正確顯示信息。最后就是上位機控制程序,需要分析從衛(wèi)星接收來的行情數(shù)據(jù),然后把數(shù)據(jù)重組成適合顯示的格式,分發(fā)給每一行的單片機。
在這三部分里面,硬件方案已經(jīng)比較清楚,主要是汪總親自在設(shè)計,楊剛提了一些單片機接口的建議。剩下兩塊,楊剛負責單片機編程,上位機控制程序則由我來負責。
聽完陳老師講解老版本的控制程序,第二天又收到她發(fā)來的源代碼,我興奮地打開Turbo C 2.0開始編程。雖說從沒做過什么正經(jīng)的軟件,有哪些事需要做,我還是能想清楚的。這個上位機控制程序需要做三件事。第一,分析行情數(shù)據(jù)庫。分析一個dBase格式的數(shù)據(jù)庫文件—準確說是兩個數(shù)據(jù)庫文件,滬市和深市各一個,交易廳會安裝衛(wèi)星天線自動接收上交所和深交所傳來的更新文件,我只管讀取這兩個文件就行了。第二,把處理好的數(shù)據(jù)按照和楊剛定好的協(xié)議格式通過串口線傳給單片機。第三,做一個界面,讓用戶操作這個控制程序。
在這三件事里,最讓我感興趣的是界面。用Turbo C做一個在命令行里顯示的菜單界面,用戶可以用方向鍵上下選擇菜單,這讓我覺得非?帷纫郧白鲞^的那些黑底白字符的程序酷多了。所以我立馬就把dBase、串口什么的都扔在腦后,開開心心地做界面。這個決定后來給我?guī)聿簧俾闊,不過也讓我從中學到了很多,這是后話,暫且不表。
很酷的界面做出一個雛形,我就想:得顯示點真實的數(shù)據(jù),看著才有范兒呢。于是我又開始做dBase數(shù)據(jù)庫的解析。讀者可能有點兒困惑:為什么數(shù)據(jù)庫需要“解析”呢?別忘了,我們在講2000年的事,那時可不像現(xiàn)在,各種數(shù)據(jù)庫驅(qū)動一應(yīng)俱全,打開Google就能找到。我花了半天工夫在網(wǎng)上搜索,硬是沒找到一個C語言的dBase驅(qū)動庫,只找到一篇描述dBase數(shù)據(jù)庫文件格式的文章。好在這個文件格式夠簡單,無非就是把數(shù)據(jù)一行接一行地寫在一個二進制文件里。老話說得好,靠貓靠狗不如自己動手,我就自己動手寫了一段程序來解析dBase數(shù)據(jù)庫文件、讀取行情庫里的數(shù)據(jù)。
程序一天天生長成型,可我一直在有意無意地回避一個重要的技術(shù)點:串口通信。因為我就只有一臺電腦,連測試串口的辦法都沒有,這部分程序我寫出來都沒法知道寫得對不對。汪總聽我描述開發(fā)的進展也挺開心,并不催促我,倒是給我派了個新的任務(wù):跟姜哲一起出差。
洛普這家公司雖小,產(chǎn)品賣得還挺好,單說證券信息大屏這個產(chǎn)品,華北各省各地也有好幾十家營業(yè)廳用著洛普的屏。2000年,互聯(lián)網(wǎng)還不普及,大戶們要么自己家里裝了網(wǎng)絡(luò),要么可以去大戶室,散戶、尤其是廣大提著菜籃子炒股的中老年散戶就得靠證券營業(yè)廳的大屏和交易終端來實現(xiàn)自己的財富夢想。所以證監(jiān)會有要求,營業(yè)廳要開業(yè),不能只開大戶室,必須得有個“廳”,大廳里得有行情大屏。所以華北地區(qū)只要有新營業(yè)廳籌備,洛普就有機會。一般營業(yè)廳至少裝兩塊屏,比較寬敞的裝三塊甚至四塊,按一塊屏50萬的報價,洛普的生意是蠻好做的。而且那年業(yè)內(nèi)一直在風傳創(chuàng)業(yè)板開市在即,新營業(yè)廳想要能支持創(chuàng)業(yè)板的屏,老營業(yè)廳也有可能趁這個時機換一套新的屏,所以這段時間洛普的幾號人都特別忙。要是那時知道創(chuàng)業(yè)板要到十年后才會開市,也許我就沒這次工作機會了。
跑市場的姜哲更是忙得不得了。姜哲大概三十歲上下,板寸,身材結(jié)實,左眉上有條不長的疤,經(jīng)常戴個墨鏡,不常笑,開口也是一股京片兒,看著有點兒像胡同里的地痞流氓。這段時間汪總和工程師李帥都在家里忙著做新屏的電路板,客戶服務(wù)就靠姜哲一個?伤植欢夹g(shù),除了能查個虛焊以外解決不了別的問題。所以這就想到拉上我一起去客戶現(xiàn)場出差,好歹我能算個技術(shù)人員。
我出的第一趟差是太原,南方證券的一個營業(yè)廳,那天有塊屏徹底瞎了,客戶火急火燎地打電話到洛普。那天我正好在那兒,汪總聽完電話跟我和姜哲一合計,也不用帶什么行李了,馬上去火車站,當晚趕到太原給客戶維修,務(wù)必要保證營業(yè)廳第二天早上正常開業(yè)。我跟著姜哲打車到西客站,也沒買票,直接沖上最近一趟去太原的火車,然后找乘務(wù)員補了兩張軟座坐下,一路無話。
到太原已是夜里,我倆打上出租車就直奔營業(yè)廳。路上姜哲又接了個電話,跟對方說“馬上就到”,想來是南方證券的人已經(jīng)等得心焦了。車到地方,只見營業(yè)廳燈火通明,門口站著一男一女正等著我們。見我們下車,靠前的圓臉眼鏡哥像是見了救星,老遠就迎上來,一把握住姜哲的手:
“哎呀,你們可算是來了……今天早上都還好好的呢,快中午那會兒,這第二塊屏突然就瞎了,還得讓你們這么大老遠的趕來,你說這事兒鬧的……喲,還沒請教您貴姓?”
“您放心,您放心,保證您明兒早上照常開業(yè)—免貴,姓姜,您叫我小姜就成!苯苣樕蠞M是殷勤的笑容,我還從沒見他這么熱情過。
四個人一起往里走,另一位三十多歲的女士轉(zhuǎn)頭問我:“對了,這位工程師貴姓?”
“我?免貴……姓熊!
“噢,是熊工啊!
我一錯愕!靶芄ぁ边@稱呼,一下子真沒跟自己聯(lián)系起來。女士還在熱情地說著話:
“熊工看著可夠年輕的!
“哦,我今年二十,大學還沒畢業(yè)呢。”
一聽這話,走在前面的姜哲回頭狠狠地瞪了我一眼,嚇得我不敢開口了。
走到大屏跟前,眼鏡哥打開電源開關(guān),只聽“嘶嘶”的電流聲響起,幾塊三米多高、四米多寬的顯示屏就在我們眼前逐一亮了起來—當然第二塊沒亮。這還是我第一次離這么近看證券顯示屏,LED點陣上一個個小黃燈閃得我眼發(fā)暈,上面顯示的文字和數(shù)字都顯得很不真實。
我又回頭看看女士和眼鏡哥,腦子里冒出了“客戶”這個詞:他們就是我的客戶吧?以前每當這個詞從那些在公司里實習的師兄們嘴里若無其事地吐出來,我都覺得好高端,F(xiàn)在我自己身邊就站著兩個客戶,滿臉焦急而又期盼地看著我們,一副欲言又止生怕擾亂我們的樣子。原來這就是“見客戶”啊。這感覺也讓我覺得很不真實,再加上舟車勞頓,腦子有點兒迷迷糊糊的。
突然一陣恐慌從我的心里竄過:我不知道該干什么了。從中午到剛才,我一直在為第一次出差而興奮著,F(xiàn)在這股勁兒一過,我才意識到:面對一塊瞎了的屏,我根本就不知道該怎么辦。是硬件故障嗎?還是軟件問題?怎么查?怎么修?我腦子里一片空白,愣在原地,也許就幾秒鐘時間,可感覺像是有一輩子那么長。
“小熊,把大褂兒穿上!苯苋舆^一件藍色的絕緣服,這簡直就是我的救命稻草啊。我手忙腳亂地穿上絕緣服,不敢看兩位客戶的眼神,跟著姜哲就鉆到了大屏的背后。
顯示屏是用鋼桁架固定在墻邊,離墻根有大概一米距離,稍微側(cè)點身就能進人。這地方平時沒人會來,清潔工也不會打掃,一落手滿是灰塵和蛛網(wǎng)。姜哲左手舉著電筒走前面,右手不停地把大片蛛網(wǎng)撥拉到一邊,我跟在后面小心翼翼往進走,不時提防著腳下的電線。走到第二塊屏的位置,手上、身上早已蹭滿了黑灰。
“來,幫我舉著手電!苯馨央娡策f給我,“照這兒。”他從絕緣服的兜里摸出一支電筆,從上往下測了幾個點,點點頭,嘟囔了一句:“嗯,行了!闭f著又從兜里掏出一柄螺絲刀、一把線鉗、一卷黑膠布擱在腳邊,扯著嗓子喊了一聲:
“哎……把電給我斷了!
不一會兒工夫,只聽“咔嚓”一聲,幾塊大屏全滅了。少了電路板縫隙透過來的LED燈光和電流聲,墻角里突然變得又黑又靜。我舉著電筒,姜哲麻利地鉸下一段像是被老鼠咬斷的電源線,把兩邊線頭重新接好,用黑膠布裹得嚴嚴實實,站起來拍拍手,又扯著嗓子喊:
“哎……打開電瞧瞧!
又是“咔嚓”一聲,過了幾秒鐘,跟著傳來了女士和眼鏡哥的歡呼聲。姜哲拾起地上的工具裝進兜里,沖我一擺手:“走吧!
出了營業(yè)廳,女士和眼鏡哥硬要請我們吃飯。我倆本來也餓著肚子,略微推辭一下也就客隨主便了。吃完飯,眼鏡哥又開車把我倆送到酒店門口方才告別。
我和姜哲只開了一個標間,兩張窄床,不過對于每天住在學生宿舍里的我來說,這完全不是問題。洗完澡躺在床上,姜哲閉著眼抽著煙,一言不發(fā)。我實在按捺不住,轉(zhuǎn)個身問他:
“哎,姜哥,你剛才怎么知道就是電源線的事兒呢?”
“嗨,整塊兒屏黑了,不是電源線是什么?”姜哲深吸一口煙,還是閉著眼,“像這種不上電,或者上了電不出字兒的毛病,都是小毛病,就是哪根兒線折了。要是遇上出字兒出一半兒,或者出來東西是錯的,那我可就沒轍Up……”
“姜哥你真行。我年輕不會辦事,你多教著我點!蔽沂钦嫘暮芘宸。
“你呀,”姜哲猛地睜開眼瞪著我,“別老跟人說你大學還沒畢業(yè),人家聽了覺著不像話!
我的臉“騰”地一下紅了,嘴里囁囁地答應(yīng)著。
“行了,睡吧!闭f完他把煙頭一掐,轉(zhuǎn)身躺下,關(guān)了燈。
波瀾不驚地寫了兩個月程序,中間又跟姜哲跑了一趟秦皇島,我負責的控制程序已經(jīng)大致出來了。這時已近年底,汪總拿到了一個重要項目:南方證券青島館陶路營業(yè)部。這個營業(yè)部位于青島市中心,計劃春節(jié)后正式營業(yè),大屏就選購了洛普的支持創(chuàng)業(yè)板的新款—也就是我們正在開發(fā)的這一款。汪總看看我和楊剛的開發(fā)進度都大致不差,營業(yè)廳的裝修又已經(jīng)完工,大屏可以進場安裝了,于是大手一揮,一行人浩浩蕩蕩地奔赴青島現(xiàn)場施工。
剛?cè)デ鄭u的頭幾天,汪總、李帥一班人立即進場,做電源、做桁架。我和楊剛倒是不用馬上進場,待在酒店完成我們的程序。這是我第一次看見真正的硬件開發(fā),真是大開眼界。跟我這抱著一臺PC過日子不一樣,楊剛那一堆家伙事兒擺出來就顯得很有范兒:示波器、仿真器、燒錄器、芯片、電路板、電烙鐵……擺了一桌子。寫的程序也不是C,是匯編。那會兒我正是剛開始對技術(shù)發(fā)燒的階段,總覺得越底層的技術(shù)就越牛,在我自己寫的上位機控制程序里也嵌了幾小段匯編程序,好像不寫匯編就不算真的編程似的。所以,一看見楊剛擺好造型點上煙開始寫程序的樣子,我就特崇拜他。
“小熊小熊,趕緊來看一眼!”我正在埋頭寫程序,楊剛在背后叫我。
我轉(zhuǎn)頭一看,看見LED上顯示著黃色的“1234”。楊剛一臉興奮地搓著手。我又左看右看,也沒看出什么來。
“嗯,1234,看見了。特牛是吧?”
“一看你就不懂!睏顒偙梢暤卣f,扔過一根“中南!苯o我,“你忘了,咱這模塊是紅綠兩色的,給個5伏的低電平就紅色,15伏的高電平就綠色!
“嗯……是啊,這黃色怎么弄出來的?”我也被他吊起了興趣。汪總前幾天看了楊剛做的第一塊原型板,當時就提了意見:紅漲綠跌這都沒問題,平盤的時候得用黃色顯示。楊剛當時還撓頭說早知道這樣就該選三色的LED模塊。
“我讓單片機控制它每秒60次在高低電平之間切換,就成黃色了!睏顒偟靡鈸P揚地說,“你瞧這單片機忙的,嘖嘖……”
我一下就明白了。這就跟放電影是一樣的道理,60赫茲頻率切換的紅色和綠色在肉眼看來就是毫無閃爍的黃色。而且稍微改變切換的節(jié)奏還可以得到橙色之類的不同顏色。這時我對楊剛那個仰慕啊,猶如滔滔江水……
類似這種有創(chuàng)造性的解決辦法,不光楊剛有,我也想了不少。比如說自己寫dBase數(shù)據(jù)庫驅(qū)動,再比如說顯示漢字。為了省成本,汪總和楊剛在電路板上只設(shè)計了很小的ROM,不把漢字庫放在單片機上,而是由上位機把漢字傳給單片機—當然就不是以內(nèi)碼的形式,而是一個長度為1024的數(shù)組,直接對應(yīng)控制LED點陣的1024個點。如果數(shù)組的第一個元素是0,就表示點陣左上角的點熄滅。如果是1,就表示這個點被點亮。這么一來,楊剛就完全不用操心要顯示的是漢字、字母還是數(shù)字,只要把我傳給他的點陣圖忠實地顯示出來就行了。
我也覺得實現(xiàn)這個功能挺好玩的。為了測試它,我還寫了一個模擬LED點陣的程序:在屏幕上顯示16行、64列的發(fā)光點,這樣我就可以看到傳輸出去的1024長度的數(shù)組代表了什么圖形。
一個難題是漢字庫:我得找到一個16×16的字庫,才能知道每個漢字的內(nèi)碼怎么轉(zhuǎn)換成一幅點陣圖。在學校BBS上幾番請教高人,終于讓我找到了解決方案:把UCDOS里的字庫摳出來,就可以得到點陣圖。
和那個年代比起來,現(xiàn)在的年輕人剛開始工作時發(fā)揮創(chuàng)造性的空間就小得多了。絕大部分的開發(fā)任務(wù),都有現(xiàn)成的框架提供了標準的做法,即使偶爾遇到一兩個難題,Google搜索一下通常都能找到答案。雖然解決問題是更快了,留給人思考的空間也更小了。寫程序如果沒有充分思考,只是照搬別人的解決方案,怎么能學到東西呢?所以我還挺慶幸自己的職業(yè)生涯開始于前互聯(lián)網(wǎng)時代的。
就這樣,一個難題接著一個難題被攻克,我們擺在桌上的實驗板已經(jīng)連在一臺電腦的串口上,顯示著一支股票的名稱和當前價位,當然,還不是即時刷新的。見這情形,汪總就開始催促我們?nèi)ガF(xiàn)場安裝。
去現(xiàn)場安裝也不是說去馬上就能去的。我們先花了一整晚時間,燒錄了400片單片機,第二天一早才拿著這些單片機去現(xiàn)場。這時營業(yè)廳已經(jīng)準備得七七八八,大屏也已矗立起來,只是暖氣沒開通,給散戶們準備的塑料長椅也還沒運進來,整個廳里空蕩蕩、冷颼颼的,進去以后得把外套再裹嚴實一點。
我們幾個人把單片機分了分,搭著梯子爬上爬下,一會兒就把四塊大屏全都插好了。通上電,只見大屏從上往下先亮后滅,自檢完成。我把筆記本電腦打開,楊剛從大屏腳上拖出一條串口線插在電腦上,興奮地搓著手。我打開編譯好的控制程序,在菜單里選擇“開始輸出”,回車……
大屏上顯示出行情數(shù)據(jù)了,但每隔兩三行就有一兩行不亮。我退出控制程序,再來,效果還是一樣—不,不完全一樣,有幾行剛才亮的現(xiàn)在不亮了,也有幾行剛才不亮的現(xiàn)在亮起來了。再試,仍然是隨機的有一小半不亮。
第一次現(xiàn)場實驗,就這樣以失敗告終。
跟楊剛一塊走回酒店,看我垂頭喪氣的樣子,楊剛拍著我的肩膀安慰我:“沒事兒,誰寫程序不出點漏子?這點兒小問題,,咱倆很快就能弄好!
我倒不是擔心問題解決不了,雖說頭一回見這么不合常規(guī)的情況,心里確實有點兒沒底。剛才現(xiàn)場實驗的時候,不光我們的人在,業(yè)主南方證券的人也在,營業(yè)廳經(jīng)理魏治就站在旁邊目睹了整個過程。我偷偷留意魏治的神色,一開始還只是嚴肅,后來臉色越來越難看,最后小聲嘟噥著走回樓上去了。汪總見這情形,趕緊跟了上去,走出兩步又回頭對我說:
“小熊啊,趕緊跟楊剛回酒店去,再調(diào)調(diào)程序,?”
倒是和顏悅色,言語間也透出了幾分著急。
要是把我擱在魏治的位置,我肯定也會又氣又急。急的是營業(yè)廳開業(yè)在即,這關(guān)鍵的大屏卻遲遲不能就緒。氣的是汪總先是吹噓新產(chǎn)品高科技云云,后是拍胸脯保證絕不會拖營業(yè)廳籌備的后腿,臨了才知道原來產(chǎn)品都沒完工,感情是把館陶路營業(yè)廳當了小白鼠。想到這里,我心里多了幾分愧疚,又加快了腳步。
回到酒店,楊剛很快搭了一個更大的實驗板:5行LED顯示,每行只有兩列,股票名稱和當前價位。我把串口線接上,運行程序,果然5行里有兩行沒亮。之前我們一直用單行的實驗板,從來沒發(fā)現(xiàn)過這個問題。
發(fā)現(xiàn)問題可不等于就能解決問題,尤其是這種隨機的問題。我使出了渾身解數(shù),別說解決問題,連到底是什么原因都找不出來。這種工控程序可不像做個網(wǎng)站,一個請求一個應(yīng)答,報文都清清楚楚。我編程的對象是串口線,對面是楊剛的單片機,我的程序里發(fā)一個信號,不代表這個信號真的發(fā)到了串口線上,不代表單片機收到了這個信號,也不代表單片機發(fā)出了回執(zhí),更不代表我收到了回執(zhí)?梢猿鲥e的地方太多了,隨機的錯誤又增加了復(fù)雜度。楊剛說“很快就弄好”,我倆硬是折騰了兩天兩宿,問題依然照舊。
這會兒已經(jīng)是凌晨一點多,現(xiàn)場實驗失敗之后,我倆已經(jīng)連續(xù)調(diào)試了40個小時,吃盒飯、上廁所之外,腦袋全都湊在屏幕前,全靠香煙和速溶咖啡支撐著。楊剛突然一拍桌子,大喊一聲:
“受不了啦!走,小熊,出去溜達會兒!
我也著實快受不了了。于是我倆站起來狠狠地伸了個懶腰,摸下樓來,朝著街角那家餃子店晃悠過去。這家店面積不大,四五張桌子,沒啥裝修,就勝在夜里開得長,總有出租車司機三兩成群地吃著宵夜聊著閑天。
“老板,一斤餃子,兩碗兒羊肉湯!
“好嘞……餃子您要什么餡兒的?”
“半斤白菜半斤韭菜—哎,小熊,你說你那程序怎么就能收不到握手信號呢?”
我們已經(jīng)發(fā)現(xiàn),之所以有幾行屏顯不亮,是因為控制程序跟單片機握手沒握上?刂瞥绦蛞婚_始運行,就會從串口廣播一個啟動信號;收到啟動信號的單片機則應(yīng)答一個握手信號,同時帶上自己的ID號,這樣控制程序就知道下面究竟有多少單片機了;接著,控制程序就會把行情數(shù)據(jù)按ID號逐行發(fā)給單片機。整個過程中,控制程序只有一次需要接收來自單片機的信號,就是這個握手信號。在出來之前我們已經(jīng)發(fā)現(xiàn),5塊單片機都收到了廣播的啟動信號,也各自都發(fā)出了握手信號,但控制程序總是只能收回兩三條。
“唉……”我使勁地撓著頭,幾天沒洗澡,頭皮有點兒癢,“要真是收不到還好呢,這收到仨還掉倆,這算怎么回事兒……”
“別急啊,咱再從頭捋捋。你看啊,單片機肯定是沒問題吧—我不是推卸責任啊,調(diào)試信號咱都看見了,再說要是發(fā)不出去握手信號肯定幾塊全都發(fā)不出去,不會是這個情況!
我無奈地點點頭。確實,怎么看都是控制程序的問題。
“你聽完握手信號以后的程序肯定也沒問題,所以只要握上手就都對了!
我又點點頭?偹阌袀好消息,雖然不是新消息。
“那就是握手信號沒聽全,有些聽見了有些沒聽見!
我把腦袋點得像雞啄米一樣。
“你是怎么聽串口上來的信號的?”
“我埋了一個中斷。一開始用C語言寫的,上次跟你聯(lián)調(diào)的時候發(fā)現(xiàn)不好使,換成拿匯編寫了,你記得這事兒不?”
“記得,記得。那段兒程序是我拷給你的。應(yīng)該沒問題呀,怎么可能聽漏呢?”
我腦子里突然靈光一閃,一拍桌子:“啊呀!”
“哎?想到什么了?”
“你說會不會是Windows先攔了一遍中斷,就給攔掉了?”為了編程方便,我在Windows里開了一個DOS命令行窗口來執(zhí)行控制程序。
“有這可能!”
我倆狼吞虎咽地吃完餃子,三步并作兩步?jīng)_回酒店,馬上動手實驗:關(guān)機,重啟進入DOS模式,執(zhí)行控制程序……
好了。5行屏顯全都乖乖地亮著。
退出控制程序,重開;再退出,再開;拔掉實驗板電源,再插上……隨便我們怎么折騰,程序穩(wěn)如泰山,5行屏顯全都亮著,一點問題都沒有。
我倆大眼瞪小眼,面面相覷了大概10秒鐘,然后同時蹦出兩個字:“睡覺!”
以前在學校BBS上看見有人說Windows是對程序員不友好的操作系統(tǒng),這時候我才知道它是有多不友好。
一覺睡到了下午,我倆把最新版本的程序拷在U盤里,興沖沖地去了工地。聽我們大致一說,汪總也露出贊許的笑容,叫我們趕快試試。
我打開放在大屏背后角落里的電腦,把程序拷進去,楊剛拖出串口線插上。我跟他對視一眼,心里居然有點兒緊張。我深吸一口氣,敲下回車鍵。
整個大屏都亮了。像波浪一樣,從上到下、從左向右,LED一行一行地挨個亮了起來,顯示出股票名稱和行情數(shù)據(jù)。我和楊剛興奮得蹦了起來,擊掌相慶,周怡在一旁夸我:“行啊小熊,真給弄出來了!蓖艨偢褐握镜眠h遠的說著悄悄話,魏治也在連連點頭。
大家圍著大屏看了一會兒,興奮勁兒也過去了,于是又各司其職。魏治溜達到大屏跟前站定,笑瞇瞇地盯著大屏上看下看?粗粗,他臉上的笑容漸漸消失,臉色變得難看起來。
“這數(shù)據(jù)不對吧?”魏治終于忍不住開口了,“深發(fā)展昨天的收盤價不是這個數(shù)。還有這兒,這兒……肯定是不對!
我和楊剛半信半疑地對望一眼,打開機器上的數(shù)據(jù)庫文件跟大屏對比。果然,雖說數(shù)據(jù)都顯示出來,可顯示的位置都不對:今天的開盤價跑到了“昨日收盤”列,諸如此類。這點小問題還不是分分鐘手到擒來?我倆這么想著,席地一坐,打開程序開始折騰。
從到青島算起,已經(jīng)過去了小一個月,直到這時,魏治才真正算是看到了這幾塊大屏的廬山真面目。不難想見,他會發(fā)現(xiàn)多少問題、有多少想要修改的需求。他這修改意見一提不要緊,我才發(fā)現(xiàn)自己寫的程序有多糟糕:讀數(shù)據(jù)、計算、顯示格式、下發(fā)……所有事都攪在一起,這里一改,那里又出個錯,真是牽一發(fā)而動全身。魏治提的幾條修改意見,我愣是在工地又干了一個通宵才全部改完。楊剛這天表現(xiàn)得極其仗義,雖說都是上位機程序的修改,跟單片機沒關(guān)系,他還是陪著我熬了一宿,倆人有說有笑、有咖啡有煙,倒也不覺得難受。
第二天早上,看了我們修改的結(jié)果,魏治看起來挺滿意。在大屏跟前轉(zhuǎn)悠了一會兒,他轉(zhuǎn)身問汪總:
“老汪,回頭創(chuàng)業(yè)板開了,咱們就拿兩塊屏顯示滬深行情,騰出兩塊屏來顯示創(chuàng)業(yè)板,你看怎么樣?剛開市的時候肯定關(guān)心創(chuàng)業(yè)板的人特多……”
聽到這兒,我心里“砰”地一跳。洛普的新款顯示屏宣稱的最大賣點就是支持創(chuàng)業(yè)板。其實,對程序來說,創(chuàng)業(yè)板跟主板沒什么區(qū)別,都是同樣的數(shù)據(jù)庫文件,這也正是我們敢這么宣傳的原因。然而,創(chuàng)業(yè)板究竟幾時開市一直沒有定論,所以對于魏治這樣的營業(yè)廳經(jīng)理來說,“支持創(chuàng)業(yè)板”不僅僅是能顯示創(chuàng)業(yè)板的數(shù)據(jù),更重要的是,能調(diào)整每一塊屏顯示的內(nèi)容?蛇@個汪總著力宣傳的核心賣點,我們忘了做了。我偷眼一瞅楊剛,見他正沖我吐舌頭做鬼臉—沒轍,趕快弄吧。
這次可不止是修改上位機程序就能解決的了。楊剛在單片機里根本沒考慮一塊屏能顯示不同市場的情況,現(xiàn)在得修改單片機程序,之前燒的400片單片機就全都報廢了。我倆花了幾個小時修改程序,在實驗板上反復(fù)核對,覺得差不多靠譜的時候,已經(jīng)又是夜幕降臨了。
這時已經(jīng)是我倆在五天里熬的第四個通宵了,靠煙和咖啡強打精神久了以后,手就會不受控制地發(fā)抖。又趕上我們?yōu)榱斯?jié)省成本,買的8051單片機都是便宜貨,管腳軟得不行,往燒錄器上插時一不小心就把管腳給撅折了。那一宿,我倆和李帥一道,喝掉了大半盒麥斯威爾速溶咖啡,抽掉了一條中南海,撅折了好幾十片單片機。后來,我把這些報廢的單片機收起來,把管腳全撅掉,在中間鉆上孔,用細繩串起來,做了一條項鏈,算是對這段打工經(jīng)歷的紀念。從那以后,我再也不能抽混合型香煙,也不能喝速溶咖啡,全拜這幾個通宵所賜。
毫不意外地,楊剛把單片機程序改完之后,連上大屏一試,我的上位機程序又出了若干bug。照原計劃,第二天就是我在青島的最后一天,剩下的應(yīng)該只是些掃尾工作。雖說已經(jīng)困得快要抬不動眼皮了,我還是硬打著精神繼續(xù)改bug,F(xiàn)在回想,記憶都已經(jīng)不太清晰,只記得我當時買的是晚上7點的火車票,到6點半我終于拿出了最后一個版本的程序,然后拎著行李打車、在站臺上狂奔,總算在6點57分跳上了回北京的列車。
上了火車,我倒頭便睡得昏天黑地。好不容易醒來以后,我呆呆地望著窗外,腦子里不斷地重復(fù)著一個念頭:這軟件,以后不能這么做。
那時,二十歲的我知道的事情還少,也說不出什么大道理,但剛過去的一個星期已經(jīng)足夠讓我印象深刻。我腦子里有很多“為什么”無法解答:為什么我寫的程序一改就會出bug?為什么單片機上做什么修改我都得跟著改程序?為什么做了三個月的項目直到最后三天才能看見做的東西究竟是什么樣?最要緊的是,為什么要五天里熬四個通宵才能把事情做完?我不知道是什么地方,但我知道,一定有某個地方不太對勁。軟件不能這么做,不然我沒辦法拿做軟件當一輩子的職業(yè)。
就這么呆著、望著、想著,北京站旁邊的恒基中心遠遠地出現(xiàn)在視野里。我職業(yè)生涯的第一個項目,就在這樣的忙碌奔波中結(jié)束了。
本文摘自熊節(jié)新書:《不敢止步:一個軟件工匠的12年》
人郵IT書坊ID:ptpressitbooks
本文關(guān)鍵詞:不敢止步:一個軟件工匠的12年,由筆耕文化傳播整理發(fā)布。
本文編號:347469
本文鏈接:http://sikaile.net/wenshubaike/mishujinen/347469.html