第一階段:基礎階段(基礎PHP程序員)php
重點:把LNMP搞熟練(核心是安裝配置基本操做)css
目標:可以完成基本的LNMP系統安裝,簡單配置維護;可以作基本的簡單系統的PHP開發;可以在PHP中型系統中支持某個PHP功能模塊的開發。前端
時間:完成本階段的時間因人而異,有的成長快半年一年就過了,成長慢的兩三年也有。mysql
1.Linuxnginx
基本命令、操做、啓動、基本服務配置(包括rpm安裝文件,各類服務配置等);會寫簡單的shell腳本和awk/sed 腳本命令等。程序員
2.Nginxweb
作到可以安裝配置nginx+php,知道基本的nginx核心配置選項,知道 server/fastcgi_pass/access_log 等基礎配置,目標是可以讓nginx+php_fpm順利工做。redis
3.MySQLsql
會本身搭建mysql,知道基本的mysql配置選項;知道innodb和myisam的區別,知道針對InnoDB和MyISAM兩個引擎的不一樣配置選項;知道基本的兩個引擎的差別和選擇上面的區別;可以純手工編譯搭建一個MySQL數據庫而且配置好編碼等正常穩定運行;核心主旨是可以搭建一個可運行的MySQL數據庫。shell
4.PHP
基本語法數組、字符串、數據庫、XML、Socket、GD/ImageMgk圖片處理等等;熟悉各類跟MySQL操做連接的api(mysql/mysqli/PDO),知道各類編碼問題的解決;知道常規熟練使用的PHP框架(ThinkPHP、Zendframework、Yii、Yaf等);瞭解基本MVC的運行機制和爲何這麼作,稍微知道不一樣的PHP框架之間的區別;可以快速學習一個MVC框架。可以知道開發工程中的文件目錄組織,有基本的良好的代碼結構和風格,可以完成小系統的開發和中型系統中某個模塊的開發工做。
5.前端
若是條件時間容許,能夠適當學習下 HTML/CSS/JS 等相關知識,知道什麼web標準,div+css的web/wap頁面模式,知道HTML5和HTML4的區別;瞭解一些基本的前端只是和JS框架(jQuery之類的);瞭解一些基本的JavaScript編程知識;(本項不是必須項,若是有時間,稍微瞭解一下是能夠的,不過不建議做爲重點,除非我的有強烈興趣)。
6.系統設計
可以完成小型系統的基本設計,包括簡單的數據庫設計,可以完成基本的:瀏覽器 -> Nginx+PHP -> 數據庫 架構的設計開發工做;可以支撐天天幾十萬到數百萬流量網站的開發維護工做;
第二階段:提升階段 (中級PHP程序員)
重點:提升針對LNMP的技能,可以更全面的對LNMP有熟練的應用。
目標:可以隨時隨地搭建好LNMP環境,快速完成常規配置;可以追查解決大部分遇到的開發和線上環境的問題;可以獨立承擔中型系統的構架和開發工做;可以在大型系統中承擔某個中型模塊的開發工做。
Linux
在第一階段的基礎上面,可以流暢的使用Shell腳原本完成不少自動化的工做;awk/sed/perl 也操做的不錯,可以完成不少文本處理和數據統計等工做;基本可以安裝大部分非特殊的Linux程序(包括各類庫、包、第三方依賴等等,好比MongoDB/Redis/Sphinx/Luncene/SVN之類的);瞭解基本的Linux服務,知道如何查看Linux的性能指標數據,知道基本的Linux下面的問題跟蹤等。
Nginx
在第一階段的基礎上面,瞭解複雜一些的Nginx配置;包括 多核配置、events、proxy_pass,sendfile/tcp_*配置,知道超時等相關配置和性能影響;知道nginx除了web server,還可以承擔代理服務器、反向靜態服務器等配置;知道基本的nginx配置調優;知道如何配置權限、編譯一個nginx擴展到nginx;知道基本的nginx運行原理(master/worker機制,epoll),知道爲何nginx性能比apache性能好等知識。
MySQL/MongoDB
在第一階段的基礎上面,在MySQL開發方面,掌握不少小技巧,包括常規SQL優化(group by/order by/rand優化等);除了可以搭建MySQL,還可以冷熱備份MySQL數據,還知道影響innodb/myisam性能的配置選項(好比key_buffer/query_cache/sort_buffer/innodb_buffer_pool_size/innodb_flush_log_at_trx_commit等),也知道這些選項配置成爲多少值合適;另外也瞭解一些特殊的配置選項,好比 知道如何搭建mysql主從同步的環境,知道各個binlog_format的區別;知道MySQL的性能追查,包括slow_log/explain等,還可以知道基本的索引創建處理等知識;原理方面瞭解基本的MySQL的架構(Server+存儲引擎),知道基本的InnoDB/MyISAM索引存儲結構和不一樣(聚簇索引,B樹);知道基本的InnoDB事務處理機制;瞭解大部分MySQL異常狀況的處理方案(或者知道哪兒找處處理方案)。條件容許的狀況,建議瞭解一下NoSQL的表明MongoDB數據庫,順便對比跟MySQL的差異,同事可以在合適的應用場景安全謹慎的使用MongoDB,知道基本的PHP與MongoDB的結合開發。
Redis/Memcached
在大部分中型系統裏面必定會涉及到緩存處理,因此必定要了解基本的緩存;知道Memcached和Redis的異同和應用場景,可以獨立安裝 Redis/Memcached,瞭解Memcahed的一些基本特性和限制,好比最大的value值,知道PHP跟他們的使用結合;Redis瞭解基本工做原理和使用,瞭解常規的數據類型,知道什麼場景應用什麼類型,瞭解Redis的事務等等。原理部分,可以大概瞭解Memcached的內存結構(slab機制),redis就瞭解經常使用數據類型底層實現存儲結構(SDS/鏈表/SkipList/HashTable)等等,順便了解一下Redis的事務、RDB、AOF等機制更好。
PHP
除了第一階段的能力,安裝配置方面可以隨意安裝PHP和各類第三方擴展的編譯安裝配置;瞭解php-fpm的大部分配置選項和含義(如max_requests/max_children/request_terminate_timeout之類的影響性能的配置),知道mod_php/fastcgi的區別;在PHP方面已經可以熟練各類基礎技術,還包括各類深刻些的PHP,包括對PHP面向對象的深刻理解/SPL/語法層面的特殊特性好比反射之類的;在框架方面已經閱讀過最少一個以上常規PHP MVC框架的代碼了,知道基本PHP框架內部實現機制和設計思想;在PHP開發中已經可以熟練使用常規的設計模式來應用開發(抽象工廠/單例/觀察者/命令鏈/策略/適配器 等模式);建議開發本身的PHP MVC框架來充分讓開發自由化,讓本身深刻理解MVC模式,也讓本身可以在業務項目開發裏快速升級;熟悉PHP的各類代碼優化方法,熟悉大部分PHP安全方面問題的解決處理;熟悉基本的PHP執行的機制原理(Zend引擎/擴展基本工做機制)。
C/C++
開始涉獵必定的C/C++語言,可以寫基本的C/C++代碼,對基本的C/C++語法熟悉(指針、數組操做、字符串、常規標準API)和數據結構(鏈表、樹、哈希、隊列)有必定的熟悉下;對Linux下面的C語言開發有基本的瞭解概念,會簡單的makefile文件編寫,可以使用簡單的GCC/GDB的程序編譯簡單調試工做;對基本的網絡編程有大概瞭解。(本項是爲了向更高層次打下基礎)。
前端
在第一階段的基礎上面,熟悉基本的HTTP協議(協議代碼200/300/400/500,基本的HTTP交互頭);條件容許,能夠在深刻寫出稍微優雅的HTML+CSS+JavaScript,或者可以大體簡單使用某些前端框架(jQuery/YUI/ExtJS/RequireJS/BootStrap之類);若是條件容許,能夠深刻學習JavaScript編程,好比閉包機制、DOM處理;再深刻些能夠讀讀jQuery源碼作深刻學習。(本項不作重點學習,除非對前端有興趣)。
系統設計
可以設計大部分中型系統的網站架構、數據庫、基本PHP框架選型;性能測試排查處理等;可以完成相似:瀏覽器 -> CDN(Squid) -> Nginx+PHP -> 緩存 -> 數據庫 結構網站的基本設計開發維護;可以支撐天天數百萬到千萬流量基本網站的開發維護工做;
第三階段:高級階段 (高級PHP程序員)
重點:除了基本的LNMP程序,還可以在某個方向或領域有深刻學習。(縱深維度發展)
目標:除了可以完成基本的PHP業務開發,還可以解決大部分深刻複雜的技術問題,而且能夠獨立設計完成中大型的系統設計和開發工做;本身可以獨立hold深刻某個技術方向,在這塊比較專業。(好比在MySQL、Nginx、PHP、Redis等等任一方向深刻研究)
Linux
除了第二階段的能力,在Linux下面除了常規的操做和性能監控跟蹤,還可以使用不少高級複雜的命令完成工做(watch/tcpdump/starce/ldd/ar等);在shell腳本方面,已經可以編寫比較複雜的shell腳本(超過500行)來協助完成不少包括備份、自動化處理、監控等工做的shell;對awk/sed/perl 等應用已經如火純青,可以隨意操做控制處理文本統計分析各類複雜格式的數據;對Linux內部機制有一些瞭解,對內核模塊加載,啓動錯誤處理等等有個基本的處理;同時對一些其餘相關的東西也瞭解,好比NFS、磁盤管理等等;
Nginx
在第二階段的基礎上面,已經可以把Nginx操做的很熟練,可以對Nginx進行更深刻的運維工做,好比監控、性能優化,複雜問題處理等等;看我的興趣,更多方面能夠考慮側重在關於Nginx工做原理部分的深刻學習,主要表如今閱讀源碼開始,好比具體的master/worker工做機制,Nginx內部的事件處理,內存管理等等;同時能夠學習Nginx擴展的開發,能夠定製一些本身私有的擴展;同時能夠對Nginx+Lua有必定程度的瞭解,看看是否能夠結合應用出更好模式;這個階段的要求是對Nginx原理的深刻理解,能夠考慮成爲Nginx方向的深刻專業者。
MySQL/MongoDB
在第二階段的基礎上面,在MySQL應用方面,除了以前的基本SQL優化,還可以在完成一些複雜操做,好比大批量數據的導入導出,線上大批量數據的更改表結構或者增刪索引字段等等高危操做;除了安裝配置,已經可以處理更多複雜的MySQL的問題,好比各類問題的追查,主從同步延遲問題的解決、跨機房同步數據方案、MySQL高可用架構等都有涉及瞭解;對MySQL應用層面,對MySQL的核心關鍵技術比較熟悉,好比事務機制(隔離級別、鎖等)、對觸發器、分區等技術有必定了解和應用;對MySQL性能方面,有包括磁盤優化(SAS遷移到SSD)、服務器優化(內存、服務器自己配置)、除了二階段的其餘核心性能優化選項(innodb_log_buffer_size/back_log/table_open_cache/thread_cache_size/innodb_lock_wait_timeout等)、鏈接池軟件選擇應用,對show *(show status/show profile)類的操做語句有深刻了解,可以完成大部分的性能問題追查;MySQL備份技術的深刻熟悉,包括災備還原、對Binlog的深刻理解,冷熱備份,多IDC備份等;在MySQL原理方面,有更多瞭解,好比對MySQL的工做機制開始閱讀部分源碼,好比對主從同步(複製)技術的源碼學習,或者對某個存儲引擎(MyISAM/Innodb/TokuDB)等等的源碼學習理解,若是條件容許,能夠參考CSV引擎開發本身簡單的存儲引擎來保存一些數據,加強對MySQL的理解;在這個過程,若是本身有興趣,也能夠考慮往DBA方向發展。MongoDB層面,能夠考慮好比說在寫少讀多的狀況開始在線上應用MongoDB,或者是作一些線上的數據分析處理的操做,具體場景能夠按照工做來,不過核心是要更好的深刻理解RMDBS和NoSQL的不一樣場景下面的應用,若是條件或者興趣容許,能夠開始深刻學習一下MongoDB的工做機制。
Redis/Memcached
在第二階段的基礎上面,可以更深刻的應用和學習。由於Memcached不是特別複雜,建議能夠把源碼進行閱讀,特別是內存管理部分,方便深刻理解;Redis部分,能夠多作一些複雜的數據結構的應用(zset來作排行榜排序操做/事務處理用來保證原子性在秒殺類場景應用之類的使用操做);多涉及aof等同步機制的學習應用,設計一個高可用的Redis應用架構和集羣;建議能夠深刻的學習一下Redis的源碼,把在第二階段積累的知識均可以應用上,特別能夠閱讀一下包括核心事件管理、內存管理、內部核心數據結構等充分學習瞭解一下。若是興趣容許,能夠成爲一個Redis方面很是專業的使用者。
PHP
做爲基礎核心技能,咱們在第二階段的基礎上面,須要有更深刻的學習和應用。從基本代碼應用上面來講,可以解決在PHP開發中遇到95%的問題,瞭解大部分PHP的技巧;對大部分的PHP框架可以迅速在一天內上手使用,而且瞭解各個主流PHP框架的優缺點,可以迅速方便項目開發中作技術選型;在配置方面,除了常規第二階段會的知識,會了解一些比較偏門的配置選項(php auto_prepend_file/auto_append_file),包括擴展中的一些複雜高級配置和原理(好比memcached擴展配置中的memcache.hash_strategy、apc擴展配置中的apc.mmap_file_mask/apc.slam_defense/apc.file_update_protection之類的);對php的工做機制比較瞭解,包括php-fpm工做機制(好比php-fpm在不一樣配置機器下面開啓進程數量計算以及原理),對zend引擎有基本熟悉(vm/gc/stream處理),閱讀過基本的PHP內核源碼(或者閱讀過相關文章),對PHP內部機制的大部分核心數據結構(基礎類型/Array/Object)實現有了解,對於核心基礎結構(zval/hashtable/gc)有深刻學習瞭解;可以進行基本的PHP擴展開發,瞭解一些擴展開發的中高級知識(minit/rinit等),熟悉php跟apache/nginx不一樣的通訊交互方式細節(mod_php/fastcgi);除了開發PHP擴展,能夠考慮學習開發Zend擴展,從更底層去了解PHP。
C/C++
在第二階段基礎上面,可以在C/C++語言方面有更深刻的學習瞭解,可以完成中小型C/C++系統的開發工做;除了基本第二階段的基礎C/C++語法和數據結構,也可以學習一些特殊數據結構(b-tree/rb-tree/skiplist/lsm-tree/trie-tree等)方便在特殊工做中需求;在系統編程方面,熟悉多進程、多線程編程;多進程狀況下面瞭解大部分多進程之間的通訊方式,可以靈活選擇通訊方式(共享內存/信號量/管道等);多線程編程可以良好的解決鎖衝突問題,而且可以進行多線程程序的開發調試工做;同時對網絡編程比較熟悉,瞭解多進程模型/多線程模型/異步網絡IO模型的差異和選型,熟悉不一樣異步網絡IO模型的原理和差別(select/poll/epoll/iocp等),而且熟悉常見的異步框架(ACE/ICE/libev/libevent/libuv/Boost.ASIO等)和使用,若是閒暇也能夠看看一些國產本身開發的庫(好比muduo);同時可以設計好的高併發程序架構(leader-follow/master-worker等);瞭解大部分C/C++後端Server開發中的問題(內存管理、日誌打印、高併發、先後端通訊協議、服務監控),知道各個後端服務RPC通訊問題(struct/http/thirft/protobuf等);可以更熟絡的使用GCC和GDB來開發編譯調試程序,在線上程序core掉後可以迅速追查跟蹤解決問題;通用模塊開發方面,能夠積累或者開發一些通用的工具或庫(好比異步網絡框架、日誌庫、內存池、線程池等),不過開發後是否應用要謹慎,省的埋坑去追bug。
前端
深刻了解HTTP協議(包括各個細緻協議特殊協議代碼和背後緣由,好比302靜態文件緩存了,502是nginx後面php掛了之類的);除了以前的前端方面的各類框架應用整合能力,前端方面的學習若是有興趣能夠更深刻,表現形式是,能夠本身開發一些相似jQuery的前端框架,或者開發一個富文本編輯器之類的比較瑣碎考驗JavaScript功力。
其餘領域語言學習
在基礎的PHP/C/C++語言方面有基本積累,建議在當前階段能夠嘗試學習不一樣的編程語言,看我的興趣愛好,腳本類語言能夠學學 Python/Ruby 之類的,函數式編程語言能夠試試 Lisp/Haskell/Scala/Erlang 之類的,靜態語言能夠試試 Java/Golang,數據統計分析能夠了解了解R語言,若是想換個視角作後端業務,能夠試試 Node.js還有前面提到的跟Nginx結合的Nginx_Lua等。學習不一樣的語言主要是提高本身的視野和解決問題手段的差別,好比會了解除了進程/線程,還有輕量級協程;好比在跨機器通訊場景下面,Erlang的解決方案簡單的驚人;好比在不想選擇C/C++的狀況下,還有相似高效的Erlang/Golang可用等等;主要是提高視野。
其餘專業方向學習
在本階段裏面,會除了基本的LNMP技能以外,會考慮一些其餘領域知識的學習,這些都是能夠的,看我的興趣和長期的目標方向。目前狀況可以選擇的領域比較多,好比、雲計算(分佈式存儲、分佈式計算、虛擬機等),機器學習(數據挖掘、模式識別等,應用到統計、個性化推薦),天然語言處理(中文分詞等),搜索引擎技術、圖形圖像、語音識別等等。除了這些高大上的,也有不少偏工程方面能夠學習的地方,好比高性能系統、移動開發(Android/IOS)、計算機安全、嵌入式系統、硬件等方向。
系統設計
系統設計在第二階段的基礎之上,可以應用掌握的經驗技能,設計出比較複雜的中大型系統,可以解決大部分線上的各類複雜系統的問題,完成相似 瀏覽器 -> CDN -> 負載均衡 ->接入層 -> Nginx+PHP -> 業務緩存 -> 數據庫 -> 各路複雜後端RPC交互(存儲後端、邏輯後端、反做弊後端、外部服務) -> 更多後端 醬紫的複雜業務;可以支撐天天數千萬到數億流量網站的正常開發維護工做。