伯樂人才網6月9日發表了《寫給即將入行的程序猿的一封信》,翻譯自《An open letter to those who want to start programming》。個人朋友(他在本站的id是Mailper)告訴我,他但願在酷殼上看到一篇更具操做性的文章。php
因爲他也是喜歡編程和技術的傢伙。因而,我讓他把他的一些學習Python和Web編程的一些點滴總結一下。因而他給我發來了一些他的心得和經歷,我在把他的心得作了很少的增改,並依據個人經歷添加了「進階」一節。html
這是一篇由新手和我這個老傢伙依據咱們的經歷完畢的文章。前端
個人這個朋友把這篇文章取名叫Build Your Programming Technical Skills,我實在不知道用中文怎麼翻譯,但我在寫的過程當中,我認爲這很是像一個打網遊作任務升級的一個過程,因此取名叫「技術練級攻略」。題目有點大,呵呵,這個標題純粹是爲了好玩。java
這裏不過在分享Mailper和我我的的學習經歷。python
(注:省去了我做爲一個剛開始學習的人之前學習過的一些技術(今天明顯過期了)。如:Delphi/Power builder。也省去了我學過的一些我認爲沒意思的技術Lotus Notes/ActiveX/COM/ADO/ATL/.NET ……)linux
前言nginx
你是否定爲本身從學校畢業的時候僅僅作太小玩具同樣的程序?走入職場後哪怕沒有什麼經驗也可以把下面這些課外練習走一遍(朋友的抱怨:學校課程老是從理論出發,做業項目都看不出有什麼實際做用,不如從工做中的需求出發)web
建議:算法
- 不要亂買書,不要亂追新技術新名詞,基礎的東西通過很是長時間積累而且還會在將來至少10年通用。
- 回想一下歷史。看看歷史上時間線上技術的發展,你才幹明確明天會是什麼樣。
- 必定要動手,樣例不管多麼簡單,建議至少本身手敲一遍看看是否理解了裏頭的細枝末節。
- 必定要學會思考。思考爲何要這樣。而不是那樣。
還要觸類旁通地思考。sql
注:你或許會很是奇怪爲何如下的東西很是偏Unix/Linux,這是因爲我認爲Windows下的編程可能會在將來很是沒有前途,緣由例如如下:
- 現在的用戶界面差點兒被兩個東西主宰了。1)Web,2)移動設備iOS或Android。Windows的圖形界面不吃香了。
- 愈來愈多的企業在用成本低性能高的Linux和各類開源技術來構架其系統。Windows的成本過高了。
- 微軟的東西變得太快了,很是不持久,他們全然是在玩弄程序猿。
詳情參見《Windows編程革命史》
因此。我我的以爲之後的趨勢是前端是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很是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 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 程序設計 。)
- 寫一個窗體。瞭解WinMain/WinProcedure,以及Windows的消息機制。
- 寫一些程序來操做Windows SDK中的資源文件或是各類圖形控件,以及做圖的編程。
- 學習怎樣使用MSDN查看相關的SDK函數,各類WM_消息以及一些例程。
- 這本書中有很是多例程,在實踐中請不要照抄,試着本身寫一個本身的例程。
- 不用太多於精通這些東西。因爲GUI正在被Web代替,主要是瞭解一下Windows 圖形界面的編程。
二、學習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 + 靜態頁面緩存的站點。
四、一些開發工具
高級深刻
一、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的各類設計模式。
二、增強系統瞭解
重要閱讀如下的幾本書:
三、系統架構
寫了那麼多。回想一下,認爲本身至關的有成就感。
但願你們不要嚇着,我本身這十來年也在不斷地學習。今天我也在學習中,人生原本就是一個不斷學習和練級的過程。只是,必定有漏的,也有不正確的。還但願你們補充和更正。(我會依據你們的反饋隨時更新此文)歡迎你們經過個人微博(@左耳朵耗子)和twitter(@haoel)和我交流。