❶ 如何系統地自學 Python
是否非常想學好 Python,一方面被瑣事糾纏,一直沒能動手,另一方面,擔心學習成本太高,心裡默默敲著退堂鼓?
幸運的是,Python 是一門初學者友好的編程語言,想要完全掌握它,你不必花上太多的時間和精力。
Python 的設計哲學之一就是簡單易學,體現在兩個方面:
語法簡潔明了:相對 Ruby 和 Perl,它的語法特性不多不少,大多數都很簡單直接,不玩兒玄學。
切入點很多:Python 可以讓你可以做很多事情,科學計算和數據分析、爬蟲、Web 網站、游戲、命令行實用工具等等等等,總有一個是你感興趣並且願意投入時間的。
廢話不多說,學會一門語言的捷徑只有一個: Getting Started
¶ 起步階段
任何一種編程語言都包含兩個部分:硬知識和軟知識,起步階段的主要任務是掌握硬知識。
硬知識
「硬知識」指的是編程語言的語法、演算法和數據結構、編程範式等,例如:變數和類型、循環語句、分支、函數、類。這部分知識也是具有普適性的,看上去是掌握了一種語法,實際是建立了一種思維。例如:讓一個 Java 程序員去學習 Python,他可以很快的將 Java 中的學到的面向對象的知識 map 到 Python 中來,因此能夠快速掌握 Python 中面向對象的特性。
如果你是剛開始學習編程的新手,一本可靠的語法書是非常重要的。它看上去可能非常枯燥乏味,但對於建立穩固的編程思維是必不可少。
下面列出了一些適合初學者入門的教學材料:
廖雪峰的 Python 教程 Python 中文教程的翹楚,專為剛剛步入程序世界的小白打造。
笨方法學 Python 這本書在講解 Python 的語法成分時,還附帶大量可實踐的例子,非常適合快速起步。
The Hitchhiker』s Guide to Python! 這本指南著重於 Python 的最佳實踐,不管你是 Python 專家還是新手,都能獲得極大的幫助。
Python 的哲學:
學習也是一樣,雖然推薦了多種學習資料,但實際學習的時候,最好只選擇其中的一個,堅持看完。
必要的時候,可能需要閱讀講解數據結構和演算法的書,這些知識對於理解和使用 Python 中的對象模型有著很大的幫助。
軟知識
「軟知識」則是特定語言環境下的語法技巧、類庫的使用、IDE的選擇等等。這一部分,即使完全不了解不會使用,也不會妨礙你去編程,只不過寫出的程序,看上去顯得「傻」了些。
對這些知識的學習,取決於你嘗試解決的問題的領域和深度。對初學者而言,起步階段極易走火,或者在選擇 Python 版本時徘徊不決,一會兒看 2.7 一會兒又轉到 3.0,或者徜徉在類庫的大海中無法自拔,Scrapy,Numpy,Django 什麼都要試試,或者參與編輯器聖戰、大括弧縮進探究、操作系統辯論賽等無意義活動,或者整天跪舔語法糖,老想著怎麼一行代碼把所有的事情做完,或者去構想聖潔的性能安全通用性健壯性全部滿分的解決方案。
很多「大牛」都會告誡初學者,用這個用那個,少走彎路,這樣反而把初學者推向了真正的彎路。
還不如告訴初學者,學習本來就是個需要你去走彎路出 Bug,只能腳踏實地,沒有奇跡只有狗屎的過程。
選擇一個方向先走下去,哪怕臟丑差,走不動了再看看有沒有更好的解決途徑。
自己走了彎路,你才知道這么做的好處,才能理解為什麼人們可以手寫狀態機去匹配卻偏要發明正則表達式,為什麼面向過程可以解決卻偏要面向對象,為什麼我可以操縱每一根指針卻偏要自動管理內存,為什麼我可以嵌套回調卻偏要用 Promise...
更重要的是,你會明白,高層次的解決方法都是對低層次的封裝,並不是任何情況下都是最有效最合適的。
技術涌進就像波浪一樣,那些陳舊的封存已久的技術,消退了遲早還會涌回的。就像現在移動端應用、手游和 HTML5 的火熱,某些方面不正在重演過去 PC 的那些歷史么?
因此,不要擔心自己走錯路誤了終身,堅持並保持進步才是正道。
起步階段的核心任務是掌握硬知識,軟知識做適當了解,有了穩固的根,粗壯的枝幹,才能長出濃密的葉子,結出甜美的果實。
¶ 發展階段
完成了基礎知識的學習,必定會感到一陣空虛,懷疑這些語法知識是不是真的有用。
沒錯,你的懷疑是非常正確的。要讓 Python 發揮出它的價值,當然不能停留在語法層面。
發展階段的核心任務,就是「跳出 Python,擁抱世界」。
在你面前會有多個分支:科學計算和數據分析、爬蟲、Web 網站、游戲、命令行實用工具等等等等,這些都不是僅僅知道 Python 語法就能解決的問題。
拿爬蟲舉例,如果你對計算機網路,HTTP 協議,HTML,文本編碼,JSON 一無所知,你能做好這部分的工作么?而你在起步階段的基礎知識也同樣重要,如果你連循環遞歸怎麼寫都還要查文檔,連 BFS 都不知道怎麼實現,這就像工匠做石凳每次起錘都要思考錘子怎麼使用一樣,非常低效。
在這個階段,不可避免要接觸大量類庫,閱讀大量書籍的。
類庫方面
「Awesome Python 項目」:vinta/awesome-python · GitHub
這里列出了你在嘗試解決各種實際問題時,Python 社區已有的工具型類庫,如下圖所示:
vinta/awesome-python
你可以按照實際需求,尋找你需要的類庫。
至於相關類庫如何使用,必須掌握的技能便是閱讀文檔。由於開源社區大多數文檔都是英文寫成的,所以,英語不好的同學,需要惡補下。
書籍方面
這里我只列出一些我覺得比較有一些幫助的書籍,詳細的請看豆瓣的書評:
科學和數據分析:
❖「集體智慧編程」:集體智慧編程 (豆瓣)
❖「數學之美」:數學之美 (豆瓣)
❖「統計學習方法」:統計學習方法 (豆瓣)
❖「Pattern Recognition And Machine Learning」:Pattern Recognition And Machine Learning (豆瓣)
❖「數據科學實戰」:數據科學實戰 (豆瓣)
❖「數據檢索導論」:信息檢索導論 (豆瓣)
爬蟲:
❖「HTTP 權威指南」:HTTP權威指南 (豆瓣)
Web 網站:
❖「HTML & CSS 設計與構建網站」:HTML & CSS設計與構建網站 (豆瓣)
...
列到這里已經不需要繼續了。
聰明的你一定會發現上面的大部分書籍,並不是講 Python 的書,而更多的是專業知識。
事實上,這里所謂「跳出 Python,擁抱世界」,其實是發現 Python 和專業知識相結合,能夠解決很多實際問題。這個階段能走到什麼程度,更多的取決於自己的專業知識。
¶ 深入階段
這個階段的你,對 Python 幾乎了如指掌,那麼你一定知道 Python 是用 C 語言實現的。
可是 Python 對象的「動態特徵」是怎麼用相對底層,連自動內存管理都沒有的C語言實現的呢?這時候就不能停留在表面了,勇敢的拆開 Python 的黑盒子,深入到語言的內部,去看它的歷史,讀它的源碼,才能真正理解它的設計思路。
這里推薦一本書:
「Python 源碼剖析」:Python源碼剖析 (豆瓣)
這本書把 Python 源碼中最核心的部分,給出了詳細的闡釋,不過閱讀此書需要對 C 語言內存模型和指針有著很好的理解。
另外,Python 本身是一門雜糅多種範式的動態語言,也就是說,相對於 C 的過程式、 Haskell 等的函數式、Java 基於類的面向對象而言,它都不夠純粹。換而言之,編程語言的「道學」,在 Python 中只能有限的體悟。學習某種編程範式時,從那些面向這種範式更加純粹的語言出發,才能有更深刻的理解,也能了解到 Python 語言的根源。
這里推薦一門公開課
「編程範式」:斯坦福大學公開課:編程範式
講師高屋建瓴,從各種編程範式的代表語言出發,給出了每種編程範式最核心的思想。
值得一提的是,這門課程對C語言有非常深入的講解,例如C語言的范型和內存管理。這些知識,對閱讀 Python 源碼也有大有幫助。
Python 的許多最佳實踐都隱藏在那些眾所周知的框架和類庫中,例如 Django、Tornado 等等。在它們的源代碼中淘金,也是個不錯的選擇。
¶ 最後的話
每個人學編程的道路都是不一樣的,其實大都殊途同歸,沒有迷路的人只有不能堅持的人!
希望想學 Python 想學編程的同學,不要猶豫了,看完這篇文章,
Just Getting Started !!!
❷ 如何系統,科學地自學編程知識
事實上要回答你的問題恐怕已經遠遠超出我的能力范疇之外了。因為對於什麼樣的學習才算得上「系統」幾乎是一個哈姆雷特式的問題——人們很難在這一問題上達成一致。
因此拋出答案幾乎只是在引發更多的爭議。所以在討論這個問題的時候,我必須承認下述描述只是我自己的一點小小的體會,只希望能對你有所幫助,這些看法並不「權威」,也不完全「正確」。
一般來說對於計算機科學的學生來說,下述課程是非常關鍵的:
提醒:學習時注意把握合理的深度,不可太浮於表面,也不可太過拘泥於部分細節,對於初學著重掌握基礎內容,能在概念上建立一個合理的認識就可以。真正的學習是在後面的職業生涯中完成的。
一、基礎篇(理論與硬體)
這一部分關注的是計算機的基本理論與基本實現。包括硬體結構理論,以及軟體與硬體的交互。以理論開篇,在機器語言部分深入,最終在操作系統部分達到高潮。
1、計算機實現計算的原理。這包括門電路是如何實現計算的,時序電路是如何實現存儲的,馮諾依曼體系結構是如何將二者結合實現了真正的現實世界的計算機的,以及它是如何反映圖靈機這一理論計算模型的。其間會學習布爾邏輯。
2、如何控制計算機硬體。這部分使用的「工具」就是機器語言和匯編語言。我們需要理解機器語言的本質,以及它如何以「匯編語言」這種更容易理解的形式為程序員提供了控制硬體設備的機會。這部分可以學習到很多非常低級但是本質的內容。
3、操作系統是如何工作的。如果你理解了上一部分的計算機硬體相關的問題,那麼理解操作系統的工作原理將不會那麼困難。另外你將明白操作系統作為硬體和上層軟體的中間層次,是如何大大簡化了人們對硬體的操作過程的。
二、進階篇(軟體系統)
1、編程語言。這包括結構化編程語言以及面向對象編程語言。因為有很多選擇,其實以一門語言開始即可,如果你在前面正確的理解了硬體與機器語言,那麼C語言入門真是太簡單了,如果你運氣不好,覺得C很困難,那麼即使是從Python、Javascript開始學習也沒問題。重點在於理解編程中和語法相關的基本概念,並了解一些簡單的演算法知識。
2、數據結構與演算法。說白了就是如何合理的組織數據,通過其結構特點來簡化編程或者提高計算的效率。這里的內容是模式化的,所有人都需要學習無序結構、有序線性結構、樹結構、圖結構等。另外,排序演算法、查找演算法必須學好,特別是演算法策略如遞推、遞歸、蠻力(窮舉)、分治、動態規劃等也必須有所實踐和了解。切記不必深陷其中,這里是個大坑,你不可能真的「精通」他們。
3、編程語言是如何實現的。這里主要涉及編譯原理。當你站在高級編程語言實現者的角度再來認識編程語言本身的時候,許多問題豁然開朗。這會深刻的改變你的編程觀。可惜的是即使是很好的學生在這里也會遇到很大的阻力。真正的問題不是這方面理論性有多強,而是教材都很爛——包括國外教材(什麼龍書虎書鯨書都根本不是為初學者准備的),而且語焉不詳。這導致大部分人都感覺莫名其妙高深莫測。如果你不是有志攀登軟體設計的最高峰,可以繞行。否則從表達式運算解析開始,逐步引入變數,類型,控制結構,函數,再到對象,一步步構建出解析器,然後結合前面學習的硬體介面知識,將其轉換為低級表示,最後你會發現沒有那麼可怕。
三、基礎領域篇(必備領域知識)
1、互聯網路是如何構成的。這部分包括網路的基本知識,主機間通信的原理,轉發設備的實現,以及互聯網路的構成。這是網路編程所需的基礎知識。除了理解低級協議,也要花一些時間了解應用層的協議,特別是 SMTP、POP3、FTP、HTTP 等,重點是了解他們的基本原理,而不是每個細節。因為每個協議都有自己的標准,光 HTTP 協議就夠你研究 6 個月以上了。這里注重的是原理。
2、如何管理大量的數據並在其上建立信息系統。資料庫是一個很好的例子。包括資料庫系統的基本理論,實現原理,以及設計原則。同樣,這里不是真的在教你如何構建一個資料庫系統,而是在學習他的核心原則,重點是學會如何合理的設計表結構,以及實現效率良好的SQL查詢語句。
四、擴展領域篇(特定領域知識)
1、基於特定平台的軟體開發。如何在Windows平台、Linux平台、Mac OS平台或者手機、平板、電視機、微波爐上完成開發?這需要學習特定的軟體平台提供了哪些編程介面,如何編譯並部署,如何調試和測試等知識。這部分就是軟體工程師職業生涯中最耗費時間的部分。
2、有效的軟體研發是如何實現的。這包括軟體結構的設計知識,軟體實施流程的管理知識,以及一些細微而繁雜的內容。人們通常用軟體工程一詞來概括。但事實上軟體工程站的角度要更高一些,這里只是涵蓋軟體工程的一小部分。
五、科技領域篇(研究性知識)
如果你對人工智慧、科學計算、圖像處理感興趣,這里還有大片的區域等待你探索。
事實上,上面的描述有些嚇人。每一個領域都夠耗盡去很長的時間。不過好消息是大部分知識都只要求在理論上理解。真正的耗費時間的部分還是在與編程、編程、編程。不是每個人都會用到資料庫系統,也不是每個人都需要懂得匯編語言。但是這些背景知識會對你有幫助。讓你不再害怕,對自己更有自信。
如果你希望自己成為一個很棒的開發人員,那麼上述知識都是必須的。但是卻依然遠遠不夠。
學無止境,計算機科學尤其如此。
❸ 如何自學編程
熟悉以下關鍵東西,可以邊學邊做,定期訓練,經常思考,長期積累:
1、語法
2、基礎理論(數學、數據結構、演算法等)
3、設計方案(編程原則、設計模式、框架設計等)
4、庫(核心、基礎、UI、擴展、游戲引擎等)
5、計算機相關(操作系統、網路、圖形學等)
6、領域知識(游戲設計、網站設計等)
7、開發工具(編輯器、IDE、自動部署等)
8、項目管理(進度管理、分工協作、Bug管理、版本控制等)
最普遍的也是最重要的能力:創造力。努力分析並理解好做什麼以及怎麼做。要知道上面那些東西一開始都是不存在的。
具體方法包括:
1、快速閱讀入門教程和書籍,適合學習語言和基礎庫。比如我學Java讀的《Java編程思想》,練習題做過一點,然後學ActionScript就沒讀過書,只讀過Adobe官方文檔《ActionScript 3.0編程》。
2、閱讀庫的文檔、實例、源碼。比如Flash、Flex開發,熟悉官方API很重要,很多細節要具體使用時才注意到,這時候最好做個筆記,雖然我從沒看過我的筆記。
3、做一個自己感興趣或熟悉的小項目,比如我就以黑白棋游戲作為多個語言的試水項目,一樣的邏輯,便於把關注點放在語言特點上。
4、自己動手豐衣足食。廚師有菜譜,程序員可沒菜譜。比如我做游戲,最關鍵的游戲編程知識全部是動手學出來的,很少有專門針對某個業務領域(如游戲)的編程書籍,要麼是入門書,要麼是模式書(如演算法)、理論書(圖形學),很少有書籍教你如何開發一個45度角地圖系統加編輯器的,全靠自己思考,以及看前人的代碼,需要時找些網路資料。關鍵是,可以培養最重要的創造力。
對於演算法和設計模式,可以研讀下,但是關鍵還是靠平時如何使用了。新手勉強不來的。
項目管理方面的,就得靠工作經驗了,多思考多提意見不要只走流程。