很多人覺得編程是很高端神秘的事情硫戈,覺得自己可能學(xué)不來锰什。但是了解到程序員的工資比較高,所以又蠢蠢欲動,想進(jìn)入這個領(lǐng)域汁胆。那么梭姓,在回答這個問題前,我們先了解一下什么是編程吧嫩码。
*什么是編程*
編程誉尖,也叫程序設(shè)計,其實就是用編程語言處理數(shù)據(jù)铸题,以達(dá)到你想要的效果铡恕。有一本書的名字很清楚地表達(dá)了這個觀點(diǎn)。
Algorithms + Data Structures = Programs
算法 + 數(shù)據(jù)結(jié)構(gòu) = 程序
*什么是數(shù)據(jù)結(jié)構(gòu)*
數(shù)據(jù)結(jié)構(gòu)其實就是數(shù)據(jù)存儲的方式丢间。我們不妨用下面幾個生活中的例子來理解探熔。
地鐵站X光機(jī)上的一件件行李
行李是排成一排,按順序進(jìn)入 X 光機(jī)處理的烘挫。排最前面的诀艰,先處理。最后進(jìn)的饮六,最后處理其垄。如果把行李看作是數(shù)據(jù),這種數(shù)據(jù)結(jié)構(gòu)其實是隊列卤橄。隊列的特點(diǎn)是先進(jìn)先出绿满。
超市里疊在一起的一箱箱牛奶:疊在一起的箱子,最開始放置的肯定是最下面的那個虽风,然后一箱一箱往上壘棒口。要拿出來的時候,當(dāng)然是先拿最上面的辜膝,最下面的最后才拿无牵。這種結(jié)構(gòu)就是棧。棧的特點(diǎn)是先進(jìn)后出厂抖。
電腦的文件夾:文件夾可以包含有子文件夾和文件茎毁,子文件夾又可以再包含下一層的文件夾和文件。這個結(jié)構(gòu)可以理解為樹型結(jié)構(gòu)忱辅。文件是樹的葉子節(jié)點(diǎn)七蜘,子文件夾可以是樹的分支,也可以是葉子墙懂。樹的特點(diǎn)是分支和層級關(guān)系橡卤。
*什么是算法*
算法就是對數(shù)據(jù)進(jìn)行處理的方法。
從數(shù)據(jù)層面看损搬,結(jié)構(gòu)不同一般需要不同的處理方式碧库。從處理效率看柜与,對同一種數(shù)據(jù)結(jié)構(gòu),也可以有多種不同的處理方式嵌灰。有些算法弄匕,可能要處理的數(shù)據(jù)量越大,時間就會成倍增加沽瞭。有些卻無論數(shù)據(jù)多大迁匠,時間都基本恒定。舉一個例子:
假
設(shè)你買了一個圓柱型的水果軟糖驹溃,里面有 9 粒糖果城丧。如果它的包裝開口是在某一邊,你需要拿第 5 粒吠架,那么你就必須先把前面 4 粒拿出來芙贫,才能拿到第
5 粒搂鲫。而且你想拿的糖果越在后面傍药,花費(fèi)時間就越多。但是魂仍,假設(shè)有一種包裝是橫著把圓柱形打開(結(jié)構(gòu)不同了)拐辽,你一次可以看到和拿到 9
粒糖果。那么無論你拿哪一粒擦酌,花費(fèi)的時間都是一樣的俱诸。
*在電腦里是怎樣的?*
假設(shè)我把上面的糖果問題抽象到計算機(jī)里面赊舶,是什么樣子的呢睁搭?下面用一段 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) { // 當(dāng)我要取的糖果還不是第5粒的話夺英,重復(fù)下面的事情 ? ?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)來存放余黎。不同的處理邏輯/算法,效率不同载萌。所以惧财,從這種角度來看亲族,學(xué)習(xí)編程和程序設(shè)計,是學(xué)會抽象可缚,學(xué)會如何把現(xiàn)實問題霎迫,在計算機(jī)里面表現(xiàn)出來。還有數(shù)據(jù)處理帘靡。
從另一種角度來看知给,編程和程序設(shè)計,就像寫作描姚。從上面第一段順序取數(shù)據(jù)的代碼看涩赢,我就像寫作一樣。我在用計算機(jī)能理解的語言轩勘,寫操作指引出來筒扒。一個好的程序員,寫的代碼绊寻,一定像好文章那樣容易理解花墩。不同的語言,指令有點(diǎn)不同澄步,但差不太遠(yuǎn)冰蘑。所以學(xué)會一種語言,再學(xué)一種難度就沒那么大村缸。
*應(yīng)該不應(yīng)該學(xué)習(xí)編程*
其實編程和程序設(shè)計并不難祠肥,尤其是當(dāng)你能把它和實際問題結(jié)合,理解梯皿〕鹣洌回到最開始的問題,我應(yīng)該學(xué)編程嗎东羹?首先剂桥,問問你自己,你學(xué)編程的目的是什么百姓?
你覺得通過指尖敲擊的指令渊额,就能創(chuàng)造無限可能,這實在是太酷了垒拢。 ?— ?你絕對應(yīng)該學(xué)習(xí)旬迹。
你目前遇到些繁瑣而重復(fù)的事情,想看一下計算機(jī)能否代勞求类。 ?— ?你應(yīng)該嘗試奔垦。
你想找一份工資相對高的工作,不用搬搬抬抬尸疆,還能在辦公室吹空調(diào)椿猎。 ?— ?這也是不錯的選擇惶岭。
你想學(xué)到一種編程語言讓你當(dāng)金飯碗用,拿高工資犯眠。 ?— ?早早死了心算了按灶。
計算機(jī)應(yīng)該是變化越來越快的領(lǐng)域,雖說有不少語言誕生的時間已經(jīng)幾十年筐咧,但是它們也是持續(xù)演化的鸯旁。說不準(zhǔn)你剛學(xué)會沒多久的東西,兩三年后就沒什么人用了量蕊,就像現(xiàn)在的前端框架铺罢。所以,如果你想把程序設(shè)計作為你的職業(yè)残炮,請做好長期持續(xù)學(xué)習(xí)的準(zhǔn)備韭赘。
但是,即便你不需要把它當(dāng)作職業(yè)势就,我認(rèn)為泉瞻,多少具備一些編程的能力,讓計算機(jī)輔助你解決問題蛋勺,提升思考方式和效率瓦灶,真的非常有好處鸠删。送上 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)下定決心要學(xué)習(xí)程序開發(fā)。那怎么開始刃泡?
*從問題出發(fā)*
你想解決什么問題巧娱?處理什么數(shù)據(jù)?最后達(dá)到什么效果烘贴?從事哪個領(lǐng)域禁添?
比
如說,如果你要處理 Excel桨踪,做各式各樣的報表老翘。或者要從固定格式的 Excel 里面抽取數(shù)據(jù)锻离。那你可能只要學(xué)習(xí) VBA 就可以了铺峭,或者用
JAVA。因為 Excel 這種企業(yè)級的東西汽纠,你用回微軟自家的語言會方便些卫键。企業(yè)級的 JAVA
語言也是不錯的選擇,因為已經(jīng)有很多寫好的工具虱朵,你學(xué)會拿來用就可以了莉炉。但是如果你非要選 Node.js 和 JavaScript
來處理钓账,就真有點(diǎn)作死。
還有絮宁,很多人想學(xué)數(shù)據(jù)分析梆暮,一上來就學(xué)什么 Spark, Hadoop,搞大數(shù)據(jù)绍昂,但我覺得那是不對的惕蹄。只學(xué)會搭建工具環(huán)境,卻不會數(shù)據(jù)分析的基礎(chǔ)治专,難道不是本末倒置嗎卖陵?況且,工具和框架更新?lián)Q代比語言變化得還快张峰,一年后說不定又換新了泪蔫。
數(shù)
據(jù)分析最主要的是有數(shù)據(jù)思維,基本的統(tǒng)計學(xué)知識和數(shù)據(jù)分析的能力喘批。如果你用 Excel, SQL
就能挖掘出數(shù)據(jù)里面的商業(yè)價值撩荣,看到別人看不到的規(guī)律,那就牛了饶深。當(dāng)然你還可以學(xué)習(xí) Python 或者 R
這種最基礎(chǔ)的數(shù)據(jù)分析領(lǐng)域的語言餐曹,因為它們提供豐富的數(shù)據(jù)分析算法和展示工具,讓數(shù)據(jù)分析工作更簡單敌厘。所以台猴,我覺得只有真的具備一定的基礎(chǔ),而且數(shù)據(jù)真的
大到一定程度俱两,你才需要去用那些大數(shù)據(jù)的處理工具饱狂。
Web Application
開發(fā)領(lǐng)域,無論前端后端宪彩,我覺得肯定要學(xué)的是 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ā)達(dá)需五,書鹉动,視頻,在線教育和練習(xí)編程開發(fā)的資源都相當(dāng)?shù)枚嗪暧剩瑢τ谝粋€稍微有點(diǎn)編程經(jīng)驗的人來說泽示。自學(xué)應(yīng)該完全不是問題,不愁沒有資源蜜氨。但是械筛,對于一個完全是自學(xué)起步,沒有任何編程背景的人來說飒炎,最好找一個靠譜的師傅來指引起步埋哟。
首先,從上面說的問題出發(fā)郎汪,新手是不可能有答案的赤赊。即便在論壇上提問,用什么語言煞赢,什么建議都會有抛计。你可要知道程序員最喜歡討論什么語言,什么框架好照筑。所以有個笑話說吹截,你想讓程序員們吵起來,只要在里面喊一句朦肘,XXX 語言是最好的語言就可以了饭弓。
其次,開始學(xué)習(xí)編程開發(fā)遇到的最大的障礙是搭建環(huán)境媒抠。很多新手都是在最開始的時候就遇到各種環(huán)境問題,導(dǎo)致完全無法跟教程練手咏花,挫敗感太強(qiáng)而放棄趴生。所以,如果有人在身邊指導(dǎo)昏翰,至少先把搭建環(huán)境這關(guān)過了苍匆,后面會順暢很多。
再說棚菊,一個有經(jīng)驗的靠譜的老師浸踩,還可以告訴你學(xué)習(xí)使用某一種語言的最少必要知識,不至于讓你迷失在太多技術(shù)細(xì)節(jié)中统求,真的可以事半功倍检碗。
如果確實身邊和網(wǎng)絡(luò)上找不到這樣的朋友据块,老師,又不舍得花錢去培訓(xùn)班折剃,要如何降低遇到障礙的可能性和提高問題解決效率呢另假?最好選擇 Mac 來開發(fā),學(xué)會如何使用 Google和正確提問怕犁。
最后边篮,無論有沒有老師,學(xué)編程最重要就是:模仿奏甫,模仿戈轿,模仿;練習(xí)阵子,練習(xí)凶杖,練習(xí)。