作者:劉鐵猛 編輯:張·布蘭登 翻譯:九幽科技
當(dāng)我寫這個話題的時(shí)候,我感覺我正在和整個世界對話,就像我在寫我的第一個程序“Hello,World”。希望這個話題可以幫助那些想學(xué)編程的人(包括你自己)獲得一個良好的開端。
關(guān)于我
我的名字叫劉鐵猛,如果你愿意可以叫我蒂姆。當(dāng)我在大學(xué)的時(shí)候,才開始學(xué)習(xí)計(jì)算機(jī)編程,在此之前,電腦對我來說就僅僅是一臺打印機(jī)或者游戲機(jī)。但是,當(dāng)我開始編程,三個因素使我在計(jì)算機(jī)領(lǐng)域中受益匪淺。分別是:
1.相當(dāng)迅速地打字
2.知道一些磁盤操作系統(tǒng)命令,并且知道一些編程語言:Basic和Pascal
3.一些熱愛電腦的志同道合者
我為什么要提這個?因?yàn)檫@些使我不再對電腦有一種恐懼感,也不再害怕和其他人互動。我依稀記得,當(dāng)我還是一個小男孩,做在一個不是很舒服的椅子上,面對著屏幕,完全不知所措。那是一種多么怪異而別扭的糟糕感覺!所以,當(dāng)你決定學(xué)習(xí)編程的時(shí)候,問你自己一個簡單的問題--你對電腦有多熟悉?你經(jīng)常使用電腦嗎?你能熟練地運(yùn)行Windows/Linux系統(tǒng)嗎?你可以使用多少軟件?當(dāng)然,即使你不是非常熟悉電腦,這也不意味著你不能學(xué)習(xí)編程。不過,在你征服計(jì)算機(jī)的旅途中,無論在心理上還是生理上都應(yīng)該會比那些已經(jīng)熟悉計(jì)算機(jī)操作的人來說,遇到的困難多得多了。
我在大學(xué)自學(xué)了VB,Delphi和Flash編程。在我畢業(yè)之后,我成為了一名軟件工程師。然后,有機(jī)會去教大學(xué)生。也許因?yàn)槲腋改付际抢蠋煹脑颍铱偰芊浅]p松地將事物有邏輯而清楚地描述出來。所以,學(xué)生都非常喜歡我的課。這也鼓勵我一步一步地走得越來越遠(yuǎn)。我開始翻譯并寫書,出版在線的培訓(xùn)視頻等。之后,我搬到了美國,我開始做一些小業(yè)務(wù)來幫助更多的人來學(xué)習(xí)電腦編程。到現(xiàn)在為止,我已經(jīng)在美國教了上百人如何來學(xué)習(xí)編程。所以,我認(rèn)為這是一個非常好的時(shí)間點(diǎn)來總結(jié)一些我的經(jīng)驗(yàn)并分享給大家!
在這些年的教學(xué)中,我主要的教學(xué)理念就是如何快而好的學(xué)習(xí)編程。你必須從“心理學(xué)之路”和“求知之路”做好準(zhǔn)備。
心理學(xué)之路
最近,我進(jìn)行了一個學(xué)習(xí)實(shí)驗(yàn):如何快速地學(xué)習(xí)編程語言?當(dāng)我說到“學(xué)習(xí)”,我的意思是這門語言必須足夠強(qiáng)大到可以通過有下面三個話題類型的面試:
1.征服語言本身,比如:語法,關(guān)鍵字,運(yùn)算符和表達(dá)式,語句,面向?qū)ο?,基本庫等等?/p>
2.算法知識,比如:常用的集合和算法(排序,遞歸)。這包括了經(jīng)典的算法問題,比如動態(tài)規(guī)劃
3.面向?qū)ο蟮闹R和技能,比如網(wǎng)頁和移動開發(fā)(基于這種語言的),工具和框架
最后,我發(fā)現(xiàn)大概還需要6個小時(shí)來完成項(xiàng)目1,另外的6個小時(shí)來完成項(xiàng)目2。我沒有測試項(xiàng)目3,因?yàn)楫?dāng)你獲得該企業(yè)的職位后,他們大多都愿意給你機(jī)會來學(xué)習(xí)這些東西。
我一共要花12個小時(shí)--是不是相當(dāng)快?我猜想你一定迫切想知道我是如何做到的--在這個過程中,如下的三個重要的事情早已刻在了我的腦海中了:
1,主動學(xué)習(xí)--我對要學(xué)習(xí)的編程語言充滿了好奇與興趣,并對它發(fā)自內(nèi)心的熱愛。不管怎樣,要確保你自己是主動來學(xué)習(xí)的。有時(shí)候,壓力的確可以促進(jìn)學(xué)習(xí),但是它不可以持續(xù)很長時(shí)間也不可以使你快速掌握該語言。
2,明白我要學(xué)習(xí)什么--我沒有老師,沒有練習(xí)資料,也沒有考試,但是我可以測試我自己來看自己有沒有理解正在學(xué)習(xí)的內(nèi)容。我知道在新的領(lǐng)域,有很多限制,所以我在筆記本上寫下了一些問題,在以后再回答他們(一般都是幾個小時(shí)后)。你會發(fā)現(xiàn)記筆記,進(jìn)行網(wǎng)絡(luò)搜索,盡可能的收集參考書等對你的學(xué)習(xí)是非常有幫助的。
3,遷移知識--因?yàn)槲沂且粋€非常有經(jīng)驗(yàn)的軟件工程師,我可以遷移老知識來幫助我理解新的語言。在大多數(shù)情況下,都可以行的通,尤其對算法和理念屢試不爽。但是有些情況,知識遷移是錯的,我必須做一個“遷移->測試(代碼)->理解”的檢查。
現(xiàn)在該你上場了!即使你沒有任何的編程經(jīng)驗(yàn),也需要準(zhǔn)確無誤地進(jìn)行下面的三樣事。
1,成為一個主動學(xué)習(xí)者--不管什么原因,你就是想學(xué)習(xí)這些語言。我認(rèn)為你對這個科目的喜愛,你想成為一個專業(yè)人士,或者你僅僅是好奇,都是非常好的理由。它們會確保你不會退縮。因?yàn)閷W(xué)習(xí)這條路,并不是一條康莊大道,會被各種障礙堵塞。各種曲折困難在這路上,包括難以理解的各種復(fù)雜內(nèi)容,有待解決的大難問題,被人嘲笑等等。通過我多年的經(jīng)驗(yàn),我發(fā)現(xiàn)保持高度的自信是保持主動性的最好方法。我有三分之二的學(xué)生沒有編程經(jīng)驗(yàn),變成主動學(xué)習(xí)者之后,卻做得非常好。而且,我發(fā)現(xiàn)那些表現(xiàn)非常好的學(xué)生往往都有一個積極樂觀的親密伙伴(妻子/丈夫/男朋友/女朋友)。因?yàn)樗麄児膭钗业膶W(xué)生留在了正確的軌道上,這將最終使他們在計(jì)算機(jī)領(lǐng)域中取得成功!
2,通過請教老師,做練習(xí),海量敲代碼等,確保你可以完全理解。編程是一個特殊的技能,你所有的知識在編碼中都有作用和價(jià)值--如果你不知道如何寫代碼,那么你什么也沒學(xué)到。衡量你已經(jīng)學(xué)到了多少最有效的方法是--在寫代碼的時(shí)候能夠有多順暢,你就學(xué)到了多少。順便說一下,通過我的觀察,當(dāng)為自己不能理解知識點(diǎn)而感到內(nèi)疚的學(xué)生在最后反而取得更多的成就。這是因?yàn)樗麄儠鼉A向于理解,同時(shí)更加努力去實(shí)現(xiàn)他們的目標(biāo)。
3,遷移你的知識--我知道你還沒有任何的編程知識來轉(zhuǎn)移,但是不要擔(dān)心憂慮。編程語言只是一種簡單的自然語言,被用來描述我們看到的世界。除非你剛剛從其他星系著陸到地球,否則一切在你大腦里面的東西都可以轉(zhuǎn)化為計(jì)算機(jī)編程語言!對于一個新的學(xué)習(xí)者,知識轉(zhuǎn)移還有另一個功能,你可以使用你剛剛學(xué)到的知識來解決你從未遇到的問題。這是非常常見的,尤其當(dāng)你遇見一個算法問題的時(shí)候。你很快就會發(fā)現(xiàn),理解和遷移知識總是綁在一起的。簡單地說,理解知識就是遷移知識,反之亦然。
求知之路
老是有人問我“學(xué)習(xí)編程難嗎?”,我的回答是:不知道。這是因?yàn)椴煌娜嗽趯W(xué)習(xí)的過程會遇到不同難度的問題。當(dāng)我還是學(xué)生的時(shí)候,常常會覺得無聊或者感興趣,沮喪或者開心等等。但是,從來不會覺得難。我的一些學(xué)生認(rèn)為編程非常簡單,然而有些學(xué)生認(rèn)為非常難。在整個學(xué)習(xí)的過程中,學(xué)生很難改變他們的最初對編程的觀念(簡單或難),即使材料變得越來越復(fù)雜了。這是什么意思呢?就是編程取決你的態(tài)度。簡單的說,知識就是知識,你的態(tài)度決定了難易程度。
學(xué)習(xí)任何知識體系,我們必須遵循一些順序。如果你遵循了這些順序,你最終將在你的大腦里,建立起屬于你自己的結(jié)構(gòu)化的信息系統(tǒng)。在我15年的軟件工程職業(yè)生涯和10年的編程培訓(xùn)師生涯,我一直在微調(diào)這些順序。我使用這個順序已經(jīng)教了成千上萬的學(xué)生,包括我自己,仍然在不斷在改進(jìn)它。下面就是這個順序的簡介:
1.準(zhǔn)備一個相對好的運(yùn)行速度快的電腦,然后安裝一個操作系統(tǒng)(建議Windows操作系統(tǒng))。不要讓一臺速度緩慢的電腦浪費(fèi)你的時(shí)間。
2.選擇一個正確的打字指法。此外,還要熟悉一些Windows快捷鍵和文本編輯器。
3.學(xué)習(xí)計(jì)算機(jī)科學(xué),第一步就是學(xué)習(xí)一門編程語言。下面就是這種語言的利弊:
a.C語言
【優(yōu)點(diǎn)】:你可以學(xué)習(xí)到許多底層的知識,給你夯實(shí)基礎(chǔ)。
【缺點(diǎn)】:C語言不支持面向?qū)ο缶幊?,你很難使用它直接找到一份工作
b.C++
【優(yōu)點(diǎn)】:很多用法和C一樣,但是卻支持面向?qū)ο缶幊?br>
【缺點(diǎn)】:有太多的知識點(diǎn)要學(xué)習(xí),相對比較復(fù)雜的語言,有多個版本要選擇
c.Java/C#/Python/JavaScript
【優(yōu)點(diǎn)】:簡單的語法,隱藏了低層次的知識點(diǎn),可讀性強(qiáng),學(xué)好它容易找工作
【缺點(diǎn)】:你將丟失很多底層的知識點(diǎn)
d.HTML和CSS不是編程語言
e.匯編語言不適合初學(xué)者
4.如果你想選擇一門語言的話,我建議你選擇Java/C#/Python。你只要選擇一個并學(xué)好它,那么其他的語言你將在一個月之內(nèi)學(xué)成。
5.找到一個老師或者一個導(dǎo)師。他們至少要具備5年以上的經(jīng)驗(yàn)。
6.找到官方語言來規(guī)范你的語言,和所有相關(guān)書籍。但要確保你不是在盲目花錢
7.要注意什么時(shí)候去閱讀書籍或者文檔,什么時(shí)候去搜索,什么時(shí)候去寫代碼或者調(diào)試Bug,什么時(shí)候并如何請教老師(導(dǎo)師)。千萬不要把你的老師或者導(dǎo)師當(dāng)成你的“bug調(diào)試小能手”。
8.當(dāng)你學(xué)習(xí)語言的時(shí)候要使用并遵循如下順序:
a.這門語言支持多少種數(shù)據(jù)類型?它們的文字值是什么樣的?
b.如何聲明變量和常量?數(shù)組怎么定義?
c.如何調(diào)用和聲明一個函數(shù)?
d.學(xué)習(xí)一點(diǎn)庫函數(shù),比如輸入和輸出
e.有多少操作系統(tǒng)支持這個語言?如何使用它們來構(gòu)建表達(dá)式?
f.什么是判斷語句和循環(huán)語句?如何把它們放在一起使用?
g.這個語言支持面向?qū)ο髥??如果支持,你如何建立一個類,并封裝成員(變量和函數(shù))?
h.這門語言支持多少個標(biāo)準(zhǔn)形式的集合?(數(shù)組,列表,棧,隊(duì)列,集合等等)
i.這門語言如何實(shí)現(xiàn)繼承和多態(tài)?
j.如何實(shí)現(xiàn)接口和SOLID法則是什么?
k.如何實(shí)現(xiàn)回調(diào)函數(shù)?
l.是否支持函數(shù)型程序設(shè)計(jì)法?
m.盡可能的多熟悉標(biāo)準(zhǔn)庫。不同的語言有不同的庫函數(shù),所以在這點(diǎn)上請教專業(yè)人士
n.使用這門語言來學(xué)習(xí)算法。實(shí)現(xiàn)經(jīng)典算法,并破解難題
o.使用這門語言來寫像網(wǎng)站,手機(jī)app等軟件
9.全日制學(xué)生通?;?個月的時(shí)間完成a到m,再花2個月的時(shí)間完成n。這個完全取決于你對之前的項(xiàng)目的理解。如果你發(fā)現(xiàn)你卡在一個項(xiàng)目上,然后重新回過來理解一下。記住要有耐心。
10.一旦你學(xué)習(xí)了新的知識點(diǎn),寫代碼,一定要聯(lián)網(wǎng)保存在Visual Studio的GitHub上。