暗示:
- 不要亂書,不要亂追求新技術,新學期,通過很長一段時間基本的東西積累,將在將來至少10大致。
- 回想一下歷史,看看歷史上時間線上技術的發展,你才幹明確明天會是什麼樣。
- 必定要動手,樣例無論多麼簡單,建議至少本身手敲一遍看看是否理解了裏頭的細枝末節。
- 必定要學會思考。思考爲何要這樣。而不是那樣。還要觸類旁通地思考。
注:你或許會很是奇怪爲何如下的東西很是偏Unix/Linux。這是因爲我認爲Windows下的編程可能會在將來很是沒有前途,緣由例如如下:javascript
- 現在的用戶界面差點兒被兩個東西主宰了,1)Web,2)移動設備iOS或Android。Windows的圖形界面不吃香了。
- 愈來愈多的企業在用成本低性能高的Linux和各類開源技術來構架其系統,Windows的成本過高了。
- 微軟的東西變得太快了,很是不持久,他們全然是在玩弄程序猿。詳情參見《Windows編程革命史》
因此,我我的認爲之後的趨勢是前端是Web+移動,後端是Linux+開源。php
開發這邊基本上沒Windows什麼事。html
啓蒙入門
一、 學習一門腳本語言,好比Python/Ruby前端
可以讓你擺脫對底層語言的恐懼感,腳本語言可以讓你很是快開發出能用得上的小程序。實踐項目:java
- 處理文本文件,或者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)
爲何要學腳本語言,因爲他們實在是太方便了,很是多時候咱們需要寫點小工具或是腳原本幫咱們解決這個問題,你就會發現正規的編程語言太難用了。python
二、 用熟一種程序猿的編輯器(不是IDE) 和一些基本工具linux
- Vim / Emacs / Notepad++。學會怎樣配置代碼補全,外觀,外部命令等。
- Source Insight (或 ctag)
使用這些東西不是爲了Cool,而是這些編輯器在查看、改動代碼/配置文章/日誌會更快更有效率。nginx
三、 熟悉Unix/Linux Shell和常見的命令行web
- 假設你用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很是easy》)學會使用Unix/Linux你會發現圖形界面在某些時候實在是太難用了,至關地至關地減小工做效率。
四、 學習Web基礎(HTML/CSS/JS) + server端技術 (LAMP)
將來一定是Web的世界,學習WEB基礎的最佳站點是W3School。
- 學習HTML基本的語法
- 學習CSS怎樣選中HTML元素並應用一些基本樣式(關鍵詞:box model)
- 學會用 Firefox + Firebug 或 chrome 查看你認爲很是炫的網頁結構。並動態改動。
- 學習使用Javascript操縱HTML元件。理解DOM和動態網頁(http://oreilly.com/catalog/9780596527402) 網上有免費的章節。足夠用了。或參看 DOM 。
- 學會用 Firefox + Firebug 或 chrome 調試Javascript代碼(設置斷點,查看變量,性能,控制檯等)
- 在一臺機器上配置Apache 或 Nginx
- 學習PHP,讓後臺PHP和前臺HTML進行數據交互,對server對應瀏覽器請求造成初步認識。實現一個表單提交和反顯的功能。
- 把PHP鏈接本地或者遠程數據庫 MySQL(MySQL 和 SQL現學現用夠了)
- 跟完一個名校的網絡編程課程(好比:http://www.stanford.edu/~ouster/cgi-bin/cs142-fall10/index.php ) 不要認爲需要多於一學期時間,大學生是全職一學期選3-5門課,你業餘時間必定可以跟上
- 學習一個javascript庫(好比jQuery 或 ExtJS)+ Ajax (異步讀入一個server端圖片或者數據庫內容)+JSON數據格式。
- HTTP: The Definitive Guide 讀完前4章你就明確你天天上網用瀏覽器的時候發生的事情了(proxy, gateway, browsers)
- 作個小站點(好比:一個小的留言板,支持用戶登陸,Cookie/Session,增、刪、改、查。上傳圖片附件,分頁顯示)
- 買個域名,租個空間,作個本身的站點。
進階加深
一、 C語言和操做系統調用
二、學習Java
三、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 + 靜態頁面緩存的站點
四、學習關係型數據庫
- 你可以安裝MSSQLServer或MySQL來學習數據庫。
- 學習教科書裏數據庫設計的那幾個範式,1NF。2NF,3NF。……
- 學習數據庫的存過。觸發器。視圖。建索引。遊標等。
- 學習SQL語句,明確錶鏈接的各類概念(參看《SQL Join的圖示》)
- 學習怎樣優化數據庫查詢(參看《MySQL的優化》)
- 實踐任務:設計一個論壇的數據庫,至少知足3NF,使用SQL語句查詢本週,本月的最新文章,評論最多的文章。最活躍用戶。
五、一些開發工具
- 學會使用SVN或Git來管理程序版本號。
- 學會使用JUnit來對Java進行單元測試。
- 學習C語言和Java語言的coding standard 或 coding guideline。(我N年前寫過一篇關C語言很是easy的文章——《編程修養》。這樣的東西你可以上網查一下,一大堆)。
- 推薦閱讀《代碼大全》《重構》《代碼整潔之道》
高級深刻
一、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的各類設計模式。
二、增強系統瞭解
重要閱讀如下的幾本書:
三、系統架構
- 負載均衡。HASH式的。純動態式的。(可以到Google學術裏搜一些關於負載均衡的文章讀讀)
- 多層分佈式系統 – client服務結點層、計算結點層、數據cache層。數據層。J2EE是經典的多層結構。
- CDN系統 – 就近訪問,內容邊緣化。
- P2P式系統。研究一下BT和電驢的算法。比方:DHT算法。
- server備份,雙機備份系統(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,我認爲這是在分佈式系統中的巨大潛力。因此,有必要學習。 對於關係數據庫,確實是一件很是重要的,這是個人錯。添加在原文。