如何系統、科學地自學編程知識?

相關問題:
自學編程需要注意什麼? - 程序員
想自學編程怎樣下手? - 大學生
如何高效自學編程? - 計算機
--
雖然不是碼農,但是一直都有一顆碼農的心。所以一直想學好怎麼編程。

先說下自己的背景吧:
已經畢業若干年工科男,所以基礎知識也就是大學裡譚浩強的那本綠殼的 C 語言。
但是除了基本的變數、數組、選擇、循環,到了指針那就記不清了。

然後因為工作需要,自己學了下 Linux 的 Shell 編程(Linux 系統的基礎知識很一般),以及 W3School 裡面 HTML, CSS 及 PHP 的部分內容。
資料庫的知識僅限於基礎的 selecet, insert, update 操作。
最後抄抄改改做了個功能很基礎的網站出來,工作上還算夠用。

現在呢,想系統的學習下編程知識,所以在 codecademy 和 coursera 開始學習。完成或進行中的科目如下:

coursera:
Learn to Program: The Fundamentals
Computer Science 101
Human-Computer Interaction

codecademy:
HTML Fundamentals
Getting Started with Programming
JavaScript
Python

現在的問題呢,就在於我自己感覺學習上很不系統,遇見什麼抓什麼。
比如我在 Ubuntu 里裝上了 Eclipse 寫 Python,可我連 Eclipse 這個軟體的性質和工作原理都不清楚,又需要四處去找資料學習。
就覺得這種方式不科學也沒效率,所以希望各位能指教下怎麼自學編程。

至於說最後的目的呢,其實我自己是希望能達到一個能獨立做開發的程序員的水平,甚至於有能力可以轉行去寫代碼。
這裡呢,又出現了由於知識不系統而出現的問題:我其實不清楚程序員的分工是什麼樣的。
我不清楚做網站前端和後端的區別是什麼,我也不清楚什麼是設計而什麼是開發。

就我自己來說,我自己的興趣是做網站,同時也對 UE、UI 設計特別感興趣。
另外也希望學習到手機 App 的開發。

所以希望各位能指點下,希望達到上面目標的話,怎麼樣系統的進行自學?
同時有什麼教材可以推薦?


感謝邀請。
事實上要回答你的問題恐怕已經遠遠超出我的能力範疇之外了。因為對於什麼樣的學習才算得上「系統」幾乎是一個哈姆雷特式的問題——人們很難在這一問題上達成一致。
因此拋出答案幾乎只是在引發更多的爭議。所以在討論這個問題的時候,我必須承認下述描述只是我自己的一點小小的體會,只希望能對你有所幫助,這些看法並不「權威」,也不完全「正確」。

一般來說對於計算機科學的學生來說,下述課程是非常關鍵的:
提醒:學習時注意把握合理的深度,不可太浮於表面,也不可太過拘泥於部分細節,對於初學著重掌握基礎內容,能在概念上建立一個合理的認識就可以。真正的學習是在後面的職業生涯中完成的。

一、基礎篇(理論與硬體)
這一部分關注的是計算機的基本理論與基本實現。包括硬體結構理論,以及軟體與硬體的交互。以理論開篇,在機器語言部分深入,最終在操作系統部分達到高潮。

1、計算機實現計算的原理。這包括門電路是如何實現計算的,時序電路是如何實現存儲的,馮諾依曼體系結構是如何將二者結合實現了真正的現實世界的計算機的,以及它是如何反映圖靈機這一理論計算模型的。其間會學習布爾邏輯。
2、如何控制計算機硬體。這部分使用的「工具」就是機器語言和彙編語言。我們需要理解機器語言的本質,以及它如何以「彙編語言」這種更容易理解的形式為程序員提供了控制硬體設備的機會。這部分可以學習到很多非常低級但是本質的內容。
3、操作系統是如何工作的。如果你理解了上一部分的計算機硬體相關的問題,那麼理解操作系統的工作原理將不會那麼困難。另外你將明白操作系統作為硬體和上層軟體的中間層次,是如何大大簡化了人們對硬體的操作過程的。

二、進階篇(軟體系統)
1、編程語言。這包括結構化編程語言以及面向對象編程語言。因為有很多選擇,其實以一門語言開始即可,如果你在前面正確的理解了硬體與機器語言,那麼C語言入門真是太簡單了,如果你運氣不好,覺得C很困難,那麼即使是從Python、Javascript開始學習也沒問題。重點在於理解編程中和語法相關的基本概念,並了解一些簡單的演算法知識。
2、數據結構與演算法。說白了就是如何合理的組織數據,通過其結構特點來簡化編程或者提高計算的效率。這裡的內容是模式化的,所有人都需要學習無序結構、有序線性結構、樹結構、圖結構等。另外,排序演算法、查找演算法必須學好,特別是演算法策略如遞推、遞歸、蠻力(窮舉)、分治、動態規劃等也必須有所實踐和了解。切記不必深陷其中,這裡是個大坑,你不可能真的「精通」他們。
3、編程語言是如何實現的。這裡主要涉及編譯原理。當你站在高級編程語言實現者的角度再來認識編程語言本身的時候,許多問題豁然開朗。這會深刻的改變你的編程觀。可惜的是即使是很好的學生在這裡也會遇到很大的阻力。真正的問題不是這方面理論性有多強,而是教材都很爛——包括國外教材(什麼龍書虎書鯨書都根本不是為初學者準備的),而且語焉不詳。這導致大部分人都感覺莫名其妙高深莫測。如果你不是有志攀登軟體設計的最高峰,可以繞行。否則從表達式運算解析開始,逐步引入變數,類型,控制結構,函數,再到對象,一步步構建出解析器,然後結合前面學習的硬體介面知識,將其轉換為低級表示,最後你會發現沒有那麼可怕。

三、基礎領域篇(必備領域知識)
1、互聯網路是如何構成的。這部分包括網路的基本知識,主機間通信的原理,轉發設備的實現,以及互聯網路的構成。這是網路編程所需的基礎知識。除了理解低級協議,也要花一些時間了解應用層的協議,特別是 SMTP、POP3、FTP、HTTP 等,重點是了解他們的基本原理,而不是每個細節。因為每個協議都有自己的標準,光 HTTP 協議就夠你研究 6 個月以上了。這裡注重的是原理。
2、如何管理大量的數據並在其上建立信息系統。資料庫是一個很好的例子。包括資料庫系統的基本理論,實現原理,以及設計原則。同樣,這裡不是真的在教你如何構建一個資料庫系統,而是在學習他的核心原則,重點是學會如何合理的設計表結構,以及實現效率良好的SQL查詢語句。

四、擴展領域篇(特定領域知識)
1、基於特定平台的軟體開發。如何在Windows平台、Linux平台、Mac OS平台或者手機、平板、電視機、微波爐上完成開發?這需要學習特定的軟體平台提供了哪些編程介面,如何編譯並部署,如何調試和測試等知識。這部分就是軟體工程師職業生涯中最耗費時間的部分。
2、有效的軟體研發是如何實現的。這包括軟體結構的設計知識,軟體實施流程的管理知識,以及一些細微而繁雜的內容。人們通常用軟體工程一詞來概括。但事實上軟體工程站的角度要更高一些,這裡只是涵蓋軟體工程的一小部分。

五、科技領域篇(研究性知識)
如果你對人工智慧、科學計算、圖像處理感興趣,這裡還有大片的區域等待你探索。

事實上,上面的描述有些嚇人。每一個領域都夠耗盡去很長的時間。不過好消息是大部分知識都只要求在理論上理解。真正的耗費時間的部分還是在與編程、編程、編程。不是每個人都會用到資料庫系統,也不是每個人都需要懂得彙編語言。但是這些背景知識會對你有幫助。讓你不再害怕,對自己更有自信。

如果你希望自己成為一個很棒的開發人員,那麼上述知識都是必須的。但是卻依然遠遠不夠。
學無止境,計算機科學尤其如此。

我說的實在太多了。思考和打字差不多耗費了我一個小時。我不太確定這些對你是否有幫助。我希望有,至少有那麼一些。但我有點害怕,似乎我的描述不是在幫助你克服困難,而是製造了更多看似難以逾越的高山。

但我想說:走入編程,然後走出編程。編程是為解決問題服務的,我們應當多思考想要解決的問題是什麼。這會在我們迷茫的編程生涯中起到指南針的作用。它會告訴我們需要學習什麼,然後由我們自己來回答如何學習。

我的一位朋友是做生物科技的,他需要在海量的DNA序列里快速的進行基因片段的比較。為了完成這一任務,他學習了 Python,並著重學習了數據結構和演算法相關的內容。雖然最後他寫出來的程序外表看起來很簡單,但是卻速度飛快,為他的事業貢獻了無形的資產。
這就是他的起點。但是他並不滿足。他繼續學習如何增強程序的穩定性,如何編寫更好的界面等等。現在他的軟體真的非常棒,一些關鍵的效率相關部分已經替換為C++實現,界面也做得很專業。
天啊,真的無法相信,這就是一位生物領域的研究人員自己親力親為的成果。即使是用苛刻的眼光來看,現在他的軟體也相當不錯。
我舉這個例子,想說明的核心在於,知識的學習,要想高效,一個廣為大眾所接受的觀點就是應當圍繞一定的具體的目標來進行。如果我們知道我們想要解決的問題是什麼,那麼我們進一步確定要學習哪些編程知識就會比較容易。相反,為了學而學,泛泛而看,效果通常都是很差的。只能給你留下一些大致的印象,而無法成為你真正的可用的知識。

我的話說完了。雖然還有很多可以討論的東西。但是時間所限,也許我們下次有機會還可以再討論另外的一些觀點和體會。
再次感謝邀請。


我個人最近也在考慮這個方面的問題,這裡有一篇【酷殼】陳皓博客,寫的相當不錯可以看看,裡面啟蒙部分我已經學了一半多了。
希望你對有用。
原文地址:程序員技術練級攻略
博文如下:

前言

你是否覺得自己從學校畢業的時候只做過小玩具一樣的程序?走入職場後哪怕沒有什麼經驗也可以把以下這些課外練習走一遍(朋友的抱怨:學校課程總是從理論出發,作業項目都看不出有什麼實際作用,不如從工作中的需求出發)

建議:

  • 不要亂買書,不要亂追新技術新名詞,基礎的東西經過很長時間積累而且還會在未來至少10年通用。
  • 回顧一下歷史,看看歷史上時間線上技術的發展,你才能明白明天會是什麼樣。
  • 一定要動手,例子不管多麼簡單,建議至少自己手敲一遍看看是否理解了裡頭的細枝末節。
  • 一定要學會思考,思考為什麼要這樣,而不是那樣。還要舉一反三地思考。

:你也許會很奇怪為什麼下面的東西很偏Unix/Linux,這是因為我覺得Windows下的編程可能會在未來很沒有前途,原因如下:

  • 現在的用戶界面幾乎被兩個東西主宰了,1)Web,2)移動設備iOS或Android。Windows的圖形界面不吃香了。
  • 越來越多的企業在用成本低性能高的Linux和各種開源技術來構架其系統,Windows的成本太高了。
  • 微軟的東西變得太快了,很不持久,他們完全是在玩弄程序員。詳情參見《Windows編程革命史》

所以,我個人認為以後的趨勢是前端是Web+移動,後端是Linux+開源。開發這邊基本上沒Windows什麼事。

啟蒙入門

1、 學習一門腳本語言,例如Python/Ruby

可以讓你擺脫對底層語言的恐懼感,腳本語言可以讓你很快開發出能用得上的小程序。實踐項目:

  • 處理文本文件,或者csv (關鍵詞 python csv, python open, python sys) 讀一個本地文件,逐行處理(例如 word count,或者處理log)
  • 遍曆本地文件系統 (sys, os, path),例如寫一個程序統計一個目錄下所有文件大小並按各種條件排序並保存結果
  • 跟資料庫打交道 (python sqlite),寫一個小腳本統計資料庫里條目數量
  • 學會用各種print之類簡單粗暴的方式進行調試
  • 學會用Google (phrase, domain, use reader to follow tech blogs)

為什麼要學腳本語言,因為他們實在是太方便了,很多時候我們需要寫點小工具或是腳本來幫我們解決問題,你就會發現正規的編程語言太難用了。

2、 用熟一種程序員的編輯器(不是IDE) 和一些基本工具

  • Vim / Emacs / Notepad++,學會如何配置代碼補全,外觀,外部命令等。
  • Source Insight (或 ctag)

使用這些東西不是為了Cool,而是這些編輯器在查看、修改代碼/配置文章/日誌會更快更有效率。

3、 熟悉Unix/Linux Shell和常見的命令行

  • 如果你用windows,至少學會用虛擬機里的linux, vmware player是免費的,裝個Ubuntu吧
  • 一定要少用少用圖形界面。
  • 學會使用man來查看幫助
  • 文件系統結構和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …
  • 學會使用一些文本操作命令 sed/awk/grep/tail/less/more …
  • 學會使用一些管理命令 ps/top/lsof/netstat/kill/tcpdump/iptables/dd…
  • 了解/etc目錄下的各種配置文章,學會查看/var/log下的系統日誌,以及/proc下的系統運行信息
  • 了解正則表達式,使用正則表達式來查找文件。

對於程序員來說Unix/Linux比Windows簡單多了。(參看我四年前CSDN的博文《其實Unix很簡單》)學會使用Unix/Linux你會發現圖形界面在某些時候實在是太難用了,相當地相當地降低工作效率。

4、 學習Web基礎(HTML/CSS/JS) + 伺服器端技術 (LAMP)

未來必然是Web的世界,學習WEB基礎的最佳網站是W3School。

  • 學習HTML基本語法
  • 學習CSS如何選中HTML元素並應用一些基本樣式(關鍵詞:box model)
  • 學會用 Firefox + Firebug 或 chrome 查看你覺得很炫的網頁結構,並動態修改。
  • 學習使用Javascript操縱HTML元件。理解DOM和動態網頁(Dynamic HTML: The Definitive Reference, 3rd Edition - O"Reilly Media) 網上有免費的章節,足夠用了。或參看 DOM 。
  • 學會用 Firefox + Firebug 或 chrome 調試Javascript代碼(設置斷點,查看變數,性能,控制台等)
  • 在一台機器上配置Apache 或 Nginx
  • 學習PHP,讓後台PHP和前台HTML進行數據交互,對伺服器相應瀏覽器請求形成初步認識。實現一個表單提交和反顯的功能。
  • 把PHP連接本地或者遠程資料庫 MySQL(MySQL 和 SQL現學現用夠了)
  • 跟完一個名校的網路編程課程(例如:http://www.stanford.edu/~ouster/cgi-bin/cs142-fall10/index.php ) 不要覺得需要多於一學期時間,大學生是全職一學期選3-5門課,你業餘時間一定可以跟上
  • 學習一個javascript庫(例如jQuery 或 ExtJS)+ Ajax (非同步讀入一個伺服器端圖片或者資料庫內容)+JSON數據格式。
  • HTTP: The Definitive Guide 讀完前4章你就明白你每天上網用瀏覽器的時候發生的事情了(proxy, gateway, browsers)
  • 做個小網站(例如:一個小的留言板,支持用戶登錄,Cookie/Session,增、刪、改、查,上傳圖片附件,分頁顯示)
  • 買個域名,租個空間,做個自己的網站。

進階加深

1、 C語言和操作系統調用

  • 重新學C語言,理解指針和內存模型,用C語言實現一下各種經典的演算法和數據結構。推薦《計算機程序設計藝術》、《演算法導論》和《編程珠璣》。
  • 學習(麻省理工免費課程)計算機科學和編程導論
  • 學習(麻省理工免費課程)C語言內存管理
  • 學習Unix/Linux系統調用(Unix高級環境編程),,了解系統層面的東西。
    • 用這些系統知識操作一下文件系統,用戶(實現一個可以拷貝目錄樹的小程序)
    • 用fork/wait/waitpid寫一個多進程的程序,用pthread寫一個多線程帶同步或互斥的程序。多進程多進程購票的程序。
    • 用signal/kill/raise/alarm/pause/sigprocmask實現一個多進程間的信號量通信的程序。
    • 學會使用gcc和gdb來編程和調試程序(參看我的《用gdb調試程序》)
    • 學會使用makefile來編譯程序。(參看我的《跟我一起寫makefile》)
    • IPC和Socket的東西可以放到高級中來實踐。
  • 學習Windows SDK編程(Windows 程序設計 ,MFC程序設計)
    • 寫一個窗口,了解WinMain/WinProcedure,以及Windows的消息機制。
    • 寫一些程序來操作Windows SDK中的資源文件或是各種圖形控制項,以及作圖的編程。
    • 學習如何使用MSDN查看相關的SDK函數,各種WM_消息以及一些常式。
    • 這本書中有很多常式,在實踐中請不要照抄,試著自己寫一個自己的常式。
    • 不用太多於精通這些東西,因為GUI正在被Web取代,主要是了解一下Windows 圖形界面的編程。@virushuo 說:「 我覺得GUI確實不那麼熱門了,但充分理解GUI工作原理是很重要的。包括移動設備開發,如果沒有基礎知識仍然很吃力。或者說移動設備開發必須理解GUI工作,或者在win那邊學,或者在mac/iOS上學」。

2、學習Java

  • Java 的學習主要是看經典的Core Java 《Java 核心技術編程》和《Java編程思想》(有兩卷,我僅鏈了第一卷,足夠了,因為Java的圖形界面了解就可以了)
  • 學習JDK,學會查閱Java API Doc Java Platform SE 6
  • 了解一下Java這種虛擬機語言和C和Python語言在編譯和執行上的差別。從C、Java、Python思考一下「跨平台」這種技術。
  • 學會使用IDE Eclipse,使用Eclipse 編譯,調試和開發Java程序。
  • 建一個Tomcat的網站,嘗試一下JSP/Servlet/JDBC/MySQL的Web開發。把前面所說的那個PHP的小項目試著用JSP和Servlet實現一下。

3、Web的安全與架構

  • 學習HTML5,網上有很多很多教程,以前酷殼也介紹過很多,我在這裡就不羅列了。
  • 學習Web開發的安全問題(參考新浪微博被攻擊的這個事,以及Ruby的這篇文章)
  • 學習HTTP Server的rewrite機制,Nginx的反向代理機制,fast-cgi(如:PHP-FPM)
  • 學習Web的靜態頁面緩存技術。
  • 學習Web的非同步工作流處理,數據Cache,數據分區,負載均衡,水平擴展的構架。
  • 實踐任務:
    • 使用HTML5的canvas 製作一些Web動畫。
    • 嘗試在前面開發過的那個Web應用中進行SQL注入,JS注入,以及XSS攻擊。
    • 把前面開發過的那個Web應用改成構造在Nginx + PHP-FPM + 靜態頁面緩存的網站

4、學習關係型資料庫

  • 你可以安裝MSSQLServer或MySQL來學習資料庫。
  • 學習教科書里資料庫設計的那幾個範式,1NF,2NF,3NF,……
  • 學習資料庫的存過,觸發器,視圖,建索引,游標等。
  • 學習SQL語句,明白表連接的各種概念(參看《SQL Join的圖示》)
  • 學習如何優化資料庫查詢(參看《MySQL的優化》)
  • 實踐任務:設計一個論壇的資料庫,至少滿足3NF,使用SQL語句查詢本周,本月的最新文章,評論最多的文章,最活躍用戶。

5、一些開發工具

  • 學會使用SVN或Git來管理程序版本。
  • 學會使用JUnit來對Java進行單元測試。
  • 學習C語言和Java語言的coding standard 或 coding guideline。(我N年前寫過一篇關C語言非常簡單的文章——《編程修養》,這樣的東西你可以上網查一下,一大堆)。
  • 推薦閱讀《代碼大全》《重構》《代碼整潔之道》

高級深入

1、C++ / Java 和面向對象

我個人以為學好C++,Java也就是舉手之勞。但是C++的學習曲線相當的陡。不過,我覺得C++是最需要學好的語言了。參看兩篇趣文「C++學習信心圖」 和「21天學好C++」

  • 學習(麻省理工免費課程)C++面向對象編程
  • 讀我的 「如何學好C++」中所推薦的那些書至少兩遍以上(如果你對C++的理解能夠深入到像我所寫的《C++虛函數表解析》或是《C++對象內存存局(上)(下)》,或是《C/C++返回內部靜態成員的陷阱》那就非常不錯了)
  • 然後反思為什麼C++要干成這樣,Java則不是?你一定要學會對比C++和Java的不同。比如,Java中的初始化,垃圾回收,介面,異常,虛函數,等等。
  • 實踐任務:
    • 用C++實現一個BigInt,支持128位的整形的加減乘除的操作。
    • 用C++封裝一個數據結構的容量,比如hash table。
    • 用C++封裝並實現一個智能指針(一定要使用模板)。
  • 《設計模式》必需一讀,兩遍以上,思考一下,這23個模式的應用場景。主要是兩點:1)鍾愛組合而不是繼承,2)鍾愛介面而不是實現。(也推薦《深入淺出設計模式》)
  • 實踐任務:
    • 使用工廠模式實現一個內存池。
    • 使用策略模式製做一個類其可以把文本文件進行左對齊,右對齊和中對齊。
    • 使用命令模式實現一個命令行計算器,並支持undo和redo。
    • 使用修飾模式實現一個酒店的房間價格訂價策略——旺季,服務,VIP、旅行團、等影響價格的因素。
  • 學習STL的用法和其設計概念 - 容器,演算法,迭代器,函數子。如果可能,請讀一下其源碼。
  • 實踐任務:嘗試使用面向對象、STL,設計模式、和WindowsSDK圖形編程的各種技能
    • 做一個貪吃蛇或是俄羅斯方塊的遊戲。支持不同的級別和難度。
    • 做一個文件瀏覽器,可以瀏覽目錄下的文件,並可以對不同的文件有不同的操作,文本文件可以打開編輯,執行文件則執行之,mp3或avi文件可以播放,圖片文件可以展示圖片。
  • 學習C++的一些類庫的設計,如: MFC(看看候捷老師的《深入淺出MFC》) ,Boost, ACE, CPPUnit,STL (STL可能會太難了,但是如果你能了解其中的設計模式和設計那就太好了,如果你能深入到我寫的《STL string類的寫時拷貝技術》那就非常不錯了,ACE需要很強在的系統知識,參見後面的「加強對系統的了解」)
  • Java是真正的面向對象的語言,Java的設計模式多得不能再多,也是用來學習面向對象的設計模式的最佳語言了(參看Java中的設計模式)。
  • 推薦閱讀《Effective Java》 and 《Java解惑》
  • 學習Java的框架,Java的框架也是多,如Spring, Hibernate,Struts 等等,主要是學習Java的設計,如IoC等。
  • Java的技術也是爛多,重點學習J2EE架構以及JMS, RMI, 等消息傳遞和遠程調用的技術。
  • 學習使用Java做Web Service (官方教程在這裡)
  • 實踐任務: 嘗試在Spring或Hibernate框架下構建一個有網路的Web Service的遠程調用程序,並可以在兩個Service中通過JMS傳遞消息。

C++和Java都不是能在短時間內能學好的,C++玩是的深,Java玩的是廣,我建議兩者選一個。我個人的學習經歷是:

  • 深究C++(我深究C/C++了十來年了)
  • 學習Java的各種設計模式。

2、加強系統了解

重要閱讀下面的幾本書:

  • 《Unix編程藝術》了解Unix系統領域中的設計和開發哲學、思想文化體系、原則與經驗。你一定會有一種醍醐灌頂的感覺。
  • 《Unix網路編程卷1,套接字》這是一本看完你就明白網路編程的書。重要注意TCP、UDP,以及多路復用的系統調用select/poll/epoll的差別。
  • 《TCP/IP詳解 卷1:協議》- 這是一本看完後你就可以當網路黑客的書。了解乙太網的的運作原理,了解TCP/IP的協議,運作原理以及如何TCP的調優。
  • 實踐任務:
    • 理解什麼是阻塞(同步IO),非阻塞(非同步IO),多路復用(select, poll, epoll)的IO技術。
    • 寫一個網路聊天程序,有聊天伺服器和多個聊天客戶端(服務端用UDP對部分或所有的的聊天客戶端進Multicast或Broadcast)。
    • 寫一個簡易的HTTP伺服器。
  • 《Unix網路編程卷2,進程間通信》信號量,管道,共享內存,消息等各種IPC…… 這些技術好像有點老掉牙了,不過還是值得了解。
  • 實踐任務:
    • 主要實踐各種IPC進程序通信的方法。
    • 嘗試寫一個管道程序,父子進程通過管道交換數據。
    • 嘗試寫一個共享內存的程序,兩個進程通過共享內存交換一個C的結構體數組。
  • 學習《Windows核心編程》一書。把CreateProcess,Windows線程、線程調度、線程同步(Event, 信號量,互斥量)、非同步I/O,內存管理,DLL,這幾大塊搞精通。
  • 實踐任務:使用CreateProcess啟動一個記事本或IE,並監控該程序的運行。把前面寫過的那個簡易的HTTP服務用線程池實現一下。寫一個DLL的鉤子程序監控指定窗口的關閉事件,或是記錄某個窗口的按鍵。
  • 有了多線程、多進程通信,TCP/IP,套接字,C++和設計模式的基本,你可以研究一下ACE了。使用ACE重寫上述的聊天程序和HTTP伺服器(帶線程池)
  • 實踐任務:通過以上的所有知識,嘗試
    • 寫一個服務端給客戶端傳大文件,要求把100M的帶寬用到80%以上。(注意,磁碟I/O和網路I/O可能會很有問題,想一想怎麼解決,另外,請注意網路傳輸最大單元MTU)
    • 了解BT下載的工作原理,用多進程的方式模擬BT下載的原理。

3、系統架構

  • 負載均衡。HASH式的,純動態式的。(可以到Google學術里搜一些關於負載均衡的文章讀讀)
  • 多層分散式系統 – 客戶端服務結點層、計算結點層、數據cache層,數據層。J2EE是經典的多層結構。
  • CDN系統 – 就近訪問,內容邊緣化。
  • P2P式系統,研究一下BT和電驢的演算法。比如:DHT演算法。
  • 伺服器備份,雙機備份系統(Live-Standby和Live-Live系統),兩台機器如何通過心跳監測對方?集群主結點備份。
  • 虛擬化技術,使用這個技術,可以把操作系統當應用程序一下切換或重新配置和部署。
  • 學習Thrift,二進位的高性能的通訊中間件,支持數據(對象)序列化和多種類型的RPC服務。
  • 學習Hadoop。Hadoop框架中最核心的設計就是:MapReduce和HDFS。MapReduce的思想是由Google的一篇論文所提及而被廣為流傳的,簡單的一句話解釋MapReduce就是「任務的分解與結果的匯總」。HDFS是Hadoop分散式文件系統(Hadoop Distributed File System)的縮寫,為分散式計算存儲提供了底層支持。
  • 了解NoSQL資料庫(有人說可能是一個過渡炒作的技術),不過因為超大規模以及高並發的純動態型網站日漸成為主流,而SNS類網站在數據存取過程中有著實時性等剛性需求,這使得目前NoSQL資料庫慢慢成了人們所關注的焦點,並大有成為取代關係型資料庫而成為未來主流數據存儲模式的趨勢。當前NoSQL資料庫很多,大部分都是開源的,其中比較知名的有:MemcacheDB、Redis、Tokyo Cabinet(升級版為Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。

寫了那麼多,回顧一下,覺得自己相當的有成就感。希望大家不要嚇著,我自己這十來年也在不斷地學習,今天我也在學習中,人生本來就是一個不斷學習和練級的過程。不過,一定有漏的,也有不對的,還希望大家補充和更正。(我會根據大家的反饋隨時更新此文)歡迎大家通過我的微博(@左耳朵耗子)和twitter(@haoel)和我交流。

—– 更新 2011/07/19 —–

1)有朋友奇怪為什麼我在這篇文章開頭說了web+移動,卻沒有在後面提到iOS/Android的前端開發。因為我心裡有一種感覺,移動設備上的UI最終也會被Javascript取代。大家可以用iPhone或Android看看google+,你就會明白了。

2)有朋友說我這裡的東西太多了,不能為了學習而學習,我非常同意。我在文章的前面也說了要思考。另外,千萬不要以為我說的這些東西是一些新的技術,這份攻略里95%以上的全是基礎。而且都是久經考驗的基礎技術。即是可以讓你一通百通的技術,也是可以讓你找到一份不錯工作的技術。

3)有朋友說學這些東西學完都40了,還不如想想怎麼去掙錢。我想告訴大家,一是我今年還沒有40歲,二是學無止境啊,三是我不覺得掙錢有多難,難的是怎麼讓你值那麼多錢?無論是打工還是創業,是什麼東西讓你自己的價值,讓你公司的價值更值錢?別的地方我不敢說,對於互聯網或IT公司來說,技術實力絕對是其中之一。

4)有朋友說技術都是工具,不應該如此痴迷這句話沒有錯,有時候我們需要更多的是抬起頭來看看技術以外的事情,或者是說我們在作技術的時候不去思考為什麼會有這個技術,為什麼不是別的,問題不在於技術,問題在於我們死讀書,讀死書,成了技術的書獃子。

5) 對於NoSQL,最近比較火,但我對其有點保守,所以,我只是說了解就可以。對於Hadoop,我覺得其在分散式系統上有巨大的潛力,所以需要學習。 對於關係型資料庫,的確是很重要的東西,這點是我的疏忽,在原文里補充。


看到這個問題忽然很感慨。
因為我很久之前看到了一個很贊的答案,至今就抽出了這樣的時間來專門實踐這種自習的方法。
答案來自Stack Exchange - Programmers,作者是Joel Spolsky,Stack Exchange(Stack Overflow)以及相關的一系列網站的創始人。
以下是渣翻。
——————
原文:
How can I teach a bright person, with no programming experience, how to program?
問:應該如何去教一個聰明但完全沒編過程的人編程?
內容:
我被單位分配了個任務:他們要我去教一個完全不會編程,但十分聰明有能力的人編程,讓他來維護我們的 .Net的程序。我確信這個人最終肯定可以學會編程,但我在尋找最短期有效的方法。我自己有些主意,但是想聽聽大家的意見。我知道方法可能因他想學的內容而異,但我想了解一下大概的思路。
問題如下:你認為什麼方法能讓一個非程序員快速學會編程,到達能設計/維護程序的程度?

Joel Spolsky的答案:

對想要學編程的人,我一般都是推薦這種學習順序。這種方法學的東西比較理論,但是會給你打下好的基礎。全心全力學習的話估計要花3-4個月,但編程這種東西不是一兩天能搞定的。

如果你連這個都搞不定,你學不會編程的,不如早點放棄。

  1. Code, by Charles Petzold.
  2. The C Programming Language, Kamp;R
  3. The Structure and Interpretation of Computer Programs, Abelson and Sussman.

方法是:讀完這三本書,拼了命去讀如果覺得搞不定。可以問問題,但一定在自己認真思考之後。如果你能搞定這三本書,恭喜你,你是一名程序員了。現在不管是什麼《15分鐘學Perl》還是書店裡那些大部頭的Java書,你都能搞定的。如果連這三本書都搞不定,回家洗洗睡吧,你學不會編程的。
說實話,我覺得你不一定非要學C和Scheme。學習它們只是為你將來學習打下基礎。這兩本書都是看起來很簡單(C和Scheme都是超級容易的語言),但正因如此,它們不用浪費時間教你複雜的編程語法,而是教你真正的編程思想。所以它們對於重新給你灌輸正確的編程思想來說,都是不可多得的好書。
試圖去抄近路直接學你現在想學的東西(就像C#和http://ASP.NET)註定會失敗。
——————
以下是個人的感想。
編程中,重要的並不是語言,而是編程的思想。
一旦思想學會了,語言很簡單。比如自己只會Java在假期給別人寫C#程序,一周就能開始寫了,因為那些編程思想都是想通的。(碰巧Java和C#又那麼像啦 &>_&<) 據說,一個程序員學第n門語言的時間為(1/2)^(n-1) :1, 1/2, 1/4...

Joel推薦的三本書,其中23我認為是極好的書,他自己也沒對為何選1做出解釋。
(我自己讀過1,1是一本講硬體方面的書,如果對硬體方面完全不感興趣,其實可以忽略。)
KR最大的優勢我認為在於:
1. 讀完之後你再去弄Java之類的OOP,才會懂得OOP的好。
2. 對於程序有更low level的認識。(反而如果從Java開始學,可能一輩子都不知道pointer是什麼東西。)
SICP的優勢則在於:
1. 讓你了解Functional Programming。(很火的Clojure,Scala, F#都是FP,Java8據說也會加入FP)
2. 通過FP更深地理解Algorithm和Data Structure。這也就是編程中我所說的的「核心思想」的一部分。

好吧,對你,我的推薦是這三項:
1. 英語
2. KR
3. SICP

對於英語,我的意見就是:不學英語你頂多只能成為一個一般的程序員,絕對成為不了好的程序員。
看樓主應該是看得懂英語的,挺不錯。
把你的Ubuntu打開,開始一頁一頁地啃這兩本書。
需要的應該只有數學思維,英語,以及耐心。
啃完之後如果覺得Algorithm還是不熟可以去買一本Robert Sedgewick的Algorithm補一補。不用去學CLRS,太學術...
學完這些之後其實再學Python會挺好的。不用買書,直接讀Python官網的Tutorial和Documentation就可以了。
有什麼問題,去Stack Overflow問。提問前讀讀這篇文章:What have you tried?

最後具體說說。要做網站,HTML和CSS是必定要學的,但這兩個在做網頁app時候都不會特別難,而且不適合作為初期學習的語言,因為很難用它們來教編程思想。
真正難的是Javascript。但是有了這兩本書做底子,其實很容易學。去讀讀Mozilla Developer Network的Javascript Tutorial,開始寫程序。學一個Framework,再開始寫程序。回頭去讀讀Javascript: the good parts. 回去繼續寫。慢慢積累,多做項目,碰到什麼學什麼,其實沒有那麼難~(我現在就是這樣)
如果做網站,最好還是學一學PHP,不過有了這些底子,也不會很難的。
Database也得學,而且需要些時間學好,慢慢積累就成。
有了這樣的底子,如果要去學Java,C#也不會特別難。
然後真正開始設計程序的時候,學各種library和framework也會很輕鬆的。

我很反對一些人說你得學什麼OS,Compilers,Programming Language Design之類的東西,那些如果你不搞學術也不是專門搞這些領域,沒有太大必要學。當然學了肯定會讓你編程的能力更上一層樓,但個人感覺只是錦上添花罷了。(因為你說你主要想做的是網頁app和網站。)
而且,連基礎都沒打好,一開始去專註學那些複雜的東西,就像天朝高中的理化教育一樣,只注重於刷題和知識點,而不講各種公式/反應背後的深層聯繫。一個人或許能靠刷題成為學霸,高考考個高分,但很難對理化有獨特、創新的理解,也無法領略其精髓。編程也是如此,如果只注重於學手頭要學的東西,或許你能學個Java做出一兩個滿是spaghetti code的小app,但很難做大,做精,做美,同時也很難領略編程真正的魅力。

最後插一句,別相信Joel說的」C是超級容易的語言「這句話。

寫Readable, efficient, secure的C簡直是...(略


知乎的推薦系統好像有問題了~~,推薦了一個這麼舊的問題。

我是來(zuo)回(guang)答(gao)這個問題的後半部分的:

這裡呢,又出現了由於知識不系統而出現的問題:我其實不清楚程序員的分工是什麼樣的。
我不清楚做網站前端和後端的區別是什麼,我也不清楚什麼是設計而什麼是開發。

就我自己來說,我自己的興趣是做網站,同時也對 UE、UI 設計特別感興趣。
另外也希望學習到手機 App 的開發。

所以希望各位能指點下,希望達到上面目標的話,怎麼樣系統的進行自學?
同時有什麼教材可以推薦?

推薦一下我最近正在編寫的《GitHub - phodal/growth-ebook: Growth: 全棧增長工程師指南。Growth: Learning Full Stack》

目錄如下:

  • Growth: 全棧增長工程師指南
    • 全棧工程師是未來
      • 技術的革新史
      • 軟體開發的核心難題:溝通
      • 大公司的專家與小公司的全棧
      • 全棧工程師的未來:無棧
  • 基礎知識篇
    • 工具只是輔助
      • WebStorm還是Sublime?
      • 語言也是一種工具
    • 提高效率的工具
      • 快速啟動軟體
      • IDE
      • DEBUG工具
      • 終端或命令提示符
      • 包管理
    • 環境搭建
      • OS X
      • Windows
      • GNU/Linux
    • 學好一門語言的藝術
      • 一次語言學習體驗
      • 輸出是最好的輸入
      • 如何應用一門新的技術
    • Web編程基礎
      • 從瀏覽器到伺服器
      • 從HTML到頁面顯示
    • HTML
      • hello,world
      • 中文?
      • 其他html標記
      • 小結
    • CSS
      • 簡介
      • 樣式與目標
      • 選擇器
      • 更有趣的CSS
    • JavaScript
      • hello,world
      • JavaScriptFul
      • 面向對象
      • 其他
  • 前端與後台
    • 後台語言選擇
      • JavaScript
      • Python
      • Java
      • PHP
      • 其他
    • MVC
      • Model
      • View
      • Controller
      • 更多
    • 後台即服務
      • API演進史
      • 後台即服務
    • 數據持久化
      • 文件存儲
      • 資料庫
      • 搜索引擎
    • 前端框架選擇
      • Angular
      • React
      • Vue
      • jQuery系
    • 前台與後台交互
      • Ajax
      • JSON
      • WebSocket
  • 編碼
    • 編碼過程
    • Web應用的構建系統
      • Web應用的構建過程
      • Web應用的構建實戰
    • Git與版本控制
      • 版本控制
      • Git
    • Tasking
      • 如何Tasking一本書
      • Tasking開發任務
    • 寫代碼只是在碼字
    • 如何編寫測試
      • 測試金字塔
      • 如何測試
    • 測試替身
      • Stub
      • Mock
    • 測試驅動開發
      • 紅-綠-重構
      • 測試先行
    • 可讀的代碼
      • 命名
      • 函數長度
      • 重複代碼
    • 代碼重構
      • 重命名
      • 提取變數
      • 提煉函數
    • Intellij Idea重構
      • 提煉函數
      • 內聯函數
      • 查詢取代臨時變數
    • 重構到設計模式
      • 過度設計與設計模式
  • 上線
    • 容器
      • Web容器
      • 應用容器
    • Docker
    • LNMP架構
      • Linux
      • HTTP伺服器
    • 代理伺服器
    • Web緩存
      • 資料庫端緩存
      • 應用層緩存
      • 前端緩存
      • 客戶端緩存
      • HTML5 離線緩存
    • 可配置
    • Toggle
      • PropertyPlaceHolder
    • 自動化部署
  • 數據分析
    • 數據分析
      • 數據分析的過程
    • Google Analytics
      • 受眾群體
      • 流量獲取
      • 移動應用
    • SEO
      • 爬蟲與索引
      • 什麼樣的網站需要SEO?
      • SEO基礎知識
      • 內容
    • Hadoop分析數據
      • 數據源
      • 數據分析
      • 學習
    • UX
      • 什麼是UX
    • UX入門
      • 什麼是簡單?
      • 進階
      • 用戶體驗要素
    • 認知設計
  • 持續交付
    • 持續集成
      • 前提條件
      • 瀑布流式開發
      • 小步前進
    • 持續交付
      • 配置管理
      • 持續集成
      • 測試
      • 構建與部署
      • 自動化
  • 遺留系統與修改代碼
    • 遺留代碼
      • 什麼是遺留代碼
      • 遺留代碼的來源
      • 遺留代碼的問題
    • 如何修改代碼
    • 網站重構
      • 速度優化
      • 功能加強
      • 模塊重構
  • 回顧與架構設計
    • 自我總結
      • 吾日三省吾身
    • Retro
      • Well
      • Less Well
      • Suggestion
      • Action
    • 浮現式設計
      • 意圖導向
      • 重構
      • 模式與演進
    • 架構模式
      • 預設計式架構
      • 演進式架構
    • 每個人都是架構師
      • 如何構建一個博客系統
      • 相關閱讀資料
    • 架構解耦
      • MVC
      • CQRS
      • 高級CQRS

HTML這麼一坨補丁一樣的東西怎能讓你系統、科學地學會編程知識?再說了縱觀全世界所有計算機課程,至少都包含下面的東西:
1、編譯原理(龍書、虎書、Parsing Techniques)
2、編程語言的原理(名稱五花八門,雖然SICP超簡單但是從這裡開始大概對你來說是沒錯的,後面就是各種計算模型了,什麼λ-calculs,π-calculus,還有各種什麼CPS變換啊、combinator啊、partial evaluation啥的,總之順便學一下Haskell是沒錯的)
3、操作系統
4、資料庫(推薦Database Management System)
5、網路
6、演算法導論

這一疊如果你有工作,每天晚上啃個兩三小時的話,三四年應該可以搞定的。然後你就有資格讓人給你寫大程序的工作了,然後你就慢慢體會到什麼是設計模式,什麼是重構,什麼是測試(做太多不需要維護個七八年的項目只會讓你越來越爛)


前幾年的一天,會用Java寫Loop和Function表弟告訴我,他有機會加入公司的開發團隊,人家團隊是用JBOSS SEAM開發WebApp的。請我給他講講倒底還需要再學點什麼?
我花了整整一晚上的時間,給他畫了一張學習路線圖,還寫了一份說明並標註了重點
。。。。
後來,他轉行了。

圖在這兒(黃色是重點,紅色是重重點),文字就不發上來了吧!


如果不準備從事這個行業,非常不建議「系統、科學地自學編程」,這個時間成本普通人很難負擔得起。
換言之,我愛好音樂,「自學過笛子、口琴和吉他,請問如何系統、科學地自學音樂?」

所以清晰你的目標非常重要——要達到怎樣的高度願意付出怎樣的代價

如果僅僅是做網站做APP,目前有大量的快速開發框架,搭積木一樣玩兒似的,看看視頻模仿就行了,UE和UI看個人天份美感,個人不建議在這上面花太多時間,模仿完全足夠了。

回到音樂,如果只是簡單學鋼琴,不一定就學五線譜,在琴鍵上寫好1234567,還不是彈的不亦樂乎:)


作為一名前金融民工的半路出家的計算系學生,有些想法想和題主分享。

回答:
1.了解計算機世界的體系(建議閱讀計算機科學概論 豆瓣鏈接:計算機科學概論 (豆瓣))
理論層:計算理論(根基是數學)
硬體層:電子電路(根基是物理)
程序層:程序設計(包括編譯原理、各種程序語言等等)
系統層:操作系統(Unix, Linux, Mac OS, Windows)
應用層:軟體工程(這就包羅萬象不一一列舉了,小到計算器,大到大數據都是應用程序)

2.當你對計算機世界的宏觀景象有了初步的了解,你可以在每一個層級進行學習
理論層:去學習各種計算理論(資訊理論啊,圖靈機啊,P和NP啊)
硬體層:單片機啊嵌入式啊甚至是智能硬體(建議從Rasperry Pi或Arduino入手)
程序層:學習數據結構、演算法以及各種編程語言呀(建議語言C/Java/Python/JavaScript/Scala/Prolog,各種范型都來一個)
系統層: 哦耶,請讀這一本 深入理解計算機系統 (豆瓣)
應用層:試試自己開發各種小應用、小網站、小遊戲吧。

3.其實最重要的還是取決於你對自己的定位
理論層:數學家?計算機科學家?
硬體層:量子計算機研究人員?電氣工程專業碩士?
程序層:XX演算法發明者?YY語言發明者?
系統層:Linux內核貢獻者?系統首席架構師?
應用層:明星級程序員?(產品經理?)

想要在哪一個層次做得出色都不是件容易的事,祝學業順利。 : )


循序漸進容易失去興趣。
既然你標了Python標籤,那麼Python是一個很好的入口。
這個語言幾乎是萬能的,所以你可以確立一個目標,無論是寫一個網站,網路應用,有界面的windows程序,沒有界面的命令行程序,科學,繪圖。。。總之確立一個不要太高的目標然後去做。
其中有什麼不懂的地方,不僅要找到答案,等到一個段落後去找原因。
等到能寫出一個初步的程序,這時應該能體會到理論知識不足對自己造成的障礙,然後再去看相關的理論知識可以更有效率的理解。

最開始無從下手時,可以在知乎問幾個開源項目,從模仿開始。


看了題主介紹,發現題主那個雜阿,接觸不少東西,卻實際上很多都不懂,或者叫做接觸都比較淺。首先在答題前先亮底牌以示自己確實是一枚迷途碼農。

我自己本身也是畢業後自學編程,目前從事iOS開發。 題主問題 如何系統、科學的自學? 我覺得這個問題難!所限沒有了學習環境,畢業了!畢業就沒辦法像在學校一樣可以把全部時間花到學習上(這點我覺得大家都應該有感覺吧,畢業了上班了,事情多的,就算閑下來,也都不一定會把時間花在學習上,當然也有特別人愛學習,話不能說死嘛)。再來就是學習編程,語言那麼多,樓主要學哪個呀,難道題主想要精通各種武林絕學,號令天下,一統江湖嗎?請參考吐蕃國國師大輪明王鳩摩智,最後一心向佛。還是說點自身體會,僅僅是體會哦。

一開始到公司上班,身邊的同事有前端設計iOSandroidPHP還有漂亮的小編等,那時候會YY如果哪天UI我自己來,介面我自己寫,iOSandroid端也我自己來,那我真是吊炸天了。那時候公司氛圍很好,設計師在下班後會有Ps分享,PHP也有同事會給有興趣的同學上課。那時候只要有分享我都去,上完基本到現在全忘記了,一門語言工作中沒有經常用,給你幾個月時間你可以把他忘光(我當時還參加iOS培訓那時候一起培訓的同事到現在基本寫不了什麼代碼,只會寫自己的老本行,因為太久沒寫忘得特別快),後來覺得我沒有那種天賦,那種精力去獲得各家絕學,沒有鳩摩智那種野心,人家最後也一心向佛了。所以我還是老老實實做好我iOS本職工作,因為編程思想是相通的,好好學好一門,學有餘力再學其他的上手就很快了。
再來就是去哪裡學,因為自己是自學的,才知道自學有多苦,其實也不算苦,真心想學是不會覺得累的,那時候的我就翻兩本書,一本objective-c語法基礎,一本iOS開發基礎,然後網上各種找資料。天天都會看看看,活了20多年也就那幾個月算的上是全身心投入學習,高考要那樣還不985,211的。哎~
自學的缺點就是要走彎路,沒辦法沒人帶,翻翻以前的代碼那叫一個慘不忍睹。所以還是建議有經濟基礎的話去培訓機構培訓,學校回不去了嘛!新來的同事剛才培訓機構出來,他們那教材整理得很不錯。如果身邊有朋友從事那行業,那就可以就厚顏無恥去讓他教也行,不過這個會比較鬧心,朋友同學有自己的生活,你天天纏著人家學也不好,除非人家真心愿意教。

還有一個就是學習過程中:碰到問題,請先從網上找答案,我相信一開始都會是從白菜問題開始,慢慢的提升。一般來說基本都能找到解決方案。實在不行再請教朋友同事吧,我本人還是不是很喜歡一開始就去問,這樣挺不好的。如果到了沒法解決的難題的時候,我們會叫你大牛!碼神!

說的有點多,爪機打碼真累,午飯都沒吃,好像廢話多了點,題主勿怪!

綜上回答就是:學一門自己想學的,學有餘力再學其他,培訓機構是首選。(如果已畢業)學習中就靠毅力了。


這方面應該有點發言權,畢竟教過N多新手。
我覺得樓上都不太實用。
我首先建議你評價下自己,創造,興趣,學習速度裡面那些比較強。如果你都不強的話我建議你趁早放棄。畢竟這條路也沒多大意思。
然後學習路徑
我不建議你學C,C++。因為對於一個沒有經驗的人來說,太難入門了。如果你一定要學的話,我建議你完全跳過指針以及C++的類以後的高級技術。
我建議你從Java入手,如果你想學C#,那也可以。Java隱藏了一些比較難的細節,標準也比較統一,高級語言里比較簡單。而shell以及python等等腳本語言又太簡單,不太實用。
教程我建議你完全跳過樓上那些經典教程,市面上21天學懂XXX,XXX完全解析比較適合你。原因在於經典雖然很經典,但是現在的你吸收不了,最多知道一些know how,但是不能揚棄。實際工作和這些經典很不一樣的,照搬是不行的。最好就是不求甚懂,快速上手。當然你會寫出無數爛的程序,當你明白爛了想寫不爛的程序的時候你可以回去啃這些書,事半功倍。
學完一門語言我覺得就差不多了,接下去你應該選擇你喜愛的開發方向,網站,UI,APP太不一樣了,你只能選擇一樣。想好了再繼續下去。


多寫代碼多看書。
給自己定一個方向,一個目標。
現在移動端主要是android和ios,還有一個溫而不火的html5,相比之下,安卓更容易入門,有良好的java基礎就可以了,開發環境很隨便。ios會更有趣,但是入門成本有點高,虛擬機和黑蘋果會讓你感到很噁心的。
Anyway,想要系統的學習,記住,先會一點,然後慢慢會很多,朝三暮四會讓你什麼都得不到。
Ps.勤奮最重要啦,我現在帶的一些應屆生,我都無力吐槽了,狗屁不通,還不肯加班學習。哎!一入碼農深似海,考慮好!


對著程序員能力矩陣煉級即可。。
[譯文]程序員能力矩陣 Programmer Competency Matrix


階段0:科普讀物

The Element of Computing System, by Nisan Schocken

階段1:高級語言、演算法

課程1:Java + Data structure + Algorithms:

牆裂推薦UCB CS61B,可以去一畝三分地找,Youtube上也有講課全部視頻,一門課java語法、數據結構、演算法都包括了

書的話 Algorithms, by Sedgewick Wayne 還是不錯,畢竟有java寫的全部詳細code

如果需要algorithms analysis,可以參考Introduction to Algorithms

課程2:Linux Shell

推薦書 The Linux Command Line, by Shotts

課程3: C,C++和Python

Programming in C, by Kochan很基礎

C++ Primer, by Lippman etc.

階段2:架構、編譯、操作系統

課程1:Computer architecture

Computer Architecture: A Quantitative Approach, by Hennessy and Patterson 經典教材,後面的appendix適合不太有基礎的初學者

如果還是比較難可參考相同作者寫的另一本更基礎的書:Computer Organization and Design: the Hardware/Software Interface, by Patterson and Hennessy

課程2:Compilers
上課用的Modern Compiler Implement in C, by Appel etc. 書很老也沒仔細讀過,但該有的貌似也都有

課程3:Operating systems

網上很不錯的免費教材:Operating Systems: Three Easy Pieces, by Arpaci-Dusseau

課本:Operating Systems: Principles and Practice, by Anderson Dahlin

階段3:基礎實踐

課程1:Computer Networks

課程2:Database

推薦書 Database System Concepts, by Silberschatz, Korth, Sudarshan

課程3:Software engineering

階段4:研究領域

體系結構:High performance computing, Cybersecurity

AI/Data science:Machine learning, Computer linguistics, Computer vision

Computer graphics: VR/AR

硬體:VLSI, Embedded system


你這樣問,你永遠入不了門。從一個你想做的網站或者應用開始,從界面設計開始,再來邏輯部分,不會就查書,查手冊。不行就百度,比如說,你要做按鍵事件,如果你看書系統學習,什麼監聽器,事件,你只會越好越糊塗,直接百度相關代碼或者在csdn求大牛貢獻。你把產品做出來了,比你系統學完有意義。
你看這麼多在高校系統學計算機,是不是百分百會編程呢?最重要學會找問題,用適合自己的方法解決問題。


回答過這個問題了:會計轉行從事IT,如何在一年時間內全職學習? - Night Silent 的回答

java 自學群:151280557,每晚統一解答問題


找個感興趣的東西(比如寫伺服器、寫IOS程序什麼的),最好是比較好玩而且有些難度的。一邊寫一邊學,需要什麼上網問什麼。要認識到 編程只是一門工具,不是什麼武林門派。實用一點。你會發現你走的很遠。最怕網上一堆人問什麼」xxx牛不牛"、「怎麼才算精通xxxx」、「怎麼提高xxx水平「。多做一些實際的應用水平就會上來了。


  • Eclipse 是個工具,新上手是需要學習的,這和你編程好不好無關。
    我初學編程時 在 80 年代初,那時完全沒有現在五花八門的「輔助工具」。
  • 沒有系統的方法,唯有循序漸進。 但如你學 Coursera 和有名的大學教科書或課程,就不會偏離正軌。
  • 你已經能寫個網站,下一步可以寫更複雜的網站/應用程式,或和別人合作。
    (例如,我在搞手機的輸入法)
  • 其中一個更高級的方向是「演算法」、計算智能 (computational intelligence) 等,由「數據結構」這科開始。 但這不是唯一方向。
  • C 語言的指針是 C 的重要部分,基本上你要想像記憶體是一個個「盒子」,指針是一個數,「指向」某盒子。 就那麽簡單。 但這種低層次 (即接近機器語言) 的風格,現在已不太流行,除非你喜歡寫 OS 等。 寫 Python 不須為指針傷腦筋。
  • 網站的前端 = 網頁表面的東西,在使用者的電腦運行
    後端 = 在 server 運行,例如轉送給使用者一些資料

考計算機專業的研究生,我當年就是這麼乾的。

除了自學考試科目《數據結構》《操作系統》,順帶自學了《資料庫原理》《離散數學》《Pascal語言》《C語言》《彙編語言》,自學《編譯原理》的時候,看了兩章,沒看懂,覺得應該去考試驗證下,就去報名考研了。

然後就考上了。


年紀有點大了(26),還是準備去德國讀個三年的計算機本科


推薦閱讀:

怎樣學演算法?
為什麼發現身邊「努力卻得不到回報」的現象越來越普遍?
審計過程中,有哪些好的習慣從一開始就值得堅持?

TAG:編程 | 自學 | 學習方法 |