優秀程序員實現向卓越程序員跨越:專訪李寧

【專家簡介】李寧

  資深軟件開發工程師、IT講師和技術顧問,從事軟件研發工作10餘年,實踐經驗十分豐富。資深Android開發專家,國內Android應用開發的先驅和傳教士,開發了基於Android平臺的新浪微博客戶端、完美通信、語音計算器、多功能日曆等廣受歡迎的應用。他還精通Java、.NET、C++等技術,曾經多次在微軟組織的技術大賽中獲獎。同時,他還是一位經驗豐富的技術作家,多次爲《程序員》雜誌和其他技術社區撰稿,著有多本Android專著,廣獲讀者好評。

1.jpg
李寧(安卓巴士配圖)


  安卓巴士:您是什麼時候接觸到計算機,怎麼走上編程這條道路的?

  李寧:我算是接觸到計算機比較早的了。記得還在上小學,到老媽的單位(國家一級科研單位)去用計算機玩遊戲,那可是80年代末哦!儘管也有彩屏的計算機,不過在國內還很少,也非常昂貴,可能現在的小朋友都無法想象,一臺PC高達4萬的價格足以讓大多數國人望而卻步(那時一個月掙400就很高了)。

  正是較早接觸到計算機,纔是我對這個傢伙產生了濃厚的興趣,不過當時也是玩玩遊戲而已。在初一時又弄了臺英文打字機練習了指法。真正開始接觸到程序設計,是在高二那年。利用學校的計算機學習了Basic語言和五筆字型輸入法(估計現在很少有人用了)。不過這還不算是真正的程序員,因爲還沒有編寫過一個有價值的程序。

  由於對計算機的喜愛,大學填寫志願時所有的專業都是計算機,當時計算機在國內並不流行(機械和電子更流行),不過很慶幸我選對了方向。上了大學以後,才真正如魚得水,因爲身邊都是很優秀的傢伙(那時的學生質量很高,在畢業時大多數都可以獨當一面),在大一開始學習了pascal、然後是C/C++語言等,這纔算正式進入程序員的行列。

  未來要走什麼路,可能就決定於小時候的一件事或某些短暫的經歷!

  安卓巴士:您學習的第一個語言或技術是什麼?大概用了多久?能和我們分享下學習編程中的一些經歷嗎?

  李寧:第一種語言是Basic,不過這種語言沒有太深入學習,如果說深入學習,直到現在還偶爾使用的應該是Pascal,以及Delphi。說實話,學習第一種語言用了幾個月的時間(用現在的眼光來看簡直太慢了),因爲語言中有很多技術當時很難理解,例如,遞歸就費了好大勁。

  從理論上說,學習計算機語言要比學習自然語言容易得多,計算機語言主要依靠邏輯思維能力,也許學習第一種語言會很費勁,不過這只是暫時的,當進入並熟悉了這個領域,就會如魚得水,學習的速度也會以指數提高,這樣掌握任何技術都會變得很容易。

  記得數年前開發了一個網上評卷的項目,原本計劃在windows下使用delphi開發客戶端,結果windows突然不太好使了,速度極慢,本想重裝,但裏面的各種工具極難配置,很麻煩,而且又沒有時間來收拾windows。所以在我多年編程經驗積累起的自信的驅使下,決定換另外一種以前只聽說過名稱的技術(wxWidget),並且將語言換成了C++,操作系統平臺換成了Fedora Linux。wxWidget是一套跨平臺的C++ UI程序庫,儘管熟悉C++,不過當時很少在linux下工作,並且幾乎沒用過wxWidget。不過這種事對我來說發生的太多了。記得當年大學剛畢業時就接到一個活,用authorware(一個多媒體開發工具)開發一個多媒體演示程序,當時的水平可遠不及現在,連什麼是authorware都不知道。結果還是跌跌撞撞地完成了任務,當然,成功的原因除了技術功底比較厚外,一個重要原因就是公司給配了一個美女作爲助手(錄音和美工),再一次驗證了男女搭配,幹活不累的古訓!

  這回扯遠了,還是說哪個網上評卷的項目,學習wxWidget並沒有費什麼勁,但是,又一件很鬱悶的事發生了,突然發現wxWidget的XML Library不支持中文(可能現在支持了),換技術也來不及了,結果自己做了一個XML解析器,哎,會的多還是有很多好處了,最後花了兩個月終於搞定了(並不只是搞這一個項目)。

  安卓巴士:接下來您又學了哪些語言或技術?當時爲什麼會選擇學這些?另外是什麼因素驅使您不停的去學各種語言或技術?

  李寧:Pascal學完後,自然就要學C語言了。如果要判斷某個人是否是學計算機的,只要問他是否學過C語言即可,所有科班出身的(包括專科)都必須學習C語言,也必須認識一個人:譚浩強。實際上,C語言並不是我選擇的,是學校安排的,身不由己而已。

  也是從C語言開始,才接觸到了更廣闊的空間,如數據結構、編譯原理、操作系統原理,儘管學校老師講的這些理論和技術的效果並不算理想(原因大家知道的),但終於有了星星之火,剩下的就是燎原了!

  至於爲什麼要不斷學習各種語言和技術,原因只有一個:我需要它!學習也並不是要學習所有的東西(人生不過百年,就算向天再借五百年也學不完),應該根據自己的目的去學習。例如,可以根據公司的業務,也可以根據自己要做的東西。例如,我現在正在做一個跨平臺(主要是移動平臺)開發的工具,所以需要學習各種平臺的核心開發技術。當然,與此無關的技術可能也會去關注,但通常不會花更多的時間去研究。

  安卓巴士:您是什麼時候開始接觸Android系統的,看您很早就出版了《Android開發完全講義》這本書,被稱爲國內Android應用開發的先驅和傳教士,最近又出版《Android深度探索卷1_HAL與驅動開發》&《Android應用開發實戰(第2版)》這兩本書,能跟我們分享下您寫書過程的一些故事麼?

  李寧:Android應該是2008底(google剛發佈G1的時候),應該是國內最早接觸Android的一批技術人員。當時接觸到Android也是個偶然,實際上,本想去研究google的其他技術,結果看到google放出來個Android模擬器,又瞭解到Android使用Java來開發,所以決定去玩玩,當時可沒想那麼多,學Android純屬娛樂。

  不過等用了Android一段時間後發現Android好像不光是Google的一個玩具,有可能成爲Google的一條強有力的觸角,所以後來開始深入研究Android的各種技術。

  其實在出版《Android開發完全講義》之前,已經寫過基本關於Java Web的書。寫書、寫blog是多年養成的習慣。主要目的是做一個知識的記錄,以爲這些東西不太可能永遠記得。有人說寫書很累,沒錯,的確很累,不過只將寫書當成掙錢的手段當然很累,但是爲了知識的記錄和傳播,就會感到很“酷”,而且寫書會將自己的知識更好地梳理一下,也會發現自己對某些知識的遺漏,從而自己的技術水平會更上一層樓。

  記得2008年寫我的處女座(Java Web開發技術大全:JSP+Servlet+Struts+Hibernate+Spring)的時候,手骨折了(純屬意外),利用在家休息的半個月,用一個手敲完了該書的兩章內容(初中打下的指法基礎沒白費),看來那些肢體殘疾的同學可以熟練使用計算機也不是不可能的。

  安卓巴士:Android和iOS之間您是如何取捨的?爲什麼最終會選擇Android平臺?Android自誕生以來版本改進了很多,但是版本更新太快也會給開發和適配帶來很多挑戰,您是如何看待和應對這些挑戰的?

  李寧:實際上iOS我也在用,Android是第一個接觸的移動平臺,當然,接觸Android最初是從經濟上考慮的,因爲我沒有MBP。只能在windows或linux下使用Android。不過最後發現我的決定是正確的,因爲將Android作爲入口是一個非常好的決定。Android的開源和免費大大降低了學習成本和開發成本。當然,如果能力足夠高,可以盡情地深入Android內部,定製自己的操作系統,這一點的確很酷。順便做一下廣告,繼《Android深度探索(卷1):HAL與驅動開發》後,還會有卷2、卷3….卷n,會囊括Android高級應用和底層開發的方方面面(包括Framework、ROM定、各種系統工具的使用等等),出版的順序也是學習Android的最佳順序。如果要學習Android的底層技術,最好先學習Linux驅動。因爲Android Framework很多地方都是用了Linux 驅動,而Linux內核是獨立於Android的。所以不學習Linux內核(主要是驅動)的技術,很難理解Android Framework中的某些技術。

  至於Android平臺的碎片化,的確很嚴重,這也是我現在正在着手解決的一個問題,還有Android的安全性和盜版問題,已經成爲了Android的三大詬病。目前對付這些調整沒有更好的方法,只能對同一款或同一類型的設備單獨適配。這一點iOS估計以後一會遇到(但可能沒android嚴重)。至於安全和盜版問題也很嚴重,尤其是安全,獲取root權限後的手機尤爲嚴重,而且目前沒有什麼太好的解決方法,除了安裝一些殺毒軟件外,可能就只有聽天由命了!希望Google和第三方有更好的解決方案。

  安卓巴士:您是怎麼看待ios和Android這兩大陣營的?您認爲封閉和開放誰會最終勝出?

  李寧:這是個老生常談的問題。開放意味着分裂,封閉意味着孤立。這要看google和apple的目的是什麼。Google的目的不是賣android手機,而是賣廣告,所以android的用戶越多越好,因此,開發對於google是最好的選擇,這樣google就可以花很少的代價迅速利用android佔領市場,最近非常流行的開源硬件:arduino,也採用了同樣的策略。常被稱爲開源硬件的Android。

  Apple的目的是爲了賣IPhone手機(包括IPad)。要靠硬件掙錢,所以如果開發iOS,將會有太多的競爭對手和廉價的iOS手機,將會嚴重影響iphone、ipad的銷售。所以封閉對於apple是首選。

  任何商業策略沒有絕對的好與壞,Google和Apple的不同盈利模式決定了Android和iOS的最終策略。 當然,這兩種策略各有利弊。不過可以用一句俗語來化解其中的矛盾:兩利相權取其重、兩害相權取其輕。 利益纔是決定Android和iOS最終走向的砝碼!

 安卓巴士:自學編程,你覺得該如何選擇適合自己的書籍?你在各種技術學習中都選擇了哪些書?

  李寧:對於信息時代的人獲取知識的途徑非常多,例如,網絡就是一個非常好的途徑。不過網絡雖然信息量巨大,但有一個不好的是這些信息大多都是未經過濾和整理的,對於初學者和水平不是很高的程序員來說,很難甄別這些信息。所以就需要通過其他途徑來獲取知識,例如,培訓和書籍。

  對於初、中級別的程序員,可以選擇一些入門級別的書,或一些分析源代碼的書。當然,有一定基礎的程序員可以選擇一些經典。例如,我學習Java會經常看Thinking in Java。C++會看Thinking in C++等,當然,還有一些經典的算法書,例如,高大爺的計算機程序設計藝術(The art of computer programming)就是非常值得閱讀的好書,值得一生珍藏!

  例外建議廣大程序員讀寫非技術領域的書籍,對開闊視野也有很大的好處。

  最後送給大家一句我比較喜歡的讀書箴言:閱讀吧,在每晚入睡之前!二個月後,你將擁有帝國,而你是帝國強大而自負的君主;你將擁有財富,而你取之不盡;你將擁有另外的生命,而你可主宰他的生死;你將幸福,再不孤獨…閱讀吧,在每晚入睡之前。

  安卓巴士:大約是在什麼時候開始找到對編程的感覺?你認爲編程學習的重點是什麼?

  李寧:應該是大二學習數據結構時,更具體點就是搞明白鏈表的原理,並可以獨立使用C語言實現雙向鏈表和其他數據結構的時候。因爲終於可以用C語言做點看似很牛逼的東西了。當時利用數據結構知識實現了一個有數據存儲功能的簡單數據庫和一些圖像處理程序。

  編程學習首先自己要對編程感興趣,更準確地說,要對創造這個世界上沒有的東西感興趣。因爲編寫程序的複雜度幾乎可以與目前地球上任何一種科學相比。而且程序員羣體的平均學歷和智商可能僅次於科學家羣體。所以能夠稱爲一名資深的程序員,說明已經成爲了這個世界上智商最高的一羣人。

  當然,除了興趣,還要不斷地練習和領悟。將自己學到的知識轉換爲能力纔是最重要的,至於具體學習什麼都不是重點,只要將說學習的東西發揮到極致即可。

  安卓巴士:編程的實戰很重要,你平時都是如何進行實戰提高自己能力的?

  李寧:多年前曾經有段時間的編程密度很大。經常一天要寫數百行有效的代碼(不包括註釋、空行、括號和自動生成的代碼),所以當時的技術水平提高的很快。不過現在早已過了需要編寫大量代碼才能提高技術的程度,儘管也會編寫大量的代碼,但較峯值時差了很多。

  對於在公司工作的程序員,可以通過公司的項目提高技術水平。但對於項目難度不大或沒有太多項目的公司(例如,經常維護而不是開發新的項目),可以通過模仿有名的項目來提高自己的水平。例如,對於Android應用。如果在Google Play上隨機抽取100個應用,你能獨立(可以查找各種資料)做出來的佔多大比例呢,如果能超過50%,說明你的能力已經比較強了,如果能超過80%,基本上已經可以肯定你已經是數一數二的Android專家了。大家可以用這個方法檢測一下自己的水平。

  安卓巴士:能分享些對你所學過的技術或語言的學習小竅門嗎?你當時是怎麼越過這道坎的?等等……

  李寧: 學習語言第一次比較鬱悶的就是數據結構了,由於第一次接觸這些東西,多少有一些找不着北。不過放棄是不可能的,已經上了賊船了,下不去了!當你被某項技術搞到塊崩潰時就暫時放下她,去做別的事。絕大多數時候,再來處理時自然就會柳暗花明。其實弄不出來是以爲自己已經掉進了思維陷阱,正在朝着完全錯誤的方向越陷越深,跳出來的方法就是關機,然後過一會再打開。正所謂只有放下才能得到!

  安卓巴士:自學編程之路已有十多年,十多年中在自學中你最大的感悟和收穫是什麼?另外很多人都覺得編程非常枯燥無味,你認爲自學編程該如何堅持下去?

  李寧:從理論上說,對自己感興趣的事是不需要堅持的,沒聽說過叫某人再堅持玩一會遊戲!玩遊戲都是主動的,沒聽說誰被逼着去玩遊戲呢。那編寫程序爲什麼就不能主動呢?

  很多人覺得編程非常枯燥無味是因爲沒有目的性,當朝着某條路漫無目的地走着,就會覺得前途渺茫,因爲還沒有看到頭。但如果已經知道路的盡頭有無盡的財富,就有了無盡的動力。如果只將編程看做一項謀生的手段,就會感到非常累。而將編程看作是事業,並且可以從無到有創造很多東西,就會感到其樂無窮。還有就是除了工作,可以玩點其他的東西,例如,前面所說的arduino就是一款很好的玩具,難道不想創造屬於自己的機器人嗎?難道不想檢驗一下大學時學的計算機原理、人工智能到底好用嗎?那就從現在開始創造一個完全屬於自己的世界!

  安卓巴士:在衆多語言或技術中,您現在主要使用的是哪個語言?爲什麼?

  李寧:目前主要使用Java,也會使用objective-C、C、C++和C#。因爲需要做跨平臺的東西,這一點Java是最方便的。至於其他語言,有的是爲了輔助Java來用的,有的是其他平臺的必須語言,如iOS。

  最後又想起某位古人說的話:作爲一名優秀的程序員,應該三個月就學習一門新語言。

  哎,按這個標準,我離優秀的程序員還差得很遠呢,看看有生之年剩下的語言還夠我學不。不夠就自己創造幾種語言吧!

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章