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