回顧個人提高之路,我以爲有幾點能夠跟你們分享的:前端
第一是「興趣」。這也是我認爲最重要的一點,一件事情作 10 年甚至作一生,若是沒有興趣的話,我以爲是很痛苦的。興趣是本能的驅動力,有了興趣,遇到問題會一直想着怎樣去解決,而不是以爲「很難作」;有了興趣,碰到一個新的東東會以爲很興奮,而不會以爲是一種負擔;有了興趣,接觸到一個東西后就像更加深刻的去了解,而不是用過了就無論了。因此我認爲若是想在一個行業(不限於軟件行業)長期發展並有所提高的話,必定要問問本身是否有足夠的興趣。程序員
第二是「堅持」。《異類》一書中提到一個 10000 小時理論,我以爲很是有道理,意思就是說若是你想成爲頂尖人才的話,必定要積累 10000 小時以上的訓練和經驗。特別是在軟件開發這個領域,技術又多,技術更新又快,若是沒有堅持去積累和提高的話,是很難達到必定高度的。操做系統、數據庫、網絡、編程語言、設計方法等都要掌握,每一個技術點又有不少更細的分類。以編程語言來講,C、C++、Java、PHP、Python 等主流的都有 10 來種,每一個語言繼續深刻的話又有不少內容,例如 Java 能夠列出來的有 JVM、IO、NIO、網絡編程、反射。。。。。。等等。因此這麼多的東東,短期內快速入門還能夠,但若是說 21 天就精通 XXX,那是不可能的,必須通過長時間的積累。其實我如今都不敢說我精通什麼,只能說相對周圍其餘人會精通一些。面試
第三就是「方法」。掌握正確的方法,可以讓咱們事半功倍,更快的提高,一些常見的方法我就不囉嗦了,這裏特別分享獨家祕方:數據庫
一個祕方是「寫博客」,注意這裏不是「看博客」,也不是「轉載博客」而是「親自寫博客」。哪樣東西你以爲你比較懂了,那麼你就寫成博客。當你真正去寫的時候,你會發現,其實還有不少不懂或者不清楚的地方,這樣就會促使你又去學習研究;當你的博客發表後,其餘人除了可以從你的博客中學到東西外,也可以幫你發現一些問題或者錯誤,這樣你就更進一步的掌握了;編程
另一個祕方就是「鏈式學習」。形象點說,就是你抓住了一個鏈條的一個鏈,而後慢慢慢慢把全部的鏈都拉出來。舉一個很簡單的例子:socket sever編程。不少人在編程的時候,都是去搜索引擎搜索一下「socket server樣例」,而後對照樣例很快就寫完功能了。而後呢。。。。。。不少人沒有而後了,完成任務就無論了。其實這樣作就錯過了一次提高本身的好機會。api
「鏈式學習」則不同,它是這樣作的:我經過搜索引擎搜索到樣例完成工做後,我會問本身不少問題:樣例中的api每一個參數都是什麼含義,有哪些注意事項,還有其它API麼?爲了解決這些問題,我就可能去找本書看,某個編程語言的socket編程;看完之後我知道socket編程的全貌和一些注意事項,而這些是經過搜索引擎搜索的樣例中沒有的;知道socket編程的全貌後,我又會問本身:操做系統是怎麼作的呢? 那我又會去看《UNIX網絡編程》,看完後我就對操做系統層面的又掌握更多了;看完《UNIX網絡編程》後,我又知道socket是和tcp/ip相關的,那我又會去看《TCP/IP協議詳解》。。。。。。瀏覽器
這樣去作就是一條學習鏈: socket server編程 -> socket 編程 -> UNIX網絡編程 -> TCP/IP協議,後面還能夠繼續不斷拓展下去。如此不斷的拓展和深刻,一個很小的契機就能初始你學到不少東西,而這些東西在之後的工做中某些時刻就派上用場了。微信
我以前在華爲是在Windosw平臺上用MFC開發,後來到了UC轉爲Linux平臺開發,用這種方法,大約用了2年就熟練掌握了Linux平臺相關的開發技術,包括Linux、MySQL、C++、Java、PHP等網絡
第三個祕方就是「閉環學習」。「鏈式學習」適合於一組相關聯的知識或者技能的學習,而「閉環學習」更適合業務、相互配合的知識和技能的學習。因爲軟件開發是須要多個團隊分工合做的,因此絕大部分人都只負責整個系統或者全流程中的一環,這樣致使不少人覺得只須要將本身負責部分精通就能夠了。其實這樣不利於我的的發展,一個緣由是本身負責的通常都比較窄,可學習和提高的空間可能很少,另一個緣由是很難設計總體上優秀的方案。app
而「閉環學習」則不同,它是這樣作的:瞭解整個功能或者業務的全流程實現,涉及了哪些模塊和系統,每一個模塊和系統主要負責什麼功能,涉及到什麼技術,性能怎樣,有什麼注意點。舉一個我作個的HTTP的業務樣例:從用戶點擊一個url開始,通過了 瀏覽器 -> 網絡 -> CDN -> Nginx -> PHP -> MySQL -> PHP -> Nginx -> 網絡 -> 瀏覽器,最後呈如今用戶面前。我開發的時候只是用PHP開發,但並不僅侷限於PHP自己,閉環學習就要求全流程中的每一個環節都要去了解和熟悉,這樣你就能夠學到了「瀏覽器、Nginx、CDN、MySQL」等不少知識。
有的朋友可能會問:這樣作有什麼用呢?其實用處很是大,一個是當出現問題的時候,有了閉環學習掌握的知識和技能,你就知道哪些地方可能有問題,應該如何處理;另一個用處是,當你考慮設計方案的時候,就不侷限於PHP自己了,也許某個功能Nginx或者CDN或者前端能作的更好,用PHP實現反而很蹩腳。
一個優秀的程序員應該具有哪些技能和修養?
首先是「快速學習能力」。這裏不是說必定要去快速去學習各類各樣的新技術,而是說當有須要時,可以快速的學習。不少人開始學新的技術和技能時,一開始就一頭扎進去寫樣例、寫Demo、看源碼,我認爲這不是好的方法,並且比較耗費時間,收效也不明顯。
我給你們分享個人4W2H快速學習方法。我在學習新的技術的時候,都是按照這樣的步驟去了解的:
1)這個技術能解決什麼問題(why)
2)比較適合在哪些場景應用(where + when)
3)這個技術跟我已經掌握的哪一個知識或技能相似,有什麼差異、有什麼特色、 有什麼優勢和缺點(what)
4)瞭解前面的問題後,我纔會開始去嘗試寫寫Demo,或者更進一步去應用(How to use)
5)以爲有興趣或者其實現很牛逼的狀況下,我就去研究一下原理機制,看看源碼等 (How it implements)
其次是「良好的理解能力」。程序員須要將產品人員或者用戶用天然語言表述的需求翻譯成程序語言。天然語言有一個特色就是通俗但不嚴謹,而程序語言必須是很是嚴謹的。若是對產品人員或者用戶提出的需求沒有很好的理解,即便程序語言寫的再漂亮,技巧再高,最後作出來也是一個不符合要求的產品。
記得有一個關於「美女」的笑話:人聽到「美女」後的反應是想到「天使面孔魔鬼身材童顏巨乳」,而豬聽到「美女」後的反應是「烏克蘭大白豬」,貓聽到「美女」後的反應是「有着金色光滑皮毛的波斯貓」。若是程序員給了貓一個「天使面孔魔鬼身材童顏巨乳」的美女,貓必定會以爲很難看。
第三是「持續不斷的學習」。軟件開發領域設計的知識和技能太多了。從廣度上來講,有操做系統、數據庫、編程語言、網絡、設計等,編程語言又有幾十種;從深度上來講,操做系統、數據庫、編程語言等都是能夠不斷深刻去學習的。不管你是從事對技能廣度要求更高的業務開發,仍是從事對技能深度要求更高開發專項系統,都須要不斷的學習,這樣才能不斷的提高本身的能力。
第四是「樂於分享」。若是單純從我的完成工做的能力來看,可能確實也有不少程序員不愛分享但確實很厲害。但我認爲真正優秀的程序員必定是除了本身優秀外,還能讓其餘人也變得優秀,或者可以貢獻優秀的開源項目以下降別人的重複工做。分享的途徑有不少種,能夠給公司人員作培訓,能夠寫博客,能夠貢獻開源項目等。
程序員如何「擠」出時間來提高本身或在技術上提高本身?
給年輕程序員的幾條建議:
打造你的工具箱。工欲善其事,必先利其器。每一個開發者都應該有一把本身的瑞士軍刀,在未來漫長的職業生涯中,這些工具能夠爲你省下寶貴的時間,並幫助你更好的組織我的知識庫。舉兩個例子
一套高效的開發環境
一個信息採集器和一本筆記本
高效的開發環境。咱們能夠從編緝器談起,這裏有 IDE vs Text Editor,有 Vim vs Emacs,有 Sublime vs Atom,那該如何選擇呢?在作選擇以前,咱們先想一想本身的目標。咱們但願這是一個長期的投資,這款編緝器能被長期使用,在這個過程不斷的打磨,使其能完 全適合本身的習慣,最大化編緝效率。若是程序員是俠客,編緝器則是他手中的劍。
信息採集器和筆記本。前者是用來收集別人產生的信息,後者則是收集本身產生的信息。前者一個簡單的例子就是瀏覽器的 Bookmark。你須要能隨時將一組有用的信息歸檔,並在將來的某個時刻快速找到它。後者最直觀的例子則是 Mac OS 或是 iOS 自帶的筆記本,這裏的目的是能隨時隨地記錄你本身的想法。從本質上講,就是你須要有一套好用的工具來作你的知識庫管理(Knowledge management),也能夠說是你知識和思想的外部備份。我我的如今是用 Evernote 同時來作信息採集與筆記的。若是有一個好的流程,你也徹底能夠用兩個工具來分別把這兩件事作好。但我建議你花足夠多的時間來思考如何組織你的我的知識庫。
以上只是兩個典型的例子,你須要作的是發現那些你要長期從事的任務(每每不隨技術而改變,也不隨公司而改變),將完成這些任務所需的工具調整至 最優。再舉一個例子,我會留意身邊的程序員所用的鍵盤。只有少部分的程序員會買高端的靜電容鍵盤,好比 HHKB。而在我看來,這明顯是一筆很划得來的投資,程序員在工做的大部分時間裏都須要和鍵盤打交道,一個溫馨的打字體驗是很是有收益的,更況且這類高品 質的鍵盤都很是的耐用。
開闊你的視野,構建你的技術體系
首先你要給本身設定一個目標,就如同一個公司會設定它的 Vision。
目標要夠大,這樣你才能看到更多的風景。
目標應該設定在解決哪一類問題,而不是精通哪一類技術。技術只是手段,不是目的。
例如,「我要成爲 iOS developer 中的達人」這個目標,就遠不如「我要成爲前端應用開發的專家」來得有意義。前者學到深處你可能會去鑽研 iOS framework 裏各類奇技淫巧,然後者你會開始關注視覺與交互設計,研究各平臺間的差別與共同趨勢。顯然,後者更有助於你的我的發展。
最後我建議每一個程序員都應該經營一款本身的產品,它能夠是一款 app,一個網站或是一個開源軟件。除非你是一個創業公司的早期員工,否則你可能沒有機會將全部學到的技術或是理念都付之實踐,有不少人想成爲全棧工程 師,最快的捷徑就是打造一款本身的產品。任何一個設計師都會精心打造本身的 Portfolio,但大部分程序員卻不會。當評估一個程序員的 Coding 能力時,我會去看他的 Github 上是否有出彩的項目,惋惜國內絕大部分程序員的 Github 空空如也,或者只有一些很是簡單的程序。我建議你們好好經營本身 Github 上項目,這不但能夠提升你的聲譽,對你未來的求職也很是有幫助。當你報怨求職面試時又被問到各類無厘頭的程序題時,有沒有想過面試官也很無奈,由於他沒有 任何其餘方法得知你的 Coding 能力究竟如何。若是每個程序員都有本身的做品,我想程序員的面試會簡單許多。
重視溝通能力的培養
當被問到「你學得 Junior Developer 和 Senior Developer 最大的差異是什麼」時,我最天然的反應是溝通與文檔。溝通包括程序員團隊內部的溝通,與其餘團隊的溝通,與 Manager 的溝通等等。我不認爲本身有能力把這些問題很是歸納地說清楚,不過我能夠給一條建議,那就是先學會和你的 Manager 溝通,讓他來教你其他的部分。許多公司都會設置 Manager 與組員的 1:1,一個有效率的 1:1 應該大部分時間有組員來主導。這須要你在 1:1 以前花足夠多的時間來考慮要問的問題,而且最好提早 1 天發給 Manager,讓他有機會思考答案。許多人對此不過重視,或者只問很是具體的問題而不是一些開放性問題,這樣你很難在你的 Manager 身上學到東西。若是你漸漸懂得如何利用 1:1 的時間,它很會成爲你在工做中單位時間投資回報率最高的活動。
累積你的人脈
每一個人都明白人脈的重要性,但實際作起來卻不容易。參加一些線下的會議或是活動,多是最直接的擴展人脈的方式之一。惋惜大部分人彷佛只是去聽 了一場技術講座就回家了。固然,這和很多活動的時間安排也有關係,講座時間排得太滿,茶歇時間短,加上有時嘉賓遲到或是沒控制好時間,乾脆就把茶歇取消 了。而實際上,結識一兩個同道中人遠比聽技術講座有價值。下次去參加這類會議,不妨給你本身設個目標,好比至少加兩個同行的微信。以後維繫你的人脈可能需 要花更多的時間,下了班或是週末找你的朋友們喝個咖啡吧!
另外我以爲每一個人都須要一個職場導師,他能夠是你第一份工做的導師或是 Manager,也能夠是你認識的其餘前輩。大家須要維繫一個很是長期的關係,不止於一家公司,最好貫穿你的整個職業生涯。每當你遇到疑惑時,均可以詢求 他的建議,我以爲這將是你最寶貴的一筆人脈財富。
尋找發揮你才華的平臺
最後也是最重要的一步,找到適合你的公司。作爲求職者評估一家公司能夠看三個方面
公司的發展前景(大公司的話,看所在部門的發展前景)
你將要加入的團隊
薪資福利
因此在面試一家公司的時候,你要意識到面試是雙向的,公司在面試你的同時,你也在面試這家公司。面試前你應該對這家公司作足功課,準備好一些有質量的問題,好比指出產品中的問題,詢問開發流程或是如何作績效評估。到時你也能夠檢驗一下你的面試官是否合格。
每次選擇公司對以上三個方面都應兼顧,但在職業生涯的不一樣階段,側重點不一樣。好比,在剛剛工做時,加入一個優秀的團隊最爲重要,他們能夠教會你 不少東西,提高你的能力。工做 5 年以後,你須要一個平臺施展你的才華,體現我的價值,公司發展前景的重要性迅速提高。當你作出一番成績,證實了本身的價值以後,逐漸進入收穫期,就有了與 公司要價的資格。另外一方面,團隊實力對公司的前景也有很大的影響。
對一個剛畢業,初入職場的同窗,一個近幾年被問了無數次的問題「個人第一份工做是去創業公司仍是大公司?」個人回答仍舊是「加入一個優秀的團隊 最爲重要」。
一些知名的大公司,團隊的素質是有必定保證,但創業公司則否則,團隊素質良莠不齊,因此如我前面所說你須要面試這個團隊,作出本身的判斷。不過除了團隊因素以外,我想提一下畢業生去創業公司的幾個好處。首先,在剛畢業的一段時間內,經濟壓力小,是最自由最能承受風險的時期,而這段時間每每不長,因此應把握好這個去創業公司的黃金時段。其次,全部的學生進入大公司後,都會擔任初級職位,某種程度上來說是學校學習的延續,規範有條理,但缺少獨立 性和創新性,而這正是中國大部分學生所欠缺的。這方面的能力在一家創業公司能夠獲得快速鍛鍊,而在大公司可能要等升到中級職位後纔有這方面的機會。我的觀點,僅供參考。
步入職場的前 3 年對從此的發展尤爲重要,但願此文能對年輕的程序員們有所幫助。