
如何成為一名優(yōu)秀的程序員?
誰不想成為一名優(yōu)秀的程序員呢?
每年都有超過數(shù)十萬名計算機專業(yè)的畢業(yè)生進入社會,據(jù)不完全統(tǒng)計,進步最快的階段在剛參加工作的 1-3 年,同時眾多程序員中 3-5 年工作經(jīng)驗的站大多數(shù),很多人在此階段達(dá)到瓶頸期,專業(yè)能力停滯不前,所以如何持續(xù)進步成為一名優(yōu)秀的程序員?
回答這個問題很簡單,我們只需要找到作為一名優(yōu)秀的程序員,應(yīng)該具有哪些特質(zhì),然后分析具備這些特質(zhì)的條件。特質(zhì)即結(jié)果,條件即方法,通過正確的方法得到想要的結(jié)果,從而成為一名優(yōu)秀的程序員。
優(yōu)秀的程序員具備的特質(zhì)有很多,這里我向大家分享一個我最看重也是最欣賞的一點特質(zhì)就是:創(chuàng)造力。
為什么是創(chuàng)造力?
回想一下當(dāng)你遇到瓶勁期,專業(yè)能力停滯不前時的感受:每次寫的代碼千篇一律、拿手的需求得心應(yīng)手,不拿手的需求每次都要 Google 一下粘貼復(fù)制、即使你寫了很多年代碼,做了無數(shù)的需求,但腦子里的存貨還是那些,僅僅是把別人的代碼拿來完成需求,并沒有把別人的知識變成你的知識。
如果說到了你的痛點,別急,還有。
每次拿到需求都一籌莫展,但有的人卻能同時拿出好幾套解決方案,聽到新的技術(shù)名詞總是一臉疑惑,而隔壁家的小孩卻早已掌握。
當(dāng)然,這是你的痛點,也是我的痛點。
日常逛 GitHub 是我的習(xí)慣,每次看到好玩的開源庫,我嘗嘗在感嘆,為什么我寫不出這樣高質(zhì)量的代碼?為什么想不到這么巧妙的解決方案?
其中之一的原因就是:優(yōu)秀的人在創(chuàng)造代碼,而我只是在粘貼復(fù)制代碼。
擁有好的創(chuàng)造力也就意味著你擁有不錯的解決問題的能力。
如何提高創(chuàng)造力?
擁有創(chuàng)造力是我們的目標(biāo),根據(jù)前面說的:特質(zhì)即結(jié)果,條件即方法?,F(xiàn)在我們就來尋求一下通過哪些方法來提高自己的創(chuàng)造力。
豐富的知識儲備
首先巧妙高質(zhì)量的代碼不是憑空蹦出來的,而是需要知識儲備的,作為程序員我們每天和各種各樣的 API 打交道,你知道哪些 API 可以實現(xiàn)怎樣的需求,你做起來就會得心應(yīng)手,你不知道就會在做的時候一籌莫展,所以我一直認(rèn)為寫代碼不是一個拼智商的工作,而是一個拼經(jīng)驗拼知識儲備的工作。
擁有豐富的知識儲備,需要有獲取知識和結(jié)構(gòu)化知識的能力,在這里小跑一下題,同樣我們可以把知識儲備當(dāng)成一個小目標(biāo),把獲取知識和結(jié)構(gòu)化知識視為實現(xiàn)目標(biāo)的方法,以此類推你可以不斷拆解,以此來發(fā)現(xiàn)自己已具備哪些特質(zhì),需要朝著哪些特質(zhì)努力,并且找到實現(xiàn)這些特質(zhì)的條件。
獲取知識
獲取知識的方法很簡單,知識可以分為新知識和舊知識,舊知識就是我們已經(jīng)了解的,新知識就是隨著技術(shù)的發(fā)展而順應(yīng)趨勢出現(xiàn)的??赡苡型瑢W(xué)會問:舊知識為什么還要獲取呢?一葉障目明白吧?正因為是舊知識我們很容易會盲目相信自我,如果有錯誤的理解會一直根深蒂固的留在我們的腦子中,所以舊的知識也要時不時拿出來篩選篩選,查漏補缺。同時在舊的知識上面,我們有一定自己的理解,在遇到相左的情況時,也能更快的分辨出真假。
對于舊的知識,我的方法是去多看不同人實現(xiàn)的代碼,需求一樣,實現(xiàn)的方式會千差萬別,GitHub 是一個非常好滿足這一方法的地方,很早就之前就有人和我說過:「永遠(yuǎn)要寫不一樣的代碼,這樣才會進步」。
新知識就簡單了,最正確的途徑就是官網(wǎng)、官方論壇、官方的 GitHub 倉庫等等,一手新內(nèi)容一定是官方頻道最新更新的,不要等著每天就看看一些技術(shù)公眾號來幫我們介紹新技術(shù),自己動手去了解是最快最直接最正確的方法。
結(jié)構(gòu)化知識
當(dāng)你擁有很多知識的時候,就需要去掌握組織、結(jié)構(gòu)化知識的能力。很多時候,我們一直在努力學(xué)習(xí),看了很多、也實踐了很多,但遇到稍微有點變式的問題,就又會一籌莫展,這時你需要把腦子中的知識,組織起來,加強之間的聯(lián)系,多種知識建立連接,才能在遇到問題的時候組合出不同的解決方案。
我在這方面常用的方法就是,先按最小單元拆分,然后已最小單元為基礎(chǔ)進行查漏,看看有沒有忽略的地方,然后去嘗試通過各種方法去找尋各單元之間的聯(lián)系。舉個例子,在 Android 的官網(wǎng)中,我們可以查到在 Android SDK 中提供執(zhí)行后臺任務(wù)的 API 有 4 種:
就像上圖所示,4 種每一個都是最小單元,當(dāng)我都清楚每一個是干什么的、該如何使用之后,就要去找尋這 4 種單元之間的關(guān)系,這張圖很好的詮釋的它們之間的關(guān)系,當(dāng)我理解完這張圖之后,以后再遇到類似的需求,就可以很好的拿出合適的解決方案了。
扎實的基礎(chǔ)
雖然我們有的在做客戶端開發(fā),有的做前端開發(fā)、有的在做服務(wù)端開發(fā),從大類上劃分我們都同屬于計算機學(xué)科?;A(chǔ)方面我們可以劃分為兩大類:計算機基礎(chǔ)和專業(yè)基礎(chǔ)。
計算機基礎(chǔ)
這方面就是我們老生常談的一些東西了,例如:數(shù)據(jù)與數(shù)據(jù)結(jié)構(gòu),算法、網(wǎng)絡(luò)基礎(chǔ)、操作系統(tǒng)基礎(chǔ)、設(shè)計模式等等,掌握這些方面,不僅能夯實我們基礎(chǔ),還能幫助我們在與不同領(lǐng)域的人協(xié)作的時候,減少不必要的麻煩降低成本,拓寬我們的技術(shù)視野,加強技術(shù)棧。
有人肯定會說你說的這些我都知道啊,可是我問你,你真的都懂了嗎?問幾個簡單的問題:
數(shù)據(jù)和數(shù)據(jù)機構(gòu)有什么關(guān)系?
數(shù)據(jù)結(jié)構(gòu)和算法又有什么關(guān)系?
哪些是基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),哪些是高級數(shù)據(jù)結(jié)構(gòu)?二者之間有什么聯(lián)系?
歡迎在評論區(qū)分享你的看法~
專業(yè)基礎(chǔ)
這方面就看各自的專業(yè)了,除了小白,大多數(shù)人都知道自己專業(yè)領(lǐng)域中,哪些是基礎(chǔ)內(nèi)容,哪些是高級內(nèi)容,一切源于基礎(chǔ),高級內(nèi)容是在基礎(chǔ)之上加以擴展優(yōu)化出來的。小白也許會問了,那我們怎么辦啊?我只能說你現(xiàn)在了解、學(xué)習(xí)、掌握的都是基礎(chǔ)...把現(xiàn)有的先吸收整理好,等你成長了,再回頭看看。
所以在這方面,我能提供給大家的經(jīng)驗,就是寫一份思維導(dǎo)圖,劃分出自己當(dāng)前專業(yè)下,需要掌握的計算機基礎(chǔ)和專業(yè)基礎(chǔ)有哪些,總結(jié)出一份技能圖譜,然后查漏補缺。
分享一份我曾經(jīng)總結(jié)的 Android 技能圖譜,看似簡單,但擴展開其實內(nèi)容很多。
學(xué)習(xí)能力
又是一個很常見的話題,我們從幼兒園就開始上學(xué),一直到大學(xué)畢業(yè),學(xué)習(xí)了十幾年,但是 ... 你真的會學(xué)習(xí)嗎?
一個完整學(xué)習(xí)過程的閉環(huán)包括三部分:學(xué)習(xí)、記憶、傳授。這里簡單和大家分享一下我的理解,如果你對此很有興趣,可以評論告訴我,我專門寫一篇文章像大家分享一下。
學(xué)習(xí)
同樣學(xué)習(xí)也分為學(xué)習(xí)新的東西和舊的東西。在學(xué)習(xí)舊的東西的時候,我們是通過深度聯(lián)想來學(xué)習(xí)的,用我們已知的理解來檢索式學(xué)習(xí),不斷過濾我們已有知識概念,將新的理解與之前的理解建立聯(lián)系加深記憶,這可以看作一個更新補充我們現(xiàn)有知識的過程。學(xué)習(xí)新的知識的時候,我們是通過字面聯(lián)想來學(xué)習(xí)的,因為我們沒有舊知識來做檢索,所以我們只能通過文字上的理解來學(xué)習(xí),這時就需要我們在學(xué)習(xí)的過程中,提取關(guān)鍵的概念,建立心智模型,同時需要我們拿其他方面已建立的心智模型來輔助我們記憶,這是一個新增的過程。
記憶
從小到大的上學(xué)經(jīng)歷,告訴我們要通過記憶來學(xué)習(xí),在我看來學(xué)習(xí)和記憶應(yīng)該相輔相成。學(xué)習(xí)是理解的過程,理解之后就自然記憶了,而不是通過死記硬背強行把知識留在我們腦中,到頭來我們僅僅記得兩個字:學(xué)過。最佳的記憶方式是:我們通過已有的知識來理解新的東西,將各個知識建立起聯(lián)系來加深記憶,從而把新的東西轉(zhuǎn)化成自己的東西。舉個通俗的例子,你有一位很要好的朋友,你是如何記住他是你很要好的朋友的?在你的腦海中,不是因為你單單記住了他這個人,而是你一想起他,就想到了你們之間發(fā)生的事情,你的這位好朋友就相當(dāng)于一個記憶點,而你們之前發(fā)生的事情,就是建立起來的聯(lián)系,你們是通過聯(lián)系而產(chǎn)生的記憶。
傳授
這是檢驗?zāi)銓W(xué)習(xí)成果的最好方式。當(dāng)你能正確的把學(xué)到的知識教給別人,這才說明你真的學(xué)會了,因為從你口中組織語言說出的東西,才是你自己的理解,這不是復(fù)述那么簡單,復(fù)述和傳授有著本質(zhì)的區(qū)別,同時當(dāng)你這篇文章看到這里的時候,我也很期待你的回復(fù),希望你可以告訴我,我寫的這些對你來說是否好理解。當(dāng)你下一次向別人分享東西的時候,可以分析一下自己這段是復(fù)述還是傳授,當(dāng)然在你聽別人分析的時候,不一定是你理解不夠,也可能是說的那個人自己理解不夠,導(dǎo)致你很難理解。
最后
說了這么多,我們再看一下開頭這個問題:如何成為一名優(yōu)秀的程序員?
我說了優(yōu)秀的程序員是具有創(chuàng)造力的,具備創(chuàng)造力的必要條件是具有:豐富的知識儲備、扎實的基礎(chǔ)、良好的學(xué)習(xí)能力。
當(dāng)我們把這些倒過來看,其實正是我們從上學(xué)到工作所經(jīng)歷的過程,十幾年的學(xué)習(xí)生涯,無時不刻在鍛煉我們的學(xué)習(xí)能力,上了大學(xué),各種各樣的計算機基礎(chǔ)課,工作之后我們進入了不同的專業(yè)領(lǐng)域,隨著工作開始儲備我們的知識庫。
所以優(yōu)秀的程序員和我們走過的是同樣的路,我們還在原地掙扎是因為我們在這條路上遇到了眾多問題還沒有解決,而優(yōu)秀的人也只是先我們一步解決了那些問題,所以大家要努力加油呀!
如果你覺得這篇文章還不錯,歡迎分享、轉(zhuǎn)發(fā)、點贊、關(guān)注、這對我有很大的幫助。
最后的最后,上一篇文章《Android 工程師開發(fā) iOS 是怎樣的體驗?》發(fā)布后,公眾號這邊還好,在掘金那邊,真是鍵盤橫飛,受到了很多冷嘲熱諷,好傷心,寫這篇文章的緣由是因為我第一次嘗試去開發(fā)了一款 iOS App,作為 Android 工程師很激動,想通過這篇文章,與同樣是參與過兩端開發(fā)的小伙伴們,交換一下想法,沒想到...??,當(dāng)然我的 App 也順利上線啦,分享一張截圖給你們:
App 的名字叫 Time Fly,很多人妄圖做出翻天覆地的產(chǎn)品,把人性研究到極致,然后悄聲無息的偷走你的時間,這款產(chǎn)品的邏輯很簡單,以一條時間軸為載體,幫助大家記錄每天的日常,當(dāng)然之后的版本還有很多有趣、異想天開的想法在設(shè)計中,希望這款 App 可以幫你找回被偷走的時間。
目前只有 iOS 版本,Android 版本還在計劃中,之前調(diào)研了一下使用 Kotlin 的跨平臺功能來為兩端做非 UI 代碼的實現(xiàn),不過這個方案還在考慮中。
在評論區(qū)分享你對本篇文章的想法,我會隨機抽幾位小伙伴送出 Time Fly 的兌換碼。
感謝,我們下期再見??。