阿里巴巴一位 70 後程序員的 26 個職場感悟!
在上週末阿里巴巴中介軟體舉辦的APM深度交流技術沙龍上,出現一位白髮高齡程式設計師,一個本子、一支筆、一臺筆記本,正記錄著臺上80後和90後開發者分享的分散式系統下的壓測、監控和可用性的話題,free talk期間,還和年輕程式設計師聊起了演算法、架構和開發效率的話題。
參會網友:這幾年總能看到一些關於大齡程式設計師職業危機的話題,看到這位老爺子之後,心安定了很多。
編者按:年齡是一個永恆的話題,不論是演員、運動員,或是身邊的程式設計師。歲月帶來了經驗上的積累和慮事的周全,但也帶走了年輕時候的體力和衝勁。
技術變化太快,大齡程式設計師對新技術的興趣、學習和接受能力可能不如以前,年齡成為大齡程式設計師走出舒適區最大的障礙之一。但我們身邊總會有一些年齡雖長,依舊保持樂觀、皮實、自省的前輩,不斷的進行自我迭代,跳出舒適區,我想,這是否就是技術成長道路上最為關鍵的品質?本文整理自70後程序員至簡於2012年底寫的一篇部落格,時間雖然有點久遠,
正文
↓
時至今日的職場生涯中,每當我與同事分享自己的成長經歷,總會有人為之振奮(希望你讀這篇文章時也能感受到),或許以我的成長經歷作為本文的寫作主線是一個不錯的選擇!通過這篇文章,你可以看到一個1997年畢業的大專生(畢業於南昌水利水電高等專科學校,現更名為南昌工程學院)、一個在高二時英語還只考29分的人,是如何一步一步成為Motorola的軟體架構師的。(至簡目前就職於阿里巴巴中介軟體團隊)
在繼續讀下去之前,讀者應認識到一點:個人觀點的獨特性與自身的成長經歷有很大的關係。因此,千萬不要盲從,而應時刻保持一種批判接受的態度。或者說,你得有自己的觀點,你(也只有你自己)得對自己的職業發展負責!另外,文章主線是自傳形式,如果你對我的成長經歷不感興趣,可以快速地略讀,只關注文中highlight的24點職場感悟。
學生時代
故事的開始得從大學以前開始。從小受“學好數理化,走遍天下都不怕”觀念的影響,我認為只要學好數理化就行了,所以偏科很嚴重,高二時英語還考過29分。那時也不愛讀書,高三時,別的同學在複習,我卻在看《電晶體技術》這類電子技術書。這種狀態,直接的結果就是第一次高考落榜了。
落榜的那個暑假,父母為我的出路沒少操心。在一天早晨刷牙時,當我媽對我說希望我去復讀時,我當時腦海裡想“能像表哥那樣考上大學那該多好啊!”,在這個念頭驅使下,我答應了去復讀。從那天開始,我頓悟了,真正知道自己要什麼了。在復讀的一年裡,我學到的一種重要能力是— 自學,這為以後大學乃至職場學習打下了很好的基礎。正因如此,我想給出:
我的職場第一感悟:自學能力是競爭力之本。
經過復讀,高考總成績提高了100多分,但也只夠專科線。最終,我被南昌水利水高等專科學校錄取,專業是“供用電技術”。這個專業相信很多人不知其然,其實就是電力自動化的變種專業,其專業內容主要是電站、發電廠高電壓的繼電保護技術。
©tom-hermans
大學讀書期間,我開始有與人在成績上一爭高下的念頭了,加上覆讀一年所獲得的自學能力,以及自己的努力,學習相當輕鬆,尤其是隻要與電子技術沾邊的課程,都能輕鬆地拔得頭籌。三年共六個學期的學習,我拿了五個一等獎學金,一個二等獎學金。畢業時,我是系裡唯一的一名優秀畢業生。期間通過了大學英語四級考試和計算機二級考試,獲得了江西省電子技能比賽一等獎。需要提及的是,在大學期間所學的與計算機相關的課程只有:《電子技術基礎》、《計算機組成原理》、《計算機軟體基礎》、《微控制器技術》和《Basic程式語言》。
第一份工作 - 電氣設計工程師
在大學期間,我還完成了人生很重要的一件事 — 找好了現在的妻子。由於她是浙江人,所以畢業時工作地點毫不猶豫地選擇了杭州。那時很多同學的工作還是包分配的,而我來到了杭州的人才市場進行雙向選擇,那時找一份工作還是相對輕鬆的(注:我們大學錄取那年的招生人數是90多萬),投出一份簡歷就找好了工作。第一個工作單位是一家不到100人、地處杭州花港觀魚對面(三臺山)的電力裝置製造民企。
儘管選擇去這家民企後立馬到公司去做了實地調查,但由於沒有社會經驗,加上被問的人沒如實反應,所以進入這家民企後所瞭解的情況讓人大跌眼鏡。另外也瞭解到單位會通過一些不入流的做法控制我們的戶口,不讓我們跳槽(那會兒的戶口還是相當重要的,結婚要戶口證明,有同事就因為戶口被控制而登記不了)。而我們在進入這家單位時簽訂了六年的勞動合同。在這樣的小企業幹上六年意味著什麼?!當時與家人打電話告知這一狀況時,我都哭出來了(就在現在楊公堤與虎跑路交叉的、現早已不存在的一個電話亭裡,記憶猶新呀!)。
儘管前途是那樣的渺茫,但帶有“優秀畢業生光環”的我仍堅信自己能做得比別人更好,因為有我的:
我的職場第二感悟:自信能讓你與眾不同,儘管有時的自信有點莫名其妙。
在這個企業一開始的工作職責是電站裝置的電氣設計工程師,需要AutoCAD(到單位後學的)設計電氣圖紙,並指導工人最終完成電氣裝置裝配及除錯。期間,企業經營範圍擴大,需要從事電子裝置的生產,因此我開始有機會接觸電子技術方面的設計工作。在兄弟單位一同事的幫助下,在一個星期內我掌握瞭如何用Tango(後來更名為Protel,現在的名稱是Altium Designer)進行原理圖和PCB線路板設計。而且,這一個星期的設計結果最終成為了電氣產品的一個部件。對於一個畢業不到一年的我來說,這是不小的進步。那時知道了什麼是網路表、過孔、焊盤等,掌握了很多電子原件的工作原理(有的還自己用麵包板做實驗),明白了做電路板的大致業務流程,還能動手焊接電路板,熟練運用示波器和萬用表進行除錯。那段時間,我對電子技術的興趣幫上了大忙,學習起來遠比別人快。當我精通電路原理,能自如運用示波器和萬用表除錯電子產品時,別人卻還不明白我的除錯動機。
我的職場第三感悟:興趣是學習效率的催化劑,培養自己的職業興趣。
第一次真正對程式設計感興趣是從知道PLC(Programming Logic Controller)開始的。當時的電站裝置採用了三菱的PLC,為了配合這一電氣產品的需要,企業社招了一名懂PLC程式設計的工程師。由於老闆擔心我們相互學技術而“翅膀變硬”,所以明確提出工程師所掌握的技能不能互通有無。當時看到這位兄弟能通過“梯形圖”改變PLC的行為,真是覺得他太神氣了,仰慕不已。後來通過這位兄弟的私下幫助(哥們呀!),我晚上偷偷地在廠房裡面學習PLC程式設計。為了獲得良好的學習效果,我設定了對電氣產品的PLC程式進行重寫的目標,且最終達成了這一目標(當然,由於這個目標不能讓老闆知道,所以我的PLC程式不能用於商用)。
我的職場第四感悟:學習應給自己設定虛擬的專案目標,以做專案的形式提升學習效果,只有這樣學到的內容才會深入而實用,切忌無目標地學到哪算哪。
從電氣產品的技術負責人到軟體工程師
一年多的功夫,我成為了某電氣產品的技術負責人,對整個產品的所有技術細節都瞭如指掌,我帶領了其他幾個工程師實現了該產品的“自主研發”。有趣的一件事是,老闆當時並不知道我已經“翅膀硬了”,想抵賴答應過的8000元專案獎金,年輕氣盛的我在與之拍完桌子之後對其他工程師下令:“沒有我的允許,誰也不能將電氣圖紙和電路原理圖用於生產”(因為年經,所以二!)。對抗的結果以老闆兌現承諾而告終。這時我隱約地有了:
我的職場第五感悟:話語權首先來自能力,而不是職位權力。
我那時還學會了CRC演算法並將之運用於PLC的串列埠通訊中,但對於計算機如何通過串列埠與PLC通訊獲得採集資料存在很大的好奇心。於是想到了學習程式語言,並計劃做一個能在計算機上實時顯示PLC所採集資料的軟體。在向PLC程式設計的兄弟表達了這一想法後,他給我的建議是:學習C語言比較難,Basic語言則更容易。於是,我毫不猶豫地選擇了自學C語言,因為我深信:
我的職場第六感悟:難學的技能一旦掌握更具競爭優勢。
也正是從那時開始,我真正開始了成為軟體工程師的自學旅程。那時比較幸運的是,單位專為我配備了工作電腦,所以具備了自學的硬體條件。由於那時Internet還不普及,學習書籍都來自浙江大學的科海書店(後來眼見著它的店面越來越小,這也是進入電子商務時代的一個縮影),那時隔三叉五地到科海去找書,生活最大的花費就在於購書(那時這方面的書不少是質次價高)。當然,學習的過程或多或少還得瞞著老闆。那段時間,別人午休我就程式設計,除了看書和做書後的習題,還一直朝實現自己的計算機監控軟體這個目標邁進(參見我的職場第四感悟)。
©fancycrave
終於有一天,我用Turbo C在DOS環境下實現了具有串列埠通訊功能的、基於圖形介面的監控軟體(如果你用現在的眼光看那個軟體,一定會說“很土”)。當我樂此不疲地向他人演示時,你可以想象我那時有多高興和自豪!這種小小的成功助長了我的信心,也讓我感受到了:
我的職場第七感悟:用階段性成果不斷增強自己的自信,且最終支援自信的是能力,而不是自大。
嚐到了成功甜頭的我隨後拓展了自己就軟體開發方面的學習內容。那時的我已經下定決心要向軟體開發方向發展,這種選擇是因為:
我的職場第八感悟:做自己喜歡的事,如果那是自己的興趣最好。
我的第一份專職軟體工程師工作
1999年的某月,在企業拖欠了一個月工資的情形下,“蓄謀”逃離企業束縛的我們(共19個工程師)經過幾個月的勞動仲裁後,與企業解除了勞動合同。在離開這家民企的第二天,1999年11月的某天,我在浙江大立機電技術開發公司(即現在的大立科技。後面都簡稱為大立公司)找到了第一份專職的軟體開發工作。我逃離束縛後能很快地找到新的支點,完全得感謝我的:
我的職場第九感悟:不論身處多麼困難的環境,即使覺得前途渺茫,也不要放棄學習,否則就是“自斷筋脈”。
©caspar-rubin
在大立公司所參與的第一個軟體專案,是使用Visual C++從事Windows某變電站影象監控桌面軟體的開發。儘管我之前自學過C++語言,但那時並未完全掌握面向物件程式設計,尤其是其中的多型。我在該桌面軟體中借鑑微軟的示例軟體DrawCli,獨立地實現了電子地圖功能。正是通過掌握這個示例軟體的設計與實現,我真正領悟到了面向物件設計的好處。也通過該影象監控桌面軟體的開發經歷,掌握了Windows VxD驅動開發、Socket通訊、多執行緒程式設計、影象處理(銳化、偽彩處理、影象字元識別和影象對比等)、ODBC資料庫程式設計(用的是SQL Server)等。
©thomas
這裡要插一個與我妻子相關的小故事。她是我大學的同班同學,畢業以後進了諸暨供電局從事農網預算工作。我在第一家民企工作時,時常往返於兩地,有時覺得很是辛苦。另外,妻子在供電局安逸的工作環境下,時常會開玩笑說老了要是下崗了都不知能幹什麼。
在我進入大立公司不到一年的時間裡,我向公司提出了可否讓她到公司來從事軟體開發工作。當時在我妻子沒有任何面試和程式設計經驗(她當時只自學了譚浩強老師的《C程式設計》和一本C++的書,忘記書名了)的情況下,公司讓她過來了,我想這是緣於公司對我的器重(這裡要謝謝龐總和章總兩位老總!)。自然,我成了妻子學習程式設計的老師。我的岳父岳母當時對於妻子放棄供電局的工作儘管不捨,但還是尊重了我們的想法,謝謝他們的開明。支援我們做出這一決定,除了為了解決兩地分居問題,還有:
我的職場第十感悟:長期安逸的工作意味著將來更大的風險。
我在大立公司的職業機遇
在妻子進入大立公司不久,由我擔綱了新版影象監控軟體的重新開發,這是我第一次擔任軟體專案負責人。在這個專案上,我可以從技術層面盡情發揮,將我在老版本軟體上所看到的設計不足完全克服。也正是通過這個軟體專案,我的面向物件程式設計能力有了很大的提高,而且完整地做過了一個軟體產品。用我現在的眼光來看:那時的開發工作除了引入了版本控制軟體外,是不折不扣的作坊式軟體開發;至於管理技能的提高,也可以說是微乎其微。
©rawpixel
2000年底,大立公司因為業務拓展的需要,需開發嵌入式影象監控系統(系統中的前端產品是後來數字硬碟錄象機的前身)。為此,公司社招了一位比我年長十歲的資深硬體開發工程師,他在進公司時已經有基於AMD的Elan SC520 x86嵌入式微控制器的硬體開發經驗。他在進公司之初與章總交談時指出:“做這類嵌入式產品,需要軟體功底非常強的人”,章總的回答是:“你放心好了,我一定找一個最好的人與你搭檔”(章總後來告訴我的)。是的,所找的那個人就是我!而其實那時我只有用Visual C++從事Windows桌面軟體的開發經驗,可見公司領導對我能力之信任!
我的職場第十一感悟:機遇很重要,但你得有能力才能抓住它。
我當時所面臨的技術挑戰,讀者可以想象。要知道,在2000年時基於x86微控制器的嵌入式系統的開發人員國內還很少。我的自學能力、電子愛好的興趣在這種挑戰面前又幫了大忙。其實,做嵌入式系統開發最主要的是參考各種資料以便掌握各類技術細節,這得通過大量地閱讀晶片手冊、使用者手冊,以及研究AMD在其官網上所提供的示例程式。在這個過程中,就技術困惑堅持探究和養成各種好的工作習慣(思考習慣、筆記習慣、總結習慣、閱讀習慣)非常重要。
我的職場第十二感悟:職場首先比拼的不是智商,而是堅持與好習慣。
我獨自完成了該嵌入式前端產品上的軟體開發工作。其中包含的大致技術內容有:從程式設計的角度精通x86處理器架構; PCI、IDE硬碟、網絡卡、串列埠、快閃記憶體等匯流排或外設的驅動;實時作業系統核心的移植工作;MINUX作業系統的檔案系統的移植; XINU作業系統的TCP/IP協議棧的移植工作。移植工作往往會碰到各種技術細節問題,等移植工作完成,對被移植模組的實現和背後的原理也已瞭如指掌。正應如此,這一時期的工作讓我對作業系統的實現原理有了很深的理解。
©fancycrave
除了軟體方面的進步,我在大立公司時的硬體知識也得到了很強擴充。不僅能輕鬆地閱讀數位電路原理圖,還自學了VHDL語言,使得拿到邏輯器件CPLD的VHDL程式就能除錯軟體(通過VHDL程式,可以瞭解程式設計所需的譯碼埠、相關訊號的操作時序等)。還學會了如何使用邏輯分析儀輔助軟體除錯工作。前面提到的這位兄長式硬體工程師調侃我說:“你讓我看到了中國軟體的希望!”,而我將這話當成了對自己的鼓勵。另外,這期間還考入了浙江大學專升本的通訊工程專業,給自己充電(2001年入學,2004年畢業,獲多學期“優秀學生”和“優秀畢業設計”)。
入職 UTSarcom
由於大立公司是浙江省測試技術研究所的子公司,它或多或少帶有事業單位的氣息。加上公司的技術舞臺有限,以及妻子也在同一家公司工作,我於2003年4月份左右離開了大立公司。在我離開之前,浙江省科委已批覆了公司的申請,分配給我一套福利房。在我離開之時,房子仍在建,不少同事對於我的離職很是不解,也勸我拿到房再走。但我有:
我的職場第十三感悟:當短期利益與長遠利益無法得兼時,選擇長遠利益。
在大立公司工作期間,很希望自己能入職UTStarcom這樣的通訊企業(那時的UTStarcom是多麼地輝煌!)。計劃離開大立公司之際,我向UTStarcom提交了求職簡歷。這次求職開始好像很順利,但到我真正入職UTStarcom的過程卻很是曲折。
©benjamin
一開始當我收到UTStartcom的面試通知時,可能太希望能進入這個公司了,在沒有很深入瞭解這個崗位的前提下,就去面試了,且馬上拿到了Offer。但後來才瞭解到,我拿到的是生產部測試開發崗位,與實際研發部門是有區別的。 當時很糾結 — 這是我想進的公司,但卻不是我想要的崗位。如果拒絕生產部的Offer,我很有可能與UTStarcom無緣。考慮再三,我還是選擇了拒絕(參見我的職場第十三感悟)。並重新向研發部門投了簡歷。
經過度日如年的一個多月等待(那會兒剛好發生了SARS疫情),在覺得入職UTStarcom研發部門無望的情況下,我入職了另外一家小公司。令人意外的是,在入職那家公司的第二天,我收到了UTStarcom研發部門的面試通知。在HR面試的那一輪中,HR對我說,“你是我所面試的人中最有工作激情的”。那時的技術面試官中,其中一位是我日後入職後的上司 — 夏青,他是我的伯樂。由於我的學歷問題,在技術面試通過後,別人只要一位VP面試通過就行,我卻需要兩位。
我的職場第十四感悟:學歷是很重要的敲門磚,即便你的能力很強;學歷儘管很重要,但能力才是最終的通行證。
2003年6月份左右,我正式入職UTStarcom研發部,從事小靈通基站控制器(後面簡稱為基站控制器)的軟體開發工作,也從此踏入通訊行業。在入職之初,由於自認為對於作業系統的原理很精通,又完整地做過軟體專案,有點飄飄然,覺得自己是個“小牛牛”。然而,入職後一接觸工作就發現,內容沒有想象的那麼簡單!
©mario
首先,基站控制器的軟體規模比我以前主導開發的專案要大很多,而且需要熟悉通訊行業的相關信令。其次,儘管我那時精通x86處理器,基站控制器用的卻是PowerPC 8250,這意味著我得重新掌握它。再次,實時作業系統用的是前美國軍方的、開源的RTEMS,那是我第一次接觸。最後,UTStarcom的工作語言是英語,寫文件和郵件都得用英語。儘管我那時能無障礙地閱讀MSDN和各類晶片手冊,但要著手寫,卻是一大挑戰(口語不作要求,因為不需直接接觸老外)。
一入職所分配的工作是網元網管部分告警抑制軟體模組的開發。儘管PowerPC處理器和RTEMS作業系統技術細節的掌握與否並不影響日常開發工作,但我仍將掌握它們作為自己的努力目標,因為:
我的職場第十五感悟:技術細節掌握得越深,解決問題時就越能遊刃有餘。
那時工作時間應付日常開發工作,業餘時間則先將精力集中放在熟讀PowerPC 8250處理器相關的技術手冊上(晚上還得上夜大)。加起來超過2000頁的英文資料,我讀了不少於3遍。隨著時間的推移,當我對PowerPC 8250處理器很有感覺之後,我將工作重點轉移到了熟悉RTEMS作業系統的實現細節上。先處理器後作業系統的學習安排,是基於我以往在x86處理器上的工作經驗而得出的,也是因為:
我的職場第十六感悟:技能的發展應採取深度先於廣度且交替進行的方式,只有這樣,面對大量的新知識才能更淡定。
RTEMS是一個類UNIX的實時作業系統,也正因為接觸這個作業系統我才意識到了自己在軟體設計能力上存在很大的提升空間。儘管我對作業系統的實現原理胸有成竹,但卻無力於構建一個象RTEMS那樣優雅的作業系統,也真切地體會到了RTEMS的設計之美。那時基站控制器上執行的RTEMS作業系統是由美國的新澤西研發中心移植好的,杭州研發中心只需在之上做應用開發。為了就RTEMS作業系統獲得更好的學習效果,我又一次運用了我的職場第四感悟,設定了自己完成RTEMS新版本移植這一目標。
RTEMS新版本的移植工作雖不在公司的日常工作範圍內,但卻得到了上司的支援。由於那時RTEMS還在開發新的功能,並不是很穩定,在移植過程中碰到各種奇怪的問題,有些問題還與GNU的binutils工具集有關(binutils中包括nm、ld、objdump等工具。RTEMS是用GCC編譯的)。在無法確認是GNU工具集的問題之前,我甚至還向Wind River公司(其知名產品是VxWorks實時作業系統)尋求過幫助,因為那時用的是它的JTAG模擬器。移植工作雖曲折,但最終還是成功了(我所移植的版本並沒有運用到產品中,後來的同事又做過了RTEMS4.6.0pre4的移植,且運用於產品中)。這一移植經歷,讓我對GNU的binutils、RTEMS作業系統的實現有了更為深入地掌握。
在UTStarcom工作的前期,我大多從事的是RTEMS作業系統相關的程式碼維護工作,工作內容除了OS核心,還包括FTP、Telnet等協議。直到中期轉為做E-Box產品的網際網路接入模組的開發工作。
E-Box是一個企業級電話交換產品,其中還存在一塊基於ADSL的網際網路接入資料板(與現在的ADSL貓功能一樣),用於實現企業網對網際網路的資料接入功能,這一資料板使用的是VxWorks5.5.0實時作業系統(PNE 2.0),處理器是Intel的XScale IXP425。那時VxWorks的IP協議棧還是基於BSD的,但Wind River對之做了一定增強。這段時期我的工作重點全在IP協議棧上(《TCP/IP詳解》這套書幫上了大忙)。這一時期的開發經歷,讓我對PNE的Bridge、FastPath、MUX、PPPoE協議、Radix路由演算法和VLAN協議很熟悉,也學會了用SmartBit儀器和Chariot軟體做網路效能測試。總之,讓我對IP(v4)協議棧方面的知識和軟體實現有了長足的進步。
E-Box產品資料板上的開發工作進行了半年後,管理層決定放棄,於是我被調到了E-Box產品的軟體平臺組。那時平臺組剛好面臨一個比較麻煩的問題 — 在命令列上執行reboot命令後,有時會出現整個系統掛起,而不是期望的重啟。平臺組的同事花了一個多星期的時間仍沒有解決這一問題。
進入平臺組之際,同樣是在沒有任何人安排的情況下,我自己主動承擔解決reboot命令功能異常的工作。在我的職業生涯中,我一直熱衷於去解決別人難以解決的技術問題,因為:
我的職場第十七感悟:越難的技術問題,其所蘊藏的知識越豐富,也越具學習價值。
經過一天半的時間,問題被解決了。其根源在於,reboot之前沒有禁用CPM協處理器。我能那麼快地解決這一問題,完全是因為之前熟讀過PowerPC 8250處理器的資料。
我在UTStarcom工作的後期,致力於ACE在E-Box產品中的一些應用,藉助ACE的網路通訊功能幫助實現在Windows平臺上通過Visual Studio除錯E-Box產品。我在《專業嵌入式軟體開發》一書的《可開發性設計,一種高效且經濟的開發模式》一章中所闡述的內容其實就是這一工作經歷的總結與延伸。
©sergey
另外,我還在E-Box產品上做過難度比較大的一個特性是,利用PowerPC 8250的MMU功能在VxWorks作業系統上實現了對任務棧的保護 — 當一個任務被排程而處於執行狀態時,它的棧就處於可讀寫狀態,而其他任務的棧全處於只讀狀態(VxWorks5.5.0核心中,還沒有RealTime Process的概念,這一概念是從6.0開始有的,所以那時我所做的這一特性很具實用性)。通過這一特性,可以有效地防止任務棧被意外篡改(比如野指標操作),即便出現篡改也能儘早發現根源。這個功能的實現過程需要除錯VxWorks核心,那時VxWorks的原始碼雖對公司提供,但Wind River公司對所提供的GNU的binutils做了特殊處理,使得無法為核心程式碼生成除錯所需的資訊,結果是無法對核心進行原始碼級程式除錯。由於我之前的RTEMS作業系統移植經歷讓我對binutils非常熟悉,通過使用一定的方法(說來話長了)繞過了Wind River公司所設定的障礙,成功地實現了對VxWorks的原始碼級程式除錯。
在職場中,我不時能成功解決複雜問題和克服技術障礙。
我的職場第十八感悟:每次積累的點滴知識,一定會在將來不知不覺地發揮效能。
短暫停留的杭州華數-雷科通
2006年4月份左右,我離開了UTStarcom。在UTStarcom所學到的,不只是前面所介紹的那些技術知識,更讓我知道了軟體開發的“正規軍”是怎樣的,與小公司相比,UTStarcom的軟體開發流程要正規得多;也經歷了英文寫作的“擠牙膏”時期過渡到輕鬆時期(好友周海東在我的英語學習中幫了不少忙);看到了好友于善成如何通過大量閱讀成為一個知識淵博的人(他的閱讀量現在仍是我的學習榜樣);還有上司夏青的技術敏感度到現在仍讓我為之稱道,是我職場至今所見過的二位具有良好技術敏感度的技術管理者之一(另一位是我在Motorola工作期間認識的,後面會談到他);團隊實力之強使得開發出的E-Box產品在我離開UTStarcom後不時能聽到正面的評價。
對了,我在大立公司工作時期,就很注重軟體設計文件的編寫,而且在我離開之時,不僅完善了所有文件,還為後繼同事做了全面的培訓。我始終堅守:
我的職場第十九感悟:通過文件化的方式傳承知識給後繼者是你的基本責任,因為你作為後繼者時也希望如此,這也是對自己負責的一種表現。
在UTStarcom工作期間,我進一步形成了將自己的技術想法寫成文章與大家分享的習慣(那時同事賀旭東稱我為“作家”,而我則稱他為“點評家),也因為自己在嵌入式軟體開發技術上的長期點滴積累,開始有了寫書的想法。
©ross
離開UTStarcom後,我入職了杭州華數集團旗下的雷科通技術(杭州)有限公司。公司當時的意向是安排我負責某寬頻接入產品的軟體開發工作。在這個公司,儘管只有兩個月的時間但也做了些事。除了一個月內完成了寬頻接入產品乙太網交換晶片在VxWorks作業系統上的驅動開發,並使得產品支援VLAN功能外,還解決了好幾個影響整個產品系統穩定性的嚴重遺留缺陷。這兩個月的工作不光讓我在技術團隊中很快地樹立了自己的威望,也使得公司高層管理者真切地看到了我的能力而在我提出離開時極力地挽留。這短暫兩個月的工作經歷帶給:
我職場第二十感悟:別人對你價值的認可,其實不是簡單地根據你的自身能力,而是根據你對他人和團隊的貢獻。
加入 Motorola
入職2006年初在杭州成立的Motorola研發中心的故事得從面試開始。在入職雷科通不久,我收到了獵頭的電話,雖然那時並沒有換工作的想法,但也沒有拒絕獵頭投簡歷。隨後我收到了Motorola的面試電話。那次面試過程記得很清楚,因為那是我所經歷的第一次英語口語技術面試。雖然工作中從沒有鍛鍊過英語口語,好在對於自己做過的技術知識很熟悉,也經常需要查閱英文資料,所以對於所做過的內容還能用英語勉強解釋清楚。在面試的最後,我對印裔技術面試官說,“現在我的英語口語不好,但我相信只要有合適的環境,能很快地提高”。印裔技術面試官最後將我領到HR那,說了一聲“Yes” — 我的技術面試通過了!
©sven
面試結束的第二天,收到了Motorola HR的電話,告知Offer的相關資訊(我的入職級別是E09,E09及以上的人在整個Motorola杭州研發中心佔比大約為10%)。那時由於並沒有換工作的想法,所以拒絕了Offer。想法很簡單,因為曾在UTStarcom這樣的公司呆過了,所以對外企的工作並不是很嚮往,反而認為在雷科通這種小公司更能施展。在我拒絕了Motorola的Offer後,我將這件事告訴了身邊的同事,他們的反饋幾乎都是“你應當去Motorola”。
幸運的是,另一名HR再一次致電給我,試圖說服我加入Motorola。她當時說“你一旦加入Motorola,以後離開時所看到的就是HP或IBM這樣的大公司”,也正是這句話打動了我。之後的經歷證明,加入Motorola是很正確的一個選擇!
2006年7月6日,我正式入職Motorola杭州研發中心。加入的初期是大量的內部培訓,培訓內容包括技術方面的、流程方面的和英語。Motorola有著成熟的企業文化,通過培訓可以讓工程師很快地融入企業,使人行事象是Motorolan(摩托羅拉人)。在經歷了約半年的培訓和學習後,2006年底,我開始參與WiMAX產品線上的CLA中介軟體軟體專案。
儘管我在CLA專案上沒有具體的工作(比如,沒有缺陷修復工作會分配給我,也沒有新的特性開發工作會掛在我的名下),但對整個團隊所從事的技術工作都得負責。我的日常工作主要是設計方案評審、程式碼審查、幫助或帶領團隊解決技術難題等。
在CLA專案上工作了一個月左右,2007年春節之後,我被第一位派到Motorola的芝加哥研發中心做為期二個月的現場技術支援。之前儘管在公司有過英語培訓,但要很好地聽與說還是存在很大的障礙,加上芝加哥那邊一起工作的是口音較重的印度人和巴基斯坦人,挑戰可以想象。在芝加哥研發中心除了做現場技術支援,還得為後續人員的到來做鋪墊。比如,租好房子、車子,準備好生活所需的一些家當(當時因為預算有限,我們住的是公寓,還得自己燒飯)。那段時間雖然因為語言的問題倍感壓力,但在全英文的環境中,我的聽說能力進步也明顯。之後差不多每年一次的出國,見到以前認識的外國同事,總會有人對我說“Your English is getting better”。對於自認為英語聽說能力不行的同仁,請記住:
我的職場第二十一感悟:英語的聽說能力只要有合適的環境,並勇於張嘴練習的情況下能快速地提高,不必擔心。
CLA軟體在技術上屬於運行於Linux作業系統上的一箇中間件,它存在多個程序用於幫助通訊裝置網元(包括WiMAX基站和接入閘道器)實現網管功能。由於軟體架構的特點,使得CLA團隊不時會碰到由於其他團隊沒有用好CLA而產生的技術問題,這類問題開始大多難以定位是屬於CLA的、還是不屬於CLA的,因而查錯過程很低效。在CLA專案的後期,我希望通過引入新的軟體設計方案幫助團隊提高軟體的查錯能力,並改善軟體質量。引入新設計需要增加很多程式碼,如何讓管理層不擔心由此而引入更多的缺陷是我著力這事時首先要考慮和解決的問題。
在這種背景下,我在CLA專案引入了單元測試,寄希望於通過單元測試提高新增程式碼的質量,以使管理層更具信心而獲得他們強有力的支援。最終結果表明,在新增了近一萬行程式碼的情況下,程式碼在最終釋出後總共只發現了一個軟體缺陷。這個專案上的工作經歷讓我第一次真正嚐到了單元測試的甜頭,在《專業嵌入式軟體開發》一書中,就單元測試方面的內容很多源於我在這一專案上的成功經驗。我在CLA上新增設計中的AED(Abnormal Exiting Detection)功能,在我離開CLA專案之後,還幫助團隊發現了很隱蔽的多執行緒問題。當通過AED功能發現這一問題的同事高興地跑過來對我說這個功能管用時,我的高興勁寫滿了整張臉。這個專案的經歷,也讓我更加堅信:
我的職場第二十二感悟:在軟體開發活動中,應設法通過有效的技術途徑去解決工程困境。
軟體開發架構師 - 幫助團隊成長
2009年初,Motorola杭州研發中心迎來了一個重量級專案 — WiMAX產品線的接入閘道器ASN-GW,我被安排到該專案,角色是軟體開發架構師。初期我的架構師一職只是杭州研發中心單方面的角色安排,而非全球性的(當時該產品由美國、印度和中國三個研發中心共同參與)。
在ASN-GW專案上與我一同共事的經理,是曾在Motorola美國研發中心呆了近十年、後來臨時轉到國內來工作的華人李亮(後面簡稱亮,習慣了)。他之前在美國工作時做過架構師、軟體釋出經理(Release Manager)等職,是一個對技術很有敏感度的管理者(我前面提到過的兩位有技術敏感度的管理者之一)。我在此之後的成長,完全離不開他的支援與信任,以及他為我所創造的職場發展環境,能與他共事讓我倍感榮幸和感激。
©daniele
我從亮身上學到的第一個內容是如何與美國管理層打交道。總體說來,Motorola在軟體開發管理方面很是四平八穩,其管理存在兩大特色,一是爭奪專案的所有權(Ownership),另一個是質疑(Challenge)。前者使得各團隊職責清晰,不容易出現突發問題或狀況找不到負責人;後者使得團隊在工作中有所作為,不至於讓人渾水摸魚。在面對美國團隊的質疑時,我以前看到的大多管理者都很緊張,總想一味地達到美國方面的要求,但亮在這方面的表現卻明顯不同。他告訴我們(包括Team Lead),“如果美國提的要求不合理,直接與他們‘掰’”。後來我認識到,美國方面做事其實很講邏輯,只要我們對於他們所質疑的問題能給出合理的解釋,很多異常事件根本就沒什麼大不了。
我的職場第二十三感悟:不要用沉默的方式一味地迎合別人的要求,據理力爭或許才是作為的表現。
參與ASN-GW的呼叫處理子系統的開發工作後,整個團隊經歷了大約半年的成長痛苦。痛苦的根源,一是對WiMAX無線接入技術相關的國際標準不熟悉,另外則是對ASN-GW產品的現有實現不瞭解,而且產品的複雜度的確很大(其中一個技術指標是:必須達到99.999%的容錯能力)。在半年的痛苦期中,我很重要的一個工作職責是幫助團隊成長,作為亮這類管理層與基層工程師間的橋樑。比如,為團隊起草《開發者指南》和《測試指南》這樣的文件,且要求和引導工程師通過文件化的形式沉澱經驗與教訓,以便提高工作效率(雖然文件化方法的實施過程需要我不斷地提醒,但這一方法被證明在這種時期很有效);我也會在例會上毫不留情地指出工程師的哪些行為影響了工作效率。
我的職場第二十四感悟:流程、文件的作用,不只是引導我們做完事,更能規範我們的行為和幫助培養工作習慣。
亮在專案進展的過程中,一直向美國方面主張杭州團隊必須設定架構師一職,也正是由於亮的一再爭取,美國方面最終努力地幫助我向這個方向發展,不斷為我分派屬於架構師工作的任務(如更新產品架構模型、參與需求管理、參與系統設計文件的評審、完成新特性開發工作評估等)。亮那時告訴我,我應是杭州研發中心第一個真正從事架構師工作的人。
©javier
剛接觸架構師方面的工作時,其實還是不大自信的,儘管我那時掌握了軟體架構師所需的基礎技術技能(比如,我的軟體設計能力很強、UML從1998年開始接觸加上之後的持續學習所以功底也很好),但對於軟體研發管理方面的內容,以及WiMAX無線接入技術知識的系統性認識還是相對單薄的。
那時與美國同事接觸下來的感覺是,他們的綜合能力都很強,似乎隨便一個人都知道如何做架構師,不少人有做GSM、iDen和CDMA產品的經驗,而且長期工作於無線接入技術領域。隨著更多地參與架構師方面的工作,不僅逐漸建立了自信,對Motorola的軟體研發管理也有了更為深入地認識與理解。所看到的不僅僅是產品技術本身的複雜度,更有開發活動運作管理方面的複雜度。最終,我成為了整個ASN-GW產品的架構師。
工作、學習和寫作
在2009年,我考入了浙江大學的MBA,同時還開始著手寫自己的處女作《專業嵌入式軟體開發》。在之後長達近兩年的工作、學習和寫作的三重壓力下,我在時間管理上有很大的進步,抗壓能力也得到了很好的鍛鍊,這時我的職場第十二感悟(指其中的堅持)又讓我最終渡過了這段最為艱難的時期。
2010年中期,NSN宣佈收購我所在的Motorola網路部門,收購活動直到2011年的4月份才結束。同時由於WiMAX市場的不景氣,美國不少系統架構師轉到了FDD-LTE產品線上,我也因為這一緣故擔任了大約半年的系統架構師,主要負責WiMAX技術的移動性與網路安全方面的工作。
2012年7月份,因為WiMAX產品線裁員,我轉到了NSN的WCDMA產品線。也從此開始離開了Motorola的研發管理環境,而真正步入了NSN的研發管理環境。
真感謝你花時間讀到這!儘管我們常將“職業規劃”掛在嘴邊,實際上職場發展真的是一種“布朗運動”。你不知道下一站會是哪、也不知道後面將要從事什麼工作、更不清楚後面會碰到怎樣的老闆。在眾多不確定因素面前,或許參照我一路走來所總結出的職場感悟能讓你不斷地朝好的方向發展。