如何自學計算機編程?

做者:骸音
連接:https://www.zhihu.com/question/28354731/answer/138578609
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。javascript

前面的不少人寫的回答都很好,答主本科研究生6年一直學的都是機械,學業中偶爾用到編程,都是很是簡單的,寫個function,寫個loop,僅此而已,對計算機運行原理一竅不通,甚至分不清bit和byte的區別(毫無誇張)。找工做時候誤打誤撞進了軟件行業,開始自學編程,利用天天下班時間看書看open course, 學會了一些計算機的和編程基礎知識,如今就任谷歌,座標美利堅。之因此想補充,是由於其餘回答大多說的若是將編程做爲一個興趣學習,我的以爲,要把編程,或者說軟件工程師做爲你將來的職業,僅僅pick up一門語言,寫簡單程序,是不夠的。理解計算機程序的運行原理和理解不少相關的知識很重要,不然在學習的路上對不少概念只能是隻知其一;不知其二,走不了太遠。如下列一些計算機的基本概念和相關的課程,答主以爲對成爲一個優秀的程序員是頗有幫助的,也是必須的。1. 計算機系統,推薦課程: UC berkely CS61C,理解難度高,不過很是重要!link: https://www.youtube.com/watch?v=gJJeUFyuvvg&list=PL-XXv-cvA_iCl2-D-FS5mk0jFF6cYSJs_此課程講述了計算機程序是如何運行的,一些計算機,程序的基本概念,例如計算機彙編指令,內存,寄存器的意義,進程和線程的區別。這些概念的理解對一個程序員是相當重要的。懂了這些,才能在程序設計和編寫中考慮到一些基本的問題,例如如何和爲何要防止內存泄漏,如何寫程序能夠減小cache miss提升performance.2. 數據結構和算法, 推薦課程:UC berkely CS61B, 理解難度中高,重要的不能再重要link: https://www.youtube.com/watch?v=mFPmKGIrQs4&list=PLZBP-86GmPTxpbvoFFzad0qYw5dKA8MV2若是不理解基本的數據結構和算法而編程,基本至關於不懂力學就去建造一個大樓,樓可能能建起來,可是你敢住,我可不敢。程序的基本做用是存儲數據和處理數據,能夠把數據結構和算法理解成完成這兩項任務的基本工具和思想。3. 網絡基礎知識,推薦課程:Stanford Network, 理解難度中等,很重要link: Introduction to Computer Networking我就不用說網絡在軟件中有多重要了,除非你只是想寫個計算器,不然這些基本概念確定要懂。這個課程基本講解了網絡building blocks, 瀏覽器是如何從你打入一個字母組成的網址,到把一個能夠interactive(交互)的頁面顯示給你,雖然這發生在短短一秒內,但後臺發生了不少事情,才能保證這個網頁傳到你的瀏覽器上。從dns ,router,到load balancer, 再到http, tcp/ip, html, css, javascript。上完這個課程,基本就清楚了。先寫到這……有人有興趣我再繼續更新,後面還有,大概寫了4分之一/*睡了一覺起來看到這麼多贊同真實受寵若驚,既然你們這麼有興趣,我接着碼字。我爭取天天抽出一段時間更新,答主有個剛出生3個月的娃,時間比較不穩定。首先要解釋幾件事情,答主自學Computer Science或者說編程的過程徹底在國外完成,因此全部學習資料和視頻都是英文的,不少術語我也只知道英文的,對你們理解帶來的不便先表示歉意。不過說到這,我認爲作到兩件事情對高效學習CS有很大幫助. 第一,學好英文,儘可能用英文學習關於CS的概念。這麼說並非由於我崇洋媚外,而是客觀的說,就算我國科研技術和編程水平已經和美國差距不大,但就教學水平和教材質量來講,還差了不少條街,並且不少CS的概念會直接用英文呈如今編程語言當中(stack, heap, tree, array, list, map, graph),即便你學的時候用的是中文,編程的時候仍是要知道英文,寫英文,直接學英文省去了二次學習。第二,*。這一點的緣由不只僅是國外的教材和課程視頻大多在牆外的網站(幾乎全部公開課在youtube上,我會把上面提到課程的link)。還有就是,我去年曾經回國在公司的北京office工做過一段時間,試着用了一下百度,就搜索編程技術相關的問題上,百度的搜索結果質量被google甩了不知道多遠。上面寫過的課程我會貼YouTube連接,這些課程能寫的做業強烈建議你們跟着寫,由於編程水平是靠寫代碼寫出來的。/4. 數據庫這個topic我沒有什麼推薦的課程,由於大多數我看到的數據庫課程都是在講如何使用sql數據庫。數據庫的知識我認爲分兩部分,做爲一個入門的程序員,可能只須要知道寫簡單的sql語句,如何create databse, create table, insert, update and query. 這是數據庫學習的第一部分,我建議利用一些能夠邊學邊寫的網站學習這部分,實戰纔會印象深入,這裏推薦一個網站(不知道需不須要)Learn to code, 他們家有不少課程,都不錯,你們不須要用付費版本,免費版足夠。 數據庫的第二個層面,我認爲纔是數據庫的精髓,這部分我是靠閱讀網上的文章加繼續搜索學習的,就是數據庫的運行原理,具體說,就是數據庫是怎麼樣實現快速查找的,想象一下,一個表有不少列,例如一我的的資料,姓名,性別,住址,年齡。那麼好比我要查找一個年齡區間的人,數據庫不可能每次都去根據年齡排序,再輸出,排序的複雜度是nlogn, 就算不排序, 每次輸出的複雜度也是n, 這對於動輒上百萬記錄的數據庫來講,速度是不能接受的,因此數據庫會用到幾種特殊結構的tree去存儲這些列,保證在輸出的時候,複雜度基本在logn。關於這些tree是如何實現的,能夠獨立寫一篇很長的文章,建議你們先學會並理解幾個基本的tree structure(數據結構和算法裏有講到),順便在這裏推薦一個微信公衆號,事先聲明,這個公衆號跟我沒有任何關係,只是他家文章水平廣泛較高,公衆號的名字叫"開點工做室「,裏面有一片講數據庫實現的文章寫的很是好,很深入。/ 這週一直在加班,外加出差,一直沒有更新,十分很差意思,週末有點時間我來更新一下*/5. 操做系統 推薦課程 Berkeley CS 162link: https://www.youtube.com/watch?v=1IcZB26STUE&list=PL-XXv-cvA_iBDyz-ba4yDskqMDY6A1w_c推薦書:Computer Systems: A Programmer's Perspective操做系統(英文縮寫OS)其實即便是經驗豐富的軟件工程師都不多有很是熟悉的,由於實在難點太多,太難理解,其中有不少雞生蛋,蛋生雞的問題,答主本身也並無理解的很是好,但我認爲對於一些基本概念的粗淺理解也是很重要的,例如OS如何schedule process的,如何管理內存的,如何實現各個process切換的,文件系統是怎麼實現的,還有最難理解但也必定要有一些理解的一個概念--鎖(mutex lock)。我以前在Oracle的工做經歷主要負責的提升操做系統的性能,因此理解較通常不在這個領域的程序員的會深入一些。說一說爲何鎖很重要,如今不多有程序是單線程了(javascript除外),在多線程的運行環境下,若是沒有鎖基本上就會天下大亂了。舉個最簡單的買牛奶的例子,假如你和別人合租有個室友,大家倆天天都喝牛奶,有一天你回家發現沒有牛奶了出去買牛奶,然而在你室友回來後你還沒回來以前你室友沒法判斷你是否已經去買牛奶了,若是他認爲你已經去了而本身沒去,大家家裏會有一瓶牛奶,若是他認爲你沒去本身也去了,大家家裏就會有兩瓶牛奶,若是他認爲你去了而你沒去,大家家就沒有牛奶了。這種在多線程程序中會出現不肯定結果或錯誤結果的狀況很可怕,須要解決。那麼解決方案就是鎖,在這個例子裏,鎖就是一個貼紙,若是你去買牛奶後貼一張紙告訴你室友你去買了,那麼對於你室友這個就很容易解決了,若是他看到沒有牛奶,沒有貼紙,他就去貼一張紙條告訴你他去買了,結果是大家家有一瓶牛奶。若是他看到沒有牛奶但你貼了紙條,那他就知道你已經去買了,他就不用去買了,結果仍是大家家只會有一瓶牛奶。這樣程序執行結果就不會有不肯定性。固然,真正的鎖實現上比這個複雜並且會有不少種鎖,但基本原理就是這樣的。關於這方面,和第2點一塊兒,推薦一本書,我寫在了開頭,這本書開頭3章不太好懂,講的是一些很基礎的計算機實現原理,不過要堅持看下去,看不懂就多看幾遍,配和網上搜索,也能夠給我發信,不過我時間很是有限,儘可能回答,沒時間回答你們不要怪罪。6. Version Control System. 推薦Git. 推薦教學網站: Learn Git with Bitbucket CloudVersion Control system,我不知道如何翻譯比較靠譜,意思就是版本控制系統。先說說爲何咱們須要它,版本控制系統幫助你更好管理你的程序,更好的幫助一個小組在程序上進行合做。舉個例子,好比你用word寫文章,想象每次你保存都不會覆蓋,而會保存成一個新的文件,而且這個文件名會記錄你和上一次保存的變化以及你的保存時間(這個保存叫commit),這樣若是你在一次改動的時候若是以爲改動的太差,你不用手動改回到上一次保存,這個系統會幫你一鍵回到任何一個你以前的保存,這樣你在每次保存後就能夠放心大膽的改動,不用擔憂若是程序沒改好致使前面的成果所有廢掉,由於你隨時能夠回到任何一個前面的版本。再說說它的第二個做用,就是合做,假設你程序寫到一半,發現這個程序須要的工做量遠遠超過你以前的預期而你須要別人的幫忙,因而你有了一個合做夥伴,這個合做夥伴用這個工具copy(這的copy通常叫clone)了你的文章,這樣他瞬間就獲得了你以前全部的版本。當大家倆分頭編輯了不少以後,這個工具能夠實現一鍵合併大家倆的修改的內容(merge),若是大家修改的內容有衝突(merge conflict),這個工具會告訴大家有衝突的地方並讓大家逐一選擇選擇誰的修改,當合並好以後,此次合併對於大家倆來講又都只是一次commit, 隨時能夠回到各自合併前的版本。Version Control有不少,比較popular的有git, perforce 和Mercury,我的最喜歡的是git, 你們能夠先學學git.----------------------------------------------------------------------------------------------------css

相關文章
相關標籤/搜索