sicppython
1. 如何學習編程
最近有幾個朋友私信問我如何學編程。我上知乎基本就是隨便寫點代碼來著,這種誤人子弟的問題我真的不敢亂說。也罷,找個問題隨便談談吧,聊勝於無。千萬不要當真。
我覺得SICP作為第一本編程書非常合適。SICP可以讓我們從零開始建立起整個對於程序語言和程序語言如何被解釋的粗淺認識。
知道什麼是數據,數據結構如何用一個小小的cons組織起來,什麼是過程,過程可以接受過程做參數並且返回過程,還有和解釋器息息相關的囿變數、自由變數、環境,等等這些重要的概念。
然後我們需要接觸機器相關的知識了。我建議學匯編。8086匯編就行了(硬核的話,或許可以學PDP-6匯編)。注意一開始從最基礎的move,add,lea開始。
然後引入棧的push和pop指令,有了棧就可以很方便的復用過程了。棧一定要好好理解,這是過程在機器裡面如何抽象的關鍵。然後引入call和ret兩個語法糖。學會匯編寫二叉樹就夠了。
因為用匯編寫二叉樹,一大堆dword,lea,肯定迷糊死了。這個時候可以上C語言了。看TCPL就行,簡單了解C語法就夠了。
C語言有指針和int等基礎類型,用C寫一遍二叉樹,明顯能體會到類型的好處。另外,C是匯編語言的又一層抽象,這里可以結合SICP里的數據抽象和過程抽象好好理解,C到底是怎麼抽象匯編的。
寫過一些C之後,了解類型的好處了。這個時候可以看TAPL。結合SICP就知道scheme基本上就是λNB的少糖形式。TAPL也是SICP這種從零開始逐漸復雜的結構,非常適合萌新看。完全弄懂λ cube和subtype就夠了。TAPL裡面還有很多細節,萌新看的時候可以忽略。
到這,編程基本上就入門了。對機器底層感興趣的去學體系結構;對數據結構和演算法感興趣的去打ACM;對PLT感興趣的繼續看ATTAPL,SF;對錢感興趣的忍著自己對C++語法的惡心去學C++;對John McCarthy感興趣的去學ML,等等。安排的明明白白。
2. python 在編程語言中是什麼地位為什麼很多大學不教 Python
十分想炮轟一下,所謂「大學學習的基本設計思想,老師教授一兩張語言即可,關鍵自己得去鑽研,看自己喜歡什麼就去多看多練習多鑽研才可以」根本就站不住腳。首先,既然是教授一兩門語言,為何這門語言是C而不是python?教授什麼語言,跟你怎麼才能把計算機語言寫好跟你要鑽研,完全就是兩回事。(我並不否認強調學習要有鑽研的精神,我十分認同在沒有其他辦法的情況下用這種論調來自我安慰,但是認為鑽研的精神最重要,學習什麼東西不重要,並不是一個讓人停止思考的好答案) 從國內的計算機科學教育來看,「計算機語言」(Computer Language)其實從來沒有獲得很高的地位,在認知上就沒有真正把計算機語言拉到一個較高的級別來看,相反的,可能還有鄙視代碼,覺得語言只是知識的底層,不是上檯面有得研究的東西。出現這種情況的原因我不大清楚,反正我身邊很多的老師其實都是平時跑跑演算法就行了——用自己用熟的C來跑,完全足夠了。如果你的代碼只是用來演示一個小程序的演算法,實際上就是一個偽代碼到可以編譯的代碼的轉變,其實真的是沒有多大區別了。 想想哪些老師在教計算機語言?基本都是教數據結構啊、演算法啊之類的拉過來客串一下,這些老師往往沒有面對復雜的系統的經驗,也沒有對一個有表達力的語言的需求在。而計算機語言的區別,所謂的表達力,優雅,抽象的角度,思維,全部都不是可以發到paper的東西,都是確確實實需要將語言工具用於應用和抽象才能體會到的。老師實際上一無使用一門好的語言的需求,二也很少做這些研究的。 計算機語言被拆成了很多門課,從語言、抽象和設計的角度來觀察語言本身,大學應該是沒有這種課程的。以我們學院來說,程序設計1根本就不是教程序設計,就是一個充水的C語言參考指導,程序設計2也不是教程序設計,就是一個充水的C++語言參考順便教你用C++的OO語法來實現點數據結構和演算法。你真正使用計算機語言是因為你要寫數據結構和演算法的作業。然後呢?因為要學計組你才需要學點匯編,一些老師可能對編程語言最大的體會是win32寫個貪吃蛇。然後等到你大三了你學「編譯原理」的時候是教你如何實現一個編譯器(而不是如何設乎芹計一門語言,用語言來思考和抽象)。 大學既不是專才教育,也不是通才教育。大學是基本能力教育,它只有義務教會大多數學生在他專業領域中的基本能力。這句話本沒有錯,但是這句模糊的話,實際上卻成為了放棄一個更好的選擇的托詞。大學當然不是專才教育,和型大學是基本能力教育也沒有錯,但是,使用C一定是掌握基本能力的最好選擇嗎?上面扯的「python不夠clean」,「Python 的集成性並不比 C 好」也站不住腳。python在大部分情況下都比C要clean多了吧。。。大學教育哪裡會在乎你的集成性。大家用 Python 是因為它的資源能夠幫助很多人解決問題,這個大致我也認同。但是,python除了類庫豐富,還是有很多好東西的。 從語言上看,python遠遠比C更適合教學啊。比如,python會讓你的 1 < a < 2 是對的,不會讓你栽入C的所謂的 (1<a) 是一個布爾值,然後跟2比較——這種設計真的是對的嗎?人歲棚畢類真的就應該遷就這種設計嗎?然後不要說 scanf("%d", &a) 這個a前面要加&這種了。你不是在學習程序語言設計,你是在學習如何躲開C的坑。。。好吧,你說學習C可以了解底層——你確認要在程序語言設計的課程裡面來學習計算機底層真的很有意義而且值得堅持? 新人如果真的要學計算機語言的話,還是跟著MIT從python開始吧。不推薦C、不推薦C++、不推薦javascript、不推薦haskell、不推薦匯編、不推薦ruby,啃的下的可以試試看SICP裡面的scheme,不然python也是個不錯的選擇。然後,C和C++一定要學好。。。haskell、lisp這些FP也挺有趣的可以看看。。。。不要挑熱門的,不要挑應用廣泛的,挑真的適合學習,能夠啟發你看到本質的。 ps:據說我院大三有門專選是python,然後還有haskell這種專選。了解了課程設計的動機和目的,其實這些都挺自然的。
3. 學習c++以後想學習第二門編程語言,請問學習什麼好一些
C#。
如果一開始把C++學成Better C了,C#可以在一定程度上引導你到面向對象去:和C++一樣是以靜態類型為主的語言,語法和C++接近,但是它對象都是「引用」類型的,我認為這是一個很好的特性,相對於C++中對象作為值類型處理更能引導你往面向對象方面去走。
4. 怎樣才能算是熟悉python會什麼具體。招聘網頁上寫著熟悉python.高手,指導,謝謝。
熟知主流硬體體系(x86, x64)
熟知 CPython 的具體實現,如若可能至少通讀源碼三遍以上
熟知每條 Python bytecode 如何被解釋執行
熟知每條 Python 語句如何 compile 成 bytecode
熟知 Python 主要數據結構所採用的優化手段
熟知 JIT 以及哪些場合下 PyPy 會比 CPython 有較大性能提高、以及有什麼代價
所以我一直只敢稱自己為 「中級 Pythonista」。對於那些僅僅知道怎麼用 Python 就敢自稱「精通」的人:專家不是那麼好當的,沒有金剛鑽別攬瓷器活。不懂那麼多底層細節就不要隨便說自己「精通」,說自己「擅長」不會被人看不起。
@米嘉 引用的 StackOverflow 上列的那幾項條件是作為將 Python 用於主要工作語言所需要的基本條件,敢於因此而稱自己「精通 Python」要讓不少人笑掉大牙。況且那幾項還有幾個嚴重問題:
第3點:如若可能,盡量避免 map/rece/fitler,而用 list/generator/set comprehension,代碼要清晰得多,GvR 如此說。xrange 和 range 的區別在 Python 3 中馬上就要滾蛋了,所以如非必要,不要大量使用 xrange。
第5點:敢於在 CPython 中大量使用遞歸是對 CPython 實現的公然侮辱。Python 的多個穩定實現都沒有 TCO,遞歸會讓性能迅速下降。記住一點:Python 中函數調用非常昂貴,可讀性、可維護性影響不大的情況下,能展開函數調用的時候盡量展開、遞歸能轉化成循環的盡量轉化。遞歸也不是人類自然的思考方式。
第7點:看書是對的,但不要把 Python 當作一門經典函數式語言對待,因為它不是。你當它是,它會很痛苦(「為毛要這樣濫用我!?」),你也會很痛苦(「為毛你不這樣實現 blah blah!?」)。SICP 是本好書,但不要因此而教條。要清楚的知道什麼時候用函數式,什麼時候用面向對象,什麼時候用面向過程,什麼時候用面向任務,什麼時候用面向結果。在一棵樹上弔死是大多數非理性死忠的表現。
5. 如何評價 Racket 這門編程語言
Racket的誕生與發展
簡單介紹一下Racket的發展,詳見知乎的一個關於Racket的問題回答:
1958年,人工智慧之父John McCarthy 發明了一種以 Lambda 演算為基礎的符號處理語言,1960年 McCarthy 發表著名論文Recursive Functions of Symbolic Expressions and Their Computation by Machine, 從此這種語言被命名為 LSIP (List Processor),其語法被命名為:符號表達式(S-Expression)。LISP構建在7個函數[atom car cdr cond cons eq quote]和2個特型[lambda label]之上。
Lisp誕生之初是為了純粹的科學研究,代碼執行像數學公式一樣,以人的大腦來演算。直到麥卡錫的學生斯蒂芬·羅素將eval函數在IBM 704機器上實現後,才開啟了Lisp作為一種計算機語言的歷史。1962年,第一個完整的Lisp編譯器在MIT誕生,從此之後Lisp以MIT為中心向全世界傳播。之後十多年,出現了各種Lisp方言。
1975年,Scheme誕生。Scheme同樣誕生與MIT,它的設計哲學是最小極簡主義,它只提供必須的少數幾個原語,所有其他的實用功能都由庫來實現。在極簡主義的設計思想下,Scheme趨於極致的優雅,並作為計算機教學語言在教育界廣泛使用。
1984年,Common Lisp誕生。在二十世紀七八十年代,由於Lisp方言過多,社區分裂,不利於lisp整體的發展。從1981年開始,在一個Lisp黑客組織的運作下,經過三年的努力整合後,於1984年推出了Common Lisp。由於Scheme的設計理念和其他Lisp版本不同,所以盡管Common Lisp借鑒了Scheme的一些特點,但沒有把Scheme整合進來。此後Lisp僅剩下兩支方言: Common Lisp 和 Scheme。
從二十世紀九十年代開始,由於C++、Java、C#的興起,Lisp逐漸沒落。直到2005年後,隨著科學計算的升溫,動態語言JavaScript、Python、Ruby的流行,Lisp又漸漸的回到人們的視線。不過在Lisp的傳統陣地教育界,Python作為強有力的挑戰者對Scheme發起沖鋒;在2008年,MIT放棄了使用Scheme作為教學語言的SICP(計算機程序的構造和解釋)課程,而啟用Python進行基礎教學。同時美國東北大學另立爐灶,其主導的科學計算系統PLT Scheme開始迅猛發展;2010年,PLT Scheme改名為Racket。近幾年,The Racket Language連續成為年度最活躍語言網站,並駕齊驅的還有haskell網站。
符號表達式 S-Expression
首先說一下S表達式:S-表達式的基本元素是list與atom。list由括弧包圍,可包涵任何數量的由空格所分隔的元素,原子是其它內容。其使用前綴表示法,在Lisp中既用作代碼,也用作數據。如:1+2*3 寫成前綴表達式就是(+ 1 (* 2 3)) 。
優點:容易parse,簡單純粹,不用考慮什麼優先順序等,也是實現代碼即數據的前提;
缺點:可讀性不是很強;
高階函數
高階函數至少滿足下列一個條件:
接受一個或多個函數作為輸入;
輸出一個函數;
微積分中的導數就是一個例子,映射一個函數到另一個函數。在無類型 lambda 演算中,所有函數都是高階的。在函數式編程中,返回另一個函數的高階函數被稱為Curry化的函數。Curry化即把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,並且返回接受餘下的參數而且返回結果的新函數的技術。如 f(x,y)=x+y, 如果給定了 y=1,則就得到了 g(x)=x+1 這個函數。
Lambda 表達式
Racket中實用Lambda表達式來定義匿名函數,《如何設計程序》書中給出的使用原則是:如果某個非遞歸函數只需要當參數使用一次,實用Lambda表達式。如果想用Lambda表達式來表達遞歸,就需要引入Y組合子,Y 就是這樣一個操作符,它作用於任何一個 (接受一個函數作為參數的) 函數 F,就會返回一個函數 X。再把 F 作用於這個函數 X,還是得到 X。所以 X 被叫做 F 的不動點(fixed point),即 (Y F) = (F (Y F)) 。
惰性求值
惰性求值(Lazy Evaluation),說白了就是某些中間結果不需要被求出來,求出來反而不利於後面的計算也浪費了時間。參見:惰性求值與惰性編程。
惰性求值是一個計算機編程中的一個概念,它的目的是要最小化計算機要做的工作。惰性計算的最重要的好處是它可以構造一個無限的數據類型。使用惰性求值的時候,表達式不在它被綁定到變數之後就立即求值,而是在該值被取用的時候求值。語句如 x:=expression; (把一個表達式的結果賦值給一個變數)明顯的調用這個表達式並把計算並把結果放置到 x 中,但是先不管實際在 x 中的是什麼,直到通過後面的表達式中到 x 的引用而有了對它的值的需求的時候,而後面表達式自身的求值也可以被延遲,最終為了生成讓外界看到的某個符號而計算這個快速增長的依賴樹。
閉包
閉包在計算機科學中,閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變數的函數。自由變數是在表達式中用於表示一個位置或一些位置的符號,比如 f(x,y) 對 x 求偏導時,y就是自由變數。這個被引用的自由變數將和這個函數一同存在,即使已經離開了創造它的環境也不例外。在函數中(嵌套)定義另一個函數時,如果內部的函數引用了外部的函數的變數,則可能產生閉包。運行時,一旦外部的 函數被執行,一個閉包就形成了,閉包中包含了內部函數的代碼,以及所需外部函數中的變數的引用。其中所引用的變數稱作上值(upvalue)。網上有很多將JavaScript閉包的文章,如果你對LISP有系統的了解,那麼這個概念自然會很清楚了。
快排的Racket實現
#langracket
(define(quick-sortarray)
(cond
[(empty?array)empty];快排的思想是分治+遞歸
[else(append
(quick-sort(filter(lambda(x)(<x(firstarray)))array));這里的array就是閉包
(filter(lambda(x)(=x(firstarray)))array)
(quick-sort(filter(lambda(x)(>x(firstarray)))array)))]))
(quick-sort'(132534509824))
;;運行結果'(012334455982)
通過這個例子,就可以感受到基於lambda運算元的 Racket 語言強大的表達能力了,高階函數、lambda表達式和閉包的使用是Racket所描述的快排十分的精煉,這和 基於馮諾依曼模型C語言是迥然不容的思維模式。後面,隨著Racket 學習的進一步深入,嘗試寫一下解釋器
6. 求編程菜鳥自學書籍!
編程電子書|增長黑客手冊如何用數據驅動爆發式增長?增長黑客PDF,免費下載
下載 鏈接: https://pan..com/s/1gWGJFVj2Ikt095XvDsCNxA
編程是編定程序的中文簡稱,就是讓計算機代碼解決某個問題,對某個計算體系規定一定的運算方式,使計算體系按照該計算方式運行,並最終得到相應結果的過程。
7. 學python對金融有用嗎
鏈接:http://pan..com/s/1djPqbCXnQrRpW0dgi2MCJg
華爾街學堂 python金融實務從入門到精通。最近,越來越多的研究員、基金經理甚至財務會計領域的朋友,向小編咨詢:金融人需要學Python么?事實上在現在,這已經不是一個問題了。Python已成為國內很多頂級投行、基金、咨詢等泛金融、商科領域的必備技能。中金公司、銀河證券、南方基金、銀華基金在招聘分析師崗位時,紛紛要求熟練掌握Python數據分析技能。
課程目錄:
Python在金融資管領域中的應用
安裝anaconda步驟
Python基礎知識
Python基礎金融分析應用
成為編程能手:Python知識進階
利用Python實現金融數據收集、分析與可視化
......
8. 如何從零開始學編程
在你學習編程之前思考一下你的目標,當你有最終目標時道路會更加的清晰。那麼,你想要寫什麼?網站?游戲?iOS或者Android應用?或是你是想自動化完成一些乏味的任務讓你有更多的時間看窗外的風景?也許你只是想更具有就業競爭力找個好工作。所有的這些都是有價值的目標,這些目標都是你編程學習推動力的一部分,沒有推動力的人,是無法在略顯枯燥的漫長學習之旅中走遠的。
不要浮躁
Badprogrammingiseasy.EvenDummiescanlearnitin21days.,meswithit.
不管是在線下還是線上的書店,滿目都是《21天學通Java》這種速成書目,它們都承諾在很短一段時間內就讓你能夠學會相關技術。MatthiasFelleisen在他的著作HowtoDesignPrograms,SecondEdition一書中明確指出了這種「速成」的趨勢並予以了以上的諷刺。
所謂的「捷徑」或者說「銀彈」是不存在的,智者說過,精通某個東西需要10年或10000個小時,也就是漢語中的「十年磨一劍」,所以不用著急,功不唐捐。
培養興趣
ionbythepublic,butbecauseitisfuntoprogram.
_LinusTorvalds
沉醉於編程,編程更是為了興趣。興趣是推動力的不竭源泉,保持這種充滿興趣的感覺,以便於你能將其投入到你的10年/10000小時的編程時間中。編程很有趣,那是探索的喜悅。那是創造的喜悅。看到自己親手完成的作品顯示在屏幕上很有趣。有人為你的代碼而驚嘆很有趣。有人在公共場合稱贊你的產品、鄰居使用你的產品、以及在媒體上討論你的產品很有趣。編程應該十分有趣,若並非如此,就找出導致編程無趣的問題,然後解決之。
在這里對於初學者有兩個大坑:
如果初學者們只與預先構建好的「發動機和組件」接觸(沒有理解和思考它們構造的原理),這會嚴重限制他們在將來構建這些東西的能力,並且在診斷解決問題時無從下手。
第二個坑沒有第一個那麼明顯:幼稚的「整體論」方法有些時候會顯得很有效,這有一定的隱蔽性與誤導性,但是一兩年過後(也許沒那麼長),當你在學習路上走遠時,再想回過頭來「補足基礎」會有巨大的心理障礙,你得拋棄之前自己狹隘的觀念,耐心地緩步前進,這比你初學時學習基礎知識困難得多。
但臘敏茄也不能矯枉過正,陷入還原論的大坑,初學時便一心試圖做宏大的理論,這樣不僅有一切流於理論的危險,枯燥和乏味還會讓你失去推動力。這種情況經常發生在計算機科班生身上。
為了更好理解,可以將學習編程類比為學習廚藝:你為了燒得一手好菜買了一些關於菜譜的書,如果你只是想為家人做菜,這會是一個不錯的主意,你重復菜譜上的步驟也能做出不賴的菜餚,但是如果你有更大的野心,真的想在朋友面前露一手,做一些獨一無二的美味佳餚,甚至成為「大廚」,你必須理解這些菜譜背後大師的想法,理解其中的理論,而不僅僅是一味地實踐。但拿猛是如果你每天唯一的工作就是閱讀那些厚重的理論書籍,因為缺乏實踐,你只會成為一個糟糕的廚子,甚至永遠成為不了廚子,因為看了幾天書後你就因為枯燥放棄了廚藝的學習。
總之,編程是連接理論與實踐的紐帶,是計算機科學與計算機應用技術相交融的領域。正確的編程學習方法應該是:通過自頂而下的探索與項目實踐,獲得編程直覺與推動力;從自底向上的打基礎過程中,獲得最重要的通用方法並鞏固編程思想的理解。
作為初學者,應以後者為主,前者為輪察輔。
啟蒙
「學編程應該學哪門語言?」這經常是初學者問的第一個問題,但這是一個錯誤的問題,你最先考慮的問題應該是「哪些東西構成了編程學習的基礎」?
編程知識的金字塔底部有三個關鍵的部分:
演算法思想:例如怎樣找出一組數中最大的那個數?首先你得有一個maxSoFar變數,之後對於每個數
語法:我怎樣用某種編程語言表達這些演算法,讓計算機能夠理解。
系統基礎:為什麼while(1)時線程永遠無法結束?為什麼int*foo(){intx=0;return&x;}是不可行的?
啟蒙階段的初學者若選擇C語言作為第一門語言會很困難並且枯燥,這是因為他們被迫要同時學習這三個部分,在能做出東西前要花費很多時間。
因此,為了盡量最小化「語法」與「系統基礎」這兩部分,建議使用Python作為學習的第一門語言,雖然Python對初學者很友好,但這並不意味著它只是一個「玩具」,在大型項目中你也能見到它強大而靈活的身影。熟悉Python後,學習C語言是便是一個不錯的選擇了:學習C語言會幫助你以靠近底層的視角思考問題,並且在後期幫助你理解操作系統層級的一些原理,如果你只想成為一個普通(平庸)的開發者你可以不學習它。
下面給出了一個可供參考的啟蒙階段導引,完成後你會在頭腦中構建起一個整體框架,幫助你進行自頂向下的探索。
完成Codecademy的Python部分。這只是熱身部分,盡快完成它,因為你永遠只是在瀏覽器里,你不會學到如何搭建開發環境。在Codecademy這類的編程學習網站學到的那點兒東西,哪怕你只想做一個小的不能再小的項目,你都不知道該從哪兒開始。
完成MIT6.00.1x(中文化)(如果你英語不過關,完成麻省理工學院公開課:計算機科學及編程導論。MOOC是學習編程的一個有效途徑。雖然該課程的教學語言為Python,但作為一門優秀的導論課,它強調學習計算機科學領域里的重要概念和範式,而不僅僅是教你特定的語言。如果你不是科班生,這能讓你在自學時開闊眼界;課程內容:計算概念,python編程語言,一些簡單的數據結構與演算法,測試與調試。支線任務:
完成Python核心編程
完成HarvardCS50(如果你英語不過關:完成哈佛大學公開課:計算機科學cs50。同樣是導論課,但這門課與MIT的導論課互補。教學語言涉及C,php,JavaScript+SQL,HTML+CSS,內容的廣度與深度十分合理,還能夠了解到最新的一些科技成果,可以很好激發學習計算機的興趣。支線任務:
閱讀《編碼的奧秘》
完成《C語言編程》
[可選]如果你的目標是成為一名Hacker:閱讀Hacker'sDelight
PS:如果教育對象還是一個孩子,以下的資源會很有幫助:
5-8歲:TurtleAcademy
8-12歲:PythonforKids
12歲以上:MITScratch或KhanAcademy
入門
結束啟蒙階段後,初學者積累了一定的代碼量,對編程也有了一定的了解。這時你可能想去學一門具體的技術,諸如Web開發,Android開發,iOS開發什麼的,你可以去嘗試做一些盡可能簡單的東西,給自己一些正反饋,補充自己的推動力。但記住別深入,這些技術有無數的細節,將來會有時間去學習;同樣的,這時候也別過於深入特定的框架和語言,現在是學習計算機科學通用基礎知識的時候,不要試圖去抄近路直接學你現在想學的東西,這是註定會失敗的。
那麼入門階段具體該做些什麼呢?這時候你需要做的是反思自己曾經寫過的程序,去思考程序為什麼(Why)要這樣設計?,思考怎樣(How)寫出更好的程序?試圖去探尋理解編程的本質:利用計算機解決問題。
設想:
X=用於思考解決方案的時間,即「解決問題」部分
Y=用於實現代碼的時間,即「利用計算機」部分」
編程能力=F(X,Y)(X>Y)
要想提高編程能力,就得優化X,Y與函數F(X,Y),很少有書的內容能同時著重集中在這三點上,但有一本書做到了——(SICP)《計算機程序的構造和解釋》,它為你指明了這三個變數的方向。在閱讀SICP之前,你也許能通過調用幾個函數解決一個簡單問題。但閱讀完SICP之後,你會學會如何將問題抽象並且分解,從而處理更復雜更龐大的問題,這是編程能力巨大的飛躍,這會在本質上改變你思考問題以及用代碼解決問題的方式。此外,SICP的教學語言為Scheme,可以讓你初步了解函數式編程。更重要的是,他的語法十分簡單,你可以很快學會它,從而把更多的時間用於學習書中的編程思想以及復雜問題的解決之道上。
PeterNorvig曾經寫過一篇非常精彩的SICP書評,其中有這樣一段:
Touseananalogy,ifSICPwereaboutautomobiles,,howtheyarebuilt,andhowonemightdesignfuel-efficient,safe,.highway,justlikeeveryoneelse.
如果你是文中的前者,閱讀SICP將成為你銜接啟蒙與入門階段的關鍵點
雖然SICP是一本「入門書」,但對於初學者還是有一定的難度,以下是一些十分有用的輔助資源:
):由上文提到的Google研究主管PeterNorvig主講,教學語言為Python,內容有一定難度。
HowtoDesignPrograms,SecondEdition:HtDP的起點比SICP低,書中的內容循循善誘,對初學者很友好,如果覺得完成SICP過於困難,可以考慮先讀一讀HtDP。
UCBerkeleySICP授課視頻以及SICP的兩位作者給Hewlett-Packard公司員工培訓時的錄像(中文化項目)
ComposingPrograms:一個繼承了SICP思想但使用Python作為教學語言的編程導論(其中包含了一些小項目)
SICP解題集:對於書後的習題,作為初學者應盡力並量力完成。
完成了這部分學習後,你會逐步建立起一個自己的程序設計模型,你的腦子里不再是一團亂麻,你會意識到記住庫和語法並不會教你如何解決編程問題,接下來要學些什麼,在你心裡也會明朗了很多。這時候才是真正開始進行項目實踐,補充推動力的好時機。
關於項目實踐:對於入門階段的初學者,參與開源項目還為時過早,這時候應該開始一些簡單的項目,諸如搭建一個網站並維護它,或是編寫一個小游戲再不斷進行擴展,如果你自己的想法不明確,MegaProjectList中選取項目。總之,務必在這時拿下你項目實踐的第一滴血。
與此同時,別忘了繼續打好根基。為了將來的厚積薄發,在下面這幾個方面你還要繼續做足功課(注意:下面的內容沒有絕對意義上的先後順序):
計算機系統基礎
有了之前程序設計的基礎後,想更加深入地把握計算機科學的脈絡,不妨看看這本書:《深入理解計算機系統》ComputerSystemsAProgrammer'sPerspective。這里點名批評這本書的中譯名,其實根本談不上什麼深入啦,這本書只是CMU的「計算機系統導論」的教材而已。CMU的計算機科學專業相對較偏軟體,該書就是從一個程序員的視角觀察計算機系統,以「程序在計算機中如何執行」為主線,全面闡述計算機系統內部實現的諸多細節。
如果你看書覺得有些枯燥的話,可以跟一門Coursera上的MOOC:TheHardware/SoftwareInterface,這門課的內容是CSAPP的一個子集,但是最經典的實驗部分都移植過來了。同時,可以看看TheCProgrammingLanguage,回顧一下C語言的知識。
完成這本書後,你會具備堅實的系統基礎,也具有了學習操作系統,編譯器,計算機網路等內容的先決條件。當學習更高級的系統內容時,翻閱一下此書的相應章節,同時編程實現其中的例子,一定會對書本上的理論具有更加感性的認識,真正做到經手的代碼,從上層設計到底層實現都瞭然於胸,並能在腦中回放數據在網路->內存->緩存->CPU的流向。
此外,也是時候去接觸UNIX哲學了:KISS-KeepitSimple,Stupid.在實踐中,這意味著你要開始熟悉命令行界面,配置文件。並且在開發中逐漸脫離之前使用的IDE,學會使用Vim或Emacs(或者最好兩者都去嘗試)。
閱讀《UNIX編程環境》
閱讀《UNIX編程藝術》
折騰你的UN*X系統
數據結構與演算法基礎
如今,很多人認為編程(特別是做web開發)的主要部分就是使用別人的代碼,能夠用清晰簡明的方式表達自己的想法比掌握硬核的數學與演算法技巧重要的多,數據結構排序函數二分搜索這不都內置了嗎?工作中永遠用不到,學演算法有啥用啊?這種扛著實用主義大旗的「碼農」思想當然不可取。沒有扎實的理論背景,遭遇瓶頸是遲早的事。
數據結構和演算法是配套的,入門階段你應該掌握的主要內容應該是:這個問題用什麼演算法和數據結構能更快解決。這就要求你對常見的數據結構和演算法了熟於心,你不一定要敲代碼,用紙手寫流程是更快的方式。對你不懂的數據結構和演算法,你要去搜它主要拿來幹嘛的,使用場景是什麼。
供你參考的學習資源:
《演算法導論》:有人說別把這本書當入門書,這本書本來就不是入門書嘛,雖說書名是IntroctiontoAlgorithms,這只不過是因為作者不想把這本書與其他書搞重名罷了。當然,也不是沒辦法拿此書入門,讀第一遍的時候跳過習題和證明就行了嘛,如果還覺得心虛先看看這本《數據結構與演算法分析》
CourseraAlgorithms:DesignandAnalysis[Part1]&[Part2]:Stanford開的演算法課,不限定語言,兩個部分跟下來演算法基礎基本就有了;英語沒過關的:麻省理工學院公開課:演算法導論
入門階段還要注意培養使用常規演算法解決小規模問題的能力,結合前文的SICP部分可以讀讀這幾本書:《編程珠璣》,《程序設計實踐》
編程語言基礎
.,.Additionally,,
-ThePragmaticProgrammer
此外還要知道,學習第n門編程語言的難度是第(n-1)門的一半,所以盡量去嘗試不同的編程語言與編程範式,若你跟尋了前文的指引,你已經接觸了:「干凈」的腳本語言Python,傳統的命令式語言C,以及浪漫的函數式語言Scheme/Racket三個好朋友。但僅僅是接觸遠遠不夠,你還需要不斷繼續加深與他們的友誼,並嘗試結交新朋友,美而雅的Ruby小姑娘,Hindley-Milner語言家族的掌中寶Haskell都是不錯的選擇。但有這么一位你躲不開的,必須得認識的大夥伴—C++,你得做好與他深交的准備:
入門:C++Primer
[可選]進階:
高效使用:EffectiveC++
深入了解:《深度探索C++對象模型》;C++Templates
研究反思:TheDesignandEvolutionofC++;對於C++這個NecessaryEvil,看這本書可以讓你選擇是成為守夜人還是守日人。
現實是殘酷的,在軟體工程領域仍舊充斥著一些狂熱者,他們只掌握著一種編程語言,也只想掌握一種語言,他們認為自己掌握的這門語言是最好的,其他異端都是傻X。這種人也不是無葯可救,有一種很簡單的治療方法:讓他們寫一個編譯器。要想真正理解編程語言,你必須親自實現一個。現在是入門階段,不要求你去上一門編譯器課程,但要求你能至少實現一個簡單的解釋器。
供你參考的學習資源:
《程序設計語言-實踐之路》:CMU編程語言原理的教材,程序語言入門書,現在就可以看,會極大擴展你的眼界,拉開你與普通人的差距。
Coursera編程語言MOOC:課堂上你能接觸到極端FP(函數式)的SML,中性偏FP的Racket,以及極端OOP(面向對象)的Ruby,並學會問題的FP分解vsOOP分解、ML的模式匹配、Lisp宏、不變性與可變性、解釋器的實現原理等,讓你在將來學習新語言時更加輕松並寫出更好的程序。
:熱熱身,教你寫一個簡單的瀏覽器——其實就是一個javascript和html的解釋器,完成後的成品還是很有趣的;接下來,試著完成一個之前在SICP部分提到過的項目:用Python寫一個SchemeInterpreter
其他
編程入門階段比較容易忽視的幾點:
學好英語:英語是你獲取高質量學習資源的主要工具,但在入門階段,所看的那些翻譯書信息損耗也沒那麼嚴重,以你自己情況權衡吧。此外英語的重要性更體現在溝通交流上,LinusTorvalds一個芬蘭人,一口流利的英語一直是他招募開發者為Linux幹活的的法寶,這是你的榜樣。
學會提問:學習中肯定會遇到問題,首先應該學會搜索引擎的「高級搜索」,當單靠檢索無法解決問題時,去StackOverflow或知乎提問,提問前讀讀這篇文章:Whathaveyoutried?
不要做一匹獨狼:嘗試搭建一個像這樣簡單的個人網站,不要只是一個孤零零的About頁面,去學習Markdown與LaTeX,試著在Blog上記錄自己的想法,並訂閱自己喜歡的編程類博客。推薦幾個供你參考:JoelonSoftware,PeterNorvig,CodingHorror
小結
以上的內容你不應該感到懼怕,編程的入門不是幾個星期就能完成的小項目。期間你還會遇到無數的困難,當你碰壁時試著嘗試「費曼」技巧:將難點分而化之,切成小知識塊,再逐個對付,之後通過向別人清楚地解說來檢驗自己是否真的理解。當然,依舊會有你解決不了的問題,這時候不要強迫自己——很多時候當你之後回過頭來再看這個問題時,一切豁然開朗。
此外不要局限與上文提到的那些材料,還有一些值得在入門階段以及將來的提升階段反復閱讀的書籍。ThePragmaticProgrammer就是這樣一本程序員入門書,終極書。有人稱這本書為代碼小全:從DRY到KISS,從做人到做程序員,這本書教給了你一切,你所需的只是遵循書上的指導。
後記
如果你能設法完成以上的所有任務,恭喜你,你已經真正實現了編程入門。這意味著你在之後更深入的學習中,不會畏懼那些學習新語言的任務,不會畏懼那些「復雜」的API,更不會畏懼學習具體的技術,甚至感覺很容易。當然,為了掌握這些東西你依舊需要大量的練習,腰還是會疼,走路還是會費勁,一口氣也上不了5樓。但我能保證你會在思想上有巨大的轉變,獲得極大的自信,看老師同學和csdn的眼光會變得非常微妙,雖然只是完成了編程入門,但已經成為了程序員精神世界的高富帥。不,我說錯了,即使是高富帥也不會有強力精神力,他也會懷疑自己,覺得自己沒錢就什麼都不是了。但總之,你遵循指南好好看書,那就會體驗「會當凌絕頂」的感覺。
首先要想學編程,選一門合適的計算機語言就十分重要了,怎麼去選擇就顯得尤為重要了,這要根據自己的興趣愛好及每個語言的特性來選擇,比如說PHP適合做web開發,易學習,易上手,非常流行的一門計算機語言了,我個人比較推薦php語言。
java可以做web開發,做安卓app開發也用的是java,在學習程度上上可能比php稍微難上手一點,不過也是沒問題的,如果對java感興趣可以嘗試一下。
python是目前比較火的一門語言了,比較適合做人工智慧領域,另外寫網路爬蟲類的程序,用python也是非常合適的了,看個人興趣來選擇了。
c,c++,c#這些語言就不推薦給了,特別是c#,已經是比較過時的一門語言了,即使學習好了,也不太適合去找工作,c與c++並不是十分適合初學者來學習,因此也是沒必要進行考慮了,還有一些更小眾的語言,更是沒有必要去考慮,因此關於語言的學習就從上面3種語言去選擇一門自己所感興趣的吧!
研發搭建環境
如果選擇好計算機語言,那麼接下來就是研發環境的搭建了,因為只有研發環境搭建好了,才可以進行後續的編程工作,比如說PHP,那麼就從網路上搜一下如何安裝PHP環境,能搜出一些簡單的教程,初學者按照教程一步一步來,頂多半天時間就可以把研發環境裝好了,如果是java,就需要先安裝jdk,進行環境變數的配置等,網上也有相關的教程,也是十分容易的,相信大家只要按照教程來做,都可以很輕易的把研發環境搭建起來的
選好視頻和書籍,輔助學習。既然是零基礎學習,就需要進行系統的學習,而不是到處網路零基礎的知識點進行學習。
代碼練習
跟隨教程一個一個章節的進行學習,需要注意的一點就是不能只是去看,那樣不行,要對每一個章節的知識點要親自用代碼敲一遍,運行一下試試效果才行,這樣才能提高自己的動手能力,才開始會覺得有一點生疏,慢慢的就會熟練起來,逐漸會增加編程的興趣。這個過程就是需要反復的進行練習,大量的代碼練習才行。這個過程是5步中最關鍵的階段了,重在代碼親自練習,對編程中有的章節不明白的地方,千萬不要放過去,可以在網上找一些相關的編程交流群,參加進去,在線上咨詢一些過來人,也許就可以輕松幫你解決疑問了,對你的學習十分幫助,並且整個過程也都是免費的。
項目實戰
如果說基礎教程都按部就班的都實踐過一遍了,那麼你就有一定的編程的基本功了,那麼自己就可以嘗試著做一些小項目,把學到的知識給串起來,進入項目實戰階段,比如說自己設計一個學生管理系統,並把它完成,如果不了解怎麼設計,可以去網上搜索。慢慢就有思路了。
我也在學習這方面,視頻書籍看過不少,最推薦的還是北京尚學堂的學習資料,Java.300集,Python400集,都是很經典的入門基礎教程,而且是結合項目學習的,很有意思,干貨滿滿,還都是免費的,推薦你可以去看看,相信可以帶你走進變成的世界。
從零開始學編程,第一關就是要選擇你所要學習的編程語言。面對著琳琅滿目的編程語言,初學者常常一籌莫展,拿不定主意,不知該選哪
9. 怎麼學習編程
1.明確學習目的 學習編程對大多數IT業人員來說都是非常有用的。學編程,做一名編程人員,從個人角度講,可以解決在軟體使用中所遇到的問題,改進現有軟體,可以為自己找到一份理想的工作添加重要得砝碼,有利於在求職道路上謀得一個好的職位;從國家的角度,可以為中國的軟體產業做出應有的貢獻,一名優秀的程序員永遠是被爭奪的對象。學晌掘習編程還能鍛煉思維,使我們的邏輯思維更加嚴密;能夠不斷享受到創新的樂趣,將一直有機會走在高科技的前沿,因為程序設計本身是一種創造性的工作。知識經濟時代給我們帶來了無限的機會,要想真正掌握計算機技術,並在IT行業里干出一番事業來,有所作為,具有一定的編程能力是一個基本條件和要求。 2.打好基礎 學編程要具備一定的基礎,總結之有以下幾方面: (1)數學基礎 從計算機發展和應用的歷史來看計算機的數學模型和體系結構等都是有數學家提出的,最早的計算機也是為數值計算而設計的。因此,要學好計算機就要有一定的數學基礎,出學者有高中水平就差不多了。 (2)邏輯思維能力的培養學程序設計要有一定的邏輯思維能力,「邏思力」的培養要長時間的實踐鍛煉。要想成為一名優秀的程序員,最重要的是掌握編程思想。要做到這一點必須在反復的實踐、觀察、分析、比較、總結中逐漸地積累。因此在學習編程過程中,我們不必等到什麼都完全明白了才去動手實踐,只要明白了大概,就要敢於自己動手去體驗。誰都有第一次。有些問題只有通過實踐後才能明白,也只有實踐才能把老師和書上的知識變成自己的,高手都是這樣成材的。 (3)選擇一種合適的入門語言 面對各種各樣的語言,應按什麼樣的順序學呢?程序設計工具不外乎如下幾類: 1)本地開發應用軟體開發的工具有:Visual Basic 、Delphi 、VC++ ( C++ Builder ) 等;資料庫開發工具有:Visual Foxpro 、Oracle Developer 、Power Builder 等。 2)跨平台開發開發工具如 Java 等。 3)網路開發對客戶端開發工具如:Java Script 等;對伺服器開發工具如:PHP 、ASP 、JSP 、ISAPI 、NSAPI 、CGI 等。以上不同的環境下幾種開發工具中 VB 法簡單並容易理解,界面設計是可設化的,易學、易用。選 VB 作為入門的方向對出學者是較為適合的。 3. 注意理解一些重要概念 一本程序設計的書看到的無非就是變數、函數、爛絕條件語句、循環語句等概念,但要真正能進行編程應用,需要深入理解這些宴歷核概念,在理解的基礎上應用,不要只簡單地學習語法、結構,而要吃透針對這些語法、結構的應用例子,做到舉一反三,觸類旁通。 4.掌握編程思想 學習一門語言或開發工具,語法結構、功能調用是次要的,最主要是學習它的思想。例如學習 VC 就要學習 Windows 的內在機理、什麼是線程......;學習 COM 就要知道 VTALBE 、類廠、介面、idl......,關鍵是學一種思想,有了思想,那麼我們就可以觸類旁通。 5.多實踐、多交流 掌握編程思想必須在編程實際工作中去實踐和體會。編程起步階段要經常自己動手設計程序,具體設計時不要拘泥於固定的思維方式,遇到問題要多想幾種解決的方案。這就要多交流,各人的思維方式不同、角度各異,各有高招,通過交流可不斷吸收別人的長處,豐富編程實踐,幫助自己提高水平。親自動手進行程序設計是創造性思維應用的體現,也是培養邏輯思維的好方法。 6.養成良好的編程習慣 編程入門不難,但入門後不斷學習是十分重要的,相對來說較為漫長。在此期間要注意養成一些良好的編程習慣。編程風格的好壞很大程度影響程序質量。良好的編程風格可以使程序結構清晰合理,且使程序代碼便於維護。如代碼的縮進編排、變數命令規則的一致性、代碼的注釋等。 7.上網學編程 在網上可以學到很多不同的編程思想、方法、經驗和技巧,有大量的工具和作品及相關的輔導材料供下載。例如網站「編程課堂」( http://best.yeah.net/ )主要以 VB 和 Delph;教學和交流為主,提供大量實用技巧;網站「現在時編程學園」( http://pshool.yeah.net/ )是專門介紹C、VC、VB、Delphi 等的綜合編程網站;網站「 VB 編程樂園 」( http://www.vbeden.com/ )提供內容豐富而且實用的編程技術文章、精選控制項、源代碼下載、計算機考試、相關軟體以及編程書籍推薦等等。 8.加強計算機理論知識的再學習 學編程是符合「理論→實踐→再理論→再實踐」的一個認識過程。一開始要具有一定的計算機理論基礎知識,包括編程所需的數學基礎知識,具備了入門的條件,就可以開始編程的實踐,從實踐中可以發現問題需要加強計算機理論知識的再學習。程序人人皆可編,但當你發現編到一定程度很難再提高的時候,就要回頭來學習一些計算機科學和數學基礎理論。學過之後,很多以前遇到的問題都會迎刃而解,使人有豁然開朗之感。因此在學習編程的過程中要不斷地針對應用中的困惑和問題深入學習數據結構、演算法、計算機原理、編譯原理、操作系統原理、軟體工程等計算機科學的理論基礎和數理邏輯、代數系統、圖論、離散數學等數學理論基礎知識。這樣經過不斷的學習,再努力地實踐,編程水平一定會不斷提高到一個新高度。
10. 求推薦一本大學Python教材
《Python編程:從入門到實踐》
2016年出版的書,基於 Python3.5 同時也兼顧 Python2.7,書中涵蓋的內容是比較精簡的,沒有艱深晦澀的概念。
每個小結都附帶練習題,它可以幫助你更快的上手編寫程序,解決實際編程問題。
上到有編程基礎的程序員,下到10歲少年,想入門Python並達到可以開發實際項目的水平,這本書都是不錯的選擇。