带上一份技能地图
程序世界是一片廣闊的大地,相比我十多年前進(jìn)入這個世界時,這片大地的邊界又?jǐn)U大了很多倍。初入程序世界難免迷茫,要在這個世界立足、生存,并得到很好的發(fā)展,應(yīng)首要具備怎樣的技能呢?未來的程序之路,先給自己準(zhǔn)備一份基本的技能地圖,先有圖,再上路。
在程序的技能地圖中,需要先開啟和點(diǎn)亮哪些部分呢?回顧我過去的經(jīng)歷并結(jié)合現(xiàn)實(shí)的需要,可以從如下兩個不同程度的維度來說明:
掌握
了解
掌握,意味著是一開始就要求熟練掌握的硬技能,這是生存之本。而至于掌握的深度,是動態(tài)的,倒是可以在行進(jìn)過程中不斷去迭代加深。了解,相對掌握不是必需,但也需要達(dá)到知其然的程度,甚至知其所以然更好。
一、掌握
上路之初,需要掌握的核心生存技能有哪些呢?![]
開發(fā)平臺,它包括一種編程語言、附帶的平臺生態(tài)及相關(guān)的技術(shù)。在如今這個專業(yè)化分工越來越細(xì)的時代,開發(fā)平臺決定了你會成為什么類型和方向的程序員。比如:服務(wù)端、客戶端或前端開發(fā)等。其中進(jìn)一步細(xì)分客戶端還可以有 Windows、Mac、iOS 和 Android 等不同的平臺。
編程語言
語言的選擇基本決定了開發(fā)平臺的性質(zhì),但有些語言可能例外,如:C++、JS、C# 等,這些語言都可以跨多個平臺。但即使你選的是這些語言,基本也會歸屬到某一類平臺上。好比你選了 C++,如果你去做了客戶端開發(fā),就很少可能再去用 C++ 寫服務(wù)端程序了。
關(guān)于語言的選擇,前面我已經(jīng)寫過了選擇的邏輯,便不再多說。但選擇了語言,我們不僅僅是熟悉語言自身的特性,還需要掌握支撐語言的平臺庫。Java 若僅從語言特性上來說,有其優(yōu)點(diǎn),但其瑕疵和缺陷也一直被吐槽,要是沒有 JDK 強(qiáng)大的平臺庫支撐,想必也不會有今天的繁榮。
平臺生態(tài)
與語言平臺關(guān)聯(lián)的還有其技術(shù)生態(tài)以及各種技術(shù)框架的繁榮程度。這些平臺技術(shù)生態(tài)的存在讓使用這門語言編程完成特定的任務(wù)變得容易和簡單得多。Java 的生命力除了 JDK 的強(qiáng)大支撐,實(shí)際還有其平臺生態(tài)的繁榮,也起了決定性的作用。
在選擇了開發(fā)平臺后,除了語言和平臺庫之外,其生態(tài)體系內(nèi)主流的技術(shù)框架和解決方案也是必選的掌握內(nèi)容。
在學(xué)校學(xué)習(xí)的算法,基本是解決各種計算機(jī)科學(xué)問題的通用方法。
還記得在學(xué)校時看過一本算法經(jīng)典書《算法導(dǎo)論》。剛又把這本書的目錄翻了出來過了一遍,發(fā)現(xiàn)已經(jīng)忘記了百分之七、八十的內(nèi)容。因?yàn)橥浀倪@部分內(nèi)容,在過去的十多年工作中我基本都沒機(jī)會用上。那么掌握算法的目的是為了什么呢?
有時候你可能會覺得學(xué)校教科書上學(xué)習(xí)的經(jīng)典算法,在實(shí)際工作中根本就用不上。我還記得考研的時候,專業(yè)考試課就是算法與數(shù)據(jù)結(jié)構(gòu),在考卷上隨手寫個排序、樹遍歷手到擒來。但到研究生畢業(yè)去參加騰訊校招面試時,讓在白紙上手寫一個快排算法,我被卡住了,自然也就沒通過。因?yàn)楹镁靡呀?jīng)沒有進(jìn)行這樣的練習(xí)了,而在研究生階段一年期的公司實(shí)習(xí)工作場景也沒有這樣的需求。
那么為什么還要學(xué)習(xí)這些經(jīng)典算法?
算法,表達(dá)的是一個計算的動態(tài)過程,它引入了一個度量標(biāo)準(zhǔn):時空復(fù)雜度。當(dāng)我回思時,發(fā)現(xiàn)這個度量標(biāo)準(zhǔn)思維在工作十余年中一直在發(fā)揮作用。如今,幾乎所有的經(jīng)典算法都能在開發(fā)平臺庫里找到實(shí)現(xiàn),不會再需要自己從頭寫。但結(jié)合工作實(shí)際的業(yè)務(wù)場景,我們需要去設(shè)計更貼合需求的算法,而只要是算法它都受到時空復(fù)雜度的約束,而我們只是在其中進(jìn)行平衡與折衷。
學(xué)校教科書的經(jīng)典算法,是剝離了業(yè)務(wù)場景的高度抽象,當(dāng)時學(xué)來有種不知道用在哪里的感覺;如今回頭結(jié)合真實(shí)的業(yè)務(wù)場景需求再看,會有一種恍然大悟之感。
數(shù)據(jù)結(jié)構(gòu)通常都和算法一起出現(xiàn),但算法表達(dá)的是動態(tài)特性,而數(shù)據(jù)結(jié)構(gòu)表達(dá)的是一種靜態(tài)的結(jié)構(gòu)特性。大部分開發(fā)平臺庫都提供了最基礎(chǔ)和常用的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),這些都是我們需要熟悉并掌握的,包括:
數(shù)組 Array
鏈表 Linked List
隊列 Queues
堆棧 Stacks
散列 Hashes
集合 Sets
另外,還有兩種數(shù)據(jù)結(jié)構(gòu)不屬于基礎(chǔ)結(jié)構(gòu),但在現(xiàn)實(shí)中有非常廣泛的直接映射場景。
樹 Trees
圖 Graphs
每種結(jié)構(gòu)都有各種變體,適用于不同的場景,甚至很多時候你還需要會組合不同的結(jié)構(gòu)去解決一些更復(fù)雜的問題。
二、了解
需要了解的內(nèi)容比需要掌握的更廣泛,但了解了這些方面會讓你更高效地協(xié)作并解決問題。
不管你寫什么樣的程序系統(tǒng),估計都離不開數(shù)據(jù)存儲。數(shù)據(jù)是一個業(yè)務(wù)系統(tǒng)的核心價值所在,所以怎么存儲不同類型的生產(chǎn)數(shù)據(jù),是你必須要了解的。如今廣泛流行的數(shù)據(jù)存儲系統(tǒng)有下面三類:
SQL 關(guān)系型數(shù)據(jù)庫(如:MySQL、Oracle)
NoSQL 非關(guān)系型數(shù)據(jù)庫(如:HBase、MongoDB)
Cache 緩存(如:Redis、Memcached)
每一種數(shù)據(jù)存儲系統(tǒng)都有其特定的特性和應(yīng)用場景。作為程序員,我們通常的需求就是最有效地用好各類數(shù)據(jù)存儲,那么按了解的深度需要依次知道如下幾點(diǎn):
如何用?在什么場景下,用什么數(shù)據(jù)存儲的什么特性?
它們是如何工作的?
如何優(yōu)化你的使用方式?
它們的量化指標(biāo),并能夠進(jìn)行量化分析?
這 4 點(diǎn)雖不要求一開始就能掌握到一定程度,但你最好一開始就有這個層次思維,在日后的工作中不斷去迭代它的深度。
為什么我們做開發(fā)還需要了解測試?
測試思維是一種與開發(fā)完全不同的思維模式。有一種流行的開發(fā)方法論叫 “測試驅(qū)動開發(fā)(TDD)”,它的流行不是沒有道理的。在寫代碼的時候,用測試的思維與方式(提供單元測試)去審視和檢測代碼,也就是說明確要開發(fā)某個功能后,先思考如何對這個功能進(jìn)行測試,并完成測試代碼的編寫,然后編寫相關(guān)的代碼滿足這些測試用例。
開發(fā)與測試這兩種相反視角的切入維度,能真正長期地提高你寫代碼的效率和水平。
每一種開發(fā)平臺和語言,估計都有其相應(yīng)約定俗成的一些工程規(guī)范要求。最基礎(chǔ)的工程規(guī)范是代碼規(guī)范,包括兩個方面:
代碼結(jié)構(gòu)
代碼風(fēng)格
像 Java 這么多年下來,逐漸形成了一種基于 Maven 的代碼組織結(jié)構(gòu)規(guī)范,這種約定俗成的代碼結(jié)構(gòu)規(guī)范省卻了很多沒必要的溝通。有時候,同樣的內(nèi)容,有更規(guī)范的結(jié)構(gòu),其可閱讀性、理解性就能得到提升。
而至于代碼風(fēng)格,相對沒那么標(biāo)準(zhǔn)化。但為了寫出更清晰、易讀的代碼,我們至少要堅持自己寫的代碼具有某種一致性的風(fēng)格。另外,除了風(fēng)格問題,也可以借助靜態(tài)代碼檢查工具來規(guī)避一些新手愛犯的低級錯誤,而老手也可以通過這些工具來找到自己的認(rèn)知與習(xí)慣盲點(diǎn)。
在開發(fā)流程方法論上,敏捷基本已經(jīng)橫掃天下,所以我們至少要了解下敏捷開發(fā)方法論。
雖然敏捷方法論定義了一些參考實(shí)踐,但它依然是一組非常松散的概念。每個實(shí)踐敏捷的開發(fā)團(tuán)隊,估計都會根據(jù)自己的理解和摸索建立一整套逐漸約定成型的開發(fā)流程規(guī)范。而為了和團(tuán)隊其他成員更好地協(xié)作,估計每個新加入團(tuán)隊的成員都需要了解團(tuán)隊演進(jìn)形成的開發(fā)流程規(guī)范。
先了解,再優(yōu)化。
既然我們生產(chǎn)代碼,自然也需要了解如何管理好代碼。
在我的從業(yè)經(jīng)歷中,源碼管理工具經(jīng)歷了從 CVS 到 SVN 再到 Git 的變遷。Git 誕生的背景是為 Linux 這樣超大規(guī)模的開源項目準(zhǔn)備的,自然決定了其能應(yīng)對各種復(fù)雜場景的源碼管理需求。所以,你至少要了解 Git,并用好它。
當(dāng)工具變得越來越強(qiáng)大時,工具背后的思想其實(shí)更重要,對其的理解決定了我們應(yīng)用工具的模式。而對源碼進(jìn)行管理的最基本訴求有以下三點(diǎn):
并行:以支持多特性,多人的并行開發(fā)
協(xié)作:以協(xié)調(diào)多人對同一份代碼的編寫
版本:以支持不同歷史的代碼版本切換
最后,把以上內(nèi)容總結(jié)為如下一張圖:紅色區(qū)域相對更小而聚焦,是需要掌握的部分,要求深度;藍(lán)色區(qū)域的部分更廣而泛,需要廣度。
以上就是回顧走過的路徑后,覺得需要具備的一份基礎(chǔ)技能圖。十多年后,這張圖上的每一個分類都出現(xiàn)了新的技術(shù)迭代,有了新的框架、算法和產(chǎn)品等,但它們并不過時,依然可以為你的技能點(diǎn)亮之路提供方向指引。也許,你程序生涯的第一個一萬小時你就會花在這張圖上了。
資料領(lǐng)取:加群:714526711;群文件可以直接下載
【如果感覺文章還可以,就請關(guān)注一下吧!!!】
轉(zhuǎn)載于:https://blog.51cto.com/14207296/2353204
總結(jié)
- 上一篇: 4.21 LNMP环境介绍 4.22/2
- 下一篇: Tensorflow源码解析3 -- T