前言
昨晚聽了一期知乎live:如何自學(xué)計算機專業(yè)課程。
學(xué)習(xí)后發(fā)現(xiàn),里面的內(nèi)容更適合計算機專業(yè)的在校生以及計算機基礎(chǔ)較弱的小白。此外,作者推薦的一些教材倒是不錯,在此分享。
Test Post Data From PC to see whether it is auto refreshed in Mobile App.
完全可以。計算機專業(yè)是人類歷史上第一個可以通過互聯(lián)網(wǎng)學(xué)習(xí)到幾乎所有專業(yè)知識的這么一個專業(yè)。
計算機專業(yè)的自學(xué)路線圖
美國計算機學(xué)會ACM發(fā)布了《計算機科學(xué)課程體系》的報告,當(dāng)前最新版是2013年的。計算機科學(xué)被劃分為18個知識領(lǐng)域。如下:
知識的掌握程度劃分為三級:
雖然計算機科學(xué)被劃分為18個領(lǐng)域,但是這18個領(lǐng)域有著緊密的聯(lián)系,構(gòu)成了知識之網(wǎng)。這是我們的核心任務(wù)。
學(xué)計算機的目的:
掌握上層應(yīng)用的開發(fā),為了能夠在IT公司找一份工作。是以就業(yè)為目的的自學(xué)。
以考試為目的的自學(xué)
為了解決工作中遇到的特定問題,提升專業(yè)技能,升職加薪。以個人的職業(yè)發(fā)展為目的。
對于小白而言,首先要對計算機科學(xué)和計算機產(chǎn)業(yè)形成整體的認(rèn)識。這方面可以讀導(dǎo)論或者科普讀物。建議先讀吳軍博士的《浪潮之巔》。這本書講IT產(chǎn)業(yè)非常精彩。
緊接著,要做兩件事:(1)掌握一門編程語言;(2)學(xué)好數(shù)學(xué)。這兩者是并行的。
(1)掌握一門編程語言:
第一種:C是一種結(jié)構(gòu)化的編程語言。如果不會C,后面的課程根本學(xué)不下去。
第二種:Java是一種典型的面向?qū)ο蟮恼Z言。Java有活躍的社區(qū)和數(shù)之不盡的開源項目。
第三種:JavaScript 或者Python。這兩個語言都是屬于動態(tài)編程語言的范疇,應(yīng)用極為廣泛。JavaScript是全世界使用人數(shù)最多的一種語言,并且JS的各種框架層出不窮,進步飛快,業(yè)界的工作機會眾多,對找工作是非常有幫助的。但實話實說,JS在計算機專業(yè)課程中用的并不多。Python卻不同,它被國內(nèi)外的很多大學(xué)選為新生的第一門語言。尤其是在這個大數(shù)據(jù)時代,Python真是火爆。
上面這四種語言,是學(xué)軟件開發(fā)必須要掌握的,從任何一個語言開始學(xué)起都可以。
(2)對于數(shù)學(xué),我們必須掌握四門課程:
- 高等數(shù)學(xué)
- 離散數(shù)學(xué)
- 線性代數(shù)
- 概率論與數(shù)理統(tǒng)計
在掌握了編程語言,用編程語言寫了一些應(yīng)用程序之后,又學(xué)習(xí)了一些數(shù)學(xué)之后,你就可以進入計算機專業(yè)基礎(chǔ)課程的學(xué)習(xí)。這些課程構(gòu)成了計算機的核心課程群,我們通常把它稱為「專業(yè)基礎(chǔ)課」。專業(yè)基礎(chǔ)課有十多門,其中最重要的是四門如下(這四個課程也是考研科目):
- 數(shù)據(jù)結(jié)構(gòu)與算法
- 計算機組成原理
- 操作系統(tǒng)
- 計算機網(wǎng)絡(luò)
除此之外,計算機基礎(chǔ)課還包括:
- 編譯原理
- 面向?qū)ο蟮姆椒?/li>
- 關(guān)系數(shù)據(jù)庫的理論
- 軟件工程等等
這次我們就只針對那四個考研科目進行介紹。
這里我要強調(diào)的是:計算機專業(yè)基礎(chǔ)課程的學(xué)習(xí),和我們在工作中實用技術(shù)的學(xué)習(xí),這兩者不是相互矛盾的,而是相互促進的。比如計算機網(wǎng)絡(luò)課程,對web開發(fā)框架有幫助;反過來,如果寫了web框架,就能更深刻的理解計算機網(wǎng)絡(luò)這門課程。
在完成專業(yè)基礎(chǔ)課和實用技術(shù)的學(xué)習(xí)之后,就進入了一個新的自學(xué)階段。這個階段可以針對你感興趣的特定領(lǐng)域深入鉆研了。比如你對人工智能感興趣,那可以學(xué)一下機器學(xué)習(xí)、spark等等。這個時候的學(xué)習(xí)目的非常明確,即:培養(yǎng)特定領(lǐng)域的專業(yè)技能,讓你成為特定領(lǐng)域的專家。
自學(xué)效果的好壞高度依賴于個人的學(xué)習(xí)動機,以及自學(xué)過程中采用的方式、方法、策略。要想取得好的學(xué)習(xí)效果,了解一些學(xué)習(xí)理論是非常重要的,這里推薦一本書叫《學(xué)習(xí)之道》。書中介紹了很多學(xué)習(xí)有關(guān)的新成果。
選書和看書的基本原則
當(dāng)某人告訴你,某書是某領(lǐng)域最好的書籍,不要盲目相信,要經(jīng)過自己親自試驗再下結(jié)論。通常情況下,一本別人眼中的好書,可能的確質(zhì)量很高,但如果閱讀它超過了你的能力,那對于你而言,它就不是一本好書,因為你不具備所需要的背景知識,和相關(guān)的技術(shù)經(jīng)驗。
第二個原則是,選擇那些你已經(jīng)具備讀懂前提的書。
閱讀科普書籍的最主要目的是:了解特定領(lǐng)域的背景知識、明了這個領(lǐng)域的基本數(shù)據(jù)和概念,建立全局觀。
讀者:多讀幾遍真的很重要,我在看js的時候,把廖雪峰的教程看了好多遍,敲了好多遍。
上圖是計算機網(wǎng)絡(luò)的經(jīng)典教材。我們拿著兩本書來舉例。
比如《計算機網(wǎng)絡(luò):系統(tǒng)方法》這本書,作者在前言中就很明確地說明,它是針對網(wǎng)絡(luò)設(shè)計者寫的。注意是網(wǎng)絡(luò)設(shè)計者,不是網(wǎng)絡(luò)應(yīng)用開發(fā)者。這本書講的是計算機網(wǎng)絡(luò)的基本原理。介紹的是最初的設(shè)計者遇到了什么問題。
讀第一遍時,第一章一定要認(rèn)真閱讀,包含了很多的術(shù)語。
讀第二遍時,每章的開頭很重要。
比如《計算機網(wǎng)絡(luò):系統(tǒng)方法》這本書,里面講到的網(wǎng)絡(luò)安全這一章,如果你當(dāng)前還沒有涉及到這一塊兒,這一遍就可以跳過。但是有關(guān)PCP協(xié)議的內(nèi)容,在實際開發(fā)中用的很多,就很重要,這些內(nèi)容分布于書中的各個章節(jié),這就需要你把它們抽取出來。
比如上面的這本《離散數(shù)學(xué)》,一頁紙就要啃兩個小時。
與書籍相比,視頻的優(yōu)點是很獨特的,特別適合展示動的過程,比如程序的調(diào)試過程、算法的運行步驟等。
有很多編程工作屬于工程領(lǐng)域,按部就班,有很多現(xiàn)成的套路,創(chuàng)造性并不強,數(shù)學(xué)在這些項目中并非成敗的關(guān)鍵因素。項目中,確實有算法在底層做支撐,但這算法往往都有現(xiàn)成的底層庫。你只需要知道如何調(diào)用就行,并不需要理解算法的細(xì)節(jié),并需要具備多深的數(shù)學(xué)功底。對于初級程序員來說,主要干的是搬磚的活兒,特別是CRUD類的代碼。
同濟的《高等數(shù)學(xué)》教材還是不錯的,但是國內(nèi)數(shù)學(xué)教材有個最大的問題就是:往往只講法則、定理、證明、習(xí)題,不講數(shù)學(xué)的發(fā)展歷史、具體應(yīng)用、也不強調(diào)解決特定問題的思路,不適合自學(xué)。
普林斯頓的《微積分讀本》,最大的特點是,講的很細(xì),采用內(nèi)心獨白的方式介紹微積分,有高中基礎(chǔ)即可。內(nèi)容雖然沒有同濟的多和深,但學(xué)習(xí)計算機來說,也基本夠用了。
讀者:這里也給大家推薦本冷門數(shù)學(xué)書,名字叫考研數(shù)學(xué)三部曲,銷量很少。因為這本書優(yōu)點是由淺入深,缺點是又臭又長,適合文科生看。
《計算機科學(xué)概論》起到的是建立全局觀的作用。
讀者:想從Python 入門的同學(xué),也推薦Headfirst Python。整個headfirst 系列都推薦。
讀者:headfirst真的很不錯,同推薦,特別設(shè)計模式。
《深入理解計算機系統(tǒng)》這本書,對于形成計算機系統(tǒng)的全局觀非常有用。這本書簡稱為CSAPP,很有名。這本是最大的特點是從使用者,而不是從設(shè)計者的角度來組織材料的,難度適中,文字流暢。但這本書不適合零基礎(chǔ)入門,你至少應(yīng)該首先學(xué)過計算機導(dǎo)論,并且有一定的C語言開發(fā)經(jīng)驗,會用Linux。
讀者:CSAPP看的時候要動C語言并且要看計算機專業(yè)導(dǎo)論,不然看不懂的。
考研的四門課
下面介紹計算機專業(yè)的幾門骨干和和核心課程。同時也是考研的四門課程:數(shù)據(jù)結(jié)構(gòu)與算法、計算機網(wǎng)絡(luò)、操作系統(tǒng)、計算機組成原理。
(1)數(shù)據(jù)結(jié)構(gòu):
上圖中,數(shù)據(jù)結(jié)構(gòu)與算法包括了兩部分內(nèi)容。
現(xiàn)在的大數(shù)據(jù)和人工智能,完全就是算法。
上圖中,第一本書有兩個版本:java版本和C語言版本,難度適中。后兩本書,較難。
對于多數(shù)人來說,掌握算法,只需要知道算法的思想、應(yīng)用場景和優(yōu)缺點就可以。實際開發(fā)中,你要設(shè)計新算法的機會并不多,并且那些應(yīng)用很廣的算法,都已經(jīng)在框架里提供了現(xiàn)成的組件。這些組建內(nèi)部已經(jīng)實現(xiàn)了算法,你只需要知道是怎么回事,會調(diào)用就可以了。比如說加密和解密的算法。
考研和大公司面試,也不會考到復(fù)雜的算法,準(zhǔn)備前多刷幾遍即可。
(2)計算機組成原理:
計算機組成原理主要是介紹計算機由哪些部件組成的,這些部件是如何互相協(xié)作、完成處理功能、同時用來滿足各種成本和功耗指標(biāo)的。
學(xué)習(xí)這門課程之前,通常需要學(xué)習(xí)數(shù)字電路基礎(chǔ)。
學(xué)完計算機組成原理之后,再去學(xué)操作系統(tǒng)和編譯原理。
學(xué)習(xí)計算機組成原理之前,建議大家先看《編碼》這本書。
(3)操作系統(tǒng):
上圖中,操作系統(tǒng)的書分為兩類:教材和專著。
操作系統(tǒng)的教材里,數(shù)學(xué)公式不多,但它并不是說操作系統(tǒng)者這門課就很容易學(xué),學(xué)好操作系統(tǒng)的關(guān)鍵是一定要把它和軟件開發(fā)、動手實踐結(jié)合起來。
很多操作系統(tǒng)都是用C語言寫的,建議大家在學(xué)習(xí)操作系統(tǒng)之前,先學(xué)習(xí)C語言。
學(xué)習(xí)操作系統(tǒng),最重要的是明白操作系統(tǒng)的內(nèi)部機理。推薦大家實用C語言在Linux下學(xué)習(xí)。
進程和線程也是屬于操作系統(tǒng)的范疇。
讀者:補一個金老師的網(wǎng)易云課堂:http://mooc.study.163.com/u/8050019871#/c
(4)計算機網(wǎng)絡(luò)
我推薦大家實用C、java、Phthon這三種語言去編寫網(wǎng)絡(luò)應(yīng)用程序。
另外必須要學(xué)會操作系統(tǒng)。網(wǎng)路協(xié)議棧通常都是由操作系統(tǒng)來負(fù)責(zé)實現(xiàn)的,網(wǎng)絡(luò)應(yīng)用基本都是多線程的。
上圖中這里介紹了三本經(jīng)典書籍。計算機網(wǎng)絡(luò)中一個重要的特點是分層。我們會發(fā)現(xiàn)這三個經(jīng)典教材是三個視角。
- 第一本:從上層協(xié)議介紹到下層協(xié)議。
- 第二本:從頂向上介紹。
- 第三本:橫切的方式,針對特定的問題(比如安全問題、性能問題)來展開介紹。
學(xué)習(xí)計算機網(wǎng)絡(luò)的關(guān)鍵,是明白上面這三個問題。
一旦了解了計算機網(wǎng)絡(luò)的這些基本原理,你就會發(fā)現(xiàn),理解實際開發(fā)中的各種通信協(xié)議和各種網(wǎng)絡(luò)庫,就會比較容易。
掌握好相應(yīng)的網(wǎng)路協(xié)議,是掌握上層應(yīng)用軟件開發(fā)技術(shù)的關(guān)鍵。比如,如果連http協(xié)議都沒掌握,就去寫web應(yīng)用, 好比在沙灘上蓋樓。
讀者:對于很多朋友,你提的問題,其實更多的需要從自己自身出發(fā),沒有一個完全標(biāo)準(zhǔn)的答案,再你問問題之前,自己先思考一分鐘。
其他
本次Live介紹的是如何自學(xué)計算機科學(xué)理論知識,第二場Live——“如何自學(xué)編程”:https://www.zhihu.com/lives/860490807847841792
第二場live介紹了如何訓(xùn)練編程技能。
第三場Live——“如何自學(xué)Java:入門與編程技能訓(xùn)練”:https://www.zhihu.com/lives/889495940065538048
第三場live是第二場Live所介紹之自學(xué)編程基本原則與方法的踐行篇,同時也展示了計算機科學(xué)理論學(xué)習(xí)是如何與具體的編程技術(shù)(以Java技術(shù)領(lǐng)域為例)學(xué)習(xí)以及軟件開發(fā)實踐相輔相成的。
https://www.zhihu.com/lives/860490807847841792
https://www.zhihu.com/lives/889495940065538048
2017年12月21日舉辦Live,如何高效地掌握Android開發(fā)技術(shù):https://www.zhihu.com/lives/916265051361529856