編程是一個值得擁有的偉大技能。它給了你構建、修補和發明的能力,而後讓你在我的和職業上都能收穫巨大的獎勵。它打開了通向各類各樣職業生涯之門,伴隨而來的是豐富的收益,即體面的薪水、隨時隨地工做的自由,或者以上所有這些。前端
因此,爲何愈來愈多來自不一樣背景的人都決定開始學習編程,也就不足爲奇了。可是,每一個嘗試這項任務的人很快都會面臨着一個不愉快的事實:學習編程好難。node
起初,會感到複雜、疑惑,由於大部分代碼根本一點意義都沒有。與指望的相反,「我搞不懂它」的感受在整個學習途中也許只增不減,這使得熱情的初學者感到無助、迷茫,甚至準備放棄。react
這個故事的寓意就是:作好準備。由於通往程序樂園是一個漫長的旅途,若一開始沒有正確的心態,將會很快就失去此中的樂趣。jquery
在此篇文章中,我將會嘗試爲你提供一些引導,包括:在你的旅途中應該作什麼、如何更好地作到、以及沿途中對你有幫助的工具和資源。git
顯而易見,你首先要考慮的就是寫代碼,它的本質是一門技術學科。你最先須要掌握的技能須要大量的「精確」與「正確」,而且任何偷工減料都會讓你一無可取。你至少須要學習一丁點數學,或者那些看起來像數學的東西,例如程序邏輯。程序員
要點就是,學習編程的基礎須要大量的專一與實踐。然而,無以計數看起來是技術或非技術的人已經先於你已經開始了他們的旅途,因此不用過於垂頭喪氣。正如咱們將會看到的那樣,有大量專爲你這樣的初學者而準備的資源來幫助此旅途儘量的簡單。angularjs
一開始學習編程的成本是很陡峭的。在太多的「基礎原理」須要掌握,包括編程語言的各個部分(表達式、變量、數據類型、操做符、循環、條件判斷、函數、類),幫助理解運行你的代碼須要使用多少CPU時間和內存的技術(很是複雜)。你將會編寫不少一開始沒法運行的代碼,所以你將不得不忍受讓每個程序員都痛苦的經歷:調試。github
一旦你學會了怎樣寫代碼,你就能學會怎樣編寫更穩定的代碼。讓代碼更高效,容易閱讀和理解,而且便於擴展,是一門藝術,其中還包括持續演進。你將可以開始探索不一樣語言的原理,並從一個簡單的「碼農」進級爲一個「軟件工程師」。這也是一個須要大量時間和實踐的過程,可是你越精通,爲你打開的機遇就越多。web
通往編程樂園的旅途,各有各的不一樣,但這裏仍是有一些好的原則可讓旅行者從中獲益。若是你纔剛剛啓程,如下是我推薦的基本過程:數據庫
若是你真的打算學習編程,你所選取的語言其實並不重要。大部分流行的編程語言都有着類似的基本原理內容,而且當你徹底掌握了你的第一編程語言後再去學習一門新的語言將會輕鬆不少,而不是一開始就掙扎於一堆語言。若是你是經過大學的學科或相似的方式來學習編程的話,你的語言可能已經被選擇好了。
無論怎樣,除非你確切知道在這個長跑中你想作什麼,只有5門語言是我推薦值得考慮的:Ruby,JavaScript,Python, C,和Java,這些語言在學習的容易程度、得到知識的廣度以及長期工做項目的數量之間有着很好的平衡。
如下是幫助你進行決定的一些提示:
解釋性語言容易上手。這是由於他們的代碼一寫完就能立刻運行。相反地,編譯性語言在編寫代碼和運行代碼之間須要一個額外的步驟。
所以,用解釋性語言能夠更快地編程,但他們並無高效地利用計算機資源,也容易存在一些不易察覺的bug。他們適用於那些對於性能並非很優先的應用。這些語言在網站開發中很流行。事實上,其中的JavaScript,是惟一能夠直接在瀏覽器執行的語言,由此使得它可以快速成爲衆所周知最賺錢的語言之一。
編程語言 |
優勢 |
缺點 |
一般用於 |
Ruby |
|
|
|
JavaScript |
|
|
|
Python |
|
|
編譯時,代碼在它運行以前會從人類可讀的代碼轉換成機器可以直接執行的代碼。這也就是爲何它會比解釋性語言更快、更高效。編譯器其中一個職責就是確保所編寫的代碼都「有意義」,所以它能夠識別而且預防各類各樣解釋性語言容易出現的bug。
出於這個緣由,用這些語言卻想把這些錯誤或者差的代碼置之不理是很難的。他們會強制你去很好地理解「在底層」到底作了什麼,你也會學到更多關於計算機是如何工做的。對應的代價是這些語言更勞動密集型,而且典型地對於初學者學習挑戰性更大。
編譯性語言用於要求高性能和穩定性的應用,其中包括運行於資源嚴重受限的硬件的嵌入式應用,和甚至一個小小的bug都能形成極大破壞的龐大又複雜的應用。
編程語言 |
優勢 |
缺點 |
一般用於 |
C |
|
|
|
Java |
|
|
|
應該注意到HTML和CSS不是編程語言,雖然他們基本用於每個網頁。他們是展現性語言,用於定義如何展現和應該包括什麼,而非如何運行。無論怎樣,HTML和CSS都是一個不錯的起點,由於他們更容易上手,而且能教會你如何把代碼編寫正確。此外,若是你打算進行網站開發,某種程度上你也須要學習HTML和CSS。
學習須要時間,由於有太多內容須要吸引。若是你打算第一天就想嘗試構建一個完整的應用,那基本是行不通的。爲了避免至於陷入沮喪,從解決一個簡單的小問題開始,可讓你走得更爲順暢。
例如,傳統上學習一門新的語言時編寫的第一個程序就是在屏幕上打印」Hello World「的」Hello World「程序。在大多數語言裏,基本上不會編寫一個簡單而又沒有什麼實際的做用的程序。然而,它依然結合了編程語言中不少的基本原理部分,因此它對於一我的入門如何編寫某一語言仍是很適用的。
在這裏,你能夠編寫對一些數字進行加、減的東西,而後從用戶那獲取輸入。隨後你能夠學到決定路徑的條件,和執行重複操做的循環。很快,你就可以準備構建你第一個項目,那時你也就可以開始經歷如何構建 一個完整應用了。
編程的核心部分能夠頗有挑戰性。但若是你還沒明白計算機在底層是如何工做的話,這些挑戰並不是顯而易見。
好比,當我一開始出發時,我以爲調試是一個很讓人受不了的過程:它看起來一點都不像是在編程。由於我得花費整整一天去排查我寫過的代碼,嘗試去找出問題的所在,」我這一次要***怎樣才能搞定這個問題呢「不斷在我腦裏迴旋,讓我崩潰得幾乎快要放棄,而不是寫一些新的代碼作一些更酷的事情。最後最後,我發現我在某處漏了一個分號,或者使用了縮進來代替空格,而當我讓個人代碼可以再次運行時,一天又過去了。那時我感受我完徹底全就是一個笨蛋,簡直是在浪費時間。
這樣的事情,也會發生在你的身上,一樣地它也會讓你抓狂。因此,對於調試的技巧就是:要有耐心,而且放鬆點。在《對於初學者學習編程的最好方式是什麼》一文中推薦注重過程,而非結果。若是你注重最終的結果(如」我在要六月底前構建一個網站「),你將會以爲沮喪,而且感受本身像個失敗者。隨着過程一點一點地前進,你將會更成功。
一如任何技能,編程也在於功多手熟。要想更好地學習地編程,沒有比實踐更好的方式了。即便你一週只有業餘的幾個小時,只要能堅持定時實踐,總有一天,你將會找到編程的真諦。最後,你將能擁有能夠在短短地幾秒鐘以內搞定問題的直覺,而在此以前可能須要花費你整整一天(如追蹤調試一個bug)。
一旦你以爲本身已經差很少掌握了編程語言的基礎部分後,進行實踐的一個更好方式是開啓你的第一個項目。設想一個你想構建的簡單應用,好比一個待辦列表,一個計算器(再一次,快速開始),而後擼之!這將會教會你怎樣去解決架構和設計上的問題,以及如何構建不一樣的部分使之能夠相互融合成爲一個可以工做的總體。這些都是可讓你可以自稱爲程序員的基本技能。
根據你的目標、學習風格和用意,在旅途中你可能須要使用到不一樣的資源。爲了幫助你決定什麼方法適用於你,這裏快速整理了一些你可以用獲得的工具,粗略涵蓋了從結構化學習到非結構化學習。
若是你不是以學業爲重,此部分建議的目錄將提供教師、做業、測試、等級、期限和實在的結果。而這些建議須要你走進一間課室或者在編程以外。
花費最大但對於大部分人來講,又是最有價值的建議就是得到一個正規大學的學位,它可能讓你有機會爲開啓編程和計算機技術的職業生涯打下最好的基礎。根據你申請的大學和學位,你將會收到對應的錄取通知書(等於一條腳邁進了職業的生涯)。可是更爲重要的是,你將能塑造出能夠洞悉計算機全部一切的本領,以及編寫確實無可挑剔代碼的能力,而高效的軟件正依賴於此。
如下是你能夠從大學課程中進行更深刻學習的內容,而在非大學裏學習這些將會更難。
電子電路:幾乎所有電腦硬件的基本物理底層。
數字邏輯電路:怎樣用電路表示真和邏輯結構。
微機與計算機系統:如何將邏輯電路結合成一個可以被編程和計算的機器。在這些元件和打印總線上發生了哪些事情。
操做系統:如何編寫一個可以進行管理、組織、自我保持和制受權各類各樣應用程序進行安全性操做的電腦。
數據庫:如何存儲和複製海量的數據且無丟失、不被破壞,而且易於搜索。
網絡:各類不相關的計算機系統如何進行通訊。
高等數學:包括微積分和線性代數。對任何尖端領域的職業生涯都是相當重要。
單片機:如何從模擬世界穿越到數字世界。
數值方法:用姨夫現實世界的問題不能很好的映射到計算機時。
計算機科學和工程學校會讓你痛不欲生,你不得不擔驚受怕,不得不強迫本身完成這些學科。可是一分耕耘一分收穫。我曾經也爲獲取個人學位而苦苦掙扎,可是我拿到畢業證的那一天是我人生中最美好的日子之一。
所謂的訓練營是用來知足那些沒有時間或資源去追求一個正規學位,但又願意更努力工做,或者至少想學習開啓軟件開發職業生涯最基本要求的人的須要。對於一個正規的學位與接下來要討論的半結構化學習,訓練營所須要的代價和承諾在於這二者之間。
訓練營的課程一般在8到12周之間,學費金額約10,000刀左右。他們在短期內覆蓋了絕大部份內容,在此期間你得犧牲你的大部分其餘業餘愛好。可是,他們會承諾爲你準備實際的開發環境,而且讓你以最快的速度進入編程的生涯。不少訓練營以職業生涯的日子了結,或者在你一畢業就爲你安排一個職位。
相對來講,訓練營在最近這幾年是一個爆炸的現象。所以,儘管不少都提供了關於就業率的追蹤報告,依然很難評估他們的成功率有多少。也就是說,當這個新興的爆炸式行業在持續快速發展的過程當中咱們只能期待有更好、更具價值的流程出現。若是你仔細地埋調查,你將會發現訓練營是否適合於你。
大部分的訓練營都是有固定場所的,你能夠你的城鎮上找到那些對你有做用的訓練營。若是你居住在大都市,也許你能夠在這裏或這裏找到你想要的訓練營。
如今愈來愈多的資源變得隨手可得,這些資源來自那些工做於有很好結構和指導可是又沒有時間或資源提交給正規則大學或訓練營的人。而這些資源一般提供在網上,且大部分是徹底免費的!隨着對這些服務的高度須要,這些工具迅速發展,日益成熟而且體現了它們的價值。本質上,軟件開發或多或少也受到這些工具演進的驅動,正如軟件的學習與教育的相互促進。
你真的想成爲一個程序員,對嗎?如下這些技巧和工具將能幫助你如何開始。
MOOC是一個驚人的資源,而且在質量和支付得起的教育中取得了重大的進展。他們經過在線的方式將世界上最好的大學課程的結構和指導提供給任何一個可以連得上互聯網的人。不少流行的MOOC也都是徹底免費的,儘管還會有一個額外的價格(以此承諾堅持學習),並且也能夠得到像相似大學那樣的學分。
這裏有不少能夠得到由來自世界上著名大學的教授進行齊整講授的一流MOOC平臺,還有你和你的同窗與世界各地的人進行相互幫助的社區平臺。如下是一些著名的提供商:
注意,正如廣告中所說的,這些課程提供了大學級別的課程,因此你最好作好克服他們的準備。
若是你喜歡有結構和有指導性的學習,但又不受限於期限,這還有不少利用各式各樣交付方法提供自動化、一步接一步訓練的在線平臺。其中有一些以視頻形式提供,有一些則用文本。並且不少都包含了你能夠直接在瀏覽器上練習的即時編輯器。經過這些網站你能夠在你的環境中自由地學習,無論是在每一天最後的一個半小時裏,仍是在每一個週末10個小時馬拉松式的練習。
其中不少平臺都須要支付以便能訂閱到所有的內容,另外不少則提供免費的資料以便你能夠立刻開始,如下網站能夠根據我的須要自由選擇。
這僅僅是其中很小的一部分,經過搜索你能夠找到更多!
對於那些想找到適合本身的方式、或利用他們本身自由的時間來提升,而又不想有結構化課程壓力的人來講,如下工具提供了一個自主學習的途徑。即便你準備使用以上任意一種途徑來學習,你也能從如下這些資源中找到能夠幫助補充你進行更好學習或進行練習的平臺 。
若是你的目標僅僅只是練習解決編程問題,那麼再一次,你須要用到互聯網。如下站點提供了一系列編碼挑戰,這些挑戰爲了解決問題,有着即時編程接口,以及能夠看到將你的與其餘用戶的解決方案進行對比的排行結果。
學習編程離不開實踐,但若是你想學到更深的內容,除了會議和夜間在線的課程外,還有一些更好的系列講座。若是你喜歡這樣的方式,能夠到YouTube或者網上找下這方面有關的視頻。
即便有這麼多有用的技術,但對不少人來講仍然沒有比書更能讓他們一頭扎進去得到關於某一主題深刻理解的了。若是你想經過此方式來學習,能夠看下Toptal免費編程書籍推薦清單。
學習編程的旅途,因人而異。不一樣的人有不一樣的資源、不一樣的目標,而且在此途中又有不盡相同的挑戰和機遇。不要過於擔憂別人正在作什麼,或者他們是如何到達終點的。即便對於經驗豐富的程序員,此旅途也是沒有終點的,由於總會有一些新的東西須要學習。
因此,個人建議就是,慢慢來,祝你旅途愉快!這裏有太多東西須要你去探索,而且一個充滿神奇的世界正等待着你的到來。千里之行,始於足下。這裏只是一些好用的鞋子。祝你好運!
Nick McCrea, United States
本文翻譯做者爲:dogstar,發表於開源中國我的博客;歡迎轉載,但請註明出處,謝謝!