轉來的,我以爲挺好,分享一下

今天這篇博客不是寫關於具體技術的,而是我對程序員怎樣學習和提升本身能力的一些感悟。我是今年7月初畢業的,離開學校後就直接進入以前實習的公司上班了。如今算來工做了也將近半年了,算上實習的時間,將近一年了。在這期間,參與了幾個android項目的開發,也維護過別人寫的項目,雖然都不是很大的項目,但也學習了很多東西。在這其間,我親身經歷了一個設計拙劣的項目,是怎麼樣一步步趨於混亂而最終變的徹底不可維護。從這件事情我瞭解到優秀的程序員是多麼難得,而「不優秀」的程序員是怎樣把項目一步步的搞砸搞爛,也瞭解到作出一款優秀的軟件是多麼的困難。什麼樣的程序員纔算優秀的程序員,而什麼樣的程序員是「不優秀」的?(我不肯意說別人壞話,只能委婉的說「不優秀」)做爲一個工做不到半年的新人,談論這個問題好像沒什麼權威性可言, 我也只是簡單的談論一下本身的見解,鑑於本身的閱歷和經驗不是很豐富,不免具備侷限性,讀這篇文章的讀者能夠指出個人錯誤。java

 

我認爲,優秀程序員和不優秀程序員的區別首先是態度上的區別。優秀的程序員有本身的理想,他們想作出好的東西,而不是混混日子而已,他們思考不少,不論是項目開始以前仍是在項目進行中,項目完成以後也會進行總結。他們對待問題比較嚴謹,思考比較全面,在動手寫代碼以前確定通過了必定的思考,對可能引入的問題進行預估。而不優秀的程序員對待問題比較隨意,也就是態度上不是那麼認真,代碼寫的也比較隨意,從不考慮之後的變化因素,今天吃飽無論明天肚子餓,他們不會意識到他們的代碼已經污染了整個項目。 在發現問題時,優秀的程序員老是想辦法彌補,他們會找出本身的代碼寫的很差的地方,謹慎的修改或大膽的推翻重寫,這樣的話把問題消滅在萌芽階段而不會讓整個項目偏出正軌。而不優秀的程序員,不多能發現問題,即便能發現問題,也是遲遲不願作出彌補,他們老是僥倖的認爲這些問題不會在後期暴露出來,因此問題越積越多,最後致使整個項目混亂不堪,錯誤百出,沒法維護。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 底層的知識和高層的知識不是不能相容的,真正優秀的程序員應該二者兼顧。

相關文章
相關標籤/搜索