轉自於 http://edu.chinaitlab.com/jyxd/888913.html
一定要動手,不管是多麼簡單的例子
學會思考介面:1)web 2)行動裝置ios, Android windows不再吃香低成本高效能 : Linux+各種開源技術 windows成本高微軟東西變化太快,不持久,似乎在玩弄程式員以後發展趨勢:
前端 web+移動, 後端Linux+開源啟蒙入門 1、 學習一門指令碼語言,例如Python/Ruby可以讓你擺脫對底層語言的恐懼感,指令碼語言可以讓你很快開發出能用得上的小程式
實踐項目:(2012-6-28前解決)
處理文字檔,或者csv (關鍵詞 python csv, python open, python sys)
讀一個本地檔案,逐行處理(例如 word count,或者處理log)
遍曆本地檔案系統 (sys, os, path),例如寫一個程式統計一個目錄下所有檔案大小並按各種條件排序並儲存結果
跟資料庫打交道 (python sqlite),寫一個小指令碼統計資料庫裡條目數量
學會用各種print之類簡單粗暴的方式進行調試
2、 用熟一種程式員的編輯器(不是IDE) 和一些基本工具
Vim / Emacs / Notepad++,學會如何配置代碼補全,外觀,外部命令等
3、 熟悉Unix/Linux Shell和常見的命令列
至少學會用虛擬機器裡的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下的系統運行資訊
瞭解Regex,使用Regex來尋找檔案。
學會使用Unix/Linux你會發現圖形介面在某些時候實在是太難用了,相當地相當地降低工作效率。
4、 學習Web基礎(HTML/CSS/JS) + 伺服器端技術 (LAMP)
學習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進行資料互動,對伺服器相應瀏覽器請求形成初步認識。實現一個表單提交和反顯的功能。
把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圖形介面的編程
2、java學習
看經典的Core Java 《Java 核心技術編程》和《Java編程思想》
學習JDK,學會查閱Java API Doc http://download.oracle.com/javase/6/docs/api/
學會使用IDE Eclipse,使用Eclipse 編譯,調試和開發Java程式。
建一個Tomcat的網站,嘗試一下JSP/Servlet/JDBC/MySQL的Web開發。
3、Web的安全與架構
學習Web開發的安全問題(參考新浪微博被攻擊的這個事,以及Ruby的這篇文章)
學習HTTP Server的rewrite機制,Nginx的反向 Proxy機制,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語句,明白表串連的各種概念
如何最佳化資料庫查詢
實踐任務:
設計一個論壇的資料庫,至少滿足3NF,使用SQL語句查詢本周,本月的最新文章,評論最多的文章,最活躍使用者。
5、一些開發工具
學會使用SVN或Git來管理程式版本。
學會使用JUnit來對Java進行單元測試。
學習C語言和Java語言的coding standard 或 coding guideline.
推薦閱讀《代碼大全》《重構》《代碼整潔之道》
進階深入
1、C++ / Java 和物件導向
參看“C++學習信心圖” 和“21天學好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式的,純動態式的。
多層分布式系統 – 用戶端服務結點層、計算結點層、資料cache層,資料層。J2EE是經典的多層結構。
CDN系統 – 就近訪問,內容邊緣化。
P2P式系統,研究一下BT和電驢的演算法。比如:DHT演算法。
伺服器備份,雙機備份系統(Live-Standby和Live-Live系統),兩台機器如何通過心跳監測對方?叢集主結點備份。
虛擬化技術,使用這個技術,可以把作業系統當應用程式一下切換或重新設定和部署。
學習Thrift,二進位的高效能的通訊中介軟體,支援資料(對象)序列化和多種類型的RPC服務。
學習Hadoop. Hadoop架構中最核心的設計就是:MapReduce和HDFS.MapReduce的思想是由Google的一篇論文所提及而被廣為流傳的,簡單的 一句話解釋MapReduce就是“任務的分解與結果的匯總”。HDFS是HadoopDistributed File System(Hadoop
Distributed File System)的縮寫,為分散式運算儲存提供了底層支援。
瞭解NoSQL資料庫(有人說可能是一個過渡炒作的技術),不過因為超大規模以及高並發的純動態型網站日漸成為主流,而SNS類網站在資料存取過程中有著 即時性等剛性需求,這使得目前NoSQL資料庫慢慢成了人們所關注的焦點,並大有成為取代關係型資料庫而成為未來主流資料存放區模
式的趨勢。當前NoSQL資料庫很多,大部分都是開源的,其中比較知名的有:MemcacheDB、Redis、Tokyo Cabinet(升級版為Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。
有時候我們需要更多的是抬起頭來看看技術以外的事情,或者是說我們在作技術的時候不去思考為什麼會有這個技術,為什麼不是別的,問題不在於技術,問題在於我們死讀書,讀死書,成了技術的書獃子。
Fighting! Fighting!