1. 要成為一名專業的程序員,從零開始需要怎麼一步步來比較好,要把最底層的先學精通嗎(個人認為)求學長
前言
你是否覺得自己從學校畢業的時候只做過小玩具一樣的程序?走入職場後哪怕沒有什麼經驗也可以把以下這些課外練習走一遍(朋友的抱怨:學校課程總是從理論出發,作業項目都看不出有什麼實際作用,不如從工作中的需求出發)
建議:
不要亂買書,不要亂追新技術新名詞,基礎的東西經過很長時間積累而且還會在未來至少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/tcpmp/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.e/~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/WinProcere,以及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框架中最核心的設計就是:MapRece和HDFS。MapRece的思想是由Google的一篇論文所提及而被廣為流傳的,簡單的一句話解釋MapRece就是「任務的分解與結果的匯總」。HDFS是Hadoop分布式文件系統(Hadoop Distributed File System)的縮寫,為分布式計算存儲提供了底層支持。
了解NoSQL資料庫(有人說可能是一個過渡炒作的技術),不過因為超大規模以及高並發的純動態型網站日漸成為主流,而SNS類網站在數據存取過程中有著實時性等剛性需求,這使得目前NoSQL資料庫慢慢成了人們所關注的焦點,並大有成為取代關系型資料庫而成為未來主流數據存儲模式的趨勢。當前NoSQL資料庫很多,大部分都是開源的,其中比較知名的有:MemcacheDB、Redis、Tokyo Cabinet(升級版為Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。
2. 如何從零開始學編程
在你學習編程之前思考一下你的目標,當你有最終目標時道路會更加的清晰。那麼,你想要寫什麼?網站?游戲?iOS或者Android應用?或是你是想自動化完成一些乏味的任務讓你有更多的時間看窗外的風景?也許你只是想更具有就業競爭力找個好工作。所有的這些都是有價值的目標,這些目標都是你編程學習推動力的一部分,沒有推動力的人,是無法在略顯枯燥的漫長學習之旅中走遠的。
不要浮躁
Badprogrammingiseasy.EvenDummiescanlearnitin21days.,meswithit.
不管是在線下還是線上的書店,滿目都是《21天學通Java》這種速成書目,它們都承諾在很短一段時間內就讓你能夠學會相關技術。MatthiasFelleisen在他的著作HowtoDesignPrograms,SecondEdition一書中明確指出了這種「速成」的趨勢並予以了以上的諷刺。
所謂的「捷徑」或者說「銀彈」是不存在的,智者說過,精通某個東西需要10年或10000個小時,也就是漢語中的「十年磨一劍」,所以不用著急,功不唐捐。
培養興趣
ionbythepublic,butbecauseitisfuntoprogram.
_LinusTorvalds
沉醉於編程,編程更是為了興趣。興趣是推動力的不竭源泉,保持這種充滿興趣的感覺,以便於你能將其投入到你的10年/10000小時的編程時間中。編程很有趣,那是探索的喜悅。那是創造的喜悅。看到自己親手完成的作品顯示在屏幕上很有趣。有人為你的代碼而驚嘆很有趣。有人在公共場合稱贊你的產品、鄰居使用你的產品、以及在媒體上討論你的產品很有趣。編程應該十分有趣,若並非如此,就找出導致編程無趣的問題,然後解決之。
在這里對於初學者有兩個大坑:
如果初學者們只與預先構建好的「發動機和組件」接觸(沒有理解和思考它們構造的原理),這會嚴重限制他們在將來構建這些東西的能力,並且在診斷解決問題時無從下手。
第二個坑沒有第一個那麼明顯:幼稚的「整體論」方法有些時候會顯得很有效,這有一定的隱蔽性與誤導性,但是一兩年過後(也許沒那麼長),當你在學習路上走遠時,再想回過頭來「補足基礎」會有巨大的心理障礙,你得拋棄之前自己狹隘的觀念,耐心地緩步前進,這比你初學時學習基礎知識困難得多。
但臘敏茄也不能矯枉過正,陷入還原論的大坑,初學時便一心試圖做宏大的理論,這樣不僅有一切流於理論的危險,枯燥和乏味還會讓你失去推動力。這種情況經常發生在計算機科班生身上。
為了更好理解,可以將學習編程類比為學習廚藝:你為了燒得一手好菜買了一些關於菜譜的書,如果你只是想為家人做菜,這會是一個不錯的主意,你重復菜譜上的步驟也能做出不賴的菜餚,但是如果你有更大的野心,真的想在朋友面前露一手,做一些獨一無二的美味佳餚,甚至成為「大廚」,你必須理解這些菜譜背後大師的想法,理解其中的理論,而不僅僅是一味地實踐。但拿猛是如果你每天唯一的工作就是閱讀那些厚重的理論書籍,因為缺乏實踐,你只會成為一個糟糕的廚子,甚至永遠成為不了廚子,因為看了幾天書後你就因為枯燥放棄了廚藝的學習。
總之,編程是連接理論與實踐的紐帶,是計算機科學與計算機應用技術相交融的領域。正確的編程學習方法應該是:通過自頂而下的探索與項目實踐,獲得編程直覺與推動力;從自底向上的打基礎過程中,獲得最重要的通用方法並鞏固編程思想的理解。
作為初學者,應以後者為主,前者為輪察輔。
啟蒙
「學編程應該學哪門語言?」這經常是初學者問的第一個問題,但這是一個錯誤的問題,你最先考慮的問題應該是「哪些東西構成了編程學習的基礎」?
編程知識的金字塔底部有三個關鍵的部分:
演算法思想:例如怎樣找出一組數中最大的那個數?首先你得有一個maxSoFar變數,之後對於每個數
語法:我怎樣用某種編程語言表達這些演算法,讓計算機能夠理解。
系統基礎:為什麼while(1)時線程永遠無法結束?為什麼int*foo(){intx=0;return&x;}是不可行的?
啟蒙階段的初學者若選擇C語言作為第一門語言會很困難並且枯燥,這是因為他們被迫要同時學習這三個部分,在能做出東西前要花費很多時間。
因此,為了盡量最小化「語法」與「系統基礎」這兩部分,建議使用Python作為學習的第一門語言,雖然Python對初學者很友好,但這並不意味著它只是一個「玩具」,在大型項目中你也能見到它強大而靈活的身影。熟悉Python後,學習C語言是便是一個不錯的選擇了:學習C語言會幫助你以靠近底層的視角思考問題,並且在後期幫助你理解操作系統層級的一些原理,如果你只想成為一個普通(平庸)的開發者你可以不學習它。
下面給出了一個可供參考的啟蒙階段導引,完成後你會在頭腦中構建起一個整體框架,幫助你進行自頂向下的探索。
完成Codecademy的Python部分。這只是熱身部分,盡快完成它,因為你永遠只是在瀏覽器里,你不會學到如何搭建開發環境。在Codecademy這類的編程學習網站學到的那點兒東西,哪怕你只想做一個小的不能再小的項目,你都不知道該從哪兒開始。
完成MIT6.00.1x(中文化)(如果你英語不過關,完成麻省理工學院公開課:計算機科學及編程導論。MOOC是學習編程的一個有效途徑。雖然該課程的教學語言為Python,但作為一門優秀的導論課,它強調學習計算機科學領域里的重要概念和範式,而不僅僅是教你特定的語言。如果你不是科班生,這能讓你在自學時開闊眼界;課程內容:計算概念,python編程語言,一些簡單的數據結構與演算法,測試與調試。支線任務:
完成Python核心編程
完成HarvardCS50(如果你英語不過關:完成哈佛大學公開課:計算機科學cs50。同樣是導論課,但這門課與MIT的導論課互補。教學語言涉及C,PHP,JavaScript+SQL,HTML+CSS,內容的廣度與深度十分合理,還能夠了解到最新的一些科技成果,可以很好激發學習計算機的興趣。支線任務:
閱讀《編碼的奧秘》
完成《C語言編程》
[可選]如果你的目標是成為一名Hacker:閱讀Hacker'sDelight
PS:如果教育對象還是一個孩子,以下的資源會很有幫助:
5-8歲:TurtleAcademy
8-12歲:PythonforKids
12歲以上:MITScratch或KhanAcademy
入門
結束啟蒙階段後,初學者積累了一定的代碼量,對編程也有了一定的了解。這時你可能想去學一門具體的技術,諸如Web開發,Android開發,iOS開發什麼的,你可以去嘗試做一些盡可能簡單的東西,給自己一些正反饋,補充自己的推動力。但記住別深入,這些技術有無數的細節,將來會有時間去學習;同樣的,這時候也別過於深入特定的框架和語言,現在是學習計算機科學通用基礎知識的時候,不要試圖去抄近路直接學你現在想學的東西,這是註定會失敗的。
那麼入門階段具體該做些什麼呢?這時候你需要做的是反思自己曾經寫過的程序,去思考程序為什麼(Why)要這樣設計?,思考怎樣(How)寫出更好的程序?試圖去探尋理解編程的本質:利用計算機解決問題。
設想:
X=用於思考解決方案的時間,即「解決問題」部分
Y=用於實現代碼的時間,即「利用計算機」部分」
編程能力=F(X,Y)(X>Y)
要想提高編程能力,就得優化X,Y與函數F(X,Y),很少有書的內容能同時著重集中在這三點上,但有一本書做到了——(SICP)《計算機程序的構造和解釋》,它為你指明了這三個變數的方向。在閱讀SICP之前,你也許能通過調用幾個函數解決一個簡單問題。但閱讀完SICP之後,你會學會如何將問題抽象並且分解,從而處理更復雜更龐大的問題,這是編程能力巨大的飛躍,這會在本質上改變你思考問題以及用代碼解決問題的方式。此外,SICP的教學語言為Scheme,可以讓你初步了解函數式編程。更重要的是,他的語法十分簡單,你可以很快學會它,從而把更多的時間用於學習書中的編程思想以及復雜問題的解決之道上。
PeterNorvig曾經寫過一篇非常精彩的SICP書評,其中有這樣一段:
Touseananalogy,ifSICPwereaboutautomobiles,,howtheyarebuilt,andhowonemightdesignfuel-efficient,safe,.highway,justlikeeveryoneelse.
如果你是文中的前者,閱讀SICP將成為你銜接啟蒙與入門階段的關鍵點
雖然SICP是一本「入門書」,但對於初學者還是有一定的難度,以下是一些十分有用的輔助資源:
):由上文提到的Google研究主管PeterNorvig主講,教學語言為Python,內容有一定難度。
HowtoDesignPrograms,SecondEdition:HtDP的起點比SICP低,書中的內容循循善誘,對初學者很友好,如果覺得完成SICP過於困難,可以考慮先讀一讀HtDP。
UCBerkeleySICP授課視頻以及SICP的兩位作者給Hewlett-Packard公司員工培訓時的錄像(中文化項目)
ComposingPrograms:一個繼承了SICP思想但使用Python作為教學語言的編程導論(其中包含了一些小項目)
SICP解題集:對於書後的習題,作為初學者應盡力並量力完成。
完成了這部分學習後,你會逐步建立起一個自己的程序設計模型,你的腦子里不再是一團亂麻,你會意識到記住庫和語法並不會教你如何解決編程問題,接下來要學些什麼,在你心裡也會明朗了很多。這時候才是真正開始進行項目實踐,補充推動力的好時機。
關於項目實踐:對於入門階段的初學者,參與開源項目還為時過早,這時候應該開始一些簡單的項目,諸如搭建一個網站並維護它,或是編寫一個小游戲再不斷進行擴展,如果你自己的想法不明確,MegaProjectList中選取項目。總之,務必在這時拿下你項目實踐的第一滴血。
與此同時,別忘了繼續打好根基。為了將來的厚積薄發,在下面這幾個方面你還要繼續做足功課(注意:下面的內容沒有絕對意義上的先後順序):
計算機系統基礎
有了之前程序設計的基礎後,想更加深入地把握計算機科學的脈絡,不妨看看這本書:《深入理解計算機系統》ComputerSystemsAProgrammer'sPerspective。這里點名批評這本書的中譯名,其實根本談不上什麼深入啦,這本書只是CMU的「計算機系統導論」的教材而已。CMU的計算機科學專業相對較偏軟體,該書就是從一個程序員的視角觀察計算機系統,以「程序在計算機中如何執行」為主線,全面闡述計算機系統內部實現的諸多細節。
如果你看書覺得有些枯燥的話,可以跟一門Coursera上的MOOC:TheHardware/SoftwareInterface,這門課的內容是CSAPP的一個子集,但是最經典的實驗部分都移植過來了。同時,可以看看TheCProgrammingLanguage,回顧一下C語言的知識。
完成這本書後,你會具備堅實的系統基礎,也具有了學習操作系統,編譯器,計算機網路等內容的先決條件。當學習更高級的系統內容時,翻閱一下此書的相應章節,同時編程實現其中的例子,一定會對書本上的理論具有更加感性的認識,真正做到經手的代碼,從上層設計到底層實現都瞭然於胸,並能在腦中回放數據在網路->內存->緩存->CPU的流向。
此外,也是時候去接觸UNIX哲學了:KISS-KeepitSimple,Stupid.在實踐中,這意味著你要開始熟悉命令行界面,配置文件。並且在開發中逐漸脫離之前使用的IDE,學會使用Vim或Emacs(或者最好兩者都去嘗試)。
閱讀《UNIX編程環境》
閱讀《UNIX編程藝術》
折騰你的UN*X系統
數據結構與演算法基礎
如今,很多人認為編程(特別是做web開發)的主要部分就是使用別人的代碼,能夠用清晰簡明的方式表達自己的想法比掌握硬核的數學與演算法技巧重要的多,數據結構排序函數二分搜索這不都內置了嗎?工作中永遠用不到,學演算法有啥用啊?這種扛著實用主義大旗的「碼農」思想當然不可取。沒有扎實的理論背景,遭遇瓶頸是遲早的事。
數據結構和演算法是配套的,入門階段你應該掌握的主要內容應該是:這個問題用什麼演算法和數據結構能更快解決。這就要求你對常見的數據結構和演算法了熟於心,你不一定要敲代碼,用紙手寫流程是更快的方式。對你不懂的數據結構和演算法,你要去搜它主要拿來幹嘛的,使用場景是什麼。
供你參考的學習資源:
《演算法導論》:有人說別把這本書當入門書,這本書本來就不是入門書嘛,雖說書名是IntroctiontoAlgorithms,這只不過是因為作者不想把這本書與其他書搞重名罷了。當然,也不是沒辦法拿此書入門,讀第一遍的時候跳過習題和證明就行了嘛,如果還覺得心虛先看看這本《數據結構與演算法分析》
CourseraAlgorithms:DesignandAnalysis[Part1]&[Part2]:Stanford開的演算法課,不限定語言,兩個部分跟下來演算法基礎基本就有了;英語沒過關的:麻省理工學院公開課:演算法導論
入門階段還要注意培養使用常規演算法解決小規模問題的能力,結合前文的SICP部分可以讀讀這幾本書:《編程珠璣》,《程序設計實踐》
編程語言基礎
.,.Additionally,,
-ThePragmaticProgrammer
此外還要知道,學習第n門編程語言的難度是第(n-1)門的一半,所以盡量去嘗試不同的編程語言與編程範式,若你跟尋了前文的指引,你已經接觸了:「干凈」的腳本語言Python,傳統的命令式語言C,以及浪漫的函數式語言Scheme/Racket三個好朋友。但僅僅是接觸遠遠不夠,你還需要不斷繼續加深與他們的友誼,並嘗試結交新朋友,美而雅的Ruby小姑娘,Hindley-Milner語言家族的掌中寶Haskell都是不錯的選擇。但有這么一位你躲不開的,必須得認識的大夥伴—C++,你得做好與他深交的准備:
入門:C++Primer
[可選]進階:
高效使用:EffectiveC++
深入了解:《深度探索C++對象模型》;C++Templates
研究反思:TheDesignandEvolutionofC++;對於C++這個NecessaryEvil,看這本書可以讓你選擇是成為守夜人還是守日人。
現實是殘酷的,在軟體工程領域仍舊充斥著一些狂熱者,他們只掌握著一種編程語言,也只想掌握一種語言,他們認為自己掌握的這門語言是最好的,其他異端都是傻X。這種人也不是無葯可救,有一種很簡單的治療方法:讓他們寫一個編譯器。要想真正理解編程語言,你必須親自實現一個。現在是入門階段,不要求你去上一門編譯器課程,但要求你能至少實現一個簡單的解釋器。
供你參考的學習資源:
《程序設計語言-實踐之路》:CMU編程語言原理的教材,程序語言入門書,現在就可以看,會極大擴展你的眼界,拉開你與普通人的差距。
Coursera編程語言MOOC:課堂上你能接觸到極端FP(函數式)的SML,中性偏FP的Racket,以及極端OOP(面向對象)的Ruby,並學會問題的FP分解vsOOP分解、ML的模式匹配、Lisp宏、不變性與可變性、解釋器的實現原理等,讓你在將來學習新語言時更加輕松並寫出更好的程序。
:熱熱身,教你寫一個簡單的瀏覽器——其實就是一個javascript和html的解釋器,完成後的成品還是很有趣的;接下來,試著完成一個之前在SICP部分提到過的項目:用Python寫一個SchemeInterpreter
其他
編程入門階段比較容易忽視的幾點:
學好英語:英語是你獲取高質量學習資源的主要工具,但在入門階段,所看的那些翻譯書信息損耗也沒那麼嚴重,以你自己情況權衡吧。此外英語的重要性更體現在溝通交流上,LinusTorvalds一個芬蘭人,一口流利的英語一直是他招募開發者為Linux幹活的的法寶,這是你的榜樣。
學會提問:學習中肯定會遇到問題,首先應該學會搜索引擎的「高級搜索」,當單靠檢索無法解決問題時,去StackOverflow或知乎提問,提問前讀讀這篇文章:Whathaveyoutried?
不要做一匹獨狼:嘗試搭建一個像這樣簡單的個人網站,不要只是一個孤零零的About頁面,去學習Markdown與LaTeX,試著在Blog上記錄自己的想法,並訂閱自己喜歡的編程類博客。推薦幾個供你參考:JoelonSoftware,PeterNorvig,CodingHorror
小結
以上的內容你不應該感到懼怕,編程的入門不是幾個星期就能完成的小項目。期間你還會遇到無數的困難,當你碰壁時試著嘗試「費曼」技巧:將難點分而化之,切成小知識塊,再逐個對付,之後通過向別人清楚地解說來檢驗自己是否真的理解。當然,依舊會有你解決不了的問題,這時候不要強迫自己——很多時候當你之後回過頭來再看這個問題時,一切豁然開朗。
此外不要局限與上文提到的那些材料,還有一些值得在入門階段以及將來的提升階段反復閱讀的書籍。ThePragmaticProgrammer就是這樣一本程序員入門書,終極書。有人稱這本書為代碼小全:從DRY到KISS,從做人到做程序員,這本書教給了你一切,你所需的只是遵循書上的指導。
後記
如果你能設法完成以上的所有任務,恭喜你,你已經真正實現了編程入門。這意味著你在之後更深入的學習中,不會畏懼那些學習新語言的任務,不會畏懼那些「復雜」的API,更不會畏懼學習具體的技術,甚至感覺很容易。當然,為了掌握這些東西你依舊需要大量的練習,腰還是會疼,走路還是會費勁,一口氣也上不了5樓。但我能保證你會在思想上有巨大的轉變,獲得極大的自信,看老師同學和csdn的眼光會變得非常微妙,雖然只是完成了編程入門,但已經成為了程序員精神世界的高富帥。不,我說錯了,即使是高富帥也不會有強力精神力,他也會懷疑自己,覺得自己沒錢就什麼都不是了。但總之,你遵循指南好好看書,那就會體驗「會當凌絕頂」的感覺。
首先要想學編程,選一門合適的計算機語言就十分重要了,怎麼去選擇就顯得尤為重要了,這要根據自己的興趣愛好及每個語言的特性來選擇,比如說PHP適合做web開發,易學習,易上手,非常流行的一門計算機語言了,我個人比較推薦php語言。
java可以做web開發,做安卓app開發也用的是java,在學習程度上上可能比php稍微難上手一點,不過也是沒問題的,如果對java感興趣可以嘗試一下。
python是目前比較火的一門語言了,比較適合做人工智慧領域,另外寫網路爬蟲類的程序,用python也是非常合適的了,看個人興趣來選擇了。
c,c++,c#這些語言就不推薦給了,特別是c#,已經是比較過時的一門語言了,即使學習好了,也不太適合去找工作,c與c++並不是十分適合初學者來學習,因此也是沒必要進行考慮了,還有一些更小眾的語言,更是沒有必要去考慮,因此關於語言的學習就從上面3種語言去選擇一門自己所感興趣的吧!
研發搭建環境
如果選擇好計算機語言,那麼接下來就是研發環境的搭建了,因為只有研發環境搭建好了,才可以進行後續的編程工作,比如說PHP,那麼就從網路上搜一下如何安裝PHP環境,能搜出一些簡單的教程,初學者按照教程一步一步來,頂多半天時間就可以把研發環境裝好了,如果是java,就需要先安裝jdk,進行環境變數的配置等,網上也有相關的教程,也是十分容易的,相信大家只要按照教程來做,都可以很輕易的把研發環境搭建起來的
選好視頻和書籍,輔助學習。既然是零基礎學習,就需要進行系統的學習,而不是到處網路零基礎的知識點進行學習。
代碼練習
跟隨教程一個一個章節的進行學習,需要注意的一點就是不能只是去看,那樣不行,要對每一個章節的知識點要親自用代碼敲一遍,運行一下試試效果才行,這樣才能提高自己的動手能力,才開始會覺得有一點生疏,慢慢的就會熟練起來,逐漸會增加編程的興趣。這個過程就是需要反復的進行練習,大量的代碼練習才行。這個過程是5步中最關鍵的階段了,重在代碼親自練習,對編程中有的章節不明白的地方,千萬不要放過去,可以在網上找一些相關的編程交流群,參加進去,在線上咨詢一些過來人,也許就可以輕松幫你解決疑問了,對你的學習十分幫助,並且整個過程也都是免費的。
項目實戰
如果說基礎教程都按部就班的都實踐過一遍了,那麼你就有一定的編程的基本功了,那麼自己就可以嘗試著做一些小項目,把學到的知識給串起來,進入項目實戰階段,比如說自己設計一個學生管理系統,並把它完成,如果不了解怎麼設計,可以去網上搜索。慢慢就有思路了。
我也在學習這方面,視頻書籍看過不少,最推薦的還是北京尚學堂的學習資料,Java.300集,Python400集,都是很經典的入門基礎教程,而且是結合項目學習的,很有意思,干貨滿滿,還都是免費的,推薦你可以去看看,相信可以帶你走進變成的世界。
從零開始學編程,第一關就是要選擇你所要學習的編程語言。面對著琳琅滿目的編程語言,初學者常常一籌莫展,拿不定主意,不知該選哪
3. 計算機科學與技術,大二了,我該學些什麼呢,現在只會寫幾行代碼
我不是大神,事實上我還是大一呢。我已經學了C,正在學C++,我也是一頭霧水。再好多看些相關書籍。我給你推薦些。我只看了一點就受益無窮。求採納。
計算機經典教材
目錄
1 前言
2 Mathematics (數學)
3 Data Structures & Algorithms (數據結構、演算法)
4 Compiler (編譯原理)
5 Operating System (操作系統)
6 Database (資料庫)
7 C (C 語言)
8 C++ (C++ 語言)
9 Object-Oriented (面向對象)
10 Software Engineering (軟體工程)
11 UNIX Programming (UNIX編程)
12 UNIX Administration (UNIX系統管理)
13 Networks (網路)
14 Windows Programming (Windows 編程)
15 Other (其它)
前言
推薦原則:
寧缺勿濫,決不混進糟粕 (好書不一定對所有人都合適,但對於它的目標讀者群來說,一定是好書)。
選書原則:
有國外的,不看國產的
有原版的,不看翻譯的
看大師的作品
看書原則:
不要看C、C++、java……今天聽說C好,就跑去學C。明天聽說java好,就跑去學java,最後你什麼也學不到。因為不管什麼語言,永遠不要忘記語言的本質。語言只是一種工具,它的作用就是完成你的工作。不管把
C 的語法學得如何透徹,也不管把 C 的
trick用的如何精妙,這都不能表示你會編程。要學會如何分析問題,如何設計程序,如何用一種具體的語言來實現。如果你只會做最後一步,你只是一個編碼者(coder),還不是一個程序員(programmer)。做一個programmer,不要做coder。總之,不要為了學語言而去學語言(除非你是個語言學家)。
不要放棄對基礎知識的學習。所謂基礎知識,一般都有一個特點,那就是:它們可能看起來沒用,但如果你忽視它們的話,總有一天你會後悔莫及。所以,如果不想以後再後悔的話,就在今天多花點時間。
不管學什麼東西,學之前先弄明白自己要學的是什麼東西,它有什麼用,在你已經學和以後的發展方向中,它處於什麼位值。如果這些都不明白,就好比在茫茫的叢林裡面四處亂撞,就算能出去,也一定會走很多彎路。
對於軟體工程之類的東西,不象 C
語言有著嚴格的標准,最好的辦法就是兼收並蓄,能看的都看,然後(最重要的)在此之上形成自己的思想(不然就什麼都白看了)。
盡信書不如無書。書里寫的只不過是寫書的人認為正確的觀點而已。學習前人的知識和經驗,在此基礎上形成自己的知識結構、觀點和思維方式,才是學習的真正目的。
一。Mathematics (數學)
書名(英文):Discrete Mathematics and Its Applications (Fifth Edition)
書名(中文):離散數學及其應用 (第五版)
原作者:Kenneth H.Rosen
書名(英文):Concrete Mathematics : A Foundation for Computer Science
(Second Edition)
書名(中文):具體數學:計算機科學基礎 (第2版)
原作者:Ronald L. Graham / Donald E. Knuth / Oren Patashnik
二。Data Structures & Algorithms (數據結構、演算法)
書名(英文):Data Structures and Algorithm Analysis in C, Second Edition
書名(中文):數據結構與演算法分析--C語言描述 (第二版)
原作者:Mark Allen Weiss
大凡國外的數據結構教科書,都有一個共同的特點,就是他們的第一章都不是講的數據結構,而是軟體工程的基本原則。我個人認為這是十分必要的,特別是對於大
多數沒有接觸過程序設計的同學來說,在數據結構這個可以說是第一次接觸程序設計的課程中能學習到基本的軟體工程原則,對於以後的學習是十分有好處的。寫一
個亂七八糟的程序出來還不如什麼都不寫。在我看來,這本書有兩個優點:一:將軟體工程的基本原則貫穿全書,二:簡單,容易理解。對於初學者,這本書無疑是
非常合適的。mufasa
書名(英文):Data Structures & Program Design In C (Second Edition)
書名(中文):數據結構與程序設計 C 語言描述 (第二版)
原作者:Robert Kruse / C.L. Tondo / Bruce Leung
書名(英文):Data Structures with C++ Using STL (Second Edition)
書名(中文):數據結構C++語言描述描述—應用標准模版庫 (第二版)
原作者:William Ford, William Topp
書名(英文):Introction to Algorithms (Second Edition)
書名(中文):演算法導論 (第二版)
原作者:Thomas H. Cormen / Charles E. Leiserson / Ronald L. Rivest /
Clifford Stein
書名(英文):The Art of Computer Programming, Volume 1 : Fundamental
Algorithms (Third Edition)
書名(中文):計算機程序設計藝術 第1卷 基本演算法 (第3版)
原作者:Donald E. Knuth
書名(英文):The Art of Computer Programming, Volume 2 : Seminumerical
Algorithms (Third Edition)
書名(中文):計算機程序設計藝術 第2卷 半數值演算法 (第3版)
原作者:Donald E. Knuth
書名(英文):The Art of Computer Programming, Volume 3 : Sorting and
Searching (Second Edition)
書名(中文):計算機程序設計藝術 第3卷 排序和查找 (第2版)
原作者:Donald E. Knuth
三。Compiler (編譯原理)
書名(英文):Compilers: Principles, Techniques, and Tools
書名(中文):編譯原理、技術與工具
原作者:Alfred V. Aho / Ravi Sethi / Jeffrey D. Ullman
書名(英文):Advanced Compiler Design and Implementation
書名(中文):高級編譯器設計與實現
原作者:Steven S. Muchnic
書名(英文):Modern Compiler Implementation in C
書名(中文):現代編譯原理--C語言描述
原作者:Andrew W.Appel / Maia Ginsburg
四。Operating System (操作系統)
書名(英文):Operating System Concepts (Sixth Edition)
書名(中文):操作系統概念 (第六版)
原作者:Abraham Silberschatz / Peter Baer Galvin / Greg Gagne
書名(英文):Operating Systems : Design and Implementation (Second
Edition)
書名(中文):操作系統:設計及實現 (第二版)
原作者:Andrew S. Tanenbaum / Albert S. Woodhull
翻譯者:王鵬、尤晉元、朱鵬、敖青雲
書名(英文):The Design and Implementation of the 4.4BSD Operating System
書名(中文):4.4BSD操作系統設計與實現
原作者:Marshall Kirk McKusick / Keith Bostic / Michael J. Karels / John
S.Quarterman
書名(英文):The Design and Implementation of the FreeBSD Operating System
書名(中文):FreeBSD操作系統設計與實現
原作者:Marshall Kirk McKusick / George V. Neville-Neil
翻譯者:張輝
書名(英文):The Design of The UNIX Operating System
書名(中文):UNIX操作系統設計
原作者:Maurice J.Bach
書名(英文):UNIX Internals : The New Frontiers
書名(中文):UNIX系統內幕
原作者:Uresh Vahalia
書名(英文):UNIX Systems for Modern Architectures
書名(中文):現代體系結構上的UNIX系統--內核程序員的SMP和Caching技術
原作者:Curt Schimmel
翻譯者:張輝
書名(英文):Lions' Commentary on UNIX 6th Edition with Source Code
書名(中文):萊昂氏UNIX源代碼分析
原作者:John Lions
書名(英文):Distributed Systems : Principles and Paradigms
書名(中文):分布式系統:原理與範例
原作者:Andrew S.Tanenbaum / Maarten van Steen
五.Database (資料庫)
書名(英文):An Introction to Database Systems, Eighth Edition
書名(中文):資料庫系統導論 (第八版)
原作者:C. J.Date
書名(英文):Database System Concepts, Fourth Edition
書名(中文):資料庫系統概念 (第四版)
原作者:Abraham Silberschat / Henry F.Korth / S.Sudarshan
六。C (C 語
書名(英文):The C Programming Language, Second Edition
書名(中文):C程序設計語言,第二版
原作者:Brian W. Kernighan / Dennis Ritchie
書名(英文):The Art and Science of C : A Library-Based Introction to
Computer Science
書名(中文):C語言的科學和藝術
原作者:Eric S.Roberts
書名(英文):Programming Abstractions in C : A Second Course in Computer
Science
書名(中文):C程序設計的抽象思維
原作者:Eric S.Roberts
書名(英文):Expert C Programming
書名(中文):C專家編程
原作者:Andrew Koenig
書名(英文):C Traps and Pitfalls
書名(中文):C陷阱與缺陷
原作者:Andrew Koenig
七。C++ (C++ 語言)
書名(英文):C++ Primer, Third Edition & Forth Edition
書名(中文):C++ Primer (第三版、第四版)
原作者:Stanley B.Lippman / Josée LaJoie / Barbara E.Moo
翻譯者:李師賢、蔣愛軍、梅曉勇、林瑛
平心而論,這本書的第三版並不適合入門,但是第四版適合。所以第四版的出現並不意味著第三版就失去了其價值。在我看來最好的辦法就是買一本第四版的中文版和一本第三版的英文版。中文版用來入門,英文版用來作參考手冊。mufasa
書名(英文):The C++ Programming Language, Special Edition
書名(中文):C++ 程序設計語言 (特別版)
原作者:Bjarne Stroustrup
書名(英文):Inside the C++ Object Model
書名(中文):深度探索 C++ 對象模型
原作者:Stanley B. Lippman
書名(英文):Effective C++, Thrid Edition
書名(中文):Effective C++ (第三版)
原作者:Scott Meyers
書名(英文):More Effective C++
書名(中文):More Effective C++
原作者:Scott Meyers
翻譯者:侯捷
書名(英文):Thinking in C++, Second Edition
書名(中文):C++編程思想 (第二版)
原作者:Bruce Eckel
書名(英文):Thinking in C++, Volume 2 : Practical Programming
書名(中文):C++編程思想 第2卷:實用編程技術
原作者:Bruce Eckel / Chuck Alison
書名(英文):Ruminations on C++ : A Decade of Programming Insight and
Experience
書名(中文):C++沉思錄
原作者:Andrew Koenig / Barbara Moo
八。Object-Oriented (面向對象)
書名(英文):Object-Oriented Analysis and Design with Applications, Second
Edition
書名(中文):面向對象分析與設計 (第二版)
原作者:Grady Booch
書名(英文):Object-Oriented Modeling and Design with UML,Second Edition
書名(中文):UML面向對象建模與設計 (第二版)
原作者:Michael Blaha / James Rumbaugh
翻譯者:車皓陽、楊眉
書名(英文):Object-Oriented Software Construction (Second Edition)
書名(中文):面向對象軟體構造 (第二版)
原作者:Bertrand Meyer
書名(英文):Design Patterns : Elements of Reusable Object-Oriented
Software
書名(中文):設計模式:可復用面向對象軟體的基礎
原作者:Erich Gamma / Richard Helm / Ralph Johnson / John Vlissides
九。Software Engineering (軟體工程)
書名(英文):Software Engineering (7th Edition)
書名(中文):軟體工程 (第七版)
原作者:Ian Sommerville
書名(英文):Software Engineering : A Practitioner's Approach (Fifth
Edition)
書名(中文):軟體工程:實踐者之路 (第5版)
原作者:Roger S. Pressman
書名(英文):Software Engineering : Theory and Practice (Second Edition)
書名(中文):軟體工程:理論與實踐 (第二版)
原作者:Shari Lawrence Pfleeger
書名(英文):The Mythical Man-Month
書名(中文):人月神話
原作者:Frederick Phillips Brooks
書名(英文):Software Architecture : Perspectives On an Emerging Emerging
Discipline
書名(中文):軟體體系結構:一門初露端倪學科的展望
原作者:Mary Shaw / David Garlan
十。UNIX Programming (UNIX編程)
書名(英文):Advanced Programming in the UNIX Environment, Second Edition
書名(中文):UNIX 環境高級編程 (第二版)
原作者:W.Richard Stevens / Stephen A.Rago
翻譯者:尤晉元、張亞英、戚正偉
書名(英文):The UNIX Programming Environment
書名(中文):UNIX 編程環境
原作者:Brianw. Kernighan
書名(英文):UNIX Network Programming, Volume 1 : The Sockets Networking
API (Third Edition)
書名(中文):UNIX 網路編程 卷1:套接字聯網API (第三版)
原作者:W. Richard Stevens / Bill Fenner / Andrew M. Rudoff
書名(英文):UNIX Network Programming Volume 2 : Interprocess
Communications (Second Edition)
書名(中文):UNIX 網路編程 卷2:進程間通信 (第2版)
原作者:W. Richard Stevens
書名(英文):The Art of UNIX Programming
書名(中文):UNIX 程序設計藝術
原作者:Eric Raymond
UNIX Administration (UNIX系統管理)
書名(英文):UNIX System Administration Handbook (Third Edition)
書名(中文):UNIX系統管理技術手冊 (第三版)
原作者:Evi Nemeth / Garth Snyder
書名(英文):Linux Administration Handbook
書名(中文):Linux系統管理技術手冊
原作者:Evi Nemeth / Garth Snyder / Trent R.Hein
書名(英文):UNIX Unleashed (Fourth Edition)
書名(中文):UNIX 技術內幕 (第四版)
原作者:Robin Anderson / Andy Johnston
書名(英文):UNIX:The Textbook
書名(中文):UNIX操作系統教程
原作者:Syed Mansoor Sarwar / Robert Koretsky / Syed Aqeel Sarwar
書名(英文):Unix Backup & Recovery
書名(中文):UNIX 備份與恢復
原作者:W.Curtis Preston
十一。Networks (網路)
書名(英文):Computer Networks (Fourth Edition)
書名(中文):計算機網路 (第4版)
原作者:Andrew S. Tanenbaum
書名(英文):TCP/IP Illustrated, Volume 1 : The Protocols
書名(中文):TCP/IP 詳解 卷1:協議
原作者:W. Richard Stevens
書名(英文):TCP/IP Illustrated, Volume 2 : The Implementation
書名(中文):TCP/IP詳解 卷2:實現
原作者:Gary R. Wright / W. Richard Stevens
書名(英文):TCP/IP Illstrated, Volume 3 : TCP for Transactions, HTTP,
NNTP, and the UNIX Domain Protocols
書名(中文):TCP/IP詳解 卷3:TCP事務協議、HTTP、NNTP和UNIX域協議
原作者:W. Richard Stevens
書名(英文):Internetworking with TCP/IP Vol I : Principles, Protocols,
and Architecture (Third Edition)
書名(中文):TCP/IP 網路互連技術 卷1:原理、協議和體系結構 (第3版)
原作者:Douglas E. Comer
書名(英文):Internetworking with TCP/IP Vol II : Design, Implementation,
and Internals (Second Edition)
書名(中文):TCP/IP 網路互連技術 卷2:設計與實現 (第2版)
原作者:Douglas E. Comer / David L. Stevens
書名(英文):Internetworking with TCP/IP Vol III : Client-Server
Programming and Applications, BSD Socket Version (Second Edition)
書名(中文):TCP/IP 網路互連技術 卷3:客戶伺服器編程和應用BSD套接字版 (第2版)
原作者:Douglas E. Comer / David L. Stevens
書名(英文):Internetworking with TCP/IP Vol III : Client-Server
Programming and Applications, Windows Sockets Version
書名(中文):TCP/IP 網路互連技術 卷3:客戶伺服器編程和應用Windows套接字版
原作者:Douglas E. Comer / David L. Stevens
十二。Windows Programming (Windows 編程)
書名(英文):Inside Microsoft Windows 2000 (Third Edition)
書名(中文):Microsoft Windows 2000 技術內幕 (第3版)
原作者:David A.solomon Mark E.Russinovich
書名(英文):Programming Windows (Fifth Edition)
書名(中文):Windows 編程 (第5版)
原作者:Charles Petzold
書名(英文):Programming Applications for Microsoft Windows
書名(中文):Microsoft Windows 應用程序設計
原作者:Jeffrey Richter
書名(英文):Programming with Microsoft Visual C++ .NET (Sixth Edition)
書名(中文):Visual C++.NET 技術內幕 (第6版)
原作者:George Shepherd / David Kruglinski
書名(英文):Dissecting MFC
書名(中文):深入淺出MFC
原作者:侯捷
十三。Other (其它)
書名(英文):Computer Systems : A programmer' s Perspective
書名(中文):計算機系統
原作者:Randal E. Bryant / David R. O'Hallaron
書名(英文):Pattern Classification (Second Edition)
書名(中文):模式分類 (第2版)
原作者:Richard O. Duda / Peter E. Hart / David G. Stork
書名(英文):Code Complete 2
書名(中文):代碼大全第2版
原作者: Steve McConnell
書名(英文):Programming Pearls (2nd Edition)
書名(中文):編程珠璣第2版
原作者: Jon Bentley
別人給我推薦的,我只看過一兩本。
4. 為什麼一些大齡程序員會時不時的感到迷茫
親,關於你的問題,是因為懂得太多,有太多煩心事了,可以放下所有,釋放一下自己,放假一周,在開始
5. 我想學編程,應該學哪一類,求助
原文地址:http://coolshell.cn/articles/4990.html
博文如下:
前言
你是否覺得自己從學校畢業的時候只做過小玩具一樣的程序?走入職場後哪怕沒有什麼經驗也可以把以下這些課外練習走一遍(朋友的抱怨:學校課程總是從理論出發,作業項目都看不出有什麼實際作用,不如從工作中的需求出發)
建議:
不要亂買書,不要亂追新技術新名詞,基礎的東西經過很長時間積累而且還會在未來至少10年通用。
回顧一下歷史,看看歷史上時間線上技術的發展,你才能明白明天會是什麼樣。
一定要動手,例子不管多麼簡單,建議至少自己手敲一遍看看是否理解了里頭的細枝末節。
一定要學會思考,思考為什麼要這樣,而不是那樣。還要舉一反三地思考。
註:你也許會很奇怪為什麼下面的東西很偏Unix/Linux,這是因為我覺得Windows下的編程可能會在未來很沒有前途,原因如下:
現在的用戶界面幾乎被兩個東西主宰了,1)Web,2)移動設備iOS或Android。Windows的圖形界面不吃香了。
越來越多的企業在用成本低性能高的Linux和各種開源技術來構架其系統,Windows的成本太高了。
微軟的東西變得太快了,很不持久,他們完全是在玩弄程序員。詳情參見《Windows編程革命史》
所以,我個人認為以後的趨勢是前端是Web+移動,後端是Linux+開源。開發這邊基本上沒Windows什麼事。
啟蒙入門
1、學習一門腳本語言,例如Python/Ruby
可以讓你擺脫對底層語言的恐懼感,腳本語言可以讓你很快開發出能用得上的小程序。實踐項目:
處理文本文件,或者csv(關鍵詞pythoncsv,pythonopen,pythonsys)讀一個本地文件,逐行處理(例如wordcount,或者處理log)
遍歷本地文件系統(sys,os,path),例如寫一個程序統計一個目錄下所有文件大小並按各種條件排序並保存結果
跟資料庫打交道(pythonsqlite),寫一個小腳本統計資料庫里條目數量
學會用各種print之類簡單粗暴的方式進行調試
學會用Google(phrase,domain,usereadertofollowtechblogs)
為什麼要學腳本語言,因為他們實在是太方便了,很多時候我們需要寫點小工具或是腳本來幫我們解決問題,你就會發現正規的編程語言太難用了。
2、用熟一種程序員的編輯器(不是IDE)和一些基本工具
Vim/Emacs/Notepad++,學會如何配置代碼補全,外觀,外部命令等。
SourceInsight(或ctag)
使用這些東西不是為了Cool,而是這些編輯器在查看、修改代碼/配置文章/日誌會更快更有效率。
3、熟悉Unix/LinuxShell和常見的命令行
如果你用windows,至少學會用虛擬機里的linux,vmwareplayer是免費的,裝個Ubuntu吧
一定要少用少用圖形界面。
學會使用man來查看幫助
文件系統結構和基本操作ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip…
學會使用一些文本操作命令sed/awk/grep/tail/less/more…
學會使用一些管理命令ps/top/lsof/netstat/kill/tcpmp/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元素並應用一些基本樣式(關鍵詞:boxmodel)
學會用Firefox+Firebug或chrome查看你覺得很炫的網頁結構,並動態修改。
學習使用Javascript操縱HTML元件。理解DOM和動態網頁(DynamicHTML:TheDefinitiveReference,3rdEdition-O'ReillyMedia)網上有免費的章節,足夠用了。或參看DOM。
學會用Firefox+Firebug或chrome調試Javascript代碼(設置斷點,查看變數,性能,控制台等)
在一台機器上配置Apache或Nginx
學習PHP,讓後台PHP和前台HTML進行數據交互,對伺服器相應瀏覽器請求形成初步認識。實現一個表單提交和反顯的功能。
把PHP連接本地或者遠程資料庫MySQL(MySQL和SQL現學現用夠了)
跟完一個名校的網路編程課程(例如:http://www.stanford.e/~ouster/cgi-bin/cs142-fall10/index.php)不要覺得需要多於一學期時間,大學生是全職一學期選3-5門課,你業余時間一定可以跟上
學習一個javascript庫(例如jQuery或ExtJS)+Ajax(非同步讀入一個伺服器端圖片或者資料庫內容)+JSON數據格式。
HTTP:TheDefinitiveGuide讀完前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的東西可以放到高級中來實踐。
學習WindowsSDK編程(Windows程序設計,MFC程序設計)
寫一個窗口,了解WinMain/WinProcere,以及Windows的消息機制。
寫一些程序來操作WindowsSDK中的資源文件或是各種圖形控制項,以及作圖的編程。
學習如何使用MSDN查看相關的SDK函數,各種WM_消息以及一些常式。
這本書中有很多常式,在實踐中請不要照抄,試著自己寫一個自己的常式。
不用太多於精通這些東西,因為GUI正在被Web取代,主要是了解一下Windows圖形界面的編程。@virushuo說:「我覺得GUI確實不那麼熱門了,但充分理解GUI工作原理是很重要的。包括移動設備開發,如果沒有基礎知識仍然很吃力。或者說移動設備開發必須理解GUI工作,或者在win那邊學,或者在mac/iOS上學」。
2、學習Java
Java的學習主要是看經典的CoreJava《Java核心技術編程》和《Java編程思想》(有兩卷,我僅鏈了第一卷,足夠了,因為Java的圖形界面了解就可以了)
學習JDK,學會查閱JavaAPIDocJavaPlatformSE6
了解一下Java這種虛擬機語言和C和Python語言在編譯和執行上的差別。從C、Java、Python思考一下「跨平台」這種技術。
學會使用IDEEclipse,使用Eclipse編譯,調試和開發Java程序。
建一個Tomcat的網站,嘗試一下JSP/Servlet/JDBC/MySQL的Web開發。把前面所說的那個PHP的小項目試著用JSP和Servlet實現一下。
3、Web的安全與架構
學習HTML5,網上有很多很多教程,以前酷殼也介紹過很多,我在這里就不羅列了。
學習Web開發的安全問題(參考新浪微博被攻擊的這個事,以及Ruby的這篇文章)
學習HTTPServer的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語句,明白表連接的各種概念(參看《SQLJoin的圖示》)
學習如何優化資料庫查詢(參看《MySQL的優化》)
實踐任務:設計一個論壇的資料庫,至少滿足3NF,使用SQL語句查詢本周,本月的最新文章,評論最多的文章,最活躍用戶。
5、一些開發工具
學會使用SVN或Git來管理程序版本。
學會使用JUnit來對Java進行單元測試。
學習C語言和Java語言的codingstandard或codingguideline。(我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++封裝一個數據結構的容量,比如hashtable。
用C++封裝並實現一個智能指針(一定要使用模板)。
《設計模式》必需一讀,兩遍以上,思考一下,這23個模式的應用場景。主要是兩點:1)鍾愛組合而不是繼承,2)鍾愛介面而不是實現。(也推薦《深入淺出設計模式》)
實踐任務:
使用工廠模式實現一個內存池。
使用策略模式製做一個類其可以把文本文件進行左對齊,右對齊和中對齊。
使用命令模式實現一個命令行計算器,並支持undo和redo。
使用修飾模式實現一個酒店的房間價格訂價策略——旺季,服務,VIP、旅行團、等影響價格的因素。
學習STL的用法和其設計概念-容器,演算法,迭代器,函數子。如果可能,請讀一下其源碼。
實踐任務:嘗試使用面向對象、STL,設計模式、和WindowsSDK圖形編程的各種技能
做一個貪吃蛇或是俄羅斯方塊的游戲。支持不同的級別和難度。
做一個文件瀏覽器,可以瀏覽目錄下的文件,並可以對不同的文件有不同的操作,文本文件可以打開編輯,執行文件則執行之,mp3或avi文件可以播放,圖片文件可以展示圖片。
學習C++的一些類庫的設計,如:MFC(看看候捷老師的《深入淺出MFC》),Boost,ACE,CPPUnit,STL(STL可能會太難了,但是如果你能了解其中的設計模式和設計那就太好了,如果你能深入到我寫的《STLstring類的寫時拷貝技術》那就非常不錯了,ACE需要很強在的系統知識,參見後面的「加強對系統的了解」)
Java是真正的面向對象的語言,Java的設計模式多得不能再多,也是用來學習面向對象的設計模式的最佳語言了(參看Java中的設計模式)。
推薦閱讀《EffectiveJava》and《Java解惑》
學習Java的框架,Java的框架也是多,如Spring,Hibernate,Struts等等,主要是學習Java的設計,如IoC等。
Java的技術也是爛多,重點學習J2EE架構以及JMS,RMI,等消息傳遞和遠程調用的技術。
學習使用Java做WebService(官方教程在這里)
實踐任務:嘗試在Spring或Hibernate框架下構建一個有網路的WebService的遠程調用程序,並可以在兩個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框架中最核心的設計就是:MapRece和HDFS。MapRece的思想是由Google的一篇論文所提及而被廣為流傳的,簡單的
一句話解釋MapRece就是「任務的分解與結果的匯總」。HDFS是Hadoop分布式文件系統(HadoopDistributedFile
System)的縮寫,為分布式計算存儲提供了底層支持。
了解NoSQL資料庫(有人說可能是一個過渡炒作的技術),
不過因為超大規模以及高並發的純動態型網站日漸成為主流,而SNS類網站在數據存取過程中有著實時性等剛性需求,這使得目前NoSQL資料庫慢慢成了人們
所關注的焦點,並大有成為取代關系型資料庫而成為未來主流數據存儲模式的趨勢。當前NoSQL資料庫很多,大部分都是開源的,其中比較知名的
有:MemcacheDB、Redis、TokyoCabinet(升級版為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,我覺得其在分布式系統上有巨大的潛力,所以需要學習。對於關系型資料庫,的確是很重要的東西,這點是我的疏忽,在原文里補充。