▲ ▲ ▲
很多人覺(jué)得編程是很高端神秘的事情,覺(jué)得自己可能學(xué)不來(lái)。但是了解到程序員的工資比較高,所以又蠢蠢欲動(dòng),想進(jìn)入這個(gè)領(lǐng)域。那么,在回答這個(gè)問(wèn)題前,我們先了解一下什么是編程吧。
編程,也叫程序設計,其實(shí)就是用編程語(yǔ)言處理數據,以達到你想要的效果。有一本書(shū)的名字很清楚地表達了這個(gè)觀(guān)點(diǎn)。
Algorithms + Data Structures = Programs
算法 + 數據結構 = 程序
數據結構其實(shí)就是數據存儲的方式。我們不妨用下面幾個(gè)生活中的例子來(lái)理解。
行李是排成一排,按順序進(jìn)入 X 光機處理的。排最前面的,先處理。最后進(jìn)的,最后處理。如果把行李看作是數據,這種數據結構其實(shí)是隊列。隊列的特點(diǎn)是先進(jìn)先出。
疊在一起的箱子,最開(kāi)始放置的肯定是最下面的那個(gè),然后一箱一箱往上壘。要拿出來(lái)的時(shí)候,當然是先拿最上面的,最下面的最后才拿。這種結構就是棧。棧的特點(diǎn)是先進(jìn)后出。
文件夾可以包含有子文件夾和文件,子文件夾又可以再包含下一層的文件夾和文件。這個(gè)結構可以理解為樹(shù)型結構。文件是樹(shù)的葉子節點(diǎn),子文件夾可以是樹(shù)的分支,也可以是葉子。樹(shù)的特點(diǎn)是分支和層級關(guān)系。
算法就是對數據進(jìn)行處理的方法。
從數據層面看,結構不同一般需要不同的處理方式。從處理效率看,對同一種數據結構,也可以有多種不同的處理方式。有些算法,可能要處理的數據量越大,時(shí)間就會(huì )成倍增加。有些卻無(wú)論數據多大,時(shí)間都基本恒定。舉一個(gè)例子:
假設你買(mǎi)了一個(gè)圓柱型的水果軟糖,里面有 9 粒糖果。如果它的包裝開(kāi)口是在某一邊,你需要拿第 5 粒,那么你就必須先把前面 4 粒拿出來(lái),才能拿到第 5 粒。而且你想拿的糖果越在后面,花費時(shí)間就越多。但是,假設有一種包裝是橫著(zhù)把圓柱形打開(kāi)(結構不同了),你一次可以看到和拿到 9 粒糖果。那么無(wú)論你拿哪一粒,花費的時(shí)間都是一樣的。
假設我把上面的糖果問(wèn)題抽象到計算機里面,是什么樣子的呢?下面用一段 JavaScript 代碼來(lái)模擬吧。(懂編程的朋友,別吐槽順序取的代碼,我知道可以按位置,這里只是說(shuō)明一下。)
function showMeTheCandy(candy) { console.log(candy) } // 排成列,順序取 var candy = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'] // 我有9粒字母糖果 var toPickCandyLocation = 5 // 我要取的糖果是第5粒 var currentCandyLocation = 1 // 現在我要開(kāi)始取的是第1粒 var candyPicked = null // 我取的糖果要放這,但現在還不存在 while (currentCandyLocation <= 5)="" {="" 當我要取的糖果還不是第5粒的話(huà),重復下面的事情="" ="" candypicked="candy.shift()" 從最前面取1粒="" ="" currentcandylocation="currentCandyLocation" +="" 1="" 挪到下一個(gè)位置="" }="" showmethecandy(candypicked)="" 看看拿到的糖果是什么字母="" //="" -=""> 'E' // 做成特定的,可按位置/編號取的結構 var candy = { '1': 'A', '2': 'B', '3': 'C', '4': 'D', '5': 'E', '6': 'F', '7': 'G', '8': 'H', '9': 'I', } showMeTheCandy(candy['9']) // -> 'E'=>從上面可以看到,同樣的數據,可以按照不同的結構來(lái)存放。不同的處理邏輯/算法,效率不同。所以,從這種角度來(lái)看,學(xué)習編程和程序設計,是學(xué)會(huì )抽象,學(xué)會(huì )如何把現實(shí)問(wèn)題,在計算機里面表現出來(lái)。還有數據處理。
從另一種角度來(lái)看,編程和程序設計,就像寫(xiě)作。從上面第一段順序取數據的代碼看,我就像寫(xiě)作一樣。我在用計算機能理解的語(yǔ)言,寫(xiě)操作指引出來(lái)。一個(gè)好的程序員,寫(xiě)的代碼,一定像好文章那樣容易理解。不同的語(yǔ)言,指令有點(diǎn)不同,但差不太遠。所以學(xué)會(huì )一種語(yǔ)言,再學(xué)一種難度就沒(méi)那么大。
其實(shí)編程和程序設計并不難,尤其是當你能把它和實(shí)際問(wèn)題結合,理解?;氐阶铋_(kāi)始的問(wèn)題,我應該學(xué)編程嗎?首先,問(wèn)問(wèn)你自己,你學(xué)編程的目的是什么?
你覺(jué)得通過(guò)指尖敲擊的指令,就能創(chuàng )造無(wú)限可能,這實(shí)在是太酷了。 — 你絕對應該學(xué)習。
你目前遇到些繁瑣而重復的事情,想看一下計算機能否代勞。 — 你應該嘗試。
你想找一份工資相對高的工作,不用搬搬抬抬,還能在辦公室吹空調。 — 這也是不錯的選擇。
你想學(xué)到一種編程語(yǔ)言讓你當金飯碗用,拿高工資。 — 早早死了心算了。
計算機應該是變化越來(lái)越快的領(lǐng)域,雖說(shuō)有不少語(yǔ)言誕生的時(shí)間已經(jīng)幾十年,但是它們也是持續演化的。說(shuō)不準你剛學(xué)會(huì )沒(méi)多久的東西,兩三年后就沒(méi)什么人用了,就像現在的前端框架。所以,如果你想把程序設計作為你的職業(yè),請做好長(cháng)期持續學(xué)習的準備。
但是,即便你不需要把它當作職業(yè),我認為,多少具備一些編程的能力,讓計算機輔助你解決問(wèn)題,提升思考方式和效率,真的非常有好處。送上 Linus 大神的話(huà):
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.
如果你已經(jīng)下定決心要學(xué)習程序開(kāi)發(fā)。那怎么開(kāi)始?
你想解決什么問(wèn)題?處理什么數據?最后達到什么效果?從事哪個(gè)領(lǐng)域?
比如說(shuō),如果你要處理 Excel,做各式各樣的報表?;蛘咭獜墓潭ǜ袷降?Excel 里面抽取數據。那你可能只要學(xué)習 VBA 就可以了,或者用 JAVA。因為 Excel 這種企業(yè)級的東西,你用回微軟自家的語(yǔ)言會(huì )方便些。企業(yè)級的 JAVA 語(yǔ)言也是不錯的選擇,因為已經(jīng)有很多寫(xiě)好的工具,你學(xué)會(huì )拿來(lái)用就可以了。但是如果你非要選 Node.js 和 JavaScript 來(lái)處理,就真有點(diǎn)作死。
還有,很多人想學(xué)數據分析,一上來(lái)就學(xué)什么 Spark, Hadoop,搞大數據,但我覺(jué)得那是不對的。只學(xué)會(huì )搭建工具環(huán)境,卻不會(huì )數據分析的基礎,難道不是本末倒置嗎?況且,工具和框架更新?lián)Q代比語(yǔ)言變化得還快,一年后說(shuō)不定又換新了。
數據分析最主要的是有數據思維,基本的統計學(xué)知識和數據分析的能力。如果你用 Excel, SQL 就能挖掘出數據里面的商業(yè)價(jià)值,看到別人看不到的規律,那就牛了。當然你還可以學(xué)習 Python 或者 R 這種最基礎的數據分析領(lǐng)域的語(yǔ)言,因為它們提供豐富的數據分析算法和展示工具,讓數據分析工作更簡(jiǎn)單。所以,我覺(jué)得只有真的具備一定的基礎,而且數據真的大到一定程度,你才需要去用那些大數據的處理工具。
Web Application 開(kāi)發(fā)領(lǐng)域,無(wú)論前端后端,我覺(jué)得肯定要學(xué)的是 JavaScript, HTML, CSS。如果你打算在前端發(fā)展,不管你是打算用 jQuery, AngularJS,React 或者 VueJS 也好,原生 JavaScript 都是基礎。即便你想從事后端,擁有基本的前端知識,可以讓你方便和前端溝通合作。后端的語(yǔ)言選擇相對較多,一般是 Ruby, Node.js, Python,PHP, Java。Java 在傳統企業(yè)領(lǐng)域用的比較多,初創(chuàng )公司一般選其它的來(lái)起步。Go, Rust, Clojure 比較新,用的人相對少一些。
現在互聯(lián)網(wǎng)如此發(fā)達,書(shū),視頻,在線(xiàn)教育和練習編程開(kāi)發(fā)的資源都相當得多,對于一個(gè)稍微有點(diǎn)編程經(jīng)驗的人來(lái)說(shuō)。自學(xué)應該完全不是問(wèn)題,不愁沒(méi)有資源。但是,對于一個(gè)完全是自學(xué)起步,沒(méi)有任何編程背景的人來(lái)說(shuō),最好找一個(gè)靠譜的師傅來(lái)指引起步。
首先,從上面說(shuō)的問(wèn)題出發(fā),新手是不可能有答案的。即便在論壇上提問(wèn),用什么語(yǔ)言,什么建議都會(huì )有。你可要知道程序員最喜歡討論什么語(yǔ)言,什么框架好。所以有個(gè)笑話(huà)說(shuō),你想讓程序員們吵起來(lái),只要在里面喊一句,XXX 語(yǔ)言是最好的語(yǔ)言就可以了。
其次,開(kāi)始學(xué)習編程開(kāi)發(fā)遇到的最大的障礙是搭建環(huán)境。很多新手都是在最開(kāi)始的時(shí)候就遇到各種環(huán)境問(wèn)題,導致完全無(wú)法跟教程練手,挫敗感太強而放棄。所以,如果有人在身邊指導,至少先把搭建環(huán)境這關(guān)過(guò)了,后面會(huì )順暢很多。
再說(shuō),一個(gè)有經(jīng)驗的靠譜的老師,還可以告訴你學(xué)習使用某一種語(yǔ)言的最少必要知識,不至于讓你迷失在太多技術(shù)細節中,真的可以事半功倍。
如果確實(shí)身邊和網(wǎng)絡(luò )上找不到這樣的朋友,老師,又不舍得花錢(qián)去培訓班,要如何降低遇到障礙的可能性和提高問(wèn)題解決效率呢?最好選擇 Mac 來(lái)開(kāi)發(fā),學(xué)會(huì )如何使用 Google和正確提問(wèn)。
最后,無(wú)論有沒(méi)有老師,學(xué)編程最重要就是:模仿,模仿,模仿;練習,練習,練習。
▲ ▲ ▲
作者簡(jiǎn)介:
聯(lián)系客服