天天看點

書籍-傳承至今的智慧載體

   首先,請允許我啰嗦幾句~萬丈高樓平地起!沒有哪個IT大神是生而知曉一切,不用學習的。他/她們一樣是一步一步學出來、練出來的。别不信!沒有不勞而獲的成功! 基礎是關鍵,走穩了再學跑!也别小貓釣魚,今天覺得這個有意思,明天又看到那個很火......搖擺不定的人,必将一事無成!至少在你精通一門技術或語言前,隻會落得這個下場!

   其次,說下這次寫文章的主要目的--給猿類推薦一些有用的書籍。個人覺得看書是學習和提高的一個重要途徑,有所讀,必有所思。有所思,必有所獲。有所獲,才得成長。

   在網上搜羅了一些書籍名稱,希望對某個階段的你有所幫助!( PS:有些資料收費的,發連結也沒用...)。

 (一) 啟蒙入門階段:

  1、建議看一些基礎的入門書,比如:《XXX基礎入門》、《XXX從入門到精通》 等等,這類書籍一般不會寫的太深。

實踐方面呢,建議學習一門小腳本語言,例如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和動态網頁(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 Definite 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 http://download.oracle.com/javase/6/docs/api/ 

了解一下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、一些開發工具 

學會使用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等。 

   大緻分這三個階段。當然,學無止境!學習的成就是不存在上限的!愛因斯坦都沒占用多大的"記憶體",何況是我們......。

  借鑒參考過其他資料--《程式員一生必讀的書》《程式設計指引者》等