如何零基礎開始自學Python編程

轉載——原做者:賽門喵
連接:https://www.zhihu.com/question/29138020/answer/141170242html

0. 明確目標

  我是真正零基礎開始學Python的,從一開始的一竅不通,到3個月後成功搭建了一個動態網站(沒有用任何框架)。相比於計算機大牛,我更加知道一個小白將會遇到什麼坑,遇到哪些難點。我把個人學習過程寫在下面,並附上在每一個階段的學習資料,但願對零基礎的Python學習者有所幫助。前端

  (注:本文只作經歷分享,不是技術探討)python

  在知乎上經常看到想要轉行IT,或者是想學習編程但不知如何開始的朋友。回答這類問題的人每每只是列出書單資源而後給出一個大體的方向。有些朋友一開始就扎入了理論學習的汪洋大海,從苦讀相似《算法導論》開始,可以堅持讀下來的寥寥無幾,學習的積極性也被不斷的挫敗感消磨的所剩無幾。git

  一直以來,編程對我而言是一種「黑魔法」般的存在。今年阿里月餅門,當不少人都參與到是非之爭的時候,我更加着迷於程序員區區幾行代碼的腳本所展示出的威力,對於外行而言,這是超乎他們想象以外的某種能力——爲何我守在電腦面前盯着秒針而後拼命點擊鼠標都不必定能搶到的禮物,程序員只須要提早花5分鐘寫3行代碼就輕鬆搞定?程序員

  因此,個人心底深處一直都想變成這樣的一位魔法師。今年的8月,恰好工做上想要開發一個基於微信的英語學習網站,藉此機會,我決定好好學習一下編程。在此以前,我全部關於程序的知識僅僅來源於兩部分,一是本科時期的C語言必修課,如今已經忘的一乾二淨,不過好歹我從中明白編程是怎麼回事;第二部分是大概兩年前因爲工做關係學的一些Python,不過只是皮毛,如今忘的七七八八。github

  簡單說,個人目標是創建一個網站,不過這個網站是動態的,也就是說它能識別誰登錄,而後對不一樣的人顯示不一樣的內容。而當時的現實是,我徹底不明白網頁是如何顯示出來的?譬如每一個人登錄知乎的時候看到的是定製化的頁面,後臺是如何基於每一個ID來組織出不一樣的頁面的?全部咱們看到的問題,回答,參與的評論在背後的服務器上是以一種什麼樣的形式存在的?又好比爲何有些頁面只能在微信端打開,在電腦上就會出錯?(不知道你有沒有發現這一點)web

  當時個人心中充滿了無數個相似的問號?固然若是你也是小白,必定有着一樣的疑問。算法

  好處是一開始就明確了學習的目的:Web建站。因此個人學習方案基本就是經過作項目學習,哪裏不懂就解決哪裏,邊作邊學習,不斷推動。另外,因爲知道不少成功的網站在用Python作服務器開發,好比知乎,因此我就天然選擇了Python。數據庫

  因而我就開始了我充滿着挫敗感和成就感的編程之路……編程

  從8月到12月的四個月裏,除去原本的工做,爲了學習質量,我會保證平均天天4個小時的學習時間,週末也不例外。另外,全部的文檔,問答都儘可能看英文的,這能夠幫你剩下大量的時間。12月13日,我作的網站上線了,3天時間大概有5000人訪問了這個網站,我有時在後臺看着日誌,難免有些心潮噴涌,我想把本身的經驗寫下來,但願對於那些有心學習編程但無從下手的朋友提供一些幫助和鼓勵。

1. 個人自學編程之路

1.1 基礎

  剛開始的時候,我對搭建網站一無所知。爲了給本身迅速創建一個框架,我在Google上面泡了整整一天,瞭解了HTML,CSS,JavaScript,Ajax,jQuery,React,SQL,服務器腳本等等知識,不求精通,只是瞭解每一項技術是幹嗎的,另外一方面創建起了一個學習的roadmap,這樣大概知道作一個Web App須要哪些知識,分別學習的主次順序。重點推薦兩個資源:

  Python基礎知識:Learn Python the Hard Way

  Web App基礎知識:@張秋怡的答案寫的通俗易懂,極力推薦。

  有了這個roadmap,我明白了前端三大必須掌握技能HTML,CSS和JavaScript,花了大概10天左右把W3Schools上的教程所有過了一遍,而後試着寫了幾個網頁,感受本身寫的很沒有底氣。因而根據知乎和豆瓣上的推薦,買了《JaveScript DOM》和《Head First HTML與CSS》,邊看書邊把例子過了一遍。

  W3Schools: www.w3schools.com/

  JavaScript:JavaScript DOM編程藝術

  HTML & CSS : Head First HTML與CSS(第2版)

  前端是須要慢慢學習的,在看完上面的資料後,雖然能寫出來一些挺漂亮的頁面,可是我本身知道不少都是不符合標準的,更不要說代碼風格什麼的。這隻能經過不斷地積累和增長代碼量來提升。因爲明白服務器端須要耗費本身大量的時間,因此在發現本身可以按照構思勉強實現網頁以後,我就把學習中心放到了服務器端上。不過天天仍是會抽空寫一寫網頁,避免手生。

1.2 服務器端

  最早了解的是HTTP協議,也就是瀏覽器和服務器之間是如何通訊的。也就是當你在瀏覽器裏鍵入網址按下回車直到網頁顯示在你瀏覽器的這個過程當中,瀏覽器和瀏覽器之間發生了什麼事情。這是頗有意思的內容,我是以讀小說的心情瞭解了這部份內容。瞭解這部分後,你就會明白相似爲何有時候會有404頁面?在百度搜索框裏鍵入的搜索詞是如何提交到百度服務器的?爲何從新登陸知乎的時候就不用再輸入密碼了?之類的問題了。

  HTTP協議學習資料:In Introduction to HTTP Basics

  @Vamei的博客:協議森林

  瞭解了HTTP協議以後,我就多少有些入迷了。看似神祕難懂的現象其實原理並不複雜,你反而會被吸引。接下來就進入到我投入時間最多的部分了——後端開發。記得當時瞭解Web開發的MVC(Model-View-Controller)模式後,有一種心血噴涌的感受,以爲太有意思了(程序員別噴,我就是這麼沒見過世面)。咱們以知乎爲例子來講明MVC是個啥:

  每一個人的主頁都是相同的佈局和風格,例如最上面的菜單搜索欄,顏色分割,左邊顯示動態等,右邊是我的信息等,而後具體的內容卻因人而異——每一個人的頭像,名字,動態都是不同的。那麼知乎是如何保證每個人看到的都是本身的主頁呢?

你能夠把這個相同的佈局想象成一個模板,裏面有一個個空格子,當你用你的帳戶登錄頁面時,想象你的電腦裏有無數個小人根據你的帳號從知乎後臺的數據庫裏取出你的頭像,動態,認證信息等等內容,而後對應着模板上規定好的位置,把對應的內容填進去。這些小人的動做實在是太快了,以致於你以爲這是在瞬間完成的。

  上面所說的模板就是MVC中的V,是View的縮寫,負責顯示。這樣作的好處在於,若是知乎有一天忽然想改變一下我的主頁的風格,那麼只須要改變這一個模板,而後幾千萬註冊用戶的主頁就相應的變化了,由於模板是公用的,是否是省了不少事情?(早期的Web開發可不是這樣喲,你可能要一個個用戶去改,很是麻煩。)

  而這些小人除了擺放內容,它們真正負責的是業務邏輯,咱們把他們叫作Controller,也就是MVC中的C。例如當你登錄的時候,這些小人要檢查你的用戶名是否是準確的,若是準確,它們要去數據庫裏取出你請求的信息等,若是用戶名錯誤,它們要攔截住你的登錄。它們的職責還有不少,沒法一一列舉。在實際中,這些小人作的事情其實就是Python(或者其它腳本語言)作的事情。

  最後,MVC中的Model其實就是傳給View的數據,包括上面的頭像,用戶名,動態等因人而異的數據。這些數據在知乎服務器上是以數據庫表格(table)的形式存在的,你能夠把它們想象成不少不一樣的excel表格,不一樣的表格儲存着不一樣的信息,有些記錄着知乎用戶的我的信息,有些記錄着回答,有些記錄着評論等等,而這些表格之間又彼此聯繫,當你在知乎的不一樣網頁間跳轉的時候,上面說的那些小人就根據你的要求,組合對應的表格取出對應的數據,而後把他們放到模板對應的空格里,發送給瀏覽器。而後瀏覽器根據你寫的CSS,用不一樣的顏色,大小等等,將數據很漂亮的顯示出來。

  這樣作的好處是什麼呢?雖然你最終在瀏覽器裏看到的是一個完整的頁面,可是在後端邏輯上它們都是區分開的——模型(M),視圖(V)和控制器(C)的區分就保證了較高的可維護性——我能夠隨時修改主頁的顯示並看到效果,一樣我能夠隨時加入一些業務邏輯。

  若是你的學習堅持到這裏了,首先要恭喜你。其次你可能已經知道一些很是成熟的Python Web框架了,例如Django,Flask等等,而且你可能看到了不少小白教程教你直接使用,畢竟大部分人可能以爲沒有必要重複造輪子。

  原本爲了省事,我也打算直接用框架。我是在設計數據庫的時候,當時在看SQLAlchemy文檔,以爲相對本身的項目SQLAlchemy太過複雜,因此我決定本身寫本身的ORM(名詞不懂不要緊),這對於當時的我來講是一件難度很是大的事情。因而我投入了極大的精力天天都在看關於SQL和Python相關的教程和資料,Python核心編程(第二版) 給了我很大的啓發。在本身完成了ORM後,又寫了URL處理函數,一樣沒有用任何現成的Web框架。

  如今回頭看,我認爲這一段時間的造輪子是提高編程能力最快的時候。好比爲了寫ORM,就必須去花不少時間學習SQL,去了解Python裏面的metaclass,而若是用一個現成的框架,我頗有可能偷懶不去關注某些細節。而不出問題還好,一旦出問題,我就只能跪。另外,造輪子迫使我在開始的時候就構思整個框架,由於我必須儘量的考慮到全部的狀況,因而就會不斷的強迫本身完善知識體系,和別人的代碼做對比從而改進本身的,這個過程充滿了無盡的挫敗感,可是得來的成就和快樂也是無可比擬的。

  SQL書籍:Sams Teach Yourself MySQL in 21 Days

  Python:Python核心編程(第二版)

  Github上的優質Python資源:CodementorIO/Python-Learning-Resources

  過程當中還牽涉到部署,個人網站是跑在Linux上的。關於部署網上有很是多的優質教程,一搜一大把。這裏就再也不贅述。

  這些是我學習大體路線,固然過程當中充滿着小的磕磕絆絆,雖然網站上線了,貌似運行還比較順利,可是若是以一個程序員的標準來要求本身,本身依然很是菜鳥。不過我並無之前那樣害怕技術了,就像你明白魔術的背後的原理後,會更多的思考原理自己。

2. 自學編程須要注意的問題

  不少人都推薦小白第一門語言選Python,由於語法簡單。這句話只說了一半,Python確實容易上手,對初學者的門檻很低。但我發現,對於小白真正的門檻在於系統知識,這就和用什麼語言徹底沒有任何關係了。例如不少人學完了Python的語法,以爲確實簡單,可是轉頭去用Python標準庫的時候,卻發現本身連文檔都看不懂。標準庫提供了Python和其它系統功能的接口,最終實現了Python和系統之間的互動。讀標準庫須要系統知識,好比操做系統,數據庫,進程和線程,socket編程,網絡協議等等,這些對於編程小白來才構成很高的門檻,可是隻有學會這些,才能真正發揮出Python的威力來。

  這也是我以爲本身的經歷對小白是有價值的一個緣由。由於設計一個動態的網頁是一個很不錯的練手Project。創建網頁(Web App)會逼迫你瞭解從你在瀏覽器裏鍵入地址按下回車到網頁顯示在瀏覽器的過程當中,瀏覽器,網絡,服務器都幹了些什麼。具體到技術上面,你不得不去學習前端的HTML,CSS和JavaScript,後端的腳本,數據庫,操做系統等。也就是說,這個過程可以促使你去主動學習上面提到的系統知識,若是你再作另一個項目,你就不會像如今這樣無從下手,而有能力去進行一些技術性的探討,因此我認爲這是一個很是好的練手項目。

2.1 必定要空出時間補充理論知識

  不少人會強調learn by doing,邊作項目邊學習,這也是我本身採用的方式。在這種方式中,你不斷犯錯,改正……學習效率很是高。可是,不少人走了極端,最後的結果就是不注意理論知識的學習。你會發現本身Google的能力愈來愈高,可是真實的編程能力並無獲得提高。若是有這種狀況,你須要反思一下。

  一種多是你太過於依賴各類成熟的框架,結果編程就變成了用「膠水」去粘合不一樣的框架完成需求。就比如你的Web App用了SQLAlchemy,雖然本身不太懂SQL,可是網站跑的也還不錯。這時候若是數據庫出現了問題,那你就只能跪了。

  另一種多是你徹底沉浸在作項目中,忽略了學習理論知識。作項目雖然充滿困難,但回報是強烈的成就感,很容易沉浸其中。我以爲這是極其錯誤的。首先半路出家的程序員都沒有通過系統的學習,沒有造成本身的知識體系,若是你不懂數據結構,算法複雜度,操做系統這些理論,那麼你能達到的高度就極其有限。因此,在天天作項目的同時,必定要保證抽出必定的時間,惡補理論知識。這部分的書單在豆瓣和知乎上都有不少總結,能夠自行搜索。

2.2 不要太糾結於無心義的問題

  好比什麼框架好,XX語言比XX語言好啦這種問題。前期肯定了練手項目,就去專心積累代碼量,積累基礎知識。那些你如今還看不懂的炫酷技術你慢慢也就能明白是怎麼回事了,反而沒有基礎,再炫酷的框架對你而言都是天書。

2.3 學會發問

  好問題是創建在你本身已經實踐或者思考的基礎上問出來的,這是對本身的負責,也是對別人的尊重。不要一遇到困難就喜歡直接上網搜索:「這個問題是怎麼回事啊?」,「我不明白你能不能幫我看看……」。

2.4 學好英語

  THE END

相關文章
相關標籤/搜索