編程入門學習路線

本文送給勵志成為優秀程序員卻無從下手的朋友們。

編程從來不是一件無趣的事情,相反,它會帶給你無窮無盡的快樂。這是一種創造事物的快樂,就像上帝創造世間萬物一樣,在代碼世界裡,你就是無所不能的造物主。

可是如何以最快的速度入門,這才是廣大新手最關心的問題。本文就來談談編程入門的學習路線。

本文適用對象:打算做軟體研發工作的人、無明確目標的在校學生。

如果你符合以上兩點中的任意一點,就請一定耐心讀完這篇文章,保證對你大有幫助。

我看到過很多推薦教程的文章,參考書列了一大堆,根本不是初學者能夠看得進去的。學編程需要一步一個腳印,循序漸進才能掌握牢固。私以為,沒有理解能力差的學生,只有寫的晦澀的書。只要有好的學習方式,每個人都可以輕鬆學會編程。

因此,本文針對每項技術只推薦最好的教程,這些教程一定是兼顧深度和趣味性的,保證你會愛不釋手地看下去。大部分推薦的教程(包括書和視頻)都是我學習過程中對比後選出的,有些老師講課的幽默程度堪比相聲,這才是真正的寓教於樂。

閑話少說,下面進入正題。

一、技術路線介紹

本節只介紹純IT領域的技術路線,而對於更高級的技術(例如計算機視覺、機器學習、人工智慧等等)不予考慮。

技術路線是一條通往該行業的道路,掌握了處於這條路上的所有技術,就具備了該行業的從業能力。因此,我們可以從各個公司的招聘職位中找到技術路線的分類。

目前,軟體開發技術路線主要有:Web後端、Web前端、Android、iOS、Windows客戶端、資料庫、嵌入式等。本節我們將依次對這些技術路線作簡要介紹,具體的學習內容會放到後面章節細講。

1、Web後端

這是當今互聯網浪潮中軟體開發的主力軍。幾乎所有互聯網公司都要提供基於Web的服務(相對於基於客戶端的服務),這些服務的核心就在於Web後端,或稱為伺服器端。

與Web前端相比,後端程序運行在伺服器上,看不見摸不著,但卻扮演著至關重要的角色。日常生活中我們用百度搜索、發新浪微博、看騰訊視頻、在淘寶購物,這些功能都由後端程序來實現。

Web後端編程又可以根據編程語言的不同分為幾大類:Java、PHP、Node.js。

Java是種古老的編程語言,在Web後端的應用也足夠久,由於Java代碼通常架構清晰、可擴展性強,因此適用於大型Web項目,比如淘寶網就是用Java開發的。

PHP是一種專門用於Web後端的腳本語言,簡單易用,適用於小型Web項目。

Node.js是一項新興技術,採用JavaScript語言開發後端,輕量高效,性能好。

除了這三種主流技術外,使用Ruby on Rails、Python、ASP.NET也可以做後端開發,但並不常用,本文就不予考慮了。

2、Web前端

Web前端是個大一統的世界,就是我們常說的 HTML+CSS+JavaScript,最新的版本是HTML5+CSS3+JavaScript。所以前端程序員只要學好了這三門語言,就可以大有作為了。

3、Android

在移動互聯網時代,Android成為最廣泛使用的移動端操作系統,自然需要大量的開發人員。與Java Web類似,Android開發同樣使用Java語言。

4、iOS

iOS是蘋果手機的操作系統,由於iPhone推出之後在全球市場備受追捧,iOS開發的需求量也很高,而且通常薪資水平高於Android。iOS過去使用Objective-C開發,近年來蘋果公司發布了新的編程語言Swift,開始逐漸替代Objective-C,成為iOS系統的主流開發語言。

5、Windows客戶端

Windows操作系統幾乎佔領了個人電腦的絕大部分市場,而Windows客戶端編程就是為你的個人電腦編寫桌面應用程序,我們日常使用的Office、電腦版QQ、迅雷影音、Photoshop等等都屬於這個範疇。

雖然我們每天都在用Windows客戶端程序,但在雲計算日益發達的今天,客戶端已經不再是各個互聯網公司首先考慮的平台。與Web相比,客戶端顯得太笨重,而且無法及時更新。只要是能夠通過瀏覽器提供的服務,就不必考慮開發客戶端軟體,只有那些運算量、數據量非常大的軟體,才需要開發客戶端版本。因此Windows客戶端開發的崗位需求並不大,主要集中在專業軟體領域,比如Adobe公司開發的各種圖像處理軟體、軟體編程IDE、大型企業內部的管理系統等等。

Windows客戶端開發的常用技術有:WinForm,Qt。

WinForm是微軟官方提供的Windows客戶端軟體開發框架,採用C#語言,屬於.NET框架的一部分。使用Visual Studio開發WinForm程序非常方便、快捷。

Qt是一個跨平台的軟體開發框架,一套程序可以同時運行在Windows、Linux、Android、iOS、Windows Phone等主流操作系統上,功能非常強大。對於想開發跨平台客戶端的公司來說,使用Qt的確可以節約很多成本。Qt主要使用C++語言實現功能,同時可以選擇使用QML語言描述界面。

除了這兩種技術,還有MFC、WPF。MFC是微軟早期的客戶端框架,由於年代久遠,開發效率低,現在用的不多了。WPF則是微軟推出的比WinForm更優秀的客戶端框架,但由於推廣不利,至今沒有得到廣泛使用。因此本文不再考慮這兩項技術。

6、資料庫

資料庫開發作為單獨的一條技術路線,似乎有些單薄。但鑒於各大互聯網公司都有資料庫工程師這一職位,所以也把它單獨列出來比較好。

實話講,資料庫這一技術路線我不太熟悉,按照我的理解,應該就是針對公司使用某一款資料庫系統,比如Oracle,做相關開發和性能優化。

7、嵌入式

嵌入式開發更偏底層,似乎離IT越來越遠了。但結合現在日益火熱的物聯網來看,嵌入式將迎來新的高潮。

如果有一些名詞你不了解它的意思,請在評論區提問,或自行百度,或者先放著也行。畢竟作為一個編程初學者,這些技術路線恐怕也不太好理解。所以繼續往下看吧,等知識積累到一定程度這些概念就自然明白了。本節只對這些技術路線做了大概的介紹,下一節讓我們開始踏上學習的道路。

二、編程語言

作為一個什麼都不懂的小白,學習編程的第一步當然是掌握一門編程語言。本節就來介紹常見的編程語言的學習路線。

首先,先明確一個觀點,作為一個程序員,只會一種編程語言是遠遠不夠的。最好精通1~2門語言,基本掌握其它所有常見的語言。這聽起來有些嚇人,但其實沒那麼困難。因為大部分編程語言都是很相似的,比如C語言、C++、C#、Java可以稱為類C語言,它們都是從C語言開始一步步擴展得到的,掌握了其中一種,其它的可以觸類旁通。

1、C語言

信息類專業的大學生通常都會在一年級上C語言這門課,也很可能是大學期間唯一的一門編程語言課。所謂師傅領進門,修行在個人,通過學習C語言邁入編程世界的大門是再合適不過了。雖然也有人提倡學習Python作為第一門編程語言,可我覺得那未免太浮躁了。剛開始應該打好基礎,而不是追求炫酷的效果。C語言是一門高級語言,又與計算機硬體息息相關,通過指針操作可以真切感受到數據的流動,這是Python無法做到的。因此,我的建議是,不管今後打算從事哪個技術路線,C語言都是必學的第一門語言。

然而遺憾的是,我由於是在課堂上學的C語言,所以這方面的優秀教材了解的也不多。無論是學校使用的各個版本的《C語言程序設計》,還是國外大牛寫的《The C Programming Language》,都未免太過枯燥。據說有一本科普性質的《啊哈C》寫的非常通俗易懂,麻煩讀過的同學點評一下是否真的如此。其它好的教程也希望同學們幫我補充。

2、C#

學完C語言很多人會產生疑問,不知道C語言能幹什麼。如果不及時消除這一顧慮,恐怕會讓大部分人喪失學下去的信心。然而C語言的用途對於初學者來說很難體現出來,所以下一步我們轉向C語言的增強版本——C#語言(讀音:C sharp)。

C#語言是微軟推出的面向對象編程語言。「面向對象」將是一個伴隨程序員一生的辭彙,因此從此刻開始,我們要隨時嘗試理解:什麼是面向對象。

簡單來說,面向對象是相對於面向過程而言的。C語言是一個典型的面向過程語言,因為C程序的執行流程可以很容易地畫一張流程框圖來表示,它強調程序員編寫程序時是面向程序執行過程考慮的。而C#則是一個典型的面向對象語言,C#程序的執行流程通常很難用流程圖表示,這是因為程序員編寫C#程序時考慮的不是一個完整的從頭到尾的執行流程,而是各個對象之間的調用關係。

雖然我已經儘力了,但上面這段話肯定無法讓初學者真正理解面向過程和面向對象的關係。不過不要緊,編程思想從來不是紙上談兵得來的,必須經過充分的實踐才能領悟。

幸運的是我收集到了一套完整的C#視頻教程,以及後續的WinForm視頻教程。學完這兩個,就會對面向對象編程有一定的理解。雖然今後並不一定從事Windows客戶端的開發,但學習這兩個內容可以幫助更好地理解後續更深層次的Java Web和Android。看視頻的同時一定要照著在自己電腦上寫一遍,這樣才能印象深刻。

這是視頻教程鏈接:C#,WinForm。這套視頻也許是我看過的最有趣的視頻了,希望大家不要錯過。

3、Java(建議精通)

如果學過C#再學Java,你會發現兩者驚人的相似。Java從難度上來說和C#一樣簡單(甚至更簡單),而用途卻比C#廣泛得多。這在很大程度上得益於Java的跨平台特性,也使Java成為了Web項目的主力軍。

推薦的視頻教程:

【傳智播客黑馬訓練營Java基礎】

地址1 官網

地址2 百度網盤 密碼:fvvw

4、C++(建議精通)

並非每個同學都需要學習C++,Java和C++精通其中一門即可。但C++與Java並不是效能重複的編程語言,相反,它們分別統治著各自的領域,就像Java統治Web領域一樣,C++統治著性能敏感的基礎設施、視頻圖像處理等領域。精通Java或C++都不容易(特別是C++,堪稱最難編程語言),因此兩者擇一即可。

C++方面仍然沒能找到優秀的視頻教程,需要大家幫忙提些建議。倒是有比較優秀的書籍,比如《C++ Primer》,值得一看。

5、JavaScript(建議精通)

JavaScript是前端開發的利器,對於前端工程師來說,精通JavaScript是必須的。近年來JavaScript甚至蔓延到了後端編程,以Node.js為代表的後端JavaScript框架使它成為全能的編程語言,大有一統江湖之勢。

這是與Java和C++一樣建議精通的語言,當然只是對前端工程師有這個要求,後端工程師倒不必花太多精力在這上面。

推薦教程:

【慕課網】 HTML+CSS基礎課程

【慕課網】 JavaScript入門篇

【慕課網】 JavaScript進階篇

【廖雪峰】 JavaScript教程

5、Python(可選)

Python是近年來日益火爆的一門編程語言。隨著Python庫的層出不窮,Python在科學計算、Web、大數據與機器學習等領域都展現了驚人的實力。

與Java類似,Python也是一門優秀的面向對象編程語言,而且更簡潔。但這不是重點,與前面所有語言不同的是,Python是一門動態類型語言。

前面提到的四種語言C、C#、Java、C++都是靜態類型語言,它們需要一個稱作「編譯器」的東西,把源代碼編譯成機器碼,才能在計算機上運行。而這一特點導致了所有變數都必須事先規定類型,比如我們習以為常的寫法

int i = 0;

就事先規定了變數iint類型。因此它們被稱為靜態類型語言,即類型是靜態的,不能改變。

以Python為代表的動態類型語言則打破了這個限制,我們完全可以直接這樣寫

i = 0;

既不用規定變數類型,又可以隨時給它賦不同類型的值,這就是動態類型語言的特點。這樣做方便了許多,但代價是Python代碼需要運行在Python解釋器上,而不是直接運行在CPU上,因此執行效率會低很多,也就是通常說的動態語言比靜態語言「慢」。

有了前幾種語言的基礎,學Python是很簡單的事情,因此不必推薦教程了,只要去網上隨便搜一篇介紹Python語法的博客看看就搞定了。

6、PHP(可選)

程序員中流傳著這樣一個說法——「PHP是世界上最好的編程語言」。從提出這句話的那一刻起,就免不了一場編程語言界的腥風血雨。以至於PHP似乎成了其它編程語言的敵人,備受人們攻擊。然而在這樣艱苦的環境中存活下來,而且能佔據很大一部分Web市場,只能說PHP有其強大的優勢。PHP開發Web項目非常快,而且輕量,是一種腳本語言,嵌入到HTML裡面就可以運行。因此小公司使用PHP很容易搭建起自己的Web業務。然而Web項目規模大到一定程度時,PHP就有些難以勝任了,需要Java這樣重量級的Web框架才可以支撐。因此,根據應用場景選擇合適的技術才是最重要的。

PHP教程尚待發掘...

7、Lisp

Lisp是一門古老的語言,老到大部分人早已忘記它的存在。我也是近兩年才了解到這門編程語言。隨著歷史消逝的編程語言數不勝數,能夠在50年後仍然保持活躍生命力的語言少之又少,Lisp是其中之一。1958年人工智慧的先驅約翰·麥卡錫(John McCarthy)為了解決人工智慧領域的問題而發明了Lisp語言,比C語言的發明早了14年。然而Lisp中包含的編程思想卻比現在最流行的語言早了幾十年。看看《黑客與畫家》的作者、矽谷創業之父保羅·格雷厄姆是怎麼說的

如果我們把流行的編程語言,以這樣的順序排列:Java、Perl、Python、Ruby。你會發現,排在越後面的語言,越像Lisp。

Python模仿Lisp,甚至把許多Lisp黑客認為屬於設計錯誤的功能,也一起模仿了。至於Ruby,如果回到1975年,你聲稱它是一種Lisp方言,沒有人會反對。

編程語言現在的發展,不過剛剛趕上1958年Lisp語言的水平。

——《為什麼Lisp語言如此先進?》,保羅·格雷厄姆

之所以我在這裡提到Lisp語言,不是因為它多麼有用(事實上Lisp的確沒多少實際的應用),而是因為它蘊含的強大的編程理念,一種完全不同於C系列語言的理念。然而我對Lisp的了解,或許根本談不上了解,僅僅局限於道聽途說,最早是通過王垠的博客,後來是《黑客與畫家》。這兩大高手對Lisp的強力推薦,使我想要做些嘗試。無奈一直沒能抽出時間專心研究,而且網上Lisp的參考資料又少得可憐。目前Lisp最流行的兩大方言是Common Lisp和Scheme,感興趣的朋友可以關注一下,如果遇到有好的教程也可以分享給大家。

8、其它語言

還有一些應用不那麼廣泛但在特定領域非常流行的語言,比如Objective-C,Ruby,Go等等,它們都有著各自不可替代的作用。不過在初學階段,不必太關心這些小眾語言,因為從上面那些大眾語言轉到這些小眾語言上是很容易的。

三、計算機基礎

現在才學計算機基礎,是不是有點晚?

當然不是,現在剛剛好。有了上面的編程基礎,我們才能深入學習計算機體系結構、操作系統、計算機網路、演算法等知識,這些知識不像編程那樣能看到實際的效果,但卻是提升水平的關鍵。

1、計算機體系結構

計算機體系結構告訴我們計算機由哪些硬體組成,它們各自完成什麼工作,如何結合成一個有機的整體。它們是物理上真實存在的東西,相當於計算機的骨架,支撐著位於其上的軟體系統。

對於程序員來說,這部分知識倒不必過於深入,推薦一本必讀書:

《深入理解計算機系統》 Randal E.Bryant,David R. O"Hallaron

建議閱讀英文版,因為讀過這本書後我深深感受到原來英語可以寫得這樣通俗易懂,甚至是一些讓我覺得無法用中文說清楚的地方。

最好買一本紙質書,這樣就能多做筆記,以後需要的時候也能翻看。如果經濟不允許的話,可以從這裡下載電子版,但是掃描的質量很差,可能會影響閱讀心情。

我在閱讀這本書的過程中寫了一系列博客《深入理解計算機系統》,歡迎前來交流~

2、操作系統

操作系統是運行在計算機上的最重要的系統軟體,從一開機它就開始運行,直到關機才最後一個結束。操作系統對運行於其上的應用軟體是至關重要的,從而也導致了Windows和Linux兩大派系的世紀之爭。學習操作系統,才能更高效地開發應用程序,這一點應該不難理解。

操作系統方面的課程尚待補充。

3、計算機網路

互聯網是這個時代最偉大的發明,學好計算機網路才能勝任今後的各項工作,因為這些工作無一不與互聯網相關。

推薦一套計算機網路視頻教程:

《六個月成為網路專家》 美河製作

這套教程內容很多,講解非常詳細。耐心看完整套教程,你就能看透計算機網路的本質。

4、演算法

演算法無疑是程序員的基本功,推薦書籍:

《演算法導論》

這本書介紹的演算法很全面,把它認真讀完並最好親手實踐每一個演算法,一定會大有收穫。

5、其它

其它一些計算機基礎知識,比如資料庫技術、計算機圖形學、多處理器編程、網路與信息安全,也都是很值得學的內容,但是大家都精力有限,沒必要樣樣精通,可以選自己感興趣的部分補強。

四、Java Web後端開發

學習了第二節和第三節提到的知識,基本上可以稱為一個合格的程序員了。下一步的發展就要根據市場行情,選擇一門專項技術,準備進入求職階段。

前面的內容可以稱得上是「九陽神功」,修鍊你的內力,而後面的內容就是「九陰真經」,能夠征戰沙場的武器。兩者相輔相成,缺一不可。

本節從後端開發談起。第一節中講到主流後端開發有三種:Java Web、PHP和Node.js,三者的思想是一致的,只不過在實現方式上有所不同,因此我主要以Java Web為例介紹。

從簡單的C語言控制台程序,到WinForm窗體應用程序,我們接觸到越來越複雜的軟體形式。而Web應用程序,又與前面兩種完全不同。我們習以為常的軟體都是通過一個Setup.exe安裝包在計算機上安裝得到的,因此它們稱為Windows客戶端。而另外一些軟體,比如百度搜索、騰訊新聞、淘寶網等等,我們習慣稱之為網站,但實際上,它們也是軟體,稱之為Web應用程序。這種軟體運行在伺服器上(伺服器就是放置在機房裡的一台高性能電腦),用戶通過瀏覽器訪問它們。

我們需要先搞懂Web程序的工作原理,為什麼用戶通過瀏覽器可以訪問到伺服器上運行的程序?它們如何利用HTTP協議通信?用戶數據存在哪裡?弄明白這些基本邏輯,再學習如何寫程序實現想要的功能。

推薦一套Java Web視頻教程:

《黑馬程序員 30天輕鬆掌握JavaWeb》

鏈接 密碼:93kt

學習完這套教程,就能夠開發簡單的網站了,但還不足以應對實際工作的需求。

為了提高開發效率,市面上出現了許多優秀的Web開源框架。在Java Web領域,有三大框架之稱的——Spring、Struts和Hibernate為開發者提供了許多便利,基本是Java Web程序的標配。學習這三大框架,可以更深入地理解如何設計軟體架構,比如MVC、IOC等等。

推薦視頻教程:

《Spring視頻教程》鏈接 密碼:ey64

《Struts2視頻教程》鏈接 密碼:05ij

《Hibernate視頻教程》鏈接 密碼:if0e

需要提醒大家的是,Web技術發展日新月異,各種框架層出不窮,即使是三大框架,也有過時的一天(目前看來,其實大部分互聯網公司都已經轉向更輕量、高效的框架了)。所以我們學習並不是為了學會用一種工具,而是要掌握它們的設計思想,當你掌握了三大框架的設計理念,相信面對其它新興框架,就可以很容易透過現象看本質,找到共同的地方。

五、Web前端

Web前端與Web後端合作完成整個Web項目的開發。前後端分離也正是Web軟體最優秀的設計理念。

前端需要用HTML語言製作網頁,用CSS描述網頁的樣式,用JavaScript給網頁提供動態特性。這幾樣技術在第二節中已經給出了教程,很容易掌握,在邏輯方面並沒有後端程序那麼複雜。

但前端技術不止於此。與後端類似,前端框架也是層出不窮,有過之而無不及。如今流行的各種框架例如React、Angular.js、Vue.js、Bootstrap等等,都需要我們多多嘗試,深入理解為何需要這些框架,它們能幫助我們做哪些事情。對各個框架有個基本的了解,才能在技術選型時遊刃有餘。由於前端水平有限,我就不做過多推薦了,有一篇非常好的文章推薦給大家看:

前端工程——基礎篇

六、Android

安卓經過近些年的快速發展,成為目前世界上最優秀的移動端操作系統,至今仍活力不減。學習安卓,主要是學習使用Android SDK提供的API實現各種功能,同時深入理解Android的運行機制。

推薦一本參考書:

《第一行代碼Android》郭霖 著

這本書思路清晰,講解生動,很適合初學者閱讀。有了這些基礎,等到真正做實際項目的時候,當你遇到更多實際的問題,比如圖片緩存、界面卡頓、屏幕適配等等,到時候只要針對性地查找解決方案,或者利用現有的開發框架就可以了,經驗也會隨之慢慢豐富。

七、成為編程大牛

這篇文章從開始到現在,已經過去了幾個月,中間屢想終止,最後還是堅持寫完了。常常感到慚愧,因為我實在稱不上編程領域的大牛,卻鬥起膽來寫這麼一篇宏大的文章,豈不是誤人子弟。所以如果你看到了這裡,請一定對本文的所有文字持保留態度,這裡沒有真理,只是我的一些分享,不一定適合所有人。

當然,如何成為編程大牛,我更是一點經驗也沒有。不過經過這些年的摸索,還是想給大家提幾點具體的建議:

  • 去公司做實際的項目,而不是在學校做簡陋的實驗品。找個靠譜的公司實習,接觸實際的項目,會學到遠多於在校期間的知識。

  • 善於做記錄,不要學了新知識忘了舊知識。寫博客就是一個很好的方式,把看的技術書籍、項目中用到的技術、遇到的問題用博客的方式總結下來,會加深自己的理解,而且方便今後回顧。

  • 最後,祝大家在技術的道路上勇往直前,成為編程大牛!

    由於頭條禁止發布外鏈,所以想要獲取文中相應教程的小夥伴直接關注我的微信公眾號就可以啦!

    公眾號名稱:Java團長

    微信號:aishangbianchengba

    推薦閱讀:

    《The C Programming Language》
    黃哥Python:從一個小題目看學習編程思路的重要性
    20 多人問我怎麼入門編程,最久的堅持了 2 個月
    Python單例模式(Singleton)的N種實現
    Teach Yourself Programming in Ten Years - 用十年的時間自學編程

    TAG:編程 | 學習 | 編程入門 | 路線 | 入門 |