PHPER 之路

一、php 高級程序員所要掌握的技能

 

很多工作幾年的 php 開發者都會有這樣的迷茫,php 開發多了,無外乎“增刪改查調接口”,真的是這樣嗎?

實際上開發者除了把自己當成 php 程序員,更應該關注 php 以外的東西,將自己定位於能熟練使用 php 搭建系統的工程師。 

我認爲高級 php 工程師可以往幾個方向去發展:

1.1、深度方向

一個工程師要往高階發展,必須同時強化幾個技術能力:

  • 設計能力:懂得如何利用分層、面向對象、設計模式等設計組織代碼

  • 編碼能力:熟悉php語法特性,知道怎麼用一兩行代碼代替初級開發者十幾上百行代碼。

  • 工程能力:學會如何快速構建工程,學會如何構建可讀、可擴展性的工程,學會如何避免埋坑給後人,學會如何與人協作維護工程,學會如何保證工程質量,學會如何權衡利弊,學會如何在困難面前妥協。

  • 抽象能力:初級開發者通常會等到邏輯重複時再抽象封裝(甚至怕拖進度或者懶惰而放棄),而高級開發者通常一開始寫出的邏輯就爲了以後的重用,並且深知一開始多付出的思考設計時間最終都會因爲複用得到回報。很多開發框架就是一步步抽象/埋坑/優化而來的。

  • 架構能力:一個業務系統如何劃分模塊,模塊之間如何協作通信,每個模塊的技術選型如何做,系統細節如何規避問題等等。

  • 優化能力:學會如何評估、分析、提升系統性能。優化途徑很多,產品功能優化、業務邏輯優化、基礎技術優化、操作系統底層硬件的優化等等。

1.2、廣度方向

php開發基本上離不開操作系統、存儲、緩存、網絡、webserver等等配套設施,因此這也是高階必備技能。一旦業務系統出問題了,必須要能快速定位解決(不一定自己解決,但要知道找到哪個負責人來解決)。

比如存儲mysql,高級開發者會懂得利用索引、利用分表分庫提高查詢性能,懂得負載均衡和災備提高性能提高可靠性(雖然是DBA的工作,但瞭解了有助於出問題時排查)

比如緩存,高級開發者懂得如何有效且最大限度利用緩存系統提高應用性能。

比如http,初級開發者往往只懂得http網絡請求就只一去一回兩個包,高級開發者會去深究網絡七層模型、會深究http請求的各個環節(DNS、三次握手等等)

比如web前端,學習如何依靠瀏覽器緩存、CDN緩存、壓縮代碼、合併文件等等提高前端性能,學習如何進行前端安全攻防。

1.3、軟素質

懂得團隊管理,項目管理,溝通技巧等等。以上觀點同樣適用於其他語言的開發者。

1.4、總結

好吧,其實我想說的就是,『高級程序員』之類不過就一頭銜,有人覺得你是,你就是,但它根本不能作爲你技能水平的標杆。

我也不覺得一個程序員有什麼一定要掌握的技能,我只知道『一個個解決每天所能見到所能想到的問題,這本身就是對自己最好的提高』。

二、PHP 程序員未來路在何方

PHP 從誕生到現在已經有 20 多年曆史,從 Web 時代興起到移動互聯網退潮,互聯網領域各種編程語言和技術層出不窮, Node.js 、 GO 、 Python 不斷地在挑戰 PHP 的地位。

這些技術的推動者非常熱衷於唱衰 PHP , PHP 語言的未來在哪裏?PHP 程序員當如何應對未來的變革?

作爲老牌的 Web 後端編程語言,PHP 在全球市場佔有率非常高,僅次於 Java ,從各個招聘網站的數據上來看 PHP 開發的職位非常多,薪資水平也非常不錯。

實際在中小企業、互聯網創業公司 PHP 的市場地位是高於 Java 的。Java 在超大型企業、傳統軟件行業、金融領域優勢更大。目前來看 Node.js、 GO 、 Python 、 Ruby 等語言還難以企及 PHP 和 Java。

PHP 語言之所以能有今天的地位,得益於 PHP 語言設計者一直遵從實用主義,將技術的複雜性隱藏在底層。PHP 語言入門簡單,容易掌握,程序健壯性好,不容易出現像 Java 、 C++ 等其他語言那樣複雜的問題,如內存泄漏和 Crash ,跟蹤調試相對輕鬆很多。PHP 官方提供的標準庫非常強大,各種功能函數都能在官方的標準庫中找到,包括 MySQL、Memcache、Redis、GD 圖形庫、CURL、XML、JSON等等,免除了開發者到處找庫的煩惱。PHP 的文檔非常棒,每個函數都有詳細的說明和使用示例。第三方類庫和工具、代碼、項目也很豐富。開發者可以快速、高效地使用 PHP 編寫開發各類軟件。到目前爲止市面上仍然沒有出現比 PHP 更簡單易用的編程語言。所以 PHP 的前景還是很廣闊的,與其糾結於編程語言的選擇,不如好好地深入學習使用 PHP 。

作爲一個資深的 PHP 開發者,在技術上給各位 PHP 程序十點未來的建議,希望對大家有所幫助。

2.1、Composer

第一點就要提 Composer ,自從 Composer 出現後,PHP 的依賴管理可以變得非常簡單。程序內依賴一些類庫和框架,直接使用 Composer 引入即可,通過使用 composer update 安裝依賴的包。解決了過去加載外部庫的各種難題。Composer 也有國內鏡像,速度非常快。現在絕大部分PHP開源的項目都提供了 Composer 的支持,建議大家在項目中使用 Composer 來解決 PHP 代碼包管理的問題,不要再使用下載源碼、手工 include 的原始方法。

 

2.2、PHP 7

PHP7 版本對 Zend 引擎做了大量修改,大幅提升了 PHP 語言的性能,使用 PHP7 可以使你的程序性能瞬間翻倍。即使是 WordPress 這樣重量級的軟件運行在 PHP7 都能有上千 QPS ,相當於一臺服務器每天就能處理 8000 萬次請求。使用 PHP7 ,做好 MySQL 優化,使用 Memcache 和 Redis 進行加速,這套技術架構完全可以應對相當大規模的系統。除了某些億級用戶的平臺之外,一般規模的系統完全沒有壓力。

2.3、PSR

PSR 是 http://www.php-fig.org/ 組織制定的PHP語言開發規範,約定了很多方面的規則,如命名空間、類名規範、編碼風格標準、Autoload、公共接口等。

現在已經成爲PHP技術社區事實上的標準了。很多知名的 PHP 框架和類庫都遵守了 PSR 規範。PHP 開發者應當學習掌握 PSR 規範,在開發程序時應當儘量遵循 PSR 規範。

2.4、Swoole

2017 年 PHP 還侷限於做 Web 網站嗎?No ,如果你還不知道 Swoole ,趕快去了解一下吧。Swoole 的口號是重新定義 PHP 語言,Swoole 是一個異步並行的通信引擎,作爲 PHP 的擴展來運行。Node.js 的異步回調 Swoole 有,Go語言的協程 Swoole 也有,這完全顛覆了對 PHP 的認知。使用 Swoole PHP 可以實現常駐內存的 Server 程序,可以實現 TCP 、 UDP 異步網絡通信的編程開發。過去PHP只能做一個 Web 網站,現在使用 Swoole 可以做 Java 、C++ 才能實現的通信服務,比如 WebSocket 及時通信、聊天、推送服務器、RPC 遠程調用服務、網關、代理、遊戲服務器等。如果你想用 PHP 做點 Web 系統之外的東西,Swoole 是最好的選擇。

2.5、Laravel

最近幾年最火熱的 PHP 框架,官網號稱是爲 Web 藝術家設計的框架,可見這套框架有多優雅。Laravel 提供的功能模塊豐富,API 設計簡潔,表達力強。而且它的社區非常活躍,代碼貢獻者衆多,第三方的插件非常多,生態系統相當繁榮。 Laravel 底層使用了很多 symfony2 組件,通過 composer 實現了依賴管理。如果還在糾結使用什麼PHP框架,不如選擇 Laravel 。 Laravel 提供的命令行工具基於 symfony.console 實現,功能強大,集成了各種項目管理、自動生成代碼的功能。

2.6、Phar

PHP5.3 之後支持了類似 Java 的 jar 包,名爲 phar。用來將多個 PHP 文件打包爲一個文件。這個特性使得 PHP 也可以像 Java 一樣方便地實現應用程序打包和組件化。一個應用程序可以打成一個 Phar 包,直接放到
PHP-FPM 中運行。配合 Swoole ,可以在命令行下執行 php server.phar 一鍵啓動服務器。PHP 的代碼包可以用 Phar 打包成組件,放到 Swoole 的服務器容器中去加載執行。

2.7、C/C++/GO

任何技術有優點就有缺點,PHP 作爲一門動態腳本語言,優點是開發方便效率高。缺點就是性能差。在密集運算的場景下比 C 、 C++ 相差幾十倍甚至上百倍。另外 PHP 不可以直接操作底層,需要依賴擴展庫來提供 API 實現。PHP 程序員可以學習一門靜態編譯語言作爲補充實現動靜互補,C/C++/Go 都是不錯的選擇。而且靜態語言的編程體驗與動態語言完全不同,學習過程可以讓你得到更大的提升。

掌握 C/C++ 語言後,還可以閱讀 PHP 、 Swoole 、 Nginx 、Redis 、 Linux內核 等開源軟件的源碼,瞭解其底層運行原理。

現在最新版本的Swoole提供了C++擴展模塊的支持,封裝了Zend API,用C++操作PHP變得很簡單,可以用C++實現PHP擴展函數和類。

2.8、HTML 5

作爲 Web 前端新一代標準,HTML5 未來前景非常廣闊,市場需求量非常大。從 PC 網站、B/S 企業軟件、移動端網頁、APP,這些領域都在擁抱 HTML5,掌握了 HTML5 才能在下一波互聯網技術大潮中存活下來。

2.9、Vue.js

PHP 程序員除了寫後臺程序之外,還有很大一部分工作在展現層,和瀏覽器前端打交道。2017 年你還在用 jQuery 操作 DOM 實現界面渲染嗎?已經完全 out 了。現在用 Vue.js 可以非常方便地實現數據和 DOM 元素的綁定。通過 Ajax 請求後臺接口返回數據後,更新前端數據自動實現界面渲染。2017 年再不學 Vue 就晚了。

如果你不光要寫 Web 程序,同時還希望兼顧 Android 、IOS 、PC 客戶端等平臺,React Native 是一個不錯的選擇。

2.9、深度學習/人工智能

互聯網的未來屬於人工智能,如果你還不瞭解機器學習、深度學習、人工智能這些概念,那你需要儘快學習瞭解一下。現在互聯網巨頭們都在佈局人工智能,包括 Google 、 Facebook 、微軟、亞馬遜 和國內的百度。雖然現在還處於科學研究的階段,但未來互聯網的各個領域都會應用到人工智能,包括自動駕駛、大數據分析、網絡遊戲、圖像識別、語言處理等。當然現在普通的工程師可能還無法參與到人工智能產品中,但至少應該理解深度學習/人工智能的基本概念和原理。

三、PHP程序員職業發展路線

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

本文按照目前主流技術做了一個基本的梳理,整個是假設PHP程序員不是基礎非常紮實的情況進行的設定,並且所有設定都非常具體明確清晰,可能會讓人覺得不適,請理解僅代表一家之言。(未來技術變化不在討論範圍)。

3.1、第一階段:基礎階段(基礎PHP程序員)

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

目標:能夠完成基本的LNMP系統安裝,簡單配置維護;能夠做基本的簡單系統的PHP開發;能夠在PHP中型系統中支持某個PHP功能模塊的開發。 

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

①、Linux

  • 基本命令、操作、啓動、基本服務配置(包括rpm安裝文件,各種服務配置等);

  • 會寫簡單的shell腳本和awk/sed 腳本命令等。

②、Nginx

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

③、MySQL

  • 會自己搭建mysql,知道基本的mysql配置選項;

  • 知道innodb和myisam的區別,知道針對InnoDB和MyISAM兩個引擎的不同 配置選項;

  • 知道基本的兩個引擎的差異和選擇上面的區別;

  • 能夠純手工編譯搭建一個MySQL數據庫並且配置好編碼等正常穩定運行;

  • 核心主旨是能夠搭建一個可 運行的MySQL數據庫。

④、PHP

  • 基本語法數組、字符串、數據庫、XML、Socket、GD/ImageMgk圖片處理等等;

  • 熟悉各種跟MySQL操作鏈接的api(mysql /mysqli/PDO),知道各種編碼問題的解決;

  • 知道常規熟練使用的PHP框架(ThinkPHP、Zendframework、Yii、Yaf 等);

  • 瞭解基本MVC的運行機制和爲什麼這麼做,稍微知道不同的PHP框架之間的區別;

  • 能夠快速學習一個MVC框架。

  • 能夠知道開發工程中的文件目錄組織,有基本的良好的代碼結構和風格,能夠完成小系統的開發和中型系統中某個模塊的開發工作。

⑤、前端

  • 如果條件時間允許,可以適當學習下 HTML/CSS/JS 等相關知識,知道什麼web標準,div+css的web/wap頁面模式,知道 HTML5和HTML4的區別;

  • 瞭解一些基本的前端只是和JS框架(jQuery之類的);、

  • 瞭解一些基本的JavaScript編程知識;(本項不是必須項,如果有時間,稍微瞭解一下是可以的,不過不建議作爲重點,除非個人有強烈興趣)

⑥、系統設計

  • 能夠完成小型系統的基本設計,包括簡單的數據庫設計,能夠完成基本的:瀏覽器 -> Nginx+PHP -> 數據庫 架構的設計開發工作;

  • 能夠支撐每天幾十萬到數百萬流量網站的開發維護工作

3.2、第二階段:提高階段 (中級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 -> 緩存 -> 數據庫 結構網站的基本設計開發維護;

  • 能夠支撐 每天數百萬到千萬流量基本網站的開發維護工作;

3.3、第三階段:高級階段 (高級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

  • 除了第二階段的能力,在Linux下面除了常規的操作和性能監控跟蹤,還能夠使用很多高級複雜的命令完成工作(watch/tcpdump /starce/ldd/ar等);

  • 在shell腳本方面,已經能夠編寫比較複雜的shell腳本(超過500行)來協助完成很多包括備份、自動化處理、 監控等工作的shell;

  • 對awk/sed/perl 等應用已經如火純青,能夠隨意操作控制處理文本統計分析各種複雜格式的數據;

  • 對Linux內部機制 有一些瞭解,對內核模塊加載,啓動錯誤處理等等有個基本的處理;

  • 同時對一些其他相關的東西也瞭解,比如NFS、磁盤管理等等;

③、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交互(存儲後端、邏輯後端、反作弊 後端、外部服務) -> 更多後端 醬紫的複雜業務;

  • 能夠支撐每天數千萬到數億流量網站的正常開發維護工作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章