成長(zhǎng)道路上的感悟
時(shí)間過(guò)得真快,轉(zhuǎn)眼就做了十來(lái)年的技術(shù)。從當(dāng)初的初出茅廬,一步步地走到了今天。在成長(zhǎng)的路上,遇到了數(shù)個(gè)貴人,有過(guò)很多次的當(dāng)頭棒喝,也有過(guò)很多的徘徊、很多的無(wú)奈和很多的感悟。很早就有寫點(diǎn)文字的想法,于自己是個(gè)總結(jié),于后來(lái)者是個(gè)參考。因?yàn)楣ぷ魃犀嵤吕p身,一直沒(méi)有機(jī)會(huì)落筆。這次,很多在頭腦中長(zhǎng)期潛伏的想法,一股腦地倒了出來(lái)。
本想用流水賬的方式,把自己的經(jīng)歷寫下,但寫好后又大段地刪掉了。因?yàn)槲矣X(jué)得,僅僅羅列自己的經(jīng)歷,能給自己什么幫助,又能給別人以什么啟發(fā)呢?!最后斟酌決定,以自己在工程師路上的幾點(diǎn)收獲作為線索來(lái)動(dòng)筆,這正是我最想與別人分享的。
我的收獲可以總結(jié)成下面三句話:
步步深入,水到渠成;
舉一反三,觸類旁通;
整合資源,提升自我。
步步深入,水到渠成
很多的初學(xué)電子工程師在面對(duì)新技術(shù)的時(shí)候總希望找到登堂入室的捷徑。尋找捷徑是人的本能,付出最小成本,換取最大的成就,這是無(wú)可厚非的。但電子技術(shù)是門很嚴(yán)謹(jǐn)?shù)目茖W(xué),靠捷徑和技巧最終都會(huì)是無(wú)果而返,折騰了半天又回到了起點(diǎn)。
說(shuō)說(shuō)我自己學(xué)USB的過(guò)程。2001年的時(shí)候,公司的一個(gè)產(chǎn)品準(zhǔn)備使用USB端口通信,我和幾位同事自發(fā)開始學(xué)習(xí)USB的相關(guān)知識(shí)。我好幾次計(jì)劃仔細(xì)把USB協(xié)議從頭看到尾,但每次都是看了前三章,就缺乏耐性,抑或因?yàn)槠渌麑B毠ぷ鞯臅r(shí)間安排而中斷。自此之后,至少10次,我一次又一次啟動(dòng)學(xué)USB設(shè)計(jì)的計(jì)劃,但每次都是從閱讀USB協(xié)議開始,然后閱讀到第三章就停掉了,甚至只看了十幾頁(yè)。雖然花費(fèi)了時(shí)間,但沒(méi)有絲毫進(jìn)展,所掌握的知識(shí)比當(dāng)初從科普文章中得到的也沒(méi)有增加多少。
直到2003年的一天,部門來(lái)了一位對(duì)USB小有所成的新同事。一次偶爾的聊天中,他提到,“USB協(xié)議熟讀第九章,再看些sample程序,就入門了”。于是,找來(lái)Cypress的USB HID的例子程序,對(duì)照USB協(xié)議的第九章來(lái)學(xué)習(xí)。那一周我不僅對(duì)USB開發(fā)入了門,而且頓悟了不少東西。我一直后悔沒(méi)有早些仔細(xì)研讀Cypress提供的USB例子程序,因?yàn)橹灰仓^皮去讀,就能發(fā)現(xiàn)里面的代碼很清楚的說(shuō)明是由CH9協(xié)議實(shí)現(xiàn)的。我花了斷斷續(xù)續(xù)3年的時(shí)間學(xué)USB,最大的收獲不是技術(shù)層面的,而是這曲折的學(xué)習(xí)之路讓我領(lǐng)悟了——做技術(shù),要扎實(shí)才行。只要步步深入,自然水到渠成。試圖走捷徑,實(shí)際卻是在原地踏步。
我很早就把TCP/IP協(xié)議的那幾本厚厚的書從書店抱回了家。然而晦澀的文字、復(fù)雜的協(xié)議,雖然也看過(guò)一些內(nèi)容,不過(guò)更多的時(shí)候,這幾本協(xié)議參考都是書柜上華麗的擺設(shè)。偶爾有個(gè)機(jī)會(huì),找了塊51單片機(jī)+RT8019的板子,抱著試試看的心態(tài),就開始了調(diào)試。好在單片機(jī)的編程本身沒(méi)有任何障礙,很快就入門了。在仔細(xì)學(xué)習(xí)TCP/IP協(xié)議棧的時(shí)候,就發(fā)現(xiàn)分層簡(jiǎn)直太奇妙了,可以把很多復(fù)雜的問(wèn)題簡(jiǎn)單化,然后得以單獨(dú)解決。TCP/IP分層帶給我的認(rèn)識(shí),不再像OSI參考模型那樣抽象,而是非常的直觀。對(duì)于具體的應(yīng)用,TCP/IP的四層甚至可以直接對(duì)應(yīng)到我們的4個(gè)函數(shù):鏈路層的任務(wù)是通過(guò)寄存器操作網(wǎng)卡芯片,IP層的主要工作居然只是打包,TCP就跟UART似的發(fā)個(gè)命令然后等應(yīng)答,應(yīng)用層就是我們的測(cè)試程序的主函數(shù),原來(lái)這么復(fù)雜的技術(shù)居然可以化解成如此簡(jiǎn)單的幾個(gè)模塊。雖然我只是寫了個(gè)TCP/IP測(cè)試程序,后來(lái)也沒(méi)再做過(guò)以太網(wǎng)的開發(fā),但這段學(xué)習(xí)經(jīng)歷帶來(lái)的自信讓我受益匪淺。
我首次做硬件的經(jīng)歷也很有意思,甚至有些幼稚。剛畢業(yè)2年一直做軟件,覺(jué)得做硬件很有成就感。因?yàn)槲覀兡莻€(gè)Team是一個(gè)硬件配十來(lái)個(gè)Firmware工程師。如果能看著很多軟件工程師用自己做的開發(fā)板做開發(fā)調(diào)試,那成就感就甭提了。于是跟我的主管領(lǐng)導(dǎo)要求做硬件,甚至以消極怠工做威脅。當(dāng)時(shí)部門經(jīng)理也想調(diào)動(dòng)我的工作積極性,于是同意了,而且一個(gè)新的項(xiàng)目很快就到了我手上。那時(shí)候,我的原理圖設(shè)計(jì)還可以,但是Layout的經(jīng)驗(yàn)基本沒(méi)有。因?yàn)榈谝淮卧O(shè)計(jì)硬件的緣故,我設(shè)計(jì)的開發(fā)板穩(wěn)定性差些,但設(shè)計(jì)的跳線非常實(shí)用,跟Build的Debug和Release配置正好對(duì)應(yīng)。項(xiàng)目組的好幾個(gè)同事在項(xiàng)目協(xié)調(diào)會(huì)上說(shuō)我做的Jumper好用。[!--empirenews.page--]
得到Team內(nèi)很多同事的肯定,對(duì)初入門的工程師絕對(duì)是莫大的鼓勵(lì)。后來(lái)又陸陸續(xù)續(xù)地做開發(fā)板、產(chǎn)品板。一個(gè)硬件的初學(xué)者居然做了幾個(gè)10萬(wàn)臺(tái)以上的銷量的產(chǎn)品。當(dāng)我看到項(xiàng)目組的十幾個(gè)同事用我設(shè)計(jì)的板子調(diào)試程序的時(shí)候,當(dāng)我從營(yíng)銷部聽到我負(fù)責(zé)設(shè)計(jì)的產(chǎn)品銷量到了多少的時(shí)候,莫大的成就感和自我肯定對(duì)繼續(xù)深入的學(xué)習(xí)也是一種動(dòng)力。
技術(shù)是靠積累的,只要你朝正確的方向付出了努力,就會(huì)一步步靠近成功。當(dāng)付出了足夠的精力和時(shí)間后,取得進(jìn)步是水到渠成的事情。努力過(guò)程中的偶然有利因素,要利用起來(lái),要學(xué)會(huì)把機(jī)遇轉(zhuǎn)化成能力。因?yàn)閷?shí)用的跳線獲得同事的認(rèn)可,我就趁熱打鐵,把硬件的穩(wěn)定性方面問(wèn)題解決掉。
對(duì)捷徑的無(wú)比向往和對(duì)技術(shù)復(fù)雜度的恐懼是初學(xué)路上最大的敵人。身邊做技術(shù)的朋友或同事,有很多人是非常聰明的,然而真正在技術(shù)上能獨(dú)擋一面的確實(shí)不多,為何?實(shí)際上,很多人是在學(xué)習(xí)新技術(shù)方面過(guò)多的希望走捷徑,而一直無(wú)法有所突破。我也曾希望自己能找到捷徑,不用辛苦的學(xué)習(xí)就可以掌握別人搞不定的技術(shù)。最后發(fā)現(xiàn)根本沒(méi)有什么捷徑,或者所謂捷徑就是腳踏實(shí)地去做。很多的電子工程師不屑于學(xué)單片機(jī),認(rèn)為單片機(jī)是低級(jí)技術(shù),以ARM、FPGA等為學(xué)習(xí)的目標(biāo)。我做過(guò)的一個(gè)產(chǎn)品原來(lái)用的是8位單片機(jī),后來(lái)轉(zhuǎn)用ARM實(shí)現(xiàn),整個(gè)C代碼是平滑移植過(guò)來(lái)的。從一個(gè)產(chǎn)品工程師的角度去看,ARM就是一個(gè)跑得比較快、片上資源以及接口比較豐富的單片機(jī),使用ARM不是因?yàn)樗歉邫n的芯片,而是因?yàn)樗梢蕴岣弋a(chǎn)品的性價(jià)比。
舉一反三,觸類旁通
我一直認(rèn)為,作為一個(gè)工程師,尤其是電子工程師,“照貓畫虎”的類推能力是非常重要的。如果我們用舉一反三的交叉方式去思考不同的技術(shù),就會(huì)發(fā)現(xiàn)很多技術(shù)是有內(nèi)在關(guān)聯(lián)的。技術(shù)領(lǐng)域上較廣泛的涉獵給我的感觸是,很多技術(shù)是作為一個(gè)體系出現(xiàn)的,靠架構(gòu)來(lái)組成的。而架構(gòu)的存在,也使中間件的開發(fā)更有效率。下面我想分享一下,學(xué)習(xí)過(guò)程中感觸到的架構(gòu)在不同技術(shù)領(lǐng)域中的表現(xiàn)。
如果你做Windows WDM Driver,會(huì)發(fā)現(xiàn)WDM的架構(gòu)是非常棒的,只要精通某一點(diǎn)并開發(fā)設(shè)計(jì)成一個(gè)小小的sys文件,就可以把它掛到操作系統(tǒng)中去。Windows的OS會(huì)在適當(dāng)?shù)臅r(shí)候調(diào)用你的sys文件,跟寫應(yīng)用程序的消息機(jī)制似的。我們?cè)偕钊氲絎DM的這個(gè)sys驅(qū)動(dòng)的內(nèi)部看,有兩個(gè)非常顯著的特點(diǎn):第一,把一系列的函數(shù)指針指向自己實(shí)現(xiàn)的函數(shù),目的是把自身掛到驅(qū)動(dòng)棧里去;第二,接受驅(qū)動(dòng)棧上層驅(qū)動(dòng)的請(qǐng)求,先處理,然后傳遞給驅(qū)動(dòng)棧的下層驅(qū)動(dòng)。正是架構(gòu)的精心設(shè)計(jì),讓模塊開發(fā)的勞動(dòng)強(qiáng)度大大降低,于是連對(duì)PC硬件不甚熟悉的我,都有過(guò)幾次做Driver的經(jīng)歷。
做嵌入式系統(tǒng)WinCE的工程師會(huì)注意到,WinCE的驅(qū)動(dòng)架構(gòu),幾乎完全是Windows WDM的簡(jiǎn)化版。WDM驅(qū)動(dòng)的那兩個(gè)特點(diǎn)在這里表現(xiàn)得淋漓盡致。當(dāng)然,因?yàn)槭乔度胧较到y(tǒng),肯定要比Windows系統(tǒng)簡(jiǎn)化很多,而且嵌入式的CPU提供的資源跟X86也是無(wú)法相比的。因?yàn)楣ぷ鞯木壒?,我?duì)WinCE沒(méi)有更深入的學(xué)習(xí)。
我曾有機(jī)會(huì)做Windows Media的編程開發(fā),這是Windws XP平臺(tái)上一個(gè)視頻特別處理,當(dāng)然用到了DirectShow技術(shù)。我當(dāng)初就感覺(jué)DS的架構(gòu)怎么這么面熟,就是一時(shí)認(rèn)不出來(lái)。原來(lái)DS使用了COM技術(shù),變得神秘了。但透過(guò)COM這個(gè)接口技術(shù)看架構(gòu),原來(lái)又是跟WDM那么的相似,只是表現(xiàn)形式由Device變成了Filter而已。一個(gè)內(nèi)核層的架構(gòu)居然在應(yīng)用層也能找到它的影子。
做Windows通信程序的時(shí)候,希望收到數(shù)據(jù)時(shí)才響應(yīng),例如向主窗口發(fā)個(gè)消息。這是APP級(jí)的,怎么做呢?對(duì)了,就用FILE_FLAG_OVERLAPPED這個(gè)屬性,我們只要以這個(gè)屬性打開設(shè)備,如串口或者USB等,以后讀取設(shè)備數(shù)據(jù)的時(shí)候,這個(gè)函數(shù)會(huì)立即Return,我們隨后就可以等待事件(Read完成了或者Timeout了或者是某故障發(fā)生了)。配合多線程編程,很容易做成消息驅(qū)動(dòng)型的,而不必用死循環(huán)浪費(fèi)額外的CPU時(shí)間片。這里就借助了操作系統(tǒng)給我們提供的消息機(jī)制。
在開發(fā)嵌入式設(shè)備的時(shí)候,我們會(huì)遇到類似的問(wèn)題,想節(jié)約額外的CPU時(shí)間片以達(dá)到節(jié)電的目的,甚至更迫切,這就可以用到消息機(jī)制。用戶程序一直在等待事件,只有在有消息來(lái)到的時(shí)候,處理程序才會(huì)被啟動(dòng)。而底層程序,則被設(shè)計(jì)用來(lái)維護(hù)消息機(jī)制,當(dāng)空閑(如按鍵、中斷等都沒(méi)有到來(lái))時(shí)候,系統(tǒng)可以進(jìn)入空閑狀態(tài),甚至睡眠狀態(tài)。多數(shù)情況下,嵌入式系統(tǒng)的CPU占用率是非常低的,所以消息機(jī)制的使用可以大副降低功耗。
其實(shí),嵌入式設(shè)備即使不用Embedded OS也可以利用OS的某些特性來(lái)設(shè)計(jì),這使得代碼的可維護(hù)性大大增強(qiáng)。所以做過(guò)Windows SDK開發(fā)的人,轉(zhuǎn)做消息驅(qū)動(dòng)的嵌入式系統(tǒng),很多概念是非常容易接受的。其實(shí),很多嵌入式系統(tǒng)的設(shè)計(jì)者,也確實(shí)參考了Windows的消息機(jī)制的實(shí)現(xiàn)方式。所以,我面試嵌入式工程師的時(shí)候,一般都會(huì)順便問(wèn)一下有沒(méi)有Windows PC編程的經(jīng)驗(yàn)。[!--empirenews.page--]
整合資源,提升自我
很多人覺(jué)得整合資源,是管理上的術(shù)語(yǔ)。實(shí)際上,工程師也需要把已經(jīng)掌握的資源進(jìn)行整合,以得到最大程度的自我提升。就像我們總質(zhì)疑為何某同事的技術(shù)能力不如我,卻做上了部門經(jīng)理的位子。如果我們仔細(xì)觀察,就會(huì)發(fā)現(xiàn)是自身的某些因素導(dǎo)致了我們的很多能力無(wú)法得到最大機(jī)會(huì)的表現(xiàn),或者,要充分整合我們已經(jīng)掌握的資源,才能使得我們的能力最大程度的展示。這是更高層次的自我提升。
當(dāng)工作數(shù)年之后,我發(fā)現(xiàn)自己認(rèn)識(shí)了很多朋友,有做技術(shù)的,也有做市場(chǎng)的;發(fā)現(xiàn)自己掌握了很多零零散散的技術(shù),能做TCPIP通信了,能獨(dú)立Layout出一塊完整的PCB了;發(fā)現(xiàn)自己具有一定的組織協(xié)調(diào)能力,能獨(dú)立組織一個(gè)團(tuán)隊(duì)的工作,能協(xié)調(diào)團(tuán)隊(duì)和外界的溝通了。如果你有跟我類似的感覺(jué),說(shuō)明你也注意到自己的潛力了。當(dāng)這些潛力沒(méi)有轉(zhuǎn)化成能力之前,這只是潛在資源而已。所以,我們要學(xué)會(huì)整合這些資源。
把自己掌握的兩項(xiàng)獨(dú)立的技術(shù)應(yīng)用于某個(gè)產(chǎn)品,并協(xié)調(diào)其搭配工作,這是技術(shù)上的整合。自己擅長(zhǎng)做軟件,和做硬件的同事合作,并主導(dǎo)合作中的很多煩瑣事物,這是人力上的整合。自己有技術(shù),和有市場(chǎng)能力的朋友,合伙創(chuàng)業(yè),那更是整合。通過(guò)整合,我們表現(xiàn)出了單打獨(dú)斗無(wú)法表現(xiàn)的能力,這就是整合的力量,撬動(dòng)地球的杠桿的力量。
我在工作7年之后辭職準(zhǔn)備創(chuàng)業(yè)。同很多工程師都有的艱苦創(chuàng)業(yè)經(jīng)歷一樣,單單一個(gè)角色轉(zhuǎn)化就非常令人痛苦。以前只需專注技術(shù)就足夠了,現(xiàn)在卻需要面對(duì)成本、工期、工廠等N多的因素,整天在工程師、業(yè)務(wù)員、售后服務(wù)之間角色轉(zhuǎn)換。另外,創(chuàng)業(yè)之初,各類文檔的撰寫就是個(gè)不小的門檻,包括合作意向書、NDA協(xié)議、產(chǎn)品規(guī)格書、報(bào)價(jià)書,都需要較好的文字表達(dá)能力。拜訪重點(diǎn)客戶之前,還要制作PPT的演示投影。創(chuàng)業(yè)之初雖然辛苦,但可預(yù)見的勝利果實(shí)的誘惑力太大了,加班、熬夜,都是家常便飯。因?yàn)槠鸩缴晕⒂悬c(diǎn)基礎(chǔ),所以開始就抓到了客戶,直接進(jìn)入創(chuàng)業(yè)過(guò)程中“為他人做嫁妝”的階段??偨Y(jié)起來(lái),我的創(chuàng)業(yè)經(jīng)歷就是整合自身資源,充分提升自己的一個(gè)過(guò)程。
很多工程師都有創(chuàng)業(yè)的沖動(dòng)。我的建議是:第一,創(chuàng)業(yè)前做盡可能多的準(zhǔn)備工作;第二,盡量選擇自己最熟悉的領(lǐng)域。當(dāng)然,工程師還有一個(gè)方面相對(duì)欠缺,就是文字表述能力。各種文檔的撰寫,都需要有好的文字功底。在以前那家公司工作的時(shí)候,因?yàn)楣芾硪粋€(gè)小Team,每周都要在視頻會(huì)議上給老板做匯報(bào),還要給幾個(gè)下屬做計(jì)劃。趕鴨子上架,在現(xiàn)實(shí)的壓力下,我開始重視書面表達(dá)能力。我覺(jué)得,書面文字的運(yùn)用能力,對(duì)一個(gè)工程師而言,是一道門檻,應(yīng)該努力跨越過(guò)去。
愿每個(gè)工程師,都有美好的人生,都能實(shí)現(xiàn)自己的理想,實(shí)現(xiàn)自己的價(jià)值。