【原版的】PHP技術成長規劃過程當中猿人

 

PHP程序猿的技術成長規劃php


做者:黑夜路人2014/10/15css

 

 

依照了解的很是多PHP/LNMP程序猿的發展軌跡。結合我的經驗體會,抽象出很是多程序猿對將來的迷漫,特別對技術學習的盲目和慌亂。簡單梳理了這個每個階段PHP程序猿的技術要求,來幫助很是多PHP程序作對照設定學習成長目標。前端

 

本文依照眼下主流技術作了一個主要的梳理,整個是假設PHP程序猿不是基礎很是紮實的狀況進行的設定。並且所有設定都很是詳細明白清晰,可能會讓人認爲不適。請理解僅表明一家之言。mysql

(將來技術變化不在討論範圍)nginx

 

 

 

第一階段:基礎階段(基礎PHP程序猿)web

 

重點:把LNMP搞熟練(核心是安裝配置基本操做)redis

目標:能夠完畢主要的LNMP系統安裝。簡單配置維護;能夠作主要的簡單系統的PHP開發;能夠在PHP中型系統中支持某個PHP功能模塊的開發。sql

時間:完畢本階段的時間因人而異。有的成長快半年一年就過了,成長慢的兩三年也有。shell

 

1.Linux 數據庫

基本命令、操做、啓動、基本服務配置(包含rpm安裝文件,各類服務配置等)。會寫簡單的shell腳本和awk/sed 腳本命令等。

 

2.Nginx: 

作到能夠安裝配置nginx+php,知道主要的nginx核心配置選項。知道 server/fastcgi_pass/access_log 等基礎配置,目標是可讓nginx+php_fpm順利工做。

 

3.MySQL: 

會本身搭建mysql,知道主要的mysql配置選項;知道innodb和myisam的差異,知道針對InnoDB和MyISAM兩個引擎的不一樣配置選項;知道主要的兩個引擎的差別和選擇上面的差異。能夠純手工編譯搭建一個MySQL數據庫並且配置好編碼等正常穩定執行;核心主旨是能夠搭建一個可執行的MySQL數據庫。

 

4.PHP:

主要的語法數組、字符串、數據庫、XML、Socket、GD/ImageMgk圖片處理等等;熟悉各類跟MySQL操做連接的api(mysql/mysqli/PDO)。知道各類編碼問題的解決;知道常規熟練使用的PHP框架(ThinkPHP、Zendframework、Yii、Yaf等);瞭解基本MVC的執行機制和爲何這麼作,略微知道不一樣的PHP框架之間的差異;能夠高速學習一個MVC框架。能夠知道開發project中的文件文件夾組織,有主要的良好的代碼結構和風格。能夠完畢小系統的開發和中型系統中某個模塊的開發工做。

 

5.前端:

假設條件時間贊成,能夠適當學習下 HTML/CSS/JS 等相關知識,知道什麼web標準,div+css的web/wap頁面模式。知道HTML5和HTML4的差異;瞭解一些主要的前端僅僅是和JS框架(jQuery之類的);瞭解一些主要的JavaScript編程知識;(本項不是必須項,假設有時間。略微瞭解一下是能夠的,只是不建議做爲重點,除非我的有強烈興趣)

 

6.系統設計:

能夠完畢小型系統的基本設計,包含簡單的數據庫設計,能夠完畢主要的:瀏覽器 -> Nginx+PHP -> 數據庫 架構的設計開發工做;能夠支撐天天幾十萬到數百萬流量站點的開發維護工做。

 

 

 

第二階段:提升階段 (中級PHP程序猿)

 

重點:提升針對LNMP的技能,能夠更全面的對LNMP有熟練的應用。

目標:能夠隨時隨地搭建好LNMP環境。高速完畢常規配置;能夠追查解決大部分遇到的開發和線上環境的問題;能夠獨立承擔中型系統的構架和開發工做;能夠在大型系統中承擔某個中型模塊的開發工做;

 

1. Linux: 

在第一階段的基礎上面。能夠流暢的使用Shell腳原本完畢很是多本身主動化的工做;awk/sed/perl 也操做的不錯,能夠完畢很是多文本處理和數據統計等工做;基本能夠安裝大部分非特殊的Linux程序(包含各類庫、包、第三方依賴等等,比方MongoDB/Redis/Sphinx/Luncene/SVN之類的)。瞭解主要的Linux服務,知道怎樣查看Linux的性能指標數據。知道主要的Linux如下的問題跟蹤等。

 

2. Nginx: 

在第一階段的基礎上面,瞭解複雜一些的Nginx配置;包含 多核配置、events、proxy_pass。sendfile/tcp_*配置。知道超時等相關配置和性能影響。知道nginx除了web server,還能夠承擔代理server、反向靜態server等配置;知道主要的nginx配置調優;知道怎樣配置權限、編譯一個nginx擴展到nginx;知道主要的nginx執行原理(master/worker機制,epoll),知道爲何nginx性能比apache性能好等知識。

 

3. 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的結合開發。

 

4. Redis/Memcached:

在大部分中型系統裏面必定會涉及到緩存處理。因此必定要了解主要的緩存;知道Memcached和Redis的異同和應用場景,能夠獨立安裝 Redis/Memcached。瞭解Memcahed的一些基本特性和限制。比方最大的value值,知道PHP跟他們的使用結合;Redis瞭解基本工做原理和使用。瞭解常規的數據類型,知道什麼場景應用什麼類型。瞭解Redis的事務等等。原理部分,能夠大概瞭解Memcached的內存結構(slab機制),redis就瞭解常用數據類型底層實現存儲結構(SDS/鏈表/SkipList/HashTable)等等,順便了解一下Redis的事務、RDB、AOF等機制更好

 

5. 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引擎/擴展基本工做機制);

 

6. C/C++: 

開始涉獵必定的C/C++語言。能夠寫主要的C/C++代碼。對主要的C/C++語法熟悉(指針、數組操做、字符串、常規標準API)和數據結構(鏈表、樹、哈希、隊列)有必定的熟悉下;對Linux如下的C語言開發有主要的瞭解概念。會簡單的makefile文件編寫,可使用簡單的GCC/GDB的程序編譯簡單調試工做;對主要的網絡編程有大概瞭解。

(本項是爲了向更高層次打下基礎)

 

 

7. 前端:

在第一階段的基礎上面,熟悉主要的HTTP協議(協議代碼200/300/400/500。主要的HTTP交互頭);條件贊成。能夠在深刻寫出略微優雅的HTML+CSS+JavaScript。或者能夠大體簡單使用某些前端框架(jQuery/YUI/ExtJS/RequireJS/BootStrap之類);假設條件贊成。能夠深刻學習JavaScript編程,比方閉包機制、DOM處理。再深刻些能夠讀讀jQuery源代碼作深刻學習。(本項不作重點學習,除非對前端有興趣)

 

8. 系統設計:

能夠設計大部分中型系統的站點架構、數據庫、基本PHP框架選型。性能測試排查處理等。能夠完畢類似:瀏覽器 -> CDN(Squid) -> Nginx+PHP -> 緩存 -> 數據庫 結構站點的基本設計開發維護;能夠支撐天天數百萬到千萬流量基本站點的開發維護工做;

 

 

 

第三階段:高級階段 (高級PHP程序猿)

 

重點:除了主要的LNMP程序,還能夠在某個方向或領域有深刻學習。(縱深維度發展)

目標:除了能夠完畢主要的PHP業務開發,還能夠解決大部分深刻複雜的技術問題。並且能夠獨立設計完畢中大型的系統設計和開發工做。本身能夠獨立hold深刻某個技術方向,在這塊比較專業。(比方在MySQL、Nginx、PHP、Redis等等任一方向深刻研究)

 

1. Linux:

除了第二階段的能力,在Linux如下除了常規的操做和性能監控跟蹤。還可使用很是多高級複雜的命令完畢工做(watch/tcpdump/starce/ldd/ar等)。在shell腳本方面,已經能夠編寫比較複雜的shell腳本(超過500行)來協助完畢很是多包含備份、本身主動化處理、監控等工做的shell。對awk/sed/perl 等應用已經如火純青。能夠任意操做控制處理文本統計分析各類複雜格式的數據;對Linux內部機制有一些瞭解。對內核模塊載入。啓動錯誤處理等等有個主要的處理。同一時候對一些其它相關的東西也瞭解。比方NFS、磁盤管理等等;

 

2. Nginx: 

在第二階段的基礎上面,已經能夠把Nginx操做的很是熟練。能夠對Nginx進行更深刻的運維工做,比方監控、性能優化,複雜問題處理等等。看我的興趣,不少其它方面能夠考慮側重在關於Nginx工做原理部分的深刻學習。主要表現在閱讀源代碼開始。比方詳細的master/worker工做機制,Nginx內部的事件處理,內存管理等等;同一時候能夠學習Nginx擴展的開發,能夠定製一些本身私有的擴展;同一時候能夠對Nginx+Lua有必定程度的瞭解,看看是否能夠結合應用出更好模式;這個階段的要求是對Nginx原理的深刻理解。能夠考慮成爲Nginx方向的深刻專業者。

 

3. MySQL/MongoDB:

在第二階段的基礎上面,在MySQL應用方面。除了以前的基本SQL優化。還能夠在完畢一些複雜操做。比方大批量數據的導入導出,線上大批量數據的更改表結構或者增刪索引字段等等高危操做。除了安裝配置,已經能夠處理不少其它複雜的MySQL的問題,比方各類問題的追查,主從同步延遲問題的解決、跨機房同步數據方案、MySQL高可用架構等都有涉及瞭解;對MySQL應用層面,對MySQL的核心關鍵技術比較熟悉,比方事務機制(隔離級別、鎖等)、對觸發器、分區等技術有必定了解和應用;對MySQL性能方面,有包含磁盤優化(SAS遷移到SSD)、server優化(內存、server自己配置)、除了二階段的其它核心性能優化選項(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的工做機制。

 

 

4. Redis/Memcached:

在第二階段的基礎上面。能夠更深刻的應用和學習。

因爲Memcached不是特別複雜。建議能夠把源代碼進行閱讀,特別是內存管理部分,方便深刻理解;Redis部分。能夠多作一些複雜的數據結構的應用(zset來作排行榜排序操做/事務處理用來保證原子性在秒殺類場景應用之類的使用操做);多涉及aof等同步機制的學習應用。設計一個高可用的Redis應用架構和集羣;建議能夠深刻的學習一下Redis的源代碼。把在第二階段積累的知識均可以應用上,特別能夠閱讀一下包含核心事件管理、內存管理、內部核心數據結構等充分學習瞭解一下。

假設興趣贊成,能夠成爲一個Redis方面很是專業的使用者。

 

 

5. 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。

 

 

6. 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。

 

 

7. 前端:

深刻了解HTTP協議(包含各個仔細協議特殊協議代碼和背後緣由。比方302靜態文件緩存了,502是nginx後面php掛了之類的);除了以前的前端方面的各類框架應用整合能力。前端方面的學習假設有興趣能夠更深刻,表現形式是,能夠本身開發一些類似jQuery的前端框架,或者開發一個富文本編輯器之類的比較瑣碎考驗JavaScript功力;

 

 

8. 其它領域語言學習:

在基礎的PHP/C/C++語言方面有基本積累。建議在當前階段能夠嘗試學習不一樣的編程語言,看我的興趣愛好,腳本類語言能夠學學 Python/Ruby 之類的。函數式編程語言能夠試試 Lisp/Haskell/Scala/Erlang 之類的。靜態語言能夠試試 Java/Golang。數據統計分析能夠了解了解R語言,假設想換個視角作後端業務,能夠試試 Node.js還有前面提到的跟Nginx結合的Nginx_Lua等。

學習不一樣的語言主要是提高本身的視野和解決這個問題手段的差別,比方會了解除了進程/線程,還有輕量級協程;比方在跨機器通訊場景如下,Erlang的解決方式簡單的驚人;比方在不想選擇C/C++的狀況下,還有類似高效的Erlang/Golang可用等等。主要是提高視野。

 

 

9. 其它專業方向學習:

在本階段裏面,會除了主要的LNMP技能以外。會考慮一些其它領域知識的學習。這些都是能夠的。看我的興趣和長期的目標方向。

眼下狀況能夠選擇的領域比較多,比方、雲計算(分佈式存儲、分佈式計算、虛擬機等)。機器學習(數據挖掘、模式識別等,應用到統計、個性化推薦),天然語言處理(中文分詞等),搜索引擎技術、圖形圖像、語音識別等等。除了這些高大上的。也有很是多偏project方面能夠學習的地方,比方高性能系統、移動開發(Android/IOS)、計算機安全、嵌入式系統、硬件等方向。

 

 

10. 系統設計:

系統設計在第二階段的基礎之上,能夠應用掌握的經驗技能,設計出比較複雜的中大型系統。能夠解決大部分線上的各類複雜系統的問題,完畢類似 瀏覽器 -> CDN -> 負載均衡 ->接入層 -> Nginx+PHP -> 業務緩存 -> 數據庫 -> 各路複雜後端RPC交互(存儲後端、邏輯後端、反做弊後端、外部服務) -> 不少其它後端 醬紫的複雜業務。能夠支撐天天數千萬到數億流量站點的正常開發維護工做。

 

 

 

第四階段:架構階段 (架構師)

 

ps: 臨時不展開討論。等下次專門撰文來描寫敘述補充本部份內容

 

 

 

第五階段:專家階段(方向領域專家)

ps:高大上,這塊不展開討論 ^_^

 

 

 

第六階段:科學家階段

ps:高大上,這塊不展開討論 ^_^

 

 

 

 

-------------------------------------------------------------------------------------

黑夜路人,一個關注開源技術、樂於學習、喜歡分享的程序猿


博客:http://blog.csdn.net/heiyeshuwu

微博:http://weibo.com/heiyeluren

微信:heiyeluren2012  

想獲取不少其它IT開源技術相關信息,歡迎關注微信!

微信二維碼掃描高速關注本號碼:


相關文章
相關標籤/搜索