作者: 張紀剛

好長時間沒好好寫點東西了,前段時間由於專案的需要出差了一個多月,期間各種加班,每天晚上加班到十點,回到賓館實現是沒什麼精力再寫部落格了。有時間能靜下來寫點東西總是很好的一件事,如果寫技術方面的部落格,不僅能給讀者提供一些解決問題的線索,也能加深自己對技術點的理解,如果寫的是自己對專案的感悟,也算是對自己所做的工作的總結。現在終於有時間寫點東西了,感覺還是不錯的。

  今天這篇部落格不是寫關於具體技術的,而是我對程式設計師怎樣學習和提高自己能力的一些感悟。我是今年7月初畢業的,離開學校後就直接進入之前實習的公司上班了。現在算來工作了也將近半年了,算上實習的時間,將近一年了。在這期間,參與了幾個android專案的開發,也維護過別人寫的專案,雖然都不是很大的專案,但也學習了不少東西。在這其間,我親身經歷了一個設計拙劣的專案,是怎麼樣一步步趨於混亂而最終變的完全不可維護。從這件事情我瞭解到優秀的程式設計師是多麼可貴,而“不優秀”的程式設計師是怎樣把專案一步步的搞砸搞爛,也瞭解到做出一款優秀的軟體是多麼的困難。什麼樣的程式設計師才算優秀的程式設計師,而什麼樣的程式設計師是“不優秀”的?(我不願意說別人壞話,只能委婉的說“不優秀”)作為一個工作不到半年的新人,談論這個問題好像沒什麼權威性可言, 我也只是簡單的談論一下自己的看法,鑑於自己的閱歷和經驗不是很豐富,難免具有侷限性,讀這篇文章的讀者可以指出我的錯誤。

  我認為,優秀程式設計師和不優秀程式設計師的區別首先是態度上的區別。優秀的程式設計師有自己的理想,他們想做出好的東西,而不是混混日子而已,他們思考很多,不管是專案開始之前還是在專案進行中,專案完成之後也會進行總結。他們對待問題比較嚴謹,思考比較全面,在動手寫程式碼之前肯定經過了一定的思考,對可能引入的問題進行預估。而不優秀的程式設計師對待問題比較隨意,也就是態度上不是那麼認真,程式碼寫的也比較隨意,從不考慮以後的變化因素,今天吃飽不管明天肚子餓,他們不會意識到他們的程式碼已經汙染了整個專案。在發現問題時,優秀的程式設計師總是想辦法彌補,他們會找出自己的程式碼寫的不好的地方,謹慎的修改或大膽的推翻重寫,這樣的話把問題消滅在萌芽階段而不會讓整個專案偏出正軌。而不優秀的程式設計師,很少能發現問題,即使能發現問題,也是遲遲不肯做出彌補,他們總是僥倖的認為這些問題不會在後期暴露出來,所以問題越積越多,最後導致整個專案混亂不堪,錯誤百出,無法維護。

  除了態度上的不同,在能力上也有很大的差別。顯而易見,優秀的程式設計師懂得比較多,他們樂於深入研究原理,對底層的知識有一定的瞭解或者瞭解的很透徹,而不只是停留在呼叫一個API;而不優秀的程式設計師一般不喜歡思考,對原理的興趣也不多,他們不願意花一些時間把一些問題搞明白,而只是簡單的呼叫一下API,如果解決不了問題,隨便在網上搜一段程式碼複製過來就萬事大吉。所以遇到比較難纏的問題,優秀的程式設計師總是能從原理出發,一針見血的看出問題的真正原因,進而解決問題,而不優秀的程式設計師總是停留在表面,在網上搜了很長時間也沒有解決問題。我深切的認識到,如果只是停留在呼叫API而不深入原理,永遠也用不好API。

  除此之外,優秀的程式設計師的另一個特點是善於並樂於學習,他們對自己所從事的工作有濃厚的興趣,有強烈的好奇心,他們總是想把問題弄明白,他們喜歡清晰,而不是迷迷糊糊的感覺。對一個人的進步起決定性作用的因素是刻苦的學習,而不是所謂的“經驗”。就像有人說的那樣,在公司裡工作不會使你成為大牛,只有持續的學習才能讓你有長足的進步。現在很多招聘職位要求有幾年的工作經驗,這是最容易讓人誤導的。工作時間長的就能力一定強嗎?舉個例子,有兩個清潔工,一個幹了十年,每天還在默默的工作,而另一個只幹了幾天,經過自己的思考發明了一個新的工具或方法,讓他的工作事半功倍。所以說,工作經驗是很虛的東西,他用時間來計量,一個人工作了5年,他可能在5年中每天都學習進步,也可能一個經驗用了5年而沒有什麼實質性的提高。

  扯了這麼多,好像和題目沒什麼關係。現在扯點和題目相關的。作為一個搞Android應用開發的,我為什麼要學Linux呢?我工作中又不會寫Linux程式,再說Linux核心博大精深,程式碼海量,關係錯綜複雜,學習Linux核心肯定要耗費大量的時間和精力,那我為什麼還要學呢?在說這個問題之前,先談談我對學習的看法。

  在學習一個東西之前,出於保險起見,我們總是會詢問別人的意見,而在這些意見中,總是會有人說學這個幹什麼,工作中又用不到。如果誰給了你這樣的建議,那麼你一定要小心,因為基本上可以斷定他是一個不愛學習的人。有很多東西,不是因為你“感覺”有用才學它,而是學了之後才能知道它有用。我的一位朋友是做C#的,他在業餘時間學了Perl,當時學的時候總是有人認為沒有用,但是當他學會之後,可以使用Perl強大的文字處理能力,去整理格式混亂的原始碼檔案,可以寫個程式自動的給領導發郵件。還有我大學的一位老師,年輕時因為英語比較好,被單位派去美國,獲得了深造的機會,回來後做了我們學校的物理系主任,很多人也認為英語沒有用,呵呵。我進入公司實習的時候,看了設計模式,在我翻看《Head First設計模式》時,被一個有經驗的同事看見了,他告訴我看設計模式沒有用,因為我們的專案是不會用到設計模式的。我不知道這是什麼邏輯。反正當我看完設計模式之後,真的被這些設計巧妙而又極具實用性的模式所震撼,在以後的專案中,我大量使用了這些模式或者設計原則。所以如果一個工作了兩三年或者更長時間的程式設計師還沒有學習過設計模式,我會深深的鄙視他,認為他不是一個真正的程式設計師。

  我上大學時學習了Java語言,當時還費了不少勁。基本的語法比較熟悉了之後,還是感覺到有些東西總是糊里糊塗,不夠清晰,比如說不知道反射是怎樣工作的。所以找了《深入Java虛擬機器》來看,當我看了兩遍這本書之後,感覺到原來不清晰的地方都顯得自然而然,知道了class檔案結構是怎樣的,類是怎樣被載入的,指令是怎麼樣被執行的,方法是怎樣被動態繫結的。這些知識對我有很大的幫助,假如我不學習Java虛擬機器,只是單純的寫Java程式,即使寫上10年,也不見的比我現在對Java的理解更透徹。

  說了這麼多,只是想說學習是有用的,大大的有用。一個經驗用5年並不等於有5年的工作經驗,一個不學習的程式設計師是不會有什麼發展機會的。所以,對於一個Java程式設計師,還分不清物件和物件的引用,對於一個iOS程式設計師,還分不清ViewController到底是MVC中的檢視還是控制器,那麼沒錯,你該學習了,該靜下心來好好鞏固一下基礎了。

  最後,來到正題。我為什麼學習Linux核心?首先,我對Linux有很深的興趣和好奇心,我喜歡專研一下。從實用性出發,我可能一輩子都沒有機會編寫Linux核心,也可能一輩子都不會從事Linux驅動開發相關的工作,但是我知道它對我是有用的。能進一步加深對作業系統中概念和實現的理解,對底層的深入理解,能讓我打下紮實的基礎。一些新技術其實都是架構在基礎的東西之上的。基礎牢固,以後再學習什麼新技術都會水到渠成。有人可能會反駁,說學習底層的東西沒用,優秀的程式設計師應該專注於設計,專案管理或架構等上層的知識,我的觀點是,設計、專案管理或架構等上層的知識和底層的知識一點都不衝突,不懂底層的人,基礎不紮實,在上層也不會走的順暢,設想一下,如果沒有深厚的基礎知識,你怎麼能知道自己架構出來的東西能不能實現呢?

  寫到這裡文章就寫完了,由於比較困,可能寫的有些散亂,在最後總結一下這篇文章的主要觀點。

  總結:

  1. 我們要做優秀的程式設計師,不要做“不優秀”的程式設計師;

  2. 學習是有用的,如果有人給你的建議是學XXX沒用,那麼你可要當心;

  3. 底層的知識和高層的知識不是不能相容的,真正優秀的程式設計師應該兩者兼顧。