專訪顧偉:從機械工程師到資深軟件工程師、再到微軟MVP的蛻變

原文:http://www.csdn.net/article/2014-05-27/2819954

摘要:顧偉曾是一名機械工程師,畢業後聽從自己內心聲音走上了軟件編程道路。他利用平時休息時間,完成從編程新手、到合格的軟件工程師、再到2014年度微軟MVP的蛻變,本文對他過去的經歷、.NET以及C#等話題進行了專訪。

 

 

顧偉認爲,程序員不僅要關注技術,更要關注所處環境。技術可能不會做一輩子,鍛鍊生存能力則是最現實的話題。

顧偉,C#高級程序員、微軟2014年度MVP。現在在某事業單位任職高級軟件工程師,負責軟件系統的設計和開發工作。

從機械工程到軟件編程的轉變

CSDN:據說你是機械類專業畢業,後來轉行編程,能介紹下這段經歷嗎?

顧偉:我大學本科學的是機械類專業,與計算機軟件編程基本上不搭邊,只有一門C語言的課程與計算機相關,所以我所接觸的第一門編程語言是C。畢業工作後在工廠生產一線呆過一陣,做過一段時間的機械加工。但後來終究聽從自己的內心並且在父親的支持下走上了編程之路。

CSDN:爲什麼要選擇走上軟件編程道路?當初你家人、身邊的朋友對你這個決定是怎麼看的?

顧偉:當時我的決定遭到了家裏人的一致反對,但是直到現在我都不後悔當初的選擇。他們主要認爲我是非科班出身,底子薄,覺得我很難跟那些計算機專業的本科生競爭。而且計算機這行尤其是做軟件編程,技術更新太快,年齡大了對新技術就學不進去了,很難再有競爭力,是個典型的吃青春飯的職業。他們一致做我思想工作,讓我安心上班,雖然我那個工作環境差一點,但是相對編程來說更加穩定,以後有了經驗,可以帶帶徒弟,日子過的逍遙自在。但是我堅持認爲,軟件是未來的潮流。軟件產業是未來的朝陽產業,國家也在大力發展這個新興行業,有很廣闊的發展前景。再說,這世上哪有什麼一勞永逸的事情,軟件編程雖然比其它行業技術更新更快,但反過來說明它是一個新興產業,有很大的發展空間。經過幾次交流,最終我成功的說服了我的家人。

CSDN:作爲一個自學人士,你是如何自學軟件編程的?能回顧下學習方法、時間安排和其它一些學習過程嗎?

顧偉:編程是個技術活,既然是技術活就需要不斷的在實踐當中加以練習。因爲我之前自學過C語言,算是有一點基礎,但是這與真正的軟件開發還是有相當的差距。爲了能夠儘快的掌握C#開發,我買了很多相關的技術書籍。入門經典、高級編程之類的書都買了,一開始的時候就跟着上面一個一個例子不斷在VS編譯器中調試、運行,監控每一步值的變化,慢慢培養編程的感覺。掌握了C#語言之後,後來我喜歡做一些小工具之類練習,比如我的瀏覽器(Webbrowser)、記賬單(單機版Access應用)等等。通過這些一個又一個的小工具開發練習,我慢慢的掌握了軟件開發的技巧。更重要的是通過這些編程練習,我建立起了肯定能學好編程的信心,並從中找到了樂趣以及成就感。

CSDN:後來你報名參加某機構培訓,能不能聊聊一邊學習、一邊實習的經歷?另外,實習的機會是如何來的?

顧偉:當時剛從廠裏出來,想盡快的進入軟件編程領域是很困難的。爲了能夠儘快縮短這個轉變時間,我參加了某機構的培訓,並且經歷了一段邊學習、邊實習的經歷。實習的機會說來也很巧,正好當時有個認識的計算機專業大學同學在我們當地一家公司做.NET開發,我就跟他聊,問他們公司缺不缺人,我想爭取一個實習工作的崗位。後來經過他的推薦,我得到了一個跟他們公司技術經理交流的機會,通過一個上午的技術筆試、面試,當天上午技術經理就跟公司總經理溝通,後來就讓我第二天上午過去正式實習。

CSDN:正式工作後你又連續通過了國家計算機四級(數據庫工程師)、軟件設計師、系統分析師、信息系統項目管理師等資格考試,說說你是如何從程序新手到合格的軟件工程師這一轉變?

顧偉:回顧剛進入職場的前3年,現在都覺得很感動那時的自己。那3年基本上所有的時間和精力都放在技術經驗的積累以及專業理論課的學習上面。白天上班經常性的向有經驗的開發人員學習技術,並且有時候會主動的要求項目經理安排開發任務給我。晚上如果有時間一般都會抽出2-3個小時用於學習算法和數據結構、操作系統、編譯原理、計算機網絡、數據庫原理等計算機專業理論課程。爲了檢驗自己的學習成果,我陸續的參加了很多考試,並先後通過了國家計算機四級(數據庫工程師)、軟件設計師、系統分析師、信息系統項目管理師等資格考試。雖然現在來看這些考試並不算太難,但是通過準備考試的過程,自己一次又一次的梳理知識點,建立了自己的知識體系。3年的歷練,不斷的總結。我順利完成了從程序新手到合格的軟件工程師的轉變。

CSDN:除了技術上的收穫外,私企、外企以及事業單位的經歷還給你帶來哪些收穫?

顧偉:很幸運自己能夠在不同類型的單位工作過,也因此接觸了很多不同背景、不同思維習慣、不同性格類型的人,積累了人脈,同時也豐富了自己的人生閱歷。中小型私企是我職業生涯的第一步,我打下了堅實的基礎,不僅僅是技術,更重要的是使自己的綜合素質得到了提高。而大型外企的管理等各個方面相對比較正規,有一整套的流程,我懂得了如何帶領和管理一個大型團隊。而在事業單位,我學會了如何跟不同類型的人溝通交流。這些年以來,我漸漸感悟出一點對生活的理解:程序員不僅要關注自己所處領域的技術,更要關注我們所處的環境。技術可能不會做一輩子,鍛鍊自己的生存能力則是最現實的話題。

能力+熱心=2014年度微軟MVP

CSDN:在博客中看到你成爲2014年度Microsoft MVP,能不能聊聊你是如何一步步成爲Microsoft MVP的?

顧偉:認識CSDN很長時間了,一直關注.NET論壇版塊,每個季度都會有申請微軟MVP的帖子發出來,也因此知道了微軟有個MVP獎項。在我的印象當中能拿到微軟MVP榮譽的人都不是一般的技術高手。我一直想向這個方向努力,卻因爲工作原因沒有足夠的時間參與,因此一直斷斷續續。好在去年時間上開始相對自由,我就有了時間能夠參與進來。一開始我主要是在論壇.NET版塊回答別人提出的各種問題,因爲自己在工作中也經常幫助同事解決技術問題,所以這種方式對我來說更容易上手。答了幾個月的題之後,我發現會有一些共性的問題或者自己覺得有必要記錄下來的一些東西,我就把它們以博客的形式貼出來。這樣堅持了一年左右,正好到了2014年的1月,可以申請4月份的MVP,我就詳細填寫了申請表格並遞交給了CSDN,由CSDN轉交給微軟MVP項目組。在此之前,我也對自己做了一個評估,覺得自己的努力和貢獻已經達到了MVP的標準,這次應該沒有問題。3個月之後,果然在愚人節這天晚上收到了微軟發送過來的祝賀郵件,通知我成功當選2014年度微軟MVP。知道自己當選微軟MVP的那一刻,我更加堅定了自己未來的技術方向。

CSDN:你談到個人非常推崇敏捷開發理念,能不能談談你在這方面的一些實踐?

顧偉:衆所周知,.NET平臺和VS開發工具,是微軟專門爲快速開發軟件而量身定製的,尤其適合中小型團隊使用。而敏捷開發理念,強調的是以人爲本、快速迭代。因此這兩者的結合,簡直是珠聯璧合。我們在做軟件設計時,會採用“一主一副”的策略,即讓更有經驗的程序員擔任主要設計者,再爲其配備一個副手,負責給主程序員提意見,在高效溝通過程當中,不斷的完善軟件設計工作。此外對於一些重要的模塊編程,我們經常採用結對編程,即讓編程能力更出色的程序員擔任編碼實現,而經驗更豐富、視野更開闊、有大局觀的人負責代碼的實時評審,及時提出代碼的問題所在。這兩點我們經常在實踐中採用,顯著提高了開發效率。

接觸Java後,專注.NET

CSDN: 在衆多技術中,你爲什麼選擇.NET?

顧偉:我曾經學習過Java語言,用Swing做過一些簡單的桌面軟件,後來也利用JSP、Servlet、JavaBean、JDBC、Tomcat等開發過一些MIS系統,再後來用JavaEE領域著名的輕量級框架SSH(Structs 1.x、Spring、Hibernate)做過一個稍大規模的業務系統。但是後來放棄了,轉而專注於.NET。一方面是自己對C#語言情有獨鍾(C#語言非常優雅,比如Linq,雖然現在搞得越來越臃腫、特性越來越多、越來越複雜);一方面是微軟有目前最強大的IDE—Visual Studio這個神器,使得開發、調試都極其方便(比Eclipse要好很多),很容易、很快速的就能做出東西出來。我一直認爲軟件開發應該強調的是速度,即在最短的時間之內開發出一個可運行的版本。讓用戶能夠看得到實實在在的可運行的軟件實體,這樣當項目經理拿着軟件原型與用戶交流就會顯得順暢的多。開發效率是我選擇.NET的重要因素。

CSDN:具體比較下Visual Studio和Eclipse的優劣吧?

顧偉:Visual Studio和Eclipse是業界當中目前最流行的兩個IDE工具。VS很智能,調試、部署都非常方便,但是需要安裝龐大的安裝包。而Eclipse相對比較靈活,可以根據自己的需要進行設置,添加功能。但是Eclipse調試不如VS方便,且IDE界面與VS相比顯得比較“原始”,這讓很多初學者感到各種不爽。微軟爲了實現IDE可定製的需求,也發佈了很多版本的VS開發工具。比如VS For Web、VS For Windows Phone等就是針對不同開發者而單獨發佈的版本。其它方面比如快捷鍵、部署等方面有細節的差異,但是總體來說,各有千秋。

CSDN: 很多人都覺得NET技術體系太過龐大,我們都該學哪些呢?順便再推薦一些學習資源吧!

顧偉:經過這麼多年.NET版本的更新,現在的.NET技術體系已經相當龐大了。除了學好.NET平臺第一編程語言的C#(或者是VB.NET,你看微軟多貼心啊?爲廣大的VB愛好者能平滑的過渡到.NET開發)以外,應該具體選擇哪些技術作爲自己的看家本領或者作爲求職時的砝碼呢?比如WCF、WPF、WF、Silverlight、Windows phone、ASP.NET MVC、Web API等等這些技術我該如何選擇呢?

我的觀點是:學以致用,學你最需要的,學更有前景的技術。我認爲作爲程序員應該要有自己的辨別能力,學習的技術一定要有針對性,要對自己的職業發展有用,不要盲目的跟風。ASP.NET MVC是對傳統WebForm開發進行的一次升級。傳統的WebForm組件控件開發有它的好處,但同時也有它的弊端。比如定製性差、不靈活、生成大量的冗餘代碼、降低運行性能等問題。相反ASP.NET MVC迴歸到了最原生的基於HTML的開發,解決了上述問題。WCF或者Web API也是非常有用的技術,隨着移動技術的發展,各種Web服務越來越傾向於輕量級的Rest Service,而Web API就是微軟提供的當前最佳開發Rest服務的開發框架。

至於學習資源,可以查看我之前發表的一篇博客,上面列舉了我覺得還不錯的在線資源以及推薦書籍:點此進入

從底層原理入手,是精通.NET的關鍵

CSDN:.NET入門非常容易,但精通非常難,你認爲如何才能學好.NET?

顧偉:我認爲學好.NET可以從以下3點入手:

 

  1. 不要滿足於學會使用各種控件,要學會開發自定義控件(非用戶控件)。
  2. 要從底層原理入手,掌握開發技術,不要停留在表面層次。
  3. 就是要注意技術發展的趨勢,選擇更有前景的技術。

 

在這裏我也提出自己的建議,隨着XP的淘汰、Win8的興起,我們.NET程序員需要儘快的將自己的技術進行升級。具體來說桌面開發這塊要從原先的WinForm升級到WPF,Web方面要從WebForm升級到MVC,爲未來的職業生涯的發展提前做好技術上的鋪墊。

CSDN:.NET有開源方面的實現嗎?能不能介紹下目前的情況?

顧偉:和Java一樣,.NET也有很多開源項目。比如跨平臺項目Mono、ORM工具NHibernate、AOP框架Spring.NET、日誌組件Log4net、測試工具NUnit、對象序列化工具Json.NET等等,還有很多第三方的開源類庫,這些都可以在網上下載到源代碼。爲了推廣.NET的發展,微軟也搞了一個源代碼的託管網站Codeplex,裏面有大量的開源項目的源代碼可供下載學習。此外,微軟最近又開源了很多開發框架的源代碼,比如ASP.NET MVC、Web Api等。隨着微軟的逐步開放,.NET開源項目的數量和質量將會進一步得到提升。

C#很優雅

CSDN:你提到C#很優雅,能不能再具體談談?

顧偉:C#程序員都知道C#中有一個非常重要的語法糖Linq,這是微軟的一大創新。Java最近才引入了類似Linq的特性。它使得原本複雜的操作,使用Linq可能只需要一句話就能完成,輕鬆實現篩選、分組、排序等功能。再比如C# 5.0中使用async和await關鍵字來簡化異步操作。以前寫異步代碼不太好理解,而現在可以使用順序編碼的思維,加上async和await關鍵字就變成異步了,顯著提高了編程效率。這些都可以在MSDN開發文檔上面找到相應的說明以及代碼示例。

CSDN:很多人都認爲C#比Java好學,對此你是怎麼看的?另外,如何才能學好C#?

顧偉:這麼多年以來其實一直有很多誤區,其中一個就是認爲C#比Java好學,有了Java基礎一週搞定C#之類的觀點,其實不然。應該說在早期,.NET Framework 2.0出來的時候,那時候的C#確實比較容易一點。你會看到很多Java的影子,所以你有了Java基礎基本上不廢太多力氣就能學會C#了。但是C#現在已經發展到了5.0。期間.NET Framework又經歷了3.5、4.0、4.5等幾個重要版本的更新,單論C#語言本身的特性就已經超過了Java的複雜程度。沒記錯的話,Java 去年才推出了類似C#中的Lambda表達式。

我個人認爲,學好語言本身最好的途徑就是查看幫助文檔並將之應用到實際項目中去,而學好C#相比較權威的資料就是MSDN在線文檔。MSDN文檔上面對C#各個技術點講解的都非常全面也很詳細,還有很多代碼片段甚至是例子可供參考。

應摒棄一些對.NET的成見

CSDN:有人說.NET可以跨平臺,而有人說.NET跨平臺是個謊言,你能不能談談.NET跨平臺這個話題?

顧偉:一直以來.NET給人的印象都是隻能運行在Windows平臺上,不像Java可以實現跨平臺,在Linux、Windows上面都能夠運行。微軟最初由於戰略原因,希望更多的人能夠使用Windows系統,並沒有打算讓.NET跨平臺,並不是技術上的原因。但是也有一些軟件愛好者發起了Mono這個項目,Mono的初衷就是要解決.NET跨平臺的問題。而最近經常看到的Xamarin移動跨平臺解決方案是Mono項目的一個分支,能夠使用C#開發Android及IOS應用,這就給從事移動開發的程序員在一定程度上降低了學習成本,學好C#一門語言就能夠開發多個不同移動平臺的APP。在CSDN論壇已經有人發佈了基於Xamarin開發的Android應用並部署到Android真機環境中運行。所以.NET跨平臺不是謊言,而是事實。

CSDN:很多人都認爲.NET程序員只會拖拉控件、綁定數據,是什麼造成這樣的局面?你認爲,處於這個階段的程序員應該如何做起?

顧偉:在早期,WebForm剛推出來的時候,微軟就是這樣展示WebForm魅力的,只要藉助於Visual Studio這個可視化的IDE,拖拉控件、綁定數據,就可以輕鬆開發網頁出來。應該說這是微軟在Web開發方面的重大創新,讓Web開發的門檻進一步降低,讓更多的人可以從事Web開發。

但是作爲專業的程序員而言,不能僅僅停留在這個層次進行開發。我們開發的系統,除了可用性這個硬性指標以外,性能也是很重要的。如果一個網站打開速度很慢,就會嚴重影響用戶體驗,進而會影響系統的可用性。所以我認爲,在ASP.NET開發過程中,儘量使用輕量級的組件代替重量級的組件,比如最典型的用Repeater來代替Gridview。其次要從運行機制和原理等方面深入理解控件,能夠有意識的寫一些自定義控件。這樣日積月累,你就會感到很踏實,而不是機械式的記住控件用法了。

CSDN:有人認爲在安全方面,Java比.NET更好,你認同這個觀點嗎?如果認同,那麼.NET如何做才能補上這方面的不足?

顧偉:這個觀點就類似於Linux和Windows操作系統哪個更安全。其實安全是相對的,不是絕對的。Java基於JVM,而.NET對應於CLR,都是處於同一層級的運行環境的概念,所以它們的安全性在理論上是一致的,不能說Java在安全性方面就一定做的比.NET好。舉個例子,比如WCF這個通信框架,就有支持https協議的綁定類型,來保證數據傳輸級的安全;再有身份驗證憑據來保證數據的真實性,防止用戶僞造身份;還有授權機制,保證不同用戶身份的人訪問不同權限的資源。所以微軟當初在設計.NET時,是充分考慮其安全性的。

CSDN:作爲微軟技術的Fans,最後你能不能談談Windows Phone 8?

顧偉:移動開發是目前非常火爆的一項技術,當前主要是谷歌的Android和蘋果的iOS兩大系統佔據了市場上的絕大部分份額,微軟由於先期戰略以及本身的問題始終沒有在移動領域佔得先機。目前其最新的Windows Phone 8.1平臺市場份額相對也比較小,因此關注Window Phone的人不是很多。好在微軟新任CEO掌權之後,對WP的發展非常重視。將搭載Window Phone系統的手機以及Surface通過Windows Azure Platform實現無縫對接,打造了一個數據集中、共享、統一的生態系統。從這個方面來講,這也給更多的微軟技術愛好者提供了一個機會,開發基於Window Phone平臺的手機、平板等手持設備的APP或者遊戲。熟悉WPF或者SilverLight的開發者相對更容易上手WP開發。

CSDN:雲計算時代,.NET是否還能適應雲計算髮展需要?在實際開發中如何與雲計算相結合?

顧偉:微軟在雲計算這方面的投入是巨大的, Windows Azure 平臺(Paas)就是微軟專門爲實施雲計算戰略而打造的雲平臺。我們可以把自己開發的Web應用、Web Service等發佈到Azure,也可以使用SQL Azure提供數據庫的服務,還可以使用Office 365等Saas產品進行移動辦公,這些都是Windows Azure平臺所提供的功能或服務。對於開發者來說,如果沒有合適的服務器資源,就可以註冊一個Windows Azure平臺賬號,申請相應的服務,將自己的網站應用發佈上去。這樣既降低了成本,又獲得了優質的服務,是比較理想的選擇。目前微軟爲推廣其Window Azure 平臺在中國大陸的應用,與世紀互聯合作,個人用戶現在就可以申請體驗。

給初入軟件行業人士的一些建議

CSDN: 能不能給初學者以及即將踏入軟件行業的人一些建議?

顧偉:

 

  1. 做編程是一項非常枯燥的職業,也是非常有挑戰性的工作。說枯燥是因爲有時候不得不寫一些沒有技術含量的代碼,有挑戰是因爲不同的項目可能會用到不同的技術,在開發過程中也許會遇到一些搞不定的難題,但終究會通過不同的思路、技巧或者是變通的手段加以解決。所以做這行之前一定要多加以思考,自己是否真的喜歡這個工作。因爲做軟件是很辛苦的,經常加班加點是常態。
  2. 平時注重項目經驗積累的同時,多讀一些計算機理論書籍。比如平時可以看看操作系統原理,做做算法趣味題。表面上看這些平時開發用不到,但其實這是在不斷的修煉自己的內功。內功深厚了,你會發現學習軟件編程不會那麼吃力。
  3. 多參與在線社區、討論組、論壇等等形式的技術交流活動。每個人都是有各自的思維侷限性的,通過不斷的交流你會慢慢發現自己對技術有了一些獨特的認識和理解。不盲從、不人云亦云。但只要是對自己有幫助,就要記下來,理解、消化、吸收。
  4. 寫博客是對技術總結的很好形式,當然了你也可以使用一些比如有道雲筆記之類的工具,或者是office等辦公軟件進行記錄。但是寫博客的形式更好,一方面是對自己知識總結;一方面也通過技術分享,讓網友發現你的問題或者是提供別的解決方案思路給你。不要怕批評,高手是在不斷的被批評之下不斷成長起來的,只要他的批評對你是有幫助的,你就賺了。
  5. 學編程除了方法和努力之外,貴在堅持不懈。只要不斷的給自己制定切實可行的短期目標,並且一步一個腳印的去實現,在遇到困難之後不斷的調整,你會發現幾年之後大不一樣!

 

CSDN:你認爲技術不再於多而在於精,談談這個觀點吧。

顧偉:技術總是在不斷的更新和發展的,微軟的技術尤其如此。人的精力也是有限的,不可能什麼都會。什麼都會的結果肯定是什麼都不精,一遇到一些稍微困難點的問題就會束手無策,註定不能成爲高手。而且有些技術雖然看上去很時髦,表面上看很有前景,在現階段卻並沒有得到比較廣泛的應用。Windows Phone就是一個典型的例子,雖然微軟在不斷的擴展這塊的業務,藉助於Windows操作系統的壟斷地位,與Windows緊密配合。但是相比較Android和iOS開發,目前的市場份額實在很低,招聘WP開發的崗位也很少。因此作爲.NET程序員一定要合理選擇技術,將有限的時間和精力放到核心技術的學習上去。比如不論你是做Web還是桌面開發,只要是做.NET開發的,C#就是必須要精通的一門語言。像異步編程、多線程、Socket等等就是必須要加以應用和實踐的。把基礎打好之後,如果有一天WP火爆起來了,自己在技術方面實際上也做好了充分準備,很快就能轉到WP開發上去。

 

 

CSDN:如果人生有個重啓鍵,你將如何重新規劃你的程序員之路?

顧偉:我是大學畢業後通過轉行才進入到計算機編程行業的,人生如果可以重啓,我希望自己能夠在剛上大學的時候就能夠選擇計算機專業,儘早的發現自己的興趣所在。

CSDN:最後聊聊你和CSDN間的故事吧。

顧偉:認識CSDN是我當年實習那家公司的經理向我推薦的,打那以後我就被CSDN的專業、前沿的技術所吸引,一直關注CSDN網站發佈的關於前沿技術的信息新聞等。後來我也曾經在CSDN論壇就我實際開發過程中遇到過的問題請教過CSDN的壇友,他們都比較熱情的對我的問題進行了解答,幫助我解決了一些我曾經遇到過的問題。7年之後,我也不再是當年的新人,也積累了一些些許的技術經驗。我也想通過CSDN論壇這個平臺,像當年別人幫助我一樣,幫助更多的人。我想這也是一種精神的傳承吧。

發佈了123 篇原創文章 · 獲贊 871 · 訪問量 97萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章