我是霖哥,一個因興趣入行的商學院畢業的程序員。最近有不少人,來問我,想學編程,但是又不知怎么開始。所以,我想在我的公眾號“商學院畢業的程序員”中,把我自學編程的經歷,毫無保留的分享出來。
現在的世界,是互聯網科技的世界,人一天生活下來,從玩手機、購物、看新聞、聽音樂,無處不在的都是編程代碼所編織出來的世界。
不論是工作中的人,還是學生,很多人都有自學編程的想法,但是卻不知道從哪里開始。
上網搜集相關自學編程的學習資料,什么C++、Java、Python一堆又一堆的術語,根本讓人無從入手。
如果去問相關的計算機的朋友:“學編程該學啥呢?”
得到的答復,一般是先學一門編程語言吧,說學習C++或者Python吧。
接著,你就跑去買了一本C++或者Python的語言書。
才翻了沒幾頁,完全看不懂,整本書都沒一點人話,又礙于面子,不知道怎么問別人,擔心別人說自己笨。
最后,一本厚厚的編程語言書,就這樣成為了家里的裝飾品。
霖哥沒有接受過傳統學校的編程教育,通過自學編程,用過11種編程語言做過項目。
總結多年的自學經驗,建議自學編程,先學習的編程語言——JavaScript!
JavaScript不是Java!
(圖:美國的Jordan品牌和中國的喬丹品牌,是沒有關系的)
JavaScript(簡稱JS)跟Java,從編程語言技術上,沒有半毛錢關系,別被她的名字欺騙了。
之所以叫JavaScript,是因為90年代Java大火,當年JavaScript的發明者網景公司把自己發明的腳本編程語言,帶上“Java”的名號,讓它更容易傳播。
這就好比我們中國的喬丹,山寨了美國的Jordan品牌名氣,其實它倆壓根沒關系......
在最初的十幾年里,JavaScript一般是用于做網頁上的動態效果的。而最近幾年,有一個叫NodeJS的工具出現,它賦予了JavaScript全方位的應用能力,不論網頁、App、后臺服務器......總之,JavaScript語言幾乎無所不能。
當然了,今天我們探討的是,新手自學編程的第一門編程語言,我們不多介紹NodeJS,來關注用JavaScript用來做網頁的部分。
奧巴馬學編程
2015年的時候,奧巴馬參加了一個“編程一小時”活動,呼吁世界上的所有人都應該學習編程,并以身作則,編寫了一段很簡單的計算機代碼,在屏幕上畫了一個正方形。
這也讓他成為了美國歷史上首位編寫計算機程序的總統!
那么,那時候,奧巴馬學習使用的,是什么編程語言?
答案是:JavaScript!
奧巴馬寫了啥?
據說,當時奧巴馬學編程,曾寫了這么一段代碼。
moveForward(100);
在上一篇霖哥自己的經驗,「我是如何用10天自學編程,改變一生」里,霖哥提及過,英語能力不能太差。因此,只要你英語不差的話,看到奧巴馬的這一句代碼,你應該能明白它的意思:
移動向前(100);
(圖:奧巴馬的編程學習網站)
沒錯,他執行了一個函數,叫moveForward(100)。 因為奧巴馬當時使用的是code.org編程學習網站,它使用這個函數,促使屏幕上的卡通人物,向右(卡通人物的前方)移動了100像素!
理解「函數」
這里提及了霖哥認為編程中最最最最重要的概念——函數。
函數,很多時候,又會被叫著“方法”。所以要注意了,跟別人溝通時,“方法”、“函數”,很可能是同一個意思,它們英文是Method和Function。 (兩者嚴格學術定義有一點差別,這里先不追究,認為一樣的就好了)
所謂函數,學術上來定義,是一個統一的代碼塊;而霖哥的理解,函數就像一個別人生產好的工具。
看看你現在桌子上的杯子,我們知道,喝水要用杯子喝,杯子是別人生產好,我們買回來的。“函數”,就像是一個生產好的杯子,我們拿過來直接用。
上面,是站在“喝水者”的角度來說的,假如換個角度來說,“我”是杯子的生產商呢?那么,要做一個杯子,我們還需要各種各樣的“函數”——比如,陶瓷、玻璃、包裝盒...等等等。如果我是包裝盒生產商呢?我還需要紙皮、綁繩等等等。
你想要生產某個商品,但是不可能說,所有的零配件都是自己生產的,部分零配件需要從外部獲取。 而零配件,就是“函數”。 同理,你要開發一個軟件,不可能所有函數,都是自己寫的,大部分(甚至是絕大部分)的函數,也是需要從外部獲取的。
所以,霖哥建議自學編程的第一課,一定要搞清楚“函數”的意義! 編程的本質,大部分時候,就是對“函數”的操控;而對函數的操控,它就像我們的生活那樣,商品是從別人那里獲得的!
這引申出霖哥自學編程的第一定律:
任何編程技術,都可以從生活中找類比!
搞清楚“函數”的意義,你就能理解大部分的軟件工程了。
你要做一個網頁,你需要調用“瀏覽器”的函數;你要做一個瀏覽器,你需要調用“網址解析”的函數;你需要做一個游戲,你需要調用“游戲引擎”的函數;你需要做一個游戲引擎,你需要調用“顯示器顯示畫面”的函數;.....................無數的“函數”,一環扣一環的,組件了我們各種各樣的計算機軟件。
這又回到「我是如何用10天自學編程,改變一生」里談到的話題了:自上而下的學習過程。這里對軟件工程的思考,也是一個自上而下、從高到低的思考過程,先思考要做一個這樣功能的程序軟件,然后再思考,使用什么“零配件”去堆砌我們軟件。
為什么霖哥推薦JavaScript作為初學編程語言?
開發環境到處都是
JavaScript的開發環境很容易弄起來,同時它是一只易入門的編程語言。
它是唯一能運行在瀏覽器網頁的編程語言。因此只要有瀏覽器運行的地方,它就可以運行起來,試問一下,現在還有哪一臺電腦或者手機是沒有瀏覽器的嗎?
而常見的Java、C++語言,就沒有這樣的好處。要學習他們,你就必須經過復雜的安裝、編譯過程,好不容易地才能運行一個小小的程序。這對初學者來說是一個不小的門檻。很多的初學者光在安裝開發環境,就被折騰得半死。
JavaScript用途廣
我們也經常看到,微信里經常出現的各種各樣的所謂H5的活動網頁,其實,就是用JavaScript開發的。
不論是做活動宣傳、企業宣傳、企業網站,經常需要工程師來做網頁。做網頁需要用到什么編程語言?就是JavaScript。
隨著這幾年JavaScript的發展,JavaScript已經不單只局限于網頁前端了,現在還可以使用JavaScript來開發后端服務器、手機App甚至游戲。
它是目前編程語言中應用最全能的編程語言,并且普及程度還在上升趨勢。
JavaScript職業需求量大
有一個職位,叫Web前端工程師。說白了,就是JavaScript工程師(另外還要有HTML、CSS知識)。
直到今天,2017年,前端工程師的崗位還是有很大的需求。
為什么呢?
霖哥覺得,因為大學計算機學科里,一般都是讓你學Java和C++,就認為JavaScript一個搞網頁的腳本編程語言沒有前途。然而,時代早就在變化了。
教育供應跟不上,市場需求大,結果就是導致前端工程師工資水漲船高。
霖哥發現,很多學了幾手JavaScript的前端工程師,比不少寒窗苦讀幾年、科班出身的C++技術大牛工資還要高。沒辦法,供求關系決定了薪資。
來一點實戰
為了讓準備自學編程的小白,加深對編程和“函數”理解,我們嘗試來一段超級簡單的代碼,作為JavaScript的入門實戰吧。
在以往的計算機語言中,我們經常會看見一個Hello World例子,其本質就是使用“屏幕打印函數”,然后輸出“Hello World”文字。霖哥這里想弄個更復雜的例子,然后用擬人化的語言,來描述一遍機器的執行。
以下代碼中,出現的英語單詞都比較簡單,能讀懂英語單詞,就能大概讀懂意思了。
你也可以自己動手試一試,創建一個文件,叫test.html,把這些代碼放進去,然后雙擊,就會看到瀏覽器的執行結果,輸出了“300”。
<script>
function add(a, b) {
return a + b;
}
document.write( add(100, 200) );
</script>
它具體是怎么運行的呢?
我們首先把它翻譯成中文方便理解:
<這里是代碼(開始)>
函數 加法 (參數a, 參數b) {
返回結果 a + b;
}
網頁.寫上( 加法 (100, 200) );
</這里是代碼(結束)>
我們再用擬人化的語言,來模擬這些代碼的操作:
你是一個上帝,
你創建了一個函數,叫add(加法);
你手下有一個家伙,叫document(網頁);
你說:document啊,執行你的write(寫) 函數! 稍等,add(加法)函數會告訴你怎么執行的!
你說:add函數,給你100和200,把它們相加,完了告訴write!
add函數說:JavaScript語言機,把100和200加起來,返回結果!
write函數說:輸出結果!
這段代碼里,出現了兩個“函數”,它們分別是add和write。
編程的本質就是操縱代碼,也就是說程序員是代碼的上帝。所以很多時候編程只是使用英語,對一系列的“函數”進行操作,各種各樣的的“函數”,是程序員們的千軍萬馬。
所以霖哥會說,英語很重要,因為只要懂得英語單詞,并且愿意看,就能很容易看得懂很多的程序代碼執行。
理解“函數”至關很重要,程序開發當中,幾乎90%的代碼都在不斷地調用函數。當程序員想做一件事的時候,第一個要想到的,是“找函數”,而不是寫具體的函數。
所謂的大牛,就是那些知道很多各種各樣“函數”的人,他們利用各種自己所知道的“函數”,來滿足自己的需求。
究竟怎么系統的學習JavaScript呀?
聽霖哥說了這么多,霖哥更著重的,是希望自學編程的人,能先理解“函數”思維這一編程的本質。
如果現在就想具體地學習JavaScript,還是建議使用霖哥上一篇文章所說的《W3School:JavaScript》,快速學習、快速試驗、快速理解。
往后的日子里,霖哥也會更多地講解一些編程概念,希望把一些抽象化的編程理論,用具象化、擬人化的方式敘述出來。
下一篇文章,霖哥想說說建房子與編程的關系,能讓你更好的理解“函數”思維。
作者相關系列文章:
我是霖哥,一個商學院畢業的程序員,通過自學編程成為一家大型上市公司的資深軟件工程師。
在《商學院畢業的程序員》專欄中,我想持續分享我自學編程的經驗和心法,用通俗的話提煉我的技術思維和對科技世界的理解,希望可以幫助到你。
如果覺得有用就分享給你的朋友,轉載請注明出處《商學院畢業的程序員》。
如果在了解或學習編程的過程中有迷惘、或對一些生澀的科技概念的不解,用力留言!