如何系統(tǒng)有效的學(xué)習(xí)編程知識
一開始接觸編程的學(xué)習(xí),猶豫不知道怎么學(xué)習(xí),容易使人喪失興趣,為此,以下是學(xué)習(xí)啦小編分享給大家的系統(tǒng)有效的學(xué)習(xí)編程知識的方法,希望可以幫到你!
系統(tǒng)有效的學(xué)習(xí)編程知識的方法
一、基礎(chǔ)篇(理論與硬件)
這一部分關(guān)注的是計算機的基本理論與基本實現(xiàn)。包括硬件結(jié)構(gòu)理論,以及軟件與硬件的交互。以理論開篇,在機器語言部分深入,最終在操作系統(tǒng)部分達到高潮。
1、計算機實現(xiàn)計算的原理。這包括門電路是如何實現(xiàn)計算的,時序電路是如何實現(xiàn)存儲的,馮諾依曼體系結(jié)構(gòu)是如何將二者結(jié)合實現(xiàn)了真正的現(xiàn)實世界的計算機的,以及它是如何反映圖靈機這一理論計算模型的。其間會學(xué)習(xí)布爾邏輯。
2、如何控制計算機硬件。這部分使用的“工具”就是機器語言和匯編語言。我們需要理解機器語言的本質(zhì),以及它如何以“匯編語言”這種更容易理解的形式為程序員提供了控制硬件設(shè)備的機會。這部分可以學(xué)習(xí)到很多非常低級但是本質(zhì)的內(nèi)容。
3、操作系統(tǒng)是如何工作的。如果你理解了上一部分的計算機硬件相關(guān)的問題,那么理解操作系統(tǒng)的工作原理將不會那么困難。另外你將明白操作系統(tǒng)作為硬件和上層軟件的中間層次,是如何大大簡化了人們對硬件的操作過程的。
二、進階篇(軟件系統(tǒng))
1、編程語言。這包括結(jié)構(gòu)化編程語言以及面向?qū)ο缶幊陶Z言。因為有很多選擇,其實以一門語言開始即可,如果你在前面正確的理解了硬件與機器語言,那么C語言入門真是太簡單了,如果你運氣不好,覺得C很困難,那么即使是從Python、Javascript開始學(xué)習(xí)也沒問題。重點在于理解編程中和語法相關(guān)的基本概念,并了解一些簡單的算法知識。
2、數(shù)據(jù)結(jié)構(gòu)與算法。說白了就是如何合理的組織數(shù)據(jù),通過其結(jié)構(gòu)特點來簡化編程或者提高計算的效率。這里的內(nèi)容是模式化的,所有人都需要學(xué)習(xí)無序結(jié)構(gòu)、有序線性結(jié)構(gòu)、樹結(jié)構(gòu)、圖結(jié)構(gòu)等。另外,排序算法、查找算法必須學(xué)好,特別是算法策略如遞推、遞歸、蠻力(窮舉)、分治、動態(tài)規(guī)劃等也必須有所實踐和了解。切記不必深陷其中,這里是個大坑,你不可能真的“精通”他們。
3、編程語言是如何實現(xiàn)的。這里主要涉及編譯原理。當(dāng)你站在高級編程語言實現(xiàn)者的角度再來認識編程語言本身的時候,許多問題豁然開朗。這會深刻的改變你的編程觀。可惜的是即使是很好的學(xué)生在這里也會遇到很大的阻力。真正的問題不是這方面理論性有多強,而是教材都很爛——包括國外教材(什么龍書虎書鯨書都根本不是為初學(xué)者準備的),而且語焉不詳。這導(dǎo)致大部分人都感覺莫名其妙高深莫測。如果你不是有志攀登軟件設(shè)計的最高峰,可以繞行。否則從表達式運算解析開始,逐步引入變量,類型,控制結(jié)構(gòu),函數(shù),再到對象,一步步構(gòu)建出解析器,然后結(jié)合前面學(xué)習(xí)的硬件接口知識,將其轉(zhuǎn)換為低級表示,最后你會發(fā)現(xiàn)沒有那么可怕。
三、基礎(chǔ)領(lǐng)域篇(必備領(lǐng)域知識)
1、互聯(lián)網(wǎng)絡(luò)是如何構(gòu)成的。這部分包括網(wǎng)絡(luò)的基本知識,主機間通信的原理,轉(zhuǎn)發(fā)設(shè)備的實現(xiàn),以及互聯(lián)網(wǎng)絡(luò)的構(gòu)成。這是網(wǎng)絡(luò)編程所需的基礎(chǔ)知識。除了理解低級協(xié)議,也要花一些時間了解應(yīng)用層的協(xié)議,特別是 SMTP、POP3、FTP、HTTP 等,重點是了解他們的基本原理,而不是每個細節(jié)。因為每個協(xié)議都有自己的標準,光 HTTP 協(xié)議就夠你研究 6 個月以上了。這里注重的是原理。
2、如何管理大量的數(shù)據(jù)并在其上建立信息系統(tǒng)。數(shù)據(jù)庫是一個很好的例子。包括數(shù)據(jù)庫系統(tǒng)的基本理論,實現(xiàn)原理,以及設(shè)計原則。同樣,這里不是真的在教你如何構(gòu)建一個數(shù)據(jù)庫系統(tǒng),而是在學(xué)習(xí)他的核心原則,重點是學(xué)會如何合理的設(shè)計表結(jié)構(gòu),以及實現(xiàn)效率良好的SQL查詢語句。
四、擴展領(lǐng)域篇(特定領(lǐng)域知識)
1、基于特定平臺的軟件開發(fā)。如何在Windows平臺、Linux平臺、Mac OS平臺或者手機、平板、電視機、微波爐上完成開發(fā)?這需要學(xué)習(xí)特定的軟件平臺提供了哪些編程接口,如何編譯并部署,如何調(diào)試和測試等知識。這部分就是軟件工程師職業(yè)生涯中最耗費時間的部分。
2、有效的軟件研發(fā)是如何實現(xiàn)的。這包括軟件結(jié)構(gòu)的設(shè)計知識,軟件實施流程的管理知識,以及一些細微而繁雜的內(nèi)容。人們通常用軟件工程一詞來概括。但事實上軟件工程站的角度要更高一些,這里只是涵蓋軟件工程的一小部分。
五、科技領(lǐng)域篇(研究性知識)
如果你對人工智能、科學(xué)計算、圖像處理感興趣,這里還有大片的區(qū)域等待你探索。
事實上,上面的描述有些嚇人。每一個領(lǐng)域都夠耗盡去很長的時間。不過好消息是大部分知識都只要求在理論上理解。真正的耗費時間的部分還是在與編程、編程、編程。不是每個人都會用到數(shù)據(jù)庫系統(tǒng),也不是每個人都需要懂得匯編語言。但是這些背景知識會對你有幫助。讓你不再害怕,對自己更有自信。
如果你希望自己成為一個很棒的開發(fā)人員,那么上述知識都是必須的。但是卻依然遠遠不夠。
學(xué)無止境,計算機科學(xué)尤其如此。
我說的實在太多了。思考和打字差不多耗費了我一個小時。我不太確定這些對你是否有幫助。我希望有,至少有那么一些。但我有點害怕,似乎我的描述不是在幫助你克服困難,而是制造了更多看似難以逾越的高山。
但我想說:走入編程,然后走出編程。編程是為解決問題服務(wù)的,我們應(yīng)當(dāng)多思考想要解決的問題是什么。這會在我們迷茫的編程生涯中起到指南針的作用。它會告訴我們需要學(xué)習(xí)什么,然后由我們自己來回答如何學(xué)習(xí)。
我的一位朋友是做生物科技的,他需要在海量的DNA序列里快速的進行基因片段的比較。為了完成這一任務(wù),他學(xué)習(xí)了 Python,并著重學(xué)習(xí)了數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的內(nèi)容。雖然最后他寫出來的程序外表看起來很簡單,但是卻速度飛快,為他的事業(yè)貢獻了無形的資產(chǎn)。
這就是他的起點。但是他并不滿足。他繼續(xù)學(xué)習(xí)如何增強程序的穩(wěn)定性,如何編寫更好的界面等等。現(xiàn)在他的軟件真的非常棒,一些關(guān)鍵的效率相關(guān)部分已經(jīng)替換為C++實現(xiàn),界面也做得很專業(yè)。
天啊,真的無法相信,這就是一位生物領(lǐng)域的研究人員自己親力親為的成果。即使是用苛刻的眼光來看,現(xiàn)在他的軟件也相當(dāng)不錯。
我舉這個例子,想說明的核心在于,知識的學(xué)習(xí),要想高效,一個廣為大眾所接受的觀點就是應(yīng)當(dāng)圍繞一定的具體的目標來進行。如果我們知道我們想要解決的問題是什么,那么我們進一步確定要學(xué)習(xí)哪些編程知識就會比較容易。相反,為了學(xué)而學(xué),泛泛而看,效果通常都是很差的。只能給你留下一些大致的印象,而無法成為你真正的可用的知識。
學(xué)習(xí)編程知識的建議
先有一個想法,像學(xué)鋼琴也有一開始想彈奏的曲子,提出一個想用生產(chǎn)出來的產(chǎn)品,或者買一本評價好的入門書,做出書中提出的“產(chǎn)品”為目標
將這個目標細化,可以找專業(yè)人士幫忙,梳理出知識的“切入點”以及周圍的“關(guān)聯(lián)點”,然后開始計劃第一次迭代(做出第一樣?xùn)|西),可以是一段很短的程序或者一個作品,但必須有具體的產(chǎn)出
每次產(chǎn)出后都重新調(diào)整計劃,重要的是自己或者專業(yè)人士要能具體地評估這次產(chǎn)出的價值。如果是跟著書就自然容易了,就是跟書上對一下就是了
如果要具體給到一個切入點,那么我的建議是兩個選擇:
從C語言開始,然后學(xué)習(xí)算法,走科班路線
從網(wǎng)頁制作開始,然后學(xué)習(xí)網(wǎng)站工程,走產(chǎn)品路線,這是產(chǎn)品中最好入門的了
不必太擔(dān)心學(xué)錯,因為到達工程級別,你學(xué)過的八成知識都不會被作為工具使用,而它們的只是實現(xiàn)了它們的歷史使命——成為你現(xiàn)有某個實用知識的中間點/橋梁、為你現(xiàn)在的學(xué)習(xí)效率做了一次鋪墊。
實際一點地說,對于一個“畢業(yè)了”的程序員,學(xué)習(xí)一門新的編程語言,可能只需一周,而熟悉需要三周,熟練地用于開發(fā)是三個月,精通只需一年。這也是大概而已,嚴謹?shù)卣f,不同的語言所關(guān)聯(lián)的知識點的數(shù)量是不一樣的。這也不影響舉例,因為在這之前,一個大學(xué)生在學(xué)習(xí)他們的第一門語言,通常是C/C++,用了一個學(xué)期,還可能掛科呢(那是態(tài)度問題或者是Dota的問題)。
首先吧,別想速成。這要能速成,那么我們專業(yè)人士不就該喝西北風(fēng)去了?
所以要真解決了學(xué)習(xí)范圍的問題后,你下一個問題應(yīng)該是“要實現(xiàn)**應(yīng)該具備那些知識”一類的了。等你在某個點扎根后,想的就是利用這個學(xué)習(xí)能力,去另一個自己更喜歡的領(lǐng)域,還是就此為據(jù)點擴充范圍,亦或者深入這個領(lǐng)域(也是擴充的一種吧,方向不同)。
最后重申的一點,就是軟件開發(fā)本身就是一個學(xué)習(xí)的過程,只是產(chǎn)出的代碼具備不同的價值而已。軟件的特殊性已經(jīng)導(dǎo)致了難以重復(fù)地寫出兩段相同的代碼,一般只會改寫重寫,或者重用原來的代碼(就是復(fù)制黏貼或者引用調(diào)用)。
編程這個領(lǐng)域的知識是怎么樣的
然后要延伸一下時代問題。
從面向?qū)ο箝_始,互聯(lián)網(wǎng)時代興起,到現(xiàn)在的移動互聯(lián)網(wǎng)時代,編程絕大部分的目的是在于創(chuàng)造“軟件”,而創(chuàng)造軟件也由于世界上最聰明的人群高速集中涌入,以及時代的需求壓力,已經(jīng)形成了一整套工程學(xué),也就是“軟件工程”了。
現(xiàn)在“編程”被集中在“軟件工程”的需求中,產(chǎn)生的一個結(jié)果就是“工程化”,而“工程化”就是整個生產(chǎn)體系開始逐步分化以及逐步專業(yè)化,從而出現(xiàn)了這個領(lǐng)域中的各種針對性專業(yè),比如“前端工程師”、“測試工程師”、“算法分析師”、“.NET軟件工程師”。
在整個軟件的開發(fā)周期中,我們都需要跟不同的人在不同程度的合作。即使是個人開發(fā)者,都會用到開源的代碼、各種下載的人家做好的工具。
這就是工程化后的結(jié)果,也就是“編程”被和其他不同的專業(yè),比如數(shù)學(xué)、醫(yī)學(xué)、建筑、人文等科學(xué)結(jié)合在一起然后具體地分化成了各個關(guān)聯(lián)的模塊。這些模塊有一個特點,就是整體上“臨近相連”。
這什么意思呢?
舉例說明就是,但從(某個)網(wǎng)站開發(fā)而言,就有客戶、老板、美工、前端工程師、服務(wù)端工程師、數(shù)據(jù)庫管理員、網(wǎng)絡(luò)推廣等等。這些角色兩兩間可能有工作上的直接關(guān)聯(lián),單指這個軟件項目的開發(fā)工作的話。
無論哪個是因,哪個是果,現(xiàn)在的情況都是沒兩個角色間的知識必定關(guān)聯(lián)和有交集。在往廣度上看,整個軟件工程領(lǐng)域以及世界都如此,只是軟件工程領(lǐng)域如建筑領(lǐng)域一般,有比較大的定量的專業(yè)化,一切都是有根據(jù)有標準的。
而至此,形成的一個結(jié)果就是,沒有人能掌握所有知識;所有知識都是有關(guān)聯(lián)的,追尋著關(guān)聯(lián)的路徑學(xué)習(xí)產(chǎn)生的效果普遍情況下是最大的。
后面那條可以簡單地證明,假設(shè)兩樣知識八竿子打不著,那么你就要等很久它們才能連起來,發(fā)揮加成效用。雖然喬幫主說過,總有一天這些dots總會連起來的,但是嘛......靠譜點也不是不好。
猜你喜歡: