1. 程式人生 > >老兵不死,只是凋零:前九枝蘭架構師王曉輝

老兵不死,只是凋零:前九枝蘭架構師王曉輝


他曾是以一位人民教師,他是程式開發界的一名老兵,你可能沒有聽過他,他有著十多年的開發經驗,先後在做過計算機老師,並且在私企、外企、網際網路公司、創業公司裡做程式開發和技術管理工作。
“惟正己可以化人,惟盡己可以服人。”他就是本期程式設計師客棧專訪前九枝蘭架構師:王曉輝,https://www.proginn.com/wo/60090

程式設計師客棧王鑫:我還是叫你老師吧,您先做個自我介紹

王曉輝:大家好,我是王曉輝,畢業後當過兩年的高中老師,於2006年辭職到北京從事專業程式開發工作,至今已10年,先後在私企、外企、網際網路公司、創業公司裡做程式開發和技術管理工作。做過的專案包括個人PC安全軟體、自然語言處理(KNLP)、移動電信聯通閘道器業務、數字證書認證系統、安全資料代理軟體、自動化營銷SaaS系統,在Windows和Linux下均積累了豐富的開發和專案管理經驗。

程式設計師客棧王鑫:像您應該很早就接觸到開發了吧?能說說當時你們的大學生活嗎?

王曉輝:現在想想還是很還念那時候的時光啊,我畢業於信陽師範學院電腦科學與技術專業,信陽師範學院只屬於二本院校,所以名氣不大,但學風很好,大學四年為我打下了紮實的計算機理論功底,再加上當時跟同學經常一起泡在學校外面的電腦培訓班(學校裡面的上機課嚴重不夠啊)裡學習各種程式設計技巧,從Basic到Pascal,再到C、Visual Basic、Visual FoxPro,到最後的C++/MFC,都自學自畫的捯飭過。

程式設計師客棧王鑫:您都在哪些公司就職過,能分享一下嗎?

王曉輝:2006年辭去老家高中老師的工作,隻身來到北京,開始第一份純技術開發工作,這是一傢俬企:北京卡斯特資訊科技有限公司,既有自己的產品(個人PC安全軟體),又做外包業務。我在公司裡做了大半年自己公司的產品後,就被外派到日企佳能(Canon)公司,開始做一個韓文自然語言處理(KNLP)的專案,這一做就是兩年多。

在這裡,我首次經歷了一個完整的專案週期——需求分析、概要設計、詳細設計、編碼、單元測試、系統測試、驗收測試。我的C/C++/MFC技能在那裡得到了一次質的提升,雖然之前看了很多的書和做了很多練習,但都跟實際的專案經驗差別甚大。核心的底層模組都是用C語言完成的,而且要求跨平臺執行,所以在這裡也首次開始在Linux系統下做開發,首次使用VIM+GCC+GDB的組合方式來開發除錯程式。

上層的UI是用C++/MFC/ATL完成的,以庫的方式呼叫底層核心的模組。這個專案整整做了兩年,在當時的我看來,這是一個很大的專案,用到了C/C++/MFC/ATL等程式設計技術,使用了模組化的設計,採用了典型的瀑布開發模式,從需求、設計

、編碼、單元測試、驗收測試,到最終的產品釋出,都給了我全新的體驗。

KNLP專案完成後,我回到原公司,公司的情況已經不容樂觀,本身的產品沒有很好的市場,外包業務也在萎縮,再加上公司上層的組織架構發生了很大的變化,導致很多老同事紛紛離開。我在公司只呆了半年,零零星星的又做了一些小專案,也選擇了離開。

後來就去了億陽信通。億陽信通有自己的軟體園,有自己的辦公大樓,有自己的餐廳,有自己的班車,算是一家很大的公司。

我當時去的部門,是做電信、移動、聯通等閘道器業務資料分析,就是把硬體裝置採集到的業務資料進行分析、儲存、彙總、頁面展現等。底層模組中很大一部分都是做資料分析處理的,但看了之後才發現,如此龐大的一個數據處理系統,全部構架在Perl語言之上的,可能當時架構設計者認為Perl是動態語言,易於開發,易於維護,易於擴充套件。這個想法原本也是不錯的,但任何系統,當達到一定的規模後,易於擴充套件和易於維護都變得不再容易。我到現在仍然認為Perl語言並不是很適合構建大規模的軟體系統,特別是在處理效能上存在瓶頸。在億陽信通的兩年裡,除了後來為了特性效能做的一些C/C++分析模組,大部分都還是跟Perl語言打交道。

後來公司領導也覺得原先的資料處理系統在效能上差強人意,就讓我們組針對特殊專案開發獨立的資料處理模組,使用C/C++語言來完成。當時開發的資料解析程式是執行在Solaris系統上,我先在自己的Ubuntu系統上開發完成,然後再移植到Solaris系統上除錯執行。因為Solaris系統跟我們平時使用的計算機CPU架構是不一樣的,我們通常使用的x86架構的計算機,硬體編碼的方式是小端(Little-Endian),而Solaris系統是大端(Big-Endian)。這也是當時開發過程中特別注意的一個方面,所以至今記憶深刻。

在億陽信通的兩年裡,我開始接觸開源專案,自己也嘗試寫一些開源的程式,比如Linux下GNOME/GTK圖形庫,就是在寫開源程式的過程中掌握的,實際工作中並沒有用到。當時還沒有github,還是Google code的程式碼倉庫。因為當時我醉心於Linux/Ubuntu, 所以開發的開源軟體都是執行在Linux/Ubuntu之上的。

後來,公司要跟IBM進行戰略合作,但雷聲大雨點小。我們專案組按照部署要跟IBM進行合作,對他們的業務質量管理產品做二次開發,滿足國內業務的需求。但合作進展緩慢,有一段時間幾乎無所事事,浪費青春啊,是時候要離開了。

我接著加盟的公司叫吉大正元資訊科技股份有限公司,總部在長春,我入職的是它的北京研究院。當時吉大正元正準備開發一款數字證書身份認證與資料代理閘道器的產品,剛好在蒐羅人才,而我也剛好從億陽信通離職,很快就受邀加盟了吉大正元的北京研究院。我入職的第二個星期,整個研發團隊就被拉到懷柔雁棲湖畔山腳下的一個小樓開始了封閉開發,沒想到一呆就是五個多月。提起封閉開發,可能很多人會覺得很苦很枯燥,但後來跟一起封閉開發過的兄弟談起,都很懷念那段時光。封閉開發相當於給程式設計師們提供了一個理想的程式設計環境,儘量排除外界因素的打擾,全身心地專注在產品研發上。這對於程式設計師的職業成長來說,實際上是一件幸事啊。

產品主要是使用C、C++Java完成——服務端核心代理模組使用C完成,後臺管理和登入會話管理模組使用Java完成,客戶端使用C++/MFC/ATL完成。當時公司決定在這次封閉開發中採用敏捷開發模式,還專門從外面請了敏捷教練進行全稱培訓,這也是我首次接觸敏捷開發理念和敏捷實踐,像迭代開發、故事牆、每日站立早會、結對程式設計,程式碼集體所有權、自動化構建,自動化部署,自動化測試等等,都為我們打開了一個全新的視野,讓我看到跟之前傳統的瀑布開發模式完全不一樣的開發流程。所以說,在封閉的這半年裡,是我職業生涯中又一個快速提升的關鍵期,可以跟在佳能研發中心的那兩年相媲美。

封閉開發結束後,閘道器產品的核心功能都已完成,之後就是對產品不斷完善和修復bug的過程。在這一個過程的開始,就已經把產品推向了市場,然後不斷的完善功能,修復Bug,以快速迭代的方式釋出新版本。這就是敏捷中快速釋出,而不像傳統的軟體釋出那樣等一切就緒了再發布產品。傳統的軟體釋出反應遲緩,錯失機會。而敏捷的釋出模式卻可以在核心功能和最小需求完成的情況下,快速推向市場,讓市場和使用者來檢驗產品,提出新需求,發現問題,從而快速有效的完善產品,持續不斷的釋出新版本。

在吉大正元北京研究院的三年零五個月的職業生涯中,我又一次收穫了很多。我接觸和學習了敏捷開發理念,掌握和實踐了敏捷開發活動,分析和掌握了很多的網路協議,對網路程式設計的理解和實踐達到了一個新的高度,對Linux下的大併發多執行緒高效能的伺服器開發有了深刻的理解和專案積累,對Linux的防火牆iptables的使用開始得心應手,對一些開源軟體——apache, openssl, openvpn的借鑑讓我的設計能力得到了很大的提升。是吉大正元又一次把我推上了一個新的高度,我很感謝這家公司。

後來,產品推向市場後,經過多次的迭代開發,趨於完善和穩定。而我又一次選擇了離開,我就像永遠走在路上的朝拜者一樣,只在某處逗留幾天,但終會再一次出發,走向遠方。

這一次,我決定再給自己一個新的挑戰——進入純粹的網際網路領域,加入純正基因的網際網路公司。我離開吉大正元的時候,北京九枝蘭資訊科技有限公司剛成立三個月,做網際網路的自動化、一站式營銷平臺,剛好當時的CTO找到了我,邀請我加入。CTO是個很有情懷的人,跟他談的很投機,可謂一拍即合,於是就選擇了加入九枝蘭。

我時常對自己說:只要用心去追求,總會收穫不一樣的風景。在生活中如此,在職業生涯中也是如此。在九枝蘭這兩年裡,我完成了我職業生涯的三級跳:
第一跳是在佳能研究院做KNLP專案時,讓我經歷了完整的瀑布開發模型;
第二跳是在吉大正元北京研究院做G3000產品時,讓我經受了敏捷開發模式的洗禮;
第三跳就是在九枝蘭,讓我融入了網際網路的基因,全程設計和開發了基於微服務架構的雲服務平臺。

在這兩年裡,我首次使用並熟練掌握了新的程式語言——Go,之前的產品專案主要都是基於C和C++進行開發,而Go語言作為網際網路時代的C語言進入了我的視野,而且讓我欲罷不能,這兩年開發的大部分程式碼都是使用Go完成的。我首次在大規模雲服務平臺上使用微服務(Micorservices)的架構模型,緊跟了網際網路時代的設計思想。我們的團隊也在雲服務中引入Docker的例項管理,讓雲服務的構建和部署更加的輕巧和靈活。還有公司扁平化和自組織的管理模式,也讓開發管理變得更為簡單高效。所有這些,都是九枝蘭帶給我的豐收碩果。

以上就是我差不多十年工作的一個經歷和總結,現在回顧那段激情燃燒的歲月,我只想說:“不後悔。”

程式設計師客棧王鑫:你參與的專案能否做一些簡單的介紹?

王曉輝:

MarketinGoS一站式營銷系統—— 集成了搜尋引擎投放、搜尋引擎優化、微信、微博、H5模板、著陸頁、郵件、簡訊、DSP、廣點通、APP 訊息推送等多個推廣渠道,結合使用者管理、營銷活動管理、營銷自動化、渠道分析、使用者分析、資料分析等功能,幫助企業主提高效率,節省營銷成本。

專案使用的主要程式語言有: Golang、PythonJavaPHPJavascript。

專案使用的關鍵技術有:RESTful API、Thrift、Apache Kafka、NSQ、Docker、MySQL、MEAN等。

身份認證與資料代理閘道器G3000—— 吉大正元自主研發的基於數字證書身份認證和安全資料代理的內網安全產品,主要針對國內對內網安全要求比較高,需要進行身份鑑別和許可權控制,而且對資料在傳輸過程的安全有極高要求的企事業單位。

專案使用的程式語言:C、C++Java

專案使用的關鍵技術:TCP/IP/SSL/HTTP、Sock5、Apache、Openssl、Openvpn、Netfilter/Iptables、TUN/TAP、MFC/ATL/STL、Windows NDIS驅動等。

自然語言合成系統KNLP—— 該專案是佳能自主研發的一個韓文自然語言處理系統,要對韓文的語言文字做語音合成處理,最終要用於佳能的硬體裝置上,如相機、影印機等。

專案使用的程式語言:C、C++

當時做專案還很少使用開源庫,所有的功能模組全都是用程式碼純手工打造出來的,所謂的軟體匠藝,在早期的專案中反而有更好的體現。

程式設計師客棧王鑫:對你來說一名優秀的專案經理需要具備什麼樣的硬實力?

王曉輝:作為一個專案經理,我覺得首先要了解技術,不要求對技術多麼精通,那是程式設計師做的事情,但作為一個專案管理者,如果對自身專案使用的技術領域不瞭解的話,可能就會兩眼摸黑、盲人摸象,在管理過程中溝通的效果就會大打折扣。

其次就是要對專案的風險因素有一個清晰的把控。專案的時間安排上是不是充足?人員安排上是不是到位?關鍵技術上是不是有瓶頸?團隊成員的工作狀態是不是很好?把這些因素一一的考慮到,如果有風險要及時的進行調整。比如專案實際的進度慢了,是什麼原因造成的?是開始的時候時間估算就不準確,還是因為遇到技術瓶頸進展緩慢,還是因為團隊成員士氣不振出活不多?根據實際的情況分析出原因找到解決的辦法。

其次就是團結的能力。專案經理就是專案的粘合劑,把所有的專案成員粘結在一起,把一個共同的目標完成。這個過程中,團隊成員之間可能會出現各種各樣的溝通問題,甚至跟你這個專案經理之間也會產生分歧,這時候怎麼辦?就需要專案經理放低姿態,不要自認為是一個管理者,而是一個兄長、一個朋友的身份,設身處地的為對方考慮,溝通到位,把問題說開辨明。大家最終的目標都是一致的,在路途中某些人稍微偏離了一點,就要及時的把他們拉回大家一起的道路上,共同向目標進發。

程式設計師客棧王鑫:在外包公司工作和在網際網路公司工作最大的區別你覺得在哪裡?

王曉輝:外包公司和做自己產品的網際網路公司我都經歷過,所以我就談一下自己的感受吧。

作為一個程式設計師的職業成長來說,並不能說在什麼樣型別的公司發展孰好孰壞,沒有一個絕對的標準。關鍵還是看你自己在這個過程中是不是得到了成長,學到了有價值的技能。而這一點在兩種型別的公司中都可以做到。

就比如我在佳能做KNLP專案時,就屬於外包性質的,但那兩年卻是我職業發展提升很快的一段時期,讓我至今受益匪淺。再比如我在吉大正元和九枝蘭,都是做自己公司的產品,同樣也是成長最快的一段職業發展時期。

但總體上,在網際網路公司做自己的產品還是要強過做外包專案,主要的原因是做自己的產品,你基本上可以更深入、更持久、更全面的進入這個專案,自然而然學到的東西就會更多一些。而外包專案要看專案,如果你碰到一個好的專案,就像我在佳能參與的KNLP專案,而且外包方對你非常信任,讓你接觸核心的技術領域,那也是很不錯的。

程式設計師客棧王鑫:就以你個人而言,比較擅長哪方面專案開發?你都有哪些優勢?

王曉輝:我比較擅長雲服務、資料安全和代理、微信公眾號平臺、企業微服務等型別的專案開發,在這些方面都有過實戰經驗。我個人的優勢在於做過多年的安全產品,對資料安全和網路協議棧非常瞭解,這兩年又專門做基於微服務的雲服務平臺,所以對後端服務的技術架構也非常瞭解。因為做過的專案型別比較多,所以在專案的實施過程中就可以參考借鑑別的專案中的長處,好的技術架構,好的管理模式。

程式設計師客棧王鑫:你平時除了專案開發還有哪些興趣愛好?

王曉輝:我除了本職的技術開發和技術管理工作外,平時還喜歡跑步、游泳、騎行、爬山和讀書,現在基本上要求自己每週跑兩次步、遊一次泳,至於讀書每年會選擇一些優秀的書籍讀上10本左右。

程式設計師客棧王鑫:在這麼多年的職業開發生涯中,都遇到過哪些巨大的挑戰?

王曉輝:經歷過這麼多的專案開發,總會遇到這樣那樣的困難和挑戰,現在想來很多都不是什麼大不了的事情了,但在當時還是需要咬咬牙關挺一挺。

我記得在吉大正元做G3000產品封閉開發期間,封閉了5個多月,前期按部就班還算正常,但到了後半段,因為封閉時間太長,有些同事情緒上就出現了一些問題。有一個小夥伴剛好因為家裡也出現了一些狀況,就突然提出了辭職,要求退出封閉開發,他是客戶端開發團隊的成員,而當時客戶端開發正處於緊張的時期,人手本來就不富足。這樣一來肯定會影響整個開發進度,後來就決定徵調一名服務端開發團隊的人來頂上。

我當時就屬於服務端開發團隊的,而服務端開發進度正常,本來可以輕輕鬆鬆地完成封閉開發任務。我跟另一個哥們就被徵詢意見:看誰同意調到客戶端來?那哥們是死活不同意,說是對客戶端開發不熟悉。好吧,那我就上吧。反正記得剛接手客戶端那陣搞得暈頭轉向啊,已經開發了很多程式碼,首先要先熟悉這些程式碼,才能繼續在上面做開發,在加上本來任務就重,就只能加班加點的趕啊。反正最終呢,還算是皆大歡喜,封閉開發的任務基本都完成了,公司後來對封閉開發的人員都做了獎勵,也算是我們的辛苦有了回報。

其它專案中遇到的困難和挑戰不一而足,總體上屬於臨危受命性質的,反正困難來了,你硬著頭皮,咬緊牙關頂住,總會柳暗花明的。而這種時候也正是你成長最快的時候,正所謂百鍊鋼才能化為繞指柔,不經過千錘百煉,怎麼能夠成為無堅不摧的利器呢。

程式設計師客棧王鑫:你如何看待未來共享經濟環境下程式設計師自由工作的前景?

王曉輝:共享經濟就是將閒置的資源共享給別人,提高資源的利用率,並讓共享資源的人從中獲得回報,共享經濟的本質就是互助+互利。

未來的工作模式將是由獨立的個體相互自由連線而成的一個既鬆散又緊密相連的網路。正如凱文-凱利在他的《失控》中所闡述的思想:有機的活系統,依賴於分散式的自管理的子系統,而各個子系統又依賴於分散式的自管理的個體,沒有中樞,沒有一個統一的自上而下的管理,每個個體相互聯絡,相互反饋,相互協作,創造了一個生機勃勃、充滿活力的有機活系統。看似雜亂,卻有條不紊地運轉。

而作為共享經濟下時代的弄潮兒——程式設計師,有著自身獨特的價值優勢。首先程式設計師的知識技能非常有利於在網際網路環境下分享;其次程式設計師這種群體的氣質非常獨特——追求自由獨立而又相依相存,恰好符合共享經濟的特質。

再有就是網際網路的發展階段已經為共享經濟的繁榮提供了基礎設施。共享經濟並不是什麼獨創性的概念,也很容易理解,但為什麼前二十年、前十年沒有喊得這麼響,沒有這個突飛猛進?那是因為原先的個體互聯互通的基礎設施——網際網路還不夠完善,還不足以支撐起共享經濟這個平臺的搭建。而現在網際網路的發展已經滲透到社會發展的方方面面,任何人不接入網際網路就相當於跟時代隔絕了,所以共享經濟的基礎設施已經完備。

應運而生的,各種共享經濟平臺如雨後春筍般紛紛出現,程式設計師客棧正是這裡面的優秀代表——針對程式設計師的共享經濟平臺。程式設計師不再侷限於自己的公司、自己所處的區域,在任何時間、任何地點,只要你有了閒置的時間,又願意把自己的技能分享出去服務於別人,就可以接入這個共享經濟平臺,獲得回報。同時你的視野將放眼全球,你所做的專案可能在異國他鄉,你一起的工作的隊友可能在千里之外,你們之間通過這綿綿不絕的網路相互連線,同時連線這個世界。

這就是未來工作的前景,我期待著美好生活的到來!