如何成為一名優秀的程序員?

誰不想成為一名優秀的程序員呢?

每年都有超過數十萬名計算機專業的畢業生進入社會,據不完全統計,進步最快的階段在剛參加工作的 1-3 年,同時眾多程序員中 3-5 年工作經驗的站大多數,很多人在此階段達到瓶頸期,專業能力停滯不前,所以如何持續進步成為一名優秀的程序員?

回答這個問題很簡單,我們只需要找到作為一名優秀的程序員,應該具有哪些特質,然後分析具備這些特質的條件。特質即結果,條件即方法,通過正確的方法得到想要的結果,從而成為一名優秀的程序員。

優秀的程序員具備的特質有很多,這裡我向大家分享一個我最看重也是最欣賞的一點特質就是:創造力。

為什麼是創造力?

回想一下當你遇到瓶勁期,專業能力停滯不前時的感受:每次寫的代碼千篇一律、拿手的需求得心應手,不拿手的需求每次都要 Google 一下粘貼複製、即使你寫了很多年代碼,做了無數的需求,但腦子裡的存貨還是那些,僅僅是把別人的代碼拿來完成需求,並沒有把別人的知識變成你的知識。

如果說到了你的痛點,別急,還有。

每次拿到需求都一籌莫展,但有的人卻能同時拿出好幾套解決方案,聽到新的技術名詞總是一臉疑惑,而隔壁家的小孩卻早已掌握。

當然,這是你的痛點,也是我的痛點。

日常逛 GitHub 是我的習慣,每次看到好玩的開源庫,我嚐嚐在感嘆,為什麼我寫不出這樣高質量的代碼?為什麼想不到這麼巧妙的解決方案?

其中之一的原因就是:優秀的人在創造代碼,而我只是在粘貼複製代碼。

擁有好的創造力也就意味著你擁有不錯的解決問題的能力。

如何提高創造力?

擁有創造力是我們的目標,根據前面說的:特質即結果,條件即方法。現在我們就來尋求一下通過哪些方法來提高自己的創造力。

豐富的知識儲備

首先巧妙高質量的代碼不是憑空蹦出來的,而是需要知識儲備的,作為程序員我們每天和各種各樣的 API 打交道,你知道哪些 API 可以實現怎樣的需求,你做起來就會得心應手,你不知道就會在做的時候一籌莫展,所以我一直認為寫代碼不是一個拼智商的工作,而是一個拼經驗拼知識儲備的工作。

擁有豐富的知識儲備,需要有獲取知識和結構化知識的能力,在這裡小跑一下題,同樣我們可以把知識儲備當成一個小目標,把獲取知識和結構化知識視為實現目標的方法,以此類推你可以不斷拆解,以此來發現自己已具備哪些特質,需要朝著哪些特質努力,並且找到實現這些特質的條件。

獲取知識

獲取知識的方法很簡單,知識可以分為新知識和舊知識,舊知識就是我們已經瞭解的,新知識就是隨著技術的發展而順應趨勢出現的。可能有同學會問:舊知識為什麼還要獲取呢?一葉障目明白吧?正因為是舊知識我們很容易會盲目相信自我,如果有錯誤的理解會一直根深蒂固的留在我們的腦子中,所以舊的知識也要時不時拿出來篩選篩選,查漏補缺。同時在舊的知識上面,我們有一定自己的理解,在遇到相左的情況時,也能更快的分辨出真假。

對於舊的知識,我的方法是去多看不同人實現的代碼,需求一樣,實現的方式會千差萬別,GitHub 是一個非常好滿足這一方法的地方,很早就之前就有人和我說過:「永遠要寫不一樣的代碼,這樣才會進步」。

新知識就簡單了,最正確的途徑就是官網、官方論壇、官方的 GitHub 倉庫等等,一手新內容一定是官方頻道最新更新的,不要等著每天就看看一些技術公眾號來幫我們介紹新技術,自己動手去了解是最快最直接最正確的方法。

結構化知識

當你擁有很多知識的時候,就需要去掌握組織、結構化知識的能力。很多時候,我們一直在努力學習,看了很多、也實踐了很多,但遇到稍微有點變式的問題,就又會一籌莫展,這時你需要把腦子中的知識,組織起來,加強之間的聯繫,多種知識建立連接,才能在遇到問題的時候組合出不同的解決方案。

我在這方面常用的方法就是,先按最小單元拆分,然後已最小單元為基礎進行查漏,看看有沒有忽略的地方,然後去嘗試通過各種方法去找尋各單元之間的聯繫。舉個例子,在 Android 的官網中,我們可以查到在 Android SDK 中提供執行後臺任務的 API 有 4 種:

如何成為一名優秀的程序員?


就像上圖所示,4 種每一個都是最小單元,當我都清楚每一個是幹什麼的、該如何使用之後,就要去找尋這 4 種單元之間的關係,這張圖很好的詮釋的它們之間的關係,當我理解完這張圖之後,以後再遇到類似的需求,就可以很好的拿出合適的解決方案了。

紮實的基礎

雖然我們有的在做客戶端開發,有的做前端開發、有的在做服務端開發,從大類上劃分我們都同屬於計算機學科。基礎方面我們可以劃分為兩大類:計算機基礎和專業基礎。

計算機基礎

這方面就是我們老生常談的一些東西了,例如:數據與數據結構,算法、網絡基礎、操作系統基礎、設計模式等等,掌握這些方面,不僅能夯實我們基礎,還能幫助我們在與不同領域的人協作的時候,減少不必要的麻煩降低成本,拓寬我們的技術視野,加強技術棧。

有人肯定會說你說的這些我都知道啊,可是我問你,你真的都懂了嗎?問幾個簡單的問題:

數據和數據機構有什麼關係?

數據結構和算法又有什麼關係?

哪些是基礎數據結構,哪些是高級數據結構?二者之間有什麼聯繫?

歡迎在評論區分享你的看法~

專業基礎

這方面就看各自的專業了,除了小白,大多數人都知道自己專業領域中,哪些是基礎內容,哪些是高級內容,一切源於基礎,高級內容是在基礎之上加以擴展優化出來的。小白也許會問了,那我們怎麼辦啊?我只能說你現在瞭解、學習、掌握的都是基礎...把現有的先吸收整理好,等你成長了,再回頭看看。

所以在這方面,我能提供給大家的經驗,就是寫一份思維導圖,劃分出自己當前專業下,需要掌握的計算機基礎和專業基礎有哪些,總結出一份技能圖譜,然後查漏補缺。

分享一份我曾經總結的 Android 技能圖譜,看似簡單,但擴展開其實內容很多。

如何成為一名優秀的程序員?


學習能力

又是一個很常見的話題,我們從幼兒園就開始上學,一直到大學畢業,學習了十幾年,但是 ... 你真的會學習嗎?

一個完整學習過程的閉環包括三部分:學習、記憶、傳授。這裡簡單和大家分享一下我的理解,如果你對此很有興趣,可以評論告訴我,我專門寫一篇文章像大家分享一下。

學習

同樣學習也分為學習新的東西和舊的東西。在學習舊的東西的時候,我們是通過深度聯想來學習的,用我們已知的理解來檢索式學習,不斷過濾我們已有知識概念,將新的理解與之前的理解建立聯繫加深記憶,這可以看作一個更新補充我們現有知識的過程。學習新的知識的時候,我們是通過字面聯想來學習的,因為我們沒有舊知識來做檢索,所以我們只能通過文字上的理解來學習,這時就需要我們在學習的過程中,提取關鍵的概念,建立心智模型,同時需要我們拿其他方面已建立的心智模型來輔助我們記憶,這是一個新增的過程。

記憶

從小到大的上學經歷,告訴我們要通過記憶來學習,在我看來學習和記憶應該相輔相成。學習是理解的過程,理解之後就自然記憶了,而不是通過死記硬背強行把知識留在我們腦中,到頭來我們僅僅記得兩個字:學過。最佳的記憶方式是:我們通過已有的知識來理解新的東西,將各個知識建立起聯繫來加深記憶,從而把新的東西轉化成自己的東西。舉個通俗的例子,你有一位很要好的朋友,你是如何記住他是你很要好的朋友的?在你的腦海中,不是因為你單單記住了他這個人,而是你一想起他,就想到了你們之間發生的事情,你的這位好朋友就相當於一個記憶點,而你們之前發生的事情,就是建立起來的聯繫,你們是通過聯繫而產生的記憶。

傳授

這是檢驗你學習成果的最好方式。當你能正確的把學到的知識教給別人,這才說明你真的學會了,因為從你口中組織語言說出的東西,才是你自己的理解,這不是複述那麼簡單,複述和傳授有著本質的區別,同時當你這篇文章看到這裡的時候,我也很期待你的回覆,希望你可以告訴我,我寫的這些對你來說是否好理解。當你下一次向別人分享東西的時候,可以分析一下自己這段是複述還是傳授,當然在你聽別人分析的時候,不一定是你理解不夠,也可能是說的那個人自己理解不夠,導致你很難理解。

最後

說了這麼多,我們再看一下開頭這個問題:如何成為一名優秀的程序員?

我說了優秀的程序員是具有創造力的,具備創造力的必要條件是具有:豐富的知識儲備、紮實的基礎、良好的學習能力。

當我們把這些倒過來看,其實正是我們從上學到工作所經歷的過程,十幾年的學習生涯,無時不刻在鍛鍊我們的學習能力,上了大學,各種各樣的計算機基礎課,工作之後我們進入了不同的專業領域,隨著工作開始儲備我們的知識庫。

所以優秀的程序員和我們走過的是同樣的路,我們還在原地掙扎是因為我們在這條路上遇到了眾多問題還沒有解決,而優秀的人也只是先我們一步解決了那些問題,所以大家要努力加油呀!

如果你覺得這篇文章還不錯,歡迎分享、轉發、點贊、關注、這對我有很大的幫助。

“我自己是一名從事了5年前端的老程序員,辭職目前在做講師,今年年初我花了一個月整理了一份最適合2019年學習的web前端乾貨,從最基礎的HTML+CSS+JS到移動端HTML5到各種框架,實戰項目都有整理,送給每一位前端小夥伴,這裡是小白聚集地,歡迎初學和進階中的小夥伴。"

https://jinshuju.net/f/g1tbRR

點擊上方鏈接領取前端豪華大禮包

也可以私信我"學習"領取免費網課在線學習以及問題解答、項目指導服務,配合強大的學習工具,帶你完成九大實戰項目,經歷從零基礎到專業前端工程師的完美蛻變。


分享到:


相關文章: