大學理科生零基礎自學計算機和編程有哪些書籍和方法比較好?

計算機小白盲一枚,想要從零起步。。不知道方向,雖說多讀書少看知乎,,可是我確實讀書都不知道讀什麼書?方向都沒有。。。。


先介紹一下個人背景,希望能引起提問者的共鳴,再介紹一下我的方法和看法。

我自己從高中就是選的文科方向,很早就不學理科的東西了,數學也很差。大學選的是國際政治方向,但是從大學第一年結束開始就自學計算機,現在正在卡內基梅隆讀計算機碩士,上一個暑假去谷歌總部實習了三個月,最近簽了Airbnb,畢業後去做軟體工程師。

算起來我從輸出第一個Hello world開始,這已經是第五個年頭學習計算機了。剛開始的兩年,我基本都靠自學,走了很多很多很多彎路,如果當時能有一個有相似背景,特別是自身連數理基礎都很薄弱的人給我講解一下學習的路徑,我就能少走很多彎路,計算機基礎想必也比現在紮實。沒有良好的指導,導致到現在,即便我已經有能力直接進入業界工作,我依然有某些薄弱地方。

--------------------------------------幸福的分割線------------------------------------------

答主說從零起步,自學計算機,但是沒有交代清楚自己的心態。

心態有兩種:

第一種,是感覺一些計算機的東西特別厲害,比如為啥百度就能搜索東西,怎麼寫一個Windows操作系統,語音識別的技術感覺很厲害,想自己也做做看。這種心態,比較適合大量的上Coursera的課和看各種30天自製XXX系列書籍。Coursera上的計算機相關課程的內容都比較淺,適合基於興趣的學習者。30天自製XXX系列書籍也比較適合快速出成果,過一把癮。這方面我就不展開了。

第二種,是想在計算機專業上有所發展,想在計算機或者互聯網行業以技術人員的角色工作,甚至干出一番事業的心態。我主要分享一下基於第二種心態的科學的學習方法和過程。

--------------------------------------幸福的分割線------------------------------------------

首先,對於下面介紹的學習步驟,對於每一步,如果學校計算機專業有對應的課程,建議蹭課或者修一個雙專業。學習內容的來源多樣化是好事情。另外,如果能找到MIT/Stanford/CMU的對應的課程材料,建議跟課程材料而不是只看書。

第一階段

Coursera/Udacity/Edx等MOOC網站上選擇一門CS101的課程來上,好好的做編程作業。

例如:

https://www.coursera.org/course/cs101

Introduction to Computer Science and Programming Using Python

https://www.udacity.com/courses/cs101

這一階段主要是初步了解計算機科學,看看是否有興趣繼續鑽研。如果這一階段如果你學不下去,大可以不必繼續花時間自學了。

cs101通常會有一系列小的編程作業,學完後至少能學會一種編程語言。

第二階段

獲得對計算機科學的一個初步認識之後,就可以開始學習計算機科學的初級基礎知識了。我個人覺得這一階段應該學習以下三門課/三個方向。對於每一項,列舉的材料至少看一種,相互參照全部看最好。

1. 初步理解計算機系統

15-213 (18-213/15-513): Introduction to Computer Systems (卡內基梅隆大學二年級學生專業課,精華在編程作業。所有作業都有本地測試代碼,自己單獨做沒有問題)

深入理解計算機系統(原書第2版) (豆瓣)

Computer Systems (豆瓣) 上面那本書的英文版

這個系列編程語言語言是C。內容涉及諸如計算機的數值表示,多線程和並發,基本的操作系統知識等等。

2. 如何構建相對複雜的軟體系統,面向對象和軟體設計

CMU 15-214: Principles of Software System Construction

MIT Elements of Software Construction

...

....

..

這方面東西也很多,找到一個相似的材料完整的過一遍即可。

如果跟了我列舉的這門課,需要學會用Java,跟完後可以學會設計模式,設計思想,面向對象等構建較大的軟體的基本知識,已經積累大量的編程經驗。

3. 基本數據結構和初級演算法

例如: 15-121 Data Structures in Java

這方面的書實在是太多了,你搜一下就有很多經典材料/課程的推薦了。我個人不建議現在就上手大名鼎鼎的 演算法導論(原書第2版) (豆瓣)(英文版叫做&

我覺得這三個部分是第二個步驟的全部了。同樣,如果看著看著沒了興趣,不建議繼續下一步了,不需要浪費時間繼續自學了。但是,如果看著還是很有興趣,但是有些地方理解的不透徹,沒關係,這種情況還是可以跳到下一步的。計算機科學很多地方都是初級知識的重複或者變形,繼續學習後面的知識,會不斷涉及當前的基礎知識的。學著學著就融會貫通了。

第三階段

這一階段開始學習計算機科學的高級基礎知識了。

對我來說,高級基礎知識只有兩塊,操作系統(Operating Systems)和演算法和高級數據結構(Algorithms and Advanced Data Structure).

操作系統,可以跟MIT的操作系統課: 6.828 / Fall 2014

跟完之後可以寫出一個能跑的小kernel。

演算法和高級數據結構:

首選演算法導論(原書第2版) (豆瓣)

MIT Advanced Data Structures (6.851)

同樣,這兩個領域的材料很多,善用搜索引擎去找。

第四階段

這一階段內容非常的多,都是計算機科學或者軟體工程的不同專業方向(Domain Knowledge)。

我這裡指的都是入門/導論級別的知識

資料庫應用

網路應用開發

手機應用開發

計算機網路

並行計算

機器學習/數據挖掘/人工智慧

搜索引擎

自然語言處理

計算機安全

編譯器

分散式系統

...

...

...

這裡東西很多了,建議選擇3到5個領域,尋找合適的材料去學習。太多了我就不羅列了,真有需要可以私信我。

任何人完成了前四個階段,我個人認為就已經至少具備了計算機專業本科生(CS Major)的平均水平。 真正的計算機專業學生上的課比上面的我說的多,但是很多並不是必須的,並不影響進入業界工作。

第五階段

這一階段可以系統性,深入的的學習各種領域的東西了,例如

如何實現一個嚴肅的關係型資料庫?(Advanced Database Systems)

分散式領域的經典理論,問題和挑戰有哪些?(Advanced Distributed Systems)

常見大數據系統的優劣?(Big Data Systems)

編譯器如何優化?(Compiler)

如何實現一個嚴肅的操作系統?(Operating Systems)

容錯的分散式系統 (Fault-tolerant Distributed Systems)

各種機器學習 (Machine Learning for Text Mining, Multimedia Machine Learning, Scalable Machine Learning, etc.)

存儲系統 (Storage Systems)

信息檢索 (Information Retrieval)

...

...

...

這一階段適合去讀一個計算機碩士/博士,或者在業界積累一定的工作經驗後進行研究,材料也是有很多,歡迎私信交流。

--------------------------------------幸福的分割線------------------------------------------

當時我開始自學的時候,舉步維艱。自身基礎實在是太薄弱了,也以為學習計算機科學就是學習編程語言。花了太多的時間一本一本的看C/C++/JAVA/Python的書籍,浪費了大量的時間。

手頭還有很多事情要做,但是看到這個問題情不自禁的停下來,花了一個多小時來寫。主要就是希望能幫助提問者或者需要這方面經驗的人。非科班的人學習計算機專業比較艱難,一方面要應付當前的專業/工作,一方面又缺乏氛圍,環境和資源,比較容易半途而廢。也許提問者自己最後也會不了了之,但是如果有人看了我的答案,真的獲得了幫助,堅持下來,我的付出也就沒有白費。

當初起步的時候,太艱難了。


網站推薦

  • 國外編程學習網站(英文講解):

http://coursera.com

http://udacity.com

http://codecademy.com

http://github.com

http://youtube.com

  • 國內編程學習網站(中文講解)

網易雲課堂:http://study.163.com

極客學院:http://jikexueyuan.com

九章演算法:http://jiuzhang.com

慕課網:http://imooc.com

書籍推薦

  • Algorithm Design (豆瓣)

  • The Algorithm Design Manual, 作者還放出了自己上課的視頻和slides - Skiena"s Audio Lectures,The Algorithm Design Manual (豆瓣)
  • Cracking The Coding Interview. 著名的CC150,Google, Mircosoft, LinkedIn 前HR離職之後寫的書,從很全面的角度剖析了面試的各個環節和題目。之所以叫CC150就是有150道面試題,除了演算法數據結構等題以外,還包含OO Design, Database, System Design, Brain Teaser等類型的題目。準備北美面試的同學一定要看。

  • 劍指Offer。英文版叫Coding Interviews. 作者是何海濤(Harry He)。Amazon上可以買到。有大概50多題,題目的分析比較全面,會從面試官的角度給出很多的建議和show各種坑。

  • 進軍矽谷 -- 程序員面試揭秘。有差不多150題。

在線OJ及部分題解

  • LintCode - Home 專門提供面試題在線評測的OJ,篩選比較方便,還可以在source處選擇cc150或者其他來源的題,有階梯訓練系統,不用擔心不知道從哪兒開始刷題。目前會根據系統locale選擇中文或者英文,評判時也比leetcode快,總之是比較贊啦。

  • LeetCode Online Judge 找工作方面非常出名的一個OJ,相應的題解非常多

  • soulmachine/leetcode含C++和Java兩個版本的題解
  • LeetCode / LintCode 答案查詢上面的題解是專業老師提供的,代碼質量很不錯。

網站推薦

  • http://GeeksforGeeks.org 非常著名的漏題網站之一。上面會時不時的有各種公司的面試真題漏出。有一些題也會有解法分析。

  • http://CareerCup.com CC150作者搞的網站,也是著名的漏題網站之一。大家會在上面討論各個公司的面試題。

  • http://Glassdoor.com 一個給公司打分的網站,類似yelp的公司版。會有一些人在上面討論面試題,適合你在面某個公司的時候專門去看一下。

  • http://themianjing.com 面經網。應該是個人經營的一個積累面經的網站。面經來源主要是一畝三分地,mitbbs之類的地方。

  • http://mitbbs.com jobhunting版。北美華人找工作必上。


這種問題知乎上一堆一堆的,學會搜索信息是你成為程序員的第一步

給你隨便貼幾個

編程學習 - 話題精華

你是如何自學 Python 的? - 調查類問題

對你影響最深的編程書籍是哪一本? - 程序員

適合程序員閱讀的書籍有哪些推薦? - 調查類問題

如果沒有任何編程經驗,就去學python吧

Python 入門 - 話題精華

選任何一本大家推薦的書都可以,並沒有哪本入門書最好,每個人眼裡「最好」的書都不一樣;

認真刷完它,包括內容和作業。

你是來求答案的,OK

=======================================

這是我的答案。

Step0 Python | Codecademy 去這裡把python的部分刷完,十幾個小時就搞定,啊,你說全是英語咋整,那你可以不用學編程了,

Step1 去網上下一本《python核心編程(第二版)》,從第一章開始看,每道題認真做,不會做咋整,思考,努力的思考,想不出來,OK,去Google一下(Google,Not Baidu)

每一章都看完,別看完第一章就完事兒。

Step2 如果你能認真完成前兩部,不打折扣,OK,你已經編程入門了,已經超過很多大學計算機系的孩子的編程Level了。

你說為啥不學C,C++,Java,到底哪個好?

嗯,別浪費生命糾結學啥,就是干,立馬乾,現在去註冊Python | Codecademy,等你入了門,再去考慮別的。

假如問怎麼編程入門的有100人,可能會去動手乾的有50人,堅持刷完Codecademy的有10人,能完整走完前兩步的或許只有一個人。

共勉。


推薦一下,最近在寫的一個開源應用——Growth。

APP來源於: 對Web應用開發的一個流程認識。

當我到了一個項目時,我發現這是一個遺留系統(沒有人知道為什麼這裡是這樣的),儘管我們有足夠的測試覆蓋率。接著在我們的另外一個項目里,我們不得不選擇了基於別的項目組的代碼(畢竟是同樣的業務),這是一份遺留代碼(充滿bug、難以維護),並且沒有人有興緻去維護好別人留下的代碼。隨後,我們開始重構現有的系統,使用新的技術、新的架構。儘管如此,我們的新代碼卻一直徘徊在遺留代碼的邊緣。

最後,我就想到了Web開發實際上就是七個步驟:

  1. 從零開始

  2. 編碼

  3. 上線

  4. 數據分析

  5. 持續交付

  6. 遺留系統

  7. 回顧與新架構

即之前的Web七日談,也算是開發的本質:

主頁視圖

主頁視圖如下所示:

  1. 技能圖譜。點擊右上角的圖標可以進入技能圖譜,技能圖譜將展示現在你學到的技術棧,並且可以向你推薦未來應該學習的技術棧。圖標上的10則表示你新GET到的功能點數。

  2. 學習路線。學習路線是依據七日來規劃的,每一日關注的點不同,如在第一天關注於如何從零開始去搭建項目。

  3. 切換視圖。當前有兩種視圖,即路線圖和七日談。

七日談模式

七日談模式關注於一些理論。如下圖所示:

  1. 右上角的簡介。會介紹一些每一個事項相關的信息。

  2. GET技能。用於構建技能圖譜、提供成長指南。

  3. 工具和書單。提供一些實用的工具,以及閱讀書單等等。

路線圖模式

路線圖關注於一些可以嘗試開始的事項。如下圖所示:

在每個Card中會包含如下的Todo List:

向左滑動即可以完成這個事項。

菜單

Github: phodal/growth · GitHub

在線: Growth Ren

已在360手機助手小米應用商店豌豆莢Google Play等應用商店上線

直接下載:http://fir.im/phodal

歡迎提供意見和反饋~~


在說咋自學之前先強調一點:趁早找一個學長或導師之類的人帶一帶,書讀萬卷不如高人指路。

在開始學之前,首先要選擇一個方向。

想要選擇一個適合你的方向,你就需要先去了解都有哪些可選。前端、後台、Android、IOS、計算機視覺......(關鍵詞多到我列不完) 你可以百度,可以google,可以問各種前輩,總之要大概了解多個方向的大概情況。然後你可以在其中選擇一個最適合你的,記住,是選擇最適合你的,先別過多的考慮工資待遇神馬的。坦誠地說,如果你只是為了工資而選擇計算機領域,你很難堅持下去,即使堅持下去了,也很難有大的發展。別太期望第一步就選中那個最最適合的,因為這不僅需要你對自己有足夠的了解,而且需要你有廣闊的視野,後者需要你在這個領域混跡很長時間才能有。

選擇完方向了,那接下來就是獲取信息並學習了(插一句,獲取信息絕逼是一件考驗能力的事)。你可以買書,你可以看博客,你可以......反正渠道很多。剛接觸的時候你可能沒法判斷一本書的水平如何,那我就告訴你一個簡單粗暴的方法:書挑厚的買。對於其它的渠道我就不細說了,你自己看著玩吧。

然後就到重頭戲了:實踐,實踐,實踐(重要的事說三遍)。既然選擇了計算機領域,有一件事你必須知道,那就是僅僅抱著書本學,很難成為高手,甚至有的時候入門都難。所以,你要想辦法找項目,找項目,找項目。在這件事上,不同的人有不同的渠道。有的是找到了手頭有項目的老師,有的是朋友介紹來的項目,有的是自己設計的項目,有的是參加了有項目的團隊......至於具體怎麼做,看你智慧了。


學編程,不要多想,就是干!

先選一門主流的編程語言,C/C++,Java或者Python都行。然後找本對應的入門經典書籍,先過一遍,接著從頭邊看邊敲例子。最後,寫個你感興趣的小項目。這些完了之後你應該就算入門了吧。


為什麼不去你們學校的計算機系蹭課?


先買本《計算機科學導論》,了解計算機。然後學一門語言,C的話推薦《The C Programming Language》或者《C Primer》,當然我比較推薦學Python,買本《Python Cookbook》很不錯的~~

然後,你自己就知道接下來該學什麼了~~


我強行來一發吧,給題主提供參考的同時,要是有問題,麻煩各位少俠指點一下,我儘早改正。

首先,還是從C語言看起來吧,書就推薦《C Primer Plus》,不是說就看這一本,而是以這一本為核心,其他的可以翻翻,其實入門書籍大同小異。有人會推薦Python,個人覺得對初學者不實用,正所謂微言大義,一個函數背後就是各種複雜的邏輯,C語言會一大串,Python就一個單詞,正兒八經地學的話,沒有相當的基礎,到了面向對象的部分會無所適從。這本書注意把後面的習題做了,一道也別漏。當然了,作為我這樣隨性,隨意,隨便的人來說,當然辦不到,還是有略過的,比如位運算。

C語言學習過程中可以穿插著Python的學習,留一些疑惑,有一些方向,培養些直覺。學完後,就可以看一下《C++ Primer Plus》, 很多人說這本書不好,可能會推薦《C++ Primer》,我個人覺得還是從前者開始好,可能我比較笨吧,這樣對於對象會有一個印象,有利於後面的理解。大學時間充裕,C語言學得熟悉一點,這本書雖然一千來頁,一個多月也就看完了,但也別心急,遇到不會的也別慌,硬著頭皮往後看可能就會有答案,不要自己瞎琢磨,再說這本書還要看好幾遍的,看完了就再去看《C++ Primer》,也記得做課後題。

這兩邊都差不多了,就可以看數據結構與演算法了。這個書和資料就很多了,得慢慢磨。有人會推薦《演算法導論》,我個人覺得先不必著急,從最簡單的開始,演算法導論里的東西除了排序啥的,其他的對我來講就像懷裡抱了個原子彈,知道很厲害,也知道原理,但不知道能幹啥,也不知道怎麼去跟我們家三胖交流造原子彈的經驗。我自己在看ACM基礎,哈工大出的,配合著演算法書看就行,還能偷著去OJ水幾道題,哈哈。我對自己要求也不高,能看懂個大概就夠了。平時翻翻《演算法導論》或者選修一些有關的課程。

看完這些我準備看《深入理解計算機系統》了,前面是我的體驗,感覺還可以,我是生物方向的博士,你懂的。

最後,既然是理工科可以強烈關注一下MATLAB和Python的Numpy,由於我比較偏向於生物專業中的偏文科方向,平時會關注一下R。


首先學會翻牆,再Google coursera和udacity。各種101課程都是零基礎的。


一般大家的推薦都是站在自己的知識結構上的~我之前問了一個程序員然後他給我推薦了這個

然後我看到第五章,表示臣妾真的天資愚鈍看不下去了嚶嚶嚶~

然後一個產品經理給我推薦了這個

這是一個程序員小遊戲~還蠻好玩的~~~給你指定一些任務用遊戲里設定的一些命令去完成~(如果你要玩兒的話……打通關了告訴我最後一關怎麼過哈……)

最後,我發現還是兒童讀物好理解~

就醬,希望對你有幫助~


現在其實計算機的課程很多,也看到了許多大神在為你講解,我就簡單說說我的看法,我建議你可以先去讀一本簡單的計算機科學計數導論,裡面會介紹很多計算機的研究領域,應用領域,和一些基本的發展,然後建議你先去學習一門編程語言,不同學的太深入,建議網課的形式,很多大牛在講編程語言的時候是非常有趣而且有他自己的編程思想在裡面,你可以學習到很多東西,其實程序員就是看別人的代碼,自己寫代碼,在導論與編程語言的學習結束後,你需要仔細的思考一下自己到底喜不喜歡這個專業,如果下了決心要學習計算機,那其實有很多方法可以開始學習,到時候你自己就會去找很多的資源去學習,到那時你可以再來知乎提問,希望你能對計算機行業感興趣並加入我們~~


正在自學的半吊子強行答一記。

如果時間充足你可以先學一門語言了解基本語法,比如c++,書就用c++primer(看這本書並不需要c語言基礎,知道什麼是二進位就ok。)。 然後推薦講計算機基礎的神書csapp,不要被這本書的中文譯名嚇到了,講的都是基礎知識,非常容易看懂(這裡和看懂是指了解基本概念和做完習題,家庭作業難度比較大可以先不做,第4章沒興趣不用看沒影響)。這本書例子用的是c語言,看完c++primer基本沒什麼壓力的能看懂。看這本有自己動手裝ubuntu系統的能力。

c++primer的習題一定要全部做,答案可以上github搜 @王月 或者@pezy的答案。

以上兩本入門建立在你非常有耐心的基礎上,一直對著黑框框玩幾個月沒耐心可能受不了,比較沒成就感。不過等你搞完這兩本應該也知道自己想幹啥了。


興趣是關鍵

1如果是零基礎的話 建議先找一本編程書 敲出自己第一個hello world 關於編程入門書籍 推薦 《與孩子一起學編程 》

2對程序的一些概念已經有了一些自己的一些簡單的理解 嘗試去寫一個階段性的程序 方便知識的鞏固與認識

3去看一些和編程相關的書籍 學習一下數據結構和演算法之類的 如果時間充足的話 去找些相關課程系統性的學一遍 對程序的理解會更有幫助

4可以找些題來訓練一下自己的編程能力 重複練習 不斷學習

5去看一些別人的源碼 擴寬自己解決問題的思路

6學會利用搜索引擎解決遇到的問題

7慢好過停 堅持下去 不斷去嘗試擴寬自己的視野與提高覺

8還可以有更多可能性 不要固步自封


自學能力強的,不用上課,自學效率比上課高,也可以上cousera找自己感興趣的看一般來說比國內高校講的好很多,最重要的是學計算機是要寫代碼的,要多寫代碼,自己做或者參與一些自己感興趣的項目!


第一步,你需要先學會搜索.


[編碼:隱匿在計算機軟硬體背後的語言].(Code).Charles.Petzold.中文文字版.pdf

我自己沒看,但有人推薦這本書作為計算機入門導論。


如果有條件,可以輔修計算機學科。@陳碩 說的去計算機蹭課肯定可行,但是考慮到很多人都堅持不下去,可能蹭了幾節課就不願意去了,課程的project也不願意做,組隊還沒人。還有很多老師會優先照顧選課的學生。

最後,去蹭幾節課看看自己是不是很喜歡計算機,絕對值得嘗試。


推薦 沈從文寫的 《邊(biān)城(chéng)》


推薦閱讀:

對於一個程序員來說,寫代碼用台式機好還是筆記本好?
如何系統的學習 Unity 3D 中的 shader 編寫(nvidia cg 編程)?
為什麼緩衝區能提升性能?
程序員是否需要大尺寸的顯示器?
coursera上有哪些值得學習的Python,數據分析的課程?

TAG:編程 | 計算機 | 初學者 |