踏入程序員這個行業,你就註定要學習一生,由於新技術層出不窮,技術體系更新快速,這是和其餘行業最大的區別之一。因此,若是你想在這個行業混出點樣子,那麼請你隨時作好學習的準備,若是你想成爲優秀的程序員,那麼必定要有正確的學習方式,下面推薦幾條程序員的最佳學習方式,但願能幫你事半功倍。git
不管你是新手菜鳥仍是高級程序員,你都離不開書籍,固然咱們要有選擇的讀書,儘可能選擇一些經典的書籍來看,若是你英文水平比較好,那麼讀一些老外撰寫的書籍是最好不過的了。書籍能讓你在繁雜的互聯網上總結出一些對你有幫助的知識體系,能讓你在某方面變得愈來愈精通。程序員
期刊則能讓你的技術知識更加普遍,做爲優秀的程序員,你最好每個領域都要可以涉獵一些,知識面越廣越好,由於編程這東西都是相通的,也許有一天你用Java的設計思想實現了智能家居。github
這是積累知識的一種有效手段,有時候能夠幫你大大提升工做效率。不要認爲你寫過的代碼沒有用處,有些經常使用的工具方法必定要收藏起來,整理出屬於本身的工具類庫。好比:文件操做類、序列化類、數據庫操做類、字符串處理類等等,時間久了,你會發現他們對你的幫助不是通常的大,這裏很少說,本身去實踐一下就知道了。數據庫
要明白一點,全世界不是你一我的在寫代碼,做爲優秀的程序員,交流是必不可少的,國外的社交網絡,我推薦reddit和github,因爲目前googleapis被屏蔽,上reddit會有點困難。編程
花更多的時間理解和分析問題,而後再設計方案吧。你會發現剩下的事情很容易了。設計不是說要用建模語言和工具,能夠是僅僅看看天空在腦子裏構思。那些在遇到問題就開始敲代碼的人每每會最終偏離需求。api
做爲程序員,當你在編寫代碼以前,儘可能把問題分析透徹一點,這不只能提升你編碼的效率,更重要的是能提升你的分析問題能力。安全
許多人都有個共同特色,只有當他須要幫助的時候,他纔會求助於論壇或者羣。優秀程序員不一樣之處在於他們會常常瀏覽論壇去幫助他人。相比較於靠別人幫助解決問題,他們幫助他人讓本身學到更多。在一個團隊中也是同樣,幫助他人解決問題收穫更多。相信我,瞭解他人的問題,思考並最終提供解決方案吧,你會比以前學到的更多。網絡
這點是技術以外的技能,也就是人際關係。不管是小組組長,仍是部門經理,你都要千方百計和他們搞好關係,儘管他們不可能教你不少知識,可是他們會給你不少學習知識的機會,好比將重要的項目交給你作,或者是一些公司的培訓。架構
處理人際關係是大部分程序員的弱點,在領導面前少一點吐槽,別再黑你的項目經理了,呵呵呵。框架
在這個世界上,有數百萬的人熱衷於軟件開發,他們有不少名字,如:軟件工程師(Software Engineer),程序員(Programmer),編碼人(Coder),開發人員(Developer)。通過一段時間後,這些人也許可以成爲一個優秀的編碼人員,他們會很是熟悉如何用計算機語言來完成本身的工做。可是,若是你要成爲一個優秀的程序員,你還能夠須要有幾件事你須要注意,若是你能讓下面十個條目成爲你的習慣,那麼你才能真正算得上是優秀程序員。
1.學無止境。就算是你有了10年以上的程序員經歷,你也得要使勁地學習,由於你在計算機這個充滿一創造力的領域,天天都會有不少不少的新事物出現。你須要跟上時代的步伐。你須要去了解新的程序語言,以及瞭解正在發展中的程序語言,以及一些編程框架。還須要去閱讀一些業內的新聞,併到一些熱門的社區去參與在線的討論,這樣你才能明白和了解整個軟件開發的趨勢。在國內,一些著名的社區例如:CSDN,ITPUB,CHINAUINX等等,在國外,建議你常常上一上digg.com去看看各類BLOG的聚合。
2.掌握多種語言。程序語言老是有其最適合的領域。當你面對須要解決的問題時,你須要找到一個最適合的語言來解決這些問題。好比,若是你須要性能,可能C/C++是首選,若是你須要跨平臺,可能Java是首選,若是你要寫一個Web上的開發程序,那麼PHP,ASP,Ajax,JSP可能會是你的選擇,若是你要處理一些文本並和別的應用交互,可能Perl, Python會是最好的。因此,花一些時間去探索一下其它你並熟悉的程序語言,能讓你的眼界變寬,由於你被武裝得更好,你思考問題也就更爲全面,這對於本身和項目都會有好的幫助。
3.理性面對不一樣的操做系統或技術。程序員們老是有本身心目中無可比擬的技術和操做系統,有的人喜歡Ubuntu,有的人喜歡Debian,還有的人喜歡Windows,以及FreeBSD,MacOSX或Solaris等等。看看個人BLOG(http://blog.csdn.net/haoel)中的那篇《其實Unix很簡單》後的回覆你就知道程序員們在維護起本身的忠愛時的那份執着了。只有一部分優秀的程序員明白不一樣操做系統的優點和長處和短處,這樣,在系統選型的時候,才能作到真正的客觀和公正,而不會讓情緒影響到本身。一樣,語言也是同樣,有太多的程序員老是喜歡糾纏於語言的對比,如:Java和Perl。哪一個剛剛出道的程序員沒有爭論去相似的話題呢?好比VC++和Delphi等等。爭論這些東西只能代表本身的膚淺和浮燥。優秀的程序並不會執着於這些,而是可以理性的分析和理心地面對,從而才能客觀地作出正確的選擇。
4.別把本身框在單一的開發環境中。 再一次,正如上面所述,每一個程序員都有本身忠愛的工具和技術,有的喜歡老的(好比我就喜歡Vi編輯程序),而有的喜歡新的好比gedit或是Emacs等。有的喜歡使用像VC++同樣的圖形界面的調試器,而我更喜歡GDB命令行方面的調式器。等等等等。程序員在使用什麼樣的工具上的爭論還少嗎?處處都是啊。使用什麼樣的工具原本無所謂,只要你能更好更快地達到你的目的。可是有一點是優秀程序員都應該瞭解的——那就是應該去嘗試一下別的工做環境。沒有比較,你永遠不知道誰好誰很差,你也永遠不知道你所不知道的。
5.使用版本管理工具管理你的代碼。千萬不要告訴我你不知道源碼的版本管理,若是你的團隊開發的源代碼並無版本管理系統,那麼我要告訴你,你的軟件開發還處於石器時代。趕快使用一個版式本管理工具吧。CVS 是一個看上去平淡無奇的版本工具,但它是被使用最廣的版本管理系統,Subversion 是CVS的一個升級版,其正在開始接管CVS的領地。Git 又是一個不一樣的版本管理工具。還有Visual SourceSafe等。使用什麼樣的版本管理工具依賴於你的團隊的大小和地理分佈,你也許正在使用最有效率或最沒有效率的工具來管理你的源代碼。但一個優秀的程序員老是會使用一款源碼版本管理工具來管理本身的代碼。若是你要我推薦一個,我推薦你使用開源的Subversion。
6.是一個優秀的團隊成員。 除非你喜歡獨奏,除非你是孤膽英雄。但我想告訴你,今天,可能沒有一個成熟的軟件是你一我的能作的到的,你多是你團隊中最牛的大拿,但這並不意味着你就是好的團隊成員。你的能力只有放到一個團隊中才能施展開來。你在和你的團隊成員交流中有禮貌嗎?你是否常常和他們溝通,而且你們都喜歡和你在一塊兒討論問題?想想一個足球隊吧,你是這個隊中好的成員嗎?當別人看到你在場上的跑動時,當別人看到你的傳球和接球和搶斷時,你的團員成員能由於你的動做受到鼓舞嗎?
7.把你的工做變成文檔。 這一條目固然包括了在代碼中寫註釋,但那還僅僅不夠,你還須要作得更多。有良好的註釋風格的代碼是一個文檔的基礎,他可以讓你和你的團隊容易的明白你的意圖和想法。寫下文檔,並不只僅是怕咱們忘了當時的想法,並且仍是一種團隊的離線交流的方法,更是一種知識傳遞的方法。記錄下你所知道的一切會是一個好的習慣。由於,我相信你不但願別人老是在你最忙的時候來打斷你問問題,或是你在休假的時候接到公司的電話來詢問你問題。而你本身若是總是守着本身的東西,其結果只多是讓你本身長時間地深陷在這塊東西內,而你就更本不能夠去作更多的事情。包括向上的晉升。你可能覺得「教會徒弟能餓死師父」,但我告訴你,你的保守會讓你失去更多更好的東西,請你相信我,我毫不是在這裏聳人聽聞。
8.注意備份和安全。 可能你以爲這是一個「廢話」,你已明白了備份的重要性。可是,我仍是要在這裏提出,丟失東西是咱們人生中的一部份,你老是會丟東西,這點你永遠沒法避免。好比:你的筆記本電腦被人偷了,你的硬盤損壞了,你的電腦中病毒了,你的系統被人入侵了,甚至整個大樓被燒了,等等,等等。因此,作好備份工做是很是很是重要的事情,硬盤是不可信的,因此按期的刻錄光盤或是磁帶可能會是一個好的方法,網絡也是不可信的,因此當心病毒和黑客,不但使用軟件方面的安全策略,你更須要一個健全的管理制度。此外,儘可能的讓你的數據放在不一樣的地方,並作好按期(每日,每週,每個月)的備份策略。
9.設計要足夠靈活。 可能你的需求只會要求你實現一個死的東西,可是,你做爲一個優秀的程序,你應該隨時在思考這個死的東西是否能夠有靈活的一面,好比把一些參數變成能夠配置的,把一些公用的東西造成你的函數庫以便之後重用,是否提供插件方面的功能?你的模塊是否要以像積木同樣隨意組合?若是要有修改的話,你的設計是否可以立刻應付?固然,靈活的設計可能並非要你去從新發明輪子,你應該儘量是使用標準化的東西。所謂靈話的設計就是要讓讓考慮更多需求以外的東西,把需求中這一類的問題都考慮到,而不是隻處理需求中所說的那一特定的東西。好比說,須要須要的屏幕分辨率是800×600,那麼你的設計可否靈活於其餘的分辨率?程序設計老是須要咱們去處理不一樣的環境,以及將來的趨勢。咱們須要用動態的眼光去思考問題,而不是刻舟求劍。也許有一天,你今天寫的程序就要移植到別的環境中去,那個時候你就能真正明白什麼是靈活的設計了。
10.不要搬起石頭砸本身的腳。程序員老是有一種很差的習慣,那就是老是想趕快地完成本身手上的工做。但狀況卻每每事已願違。越是想作得快,就越是容易出問題,越是想作得快,就越是容易遺漏問題,最終,程序改過來改過去,按下葫蘆起了瓢,最後花費的時間和精力反而更多。欲速而不達。優秀程序員的習慣是前面多花一些時間多做一些調查,試驗一下不一樣的解決方案,若是時間容許,一個好的習慣是,每4個小時的編程,須要一個小時的休息,而後又是4個小時的編碼。固然,這因人而異,但其目的就是讓你時常回頭看看,讓你想想這樣三個問題:1)是否這麼作是對的?2)是否這麼作考慮到了全部的狀況?3)是否有更好的方法?想好了再說,時常回頭看看走過的路,時常總結一下過去事,會對你有很大的幫助。
以上是十條優秀程序員的習慣或行爲規範,但願其能夠對你有所幫助。
正確的軟件開發應該是懶惰式開發,也被稱做忍耐式開發;這種開發方式的表現是,在真正動手寫代碼前,程序員要花大量的時間通盤考慮全部可能的解決方案和途徑。這能夠看做是延緩寫代碼,在沒有徹底理解問題前毫不動手寫代碼。先把問題理解清楚,確保將要寫的代碼能真正的解決問題,這將會避免以後寫出大量無用的代碼。
這裏說的先把問題弄清楚,表現有:
1. 真正的理解需求,讓產品部門(業務分析部門)弄清楚他們真正需求的是什麼。
2. 清楚跟團隊中的其它程序員或其餘團隊中的程序員須要那些交互,如何交互,這包括:
你須要花大量的時間調研,來確保需求符合實情,來作工做讓你和同事的交流有共同的語言語義。然而,程序員都喜歡馬上衝上去編程,喜歡在電腦前不停的敲代碼。
在真正的軟件開發中,只有5%的開發時間是有效率的(你能夠參考《程序員開發效率悖論》)。若是你發現一個程序員用100%的時間都在盯着屏幕,那麼,你看到的這個程序員是最糟糕的程序員。
若是一個程序員老是在電腦前編碼,這絕對是一個很差的信號。
高效的程序員老是不斷檢查他對需求的理解,確保他們的代碼和需求是同步的。高效的程序員是頻繁的和產品經理/業務人員溝通交流,你能夠常常看到他們使用白板與同事和架構師交流討論。程序員的閱歷和經驗都是用來提升開發效率,最優秀的程序員:
程序員從心理上講都是喜好本身的代碼的。
爛程序員不喜歡去修改已經寫成的爛代碼。相比起優化本身的代碼,他們更願意簡單的增長更多的代碼,以此來彌補以前的缺陷。更糟糕的是,他們喜歡把責任歸咎於他人。最終,一堆很差用的代碼上再加上另一堆很差用的代碼,整個系統變獲得處是bug,極不穩定。
優秀的程序員常常也會寫出爛代碼,但他們能看到那些代碼須要優化,哪些須要重寫。優秀的程序員和不優秀的程序員的區別就在於對有問題的代碼的態度,優秀的程序員的作法是:
當代碼中有須要優化或須要重寫的地方時,時間拖的越久,你就越難回頭解決這些問題。由於對這些代碼依賴的程序會愈來愈多,愈來愈深,當你優化這些代碼時,相關的依賴也須要進行相關修改。當積累的問題愈來愈多時,輕鬆的優化/從新這些代碼已經變得不可能。而使用繼續增長代碼的方式來彌補以前代碼問題,會讓系統變得愈來愈不穩定。
若是腦子裏沒想清楚,那就懶一些,把寫代碼的時間日後推。