程序猿練級攻略

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

  建議:php

  不要亂買書,不要亂追新技術新名詞,基礎的東西通過很長時間積累並且還會在將來至少10年通用。前端

  回顧一下歷史,看看歷史上時間線上技術的發展,你才能明白明天會是什麼樣。java

  必定要動手,例子無論多麼簡單,建議至少本身手敲一遍看看是否理解了裏頭的細枝末節。python

  必定要學會思考,思考爲何要這樣,而不是那樣。還要觸類旁通地思考。linux

  注:你也許會很奇怪爲何下面的東西很偏Unix/Linux,這是由於我以爲Windows下的編程可能會在將來很沒有前途,緣由以下:程序員

  如今的用戶界面幾乎被兩個東西主宰了,1)Web,2)移動設備iOS或Android。Windows的圖形界面不吃香了。正則表達式

  愈來愈多的企業在用成本低性能高的Linux和各類開源技術來構架其系統,Windows的成本過高了。算法

  微軟的東西變得太快了,很不持久,他們徹底是在玩弄程序員。詳情參見《Windows編程革命史》sql

  因此,我我的認爲之後的趨勢是前端是Web+移動,後端是Linux+開源。開發這邊基本上沒Windows什麼事。

  啓蒙入門

  一、 學習一門腳本語言,例如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)

  爲何要學腳本語言,由於他們實在是太方便了,不少時候咱們須要寫點小工具或是腳原本幫咱們解決問題,你就會發現正規的編程語言太難用了。

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

  Vim / Emacs / Notepad++,學會如何配置代碼補全,外觀,外部命令等。

  Source Insight (或 ctag)

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

  三、 熟悉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你會發現圖形界面在某些時候實在是太難用了,至關地至關地下降工做效率。

  四、 學習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,增、刪、改、查,上傳圖片附件,分頁顯示)

  買個域名,租個空間,作個本身的網站。

  進階加深

  一、 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上學」。

  二、學習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實現一下。

  三、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語言很是簡單的文章——《編程修養》,這樣的東西你能夠上網查一下,一大堆)。

  推薦閱讀《代碼大全》《重構》《代碼整潔之道》

  高級深刻

  一、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的框架也是多

全能程序員交流QQ羣290551701,羣內程序員都是來自,百度、阿里、京東、小米、去哪兒、餓了嗎、藍港等高級程序員 ,擁有豐富的經驗。加入咱們,直線溝通技術大牛,最佳的學習環境,瞭解業內的一手的資訊。若是你想結實大牛,那 就加入進來,讓大牛帶你超神!

相關文章
相關標籤/搜索