好文章之——PHP系列(一)

注:最近實習的公司是一家作電商企業,後臺主要是php開發,很久不怎麼接觸php的我看了幾篇相關文章,提升下對它的認識與理解,發現裏面的學習思路仍是很是好的,固然也會從新拾一下基礎知識啦!javascript

其實本身心中仍是有點小糾結的,感受本身學的東西太雜了,沒有很是精通的。畢竟人的精力是有限,舉個例子:「若是1年幹php,第二年又幹java,第三年多是Python。可是當第四年他可能想去找另一份工做,那他到底要找什麼樣的工做呢? 每一種技能都不精,若是面試PHP,人家就按你php的水平給你薪水,而不太會看重你還java或者python。 結果你薪資水平可能就是個中下等水平的薪水。」其實知識面廣點是很好的,可是就怕你什麼都能只會個皮毛,必須得確立本身的長項和着重點,這是我必須得想明白的問題~php

 

高級PHP工程師所應該具有一些技能

1、平靜的心態css

  和全部程序員同樣,要寫一手好的程序,沒有好的心態是不行的。html

  遇事不可急躁,不可輕言放棄。前端

  在程序開發過程當中,尤爲是初中級程序員,寫出的程序或架構會遇到不少問題,其中一些問題比較弱智,而有些問題根本沒有碰到過,因而不可太過急躁,應該逐個排查問題的最初源泉,將其幹掉。急躁的心態去開發系統是對項目的一種不負責。急躁會讓人學會將就,讓人學會逃避。而我我的北京兩年的簡單生活,給我其中一個最大的歷練也就是:個人心態更加平靜了。java

  相信,這樣的心態也會有助於你其餘方面的處事能力。python

  爲何將心態列入其中,我是想說明:它不一樣於銷售的職能,須要很大激情澎湃,而是須要靜靜的思考mysql

  2、一套爛熟於心的問題解決思路jquery

  曾經有位程序開發的同事在QQ簽名中寫到:每解決一個bug,就給本身一個提高。的確,沒有真正解決過無數的bug或問題的程序員,談不上專家,談不上高級程序員。而一個高級程序員正是從這種解決問題的過程當中不斷地歷練本身,造成一套爛熟於心的問題解決思路,讓本身強大的。linux

  我也簡單說說PHP程序員成長過程當中常常遇到的一些問題,若是你一個也沒遇到或不多遇到,那麼您就是兩個極端的人:要麼初級入門,要麼高級了,哈哈。

  • 一、編碼問題。

  • 二、PHP和SQL數據庫執行效率問題。

  • 三、Session和Cookie域和加密解析問題。

  • 四、程序的執行順序問題。

  • 五、程序編寫的多環境適用問題。

  • 六、分類的構建和結構設計問題。

  • 七、字符串處理問題:正則表達式處理或簡單PHP字符串處理函數來處理。

  • 八、各類模板引擎的編寫侷限性問題。

  • 九、PHP和web端數據交互問題(如ajax,接口調用等)。

  3、過硬的PHP基礎知識

  沒有過硬的PHP基礎知識,哪怕心態再好,問題解決的能力再強,也只能紙上談兵。

  過硬的基礎知識會讓你在項目開發過程當中遊刃有餘。

  我也簡單說說哪些屬於PHP工程師所應具有的基礎知識(其實這些在招聘需求中很常見):

  • 一、語法規則,這個不說了,這個不會,就沒入門,趕忙買本書或找個網站補補。

  • 二、MYSQL各類sql語句的寫法,增刪改查基本的不說了,in(),union,left(),left join,as,replace,alter table,where的字段排序,各類索引創建的方法要特別熟悉。

  • 三、會本身搭建LAMP環境和WAMP環境,用集成軟件一鍵式安裝的不算。開發程序,對於本身開發的環境構建結構都不清楚,怎麼排查問題?因此至少要會用對立的msi文件來安裝本身須要的開發環境。安裝3-5遍成功,這個算還行,還得會安裝各類擴展,配置apache服務,知道各類參數設置的地方以及知道怎麼設置各類參數;會linux操做系統的基本命令。

  • 四、熟悉web方面的其餘程序,由於PHP不是一個徹底獨立的東西,他是一個和其餘語言和要素配合來完成一個項目的,若是對其餘語言和要素不太熟悉,在團隊協做過程當中會很是吃力。這些其餘要素包括:html,java,jquery,xml,http協議,正則表達式等。

  4、綜合的互聯網應用及項目管理知識和素養

  一、見識廣博,擅於學習

  只顧本身鑽研,不看看、學學人家的作法,會像井底之蛙,難以看到廣闊的天空的;因此,不要只顧着每天編程,學會抽點時間去看看一些大型開源系統的架構思路,以及大型商務網站的構建方式。向他們學習,補充本身的不足。

  好比至少該曉得不一樣類型的開源系統有哪些吧,好比Uchome,dede,phpcms,wordpress,discuz,帝國等等。

  看多了,你也會總結髮現一些常規性的思路,好比緩存的機制,好比模板機制,好比靜態頁面生成等等。

  二、項目解決方案選型

  不一樣需求,用不一樣的機構和選型。也就是常說的「水來土掩,兵來將擋」,有些架構當然強大,可是用於小型項目也會很吃力,就是殺機不用牛刀。根據需求來選型很重要。

  選型不是隨口就能定的,須要一個PHP程序員用於良好的儲備,我的以爲至少須要如下儲備,才具有選型能力:

  • 熟練應用至少一個PHP框架,兩-三個PHP開源系統;

  • 擁有本身的一套應用系統。

  三、良好的項目管理素養

  項目不是一直開發過程當中,項目也會進入運營期,維護期,這樣,具有良好的項目管理素養會使項目更加穩定,可控。

  良好的項目管理素養包括:

  • 良好的項目開發及維護習慣,記住:千萬別爲了一時的省力,形成後面屢次的重複勞動。時時提醒本身將工做流程化,流程規劃化,規範簡單化。

  • 良好的多人合做管理意識:項目不是一我的的,是多人協做的產物,也是服務於大衆的,於是,要提高協做意識,讓相關人員一同來完善項目。

  四、豐富的項目開發應用經驗

  學理論,去考試或考覈是學校裏面的事兒,沒有項目經驗,就像滿肚子經文,吐也難吐出。

  這就須要實際的項目將本身的知識去學會轉化爲需求實現。

  五、良好的開發規範

  • 代碼可讀性強:對象,方法,函數的註釋;一套成熟的命名規範。

  • 代碼冗餘度底:程序和文件的重用性大,高內聚,低耦合。

  • 執行效率高:用最簡單的程序流程實現應用需求,勿擾大彎子。

  • 代碼安全性好:作一名警戒的程序員,任何有用戶輸入和上傳文件的地方都得額外謹慎,也許一個程序員一時的疏忽就會致使一個系統頃刻間崩潰。

  另外,多說幾句,PHP高級工程師,其實對於一個稍微能堅持,並喜歡PHP的來講不太難;難的是學會用工具來實現想法,無論是本身的想法仍是他人的需求,學會轉化。

  這樣,不防多瞭解些互聯網發展的趨勢,項目開發管理流程等等。

 

PHP程序員的技術成長規劃

 

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

本文按照目前主流技術作了一個基本的梳理,整個是假設PHP程序員不是基礎很是紮實的狀況進行的設定,而且全部設定都很是具體明確清晰,可能會讓人以爲不適,請理解僅表明一家之言。(將來技術變化不在討論範圍)

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

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

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

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

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框架。可以知道開發工程中的文件目錄組織,有基本的良好的代碼結構和風格,可以完成小系統的開發和中型系統中某個模塊的開發工做。

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,還可以承擔代理服務器、反向靜態服務器等配置;知道基本的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)、服務器優化(內存、服務器自己配置)、除了二階段的其餘核心性能優化選項(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技能以外,會考慮一些其餘領域知識的學習,這些都是能夠的,看我的興趣和長期的目標方向。目前狀況可以選擇的領域比較多,好比、雲計算(分佈式存儲、分佈式計算、虛擬機等),機器學習(數據挖掘、模式識別等,應用到統計、個性化推薦),天然語言處理(中文分詞等),搜索引擎技術、圖形圖像、語音識別等等。除了這些高大上的,也有不少偏工程方面能夠學習的地方,好比高性能系統、移動開發(Android/IOS)、計算機安全、嵌入式系統、硬件等方向。

10. 系統設計:

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

 

PHP工程師面臨的成長瓶頸

PHP工程師面臨成長瓶頸

  先明確這裏所指的PHP工程師,是指主要以PHP進行Web系統的開發,沒有使用其的語言工做過。工做經驗大概在3~4年,普通的Web系統(百萬級訪問,千成級數據之內或業務邏輯不是特別複雜)開發起基本駕輕就熟,沒有什麼問題。但他們會這樣的物點:

  ◆除了PHP不使用其它的語言,可能會點shell 腳本。

  ◆對PHP的掌握不精(不少PHP手冊都沒有看完,庫除外)。

  ◆知識面比較窄(面對需求,除開使用PHP和mysql ,不知道其它的解決辦法)。

  ◆PHP代碼以過程爲主,認爲面向對象的實現太繞,看不懂。

  這些PHPer在遇到須要高性能,處理高併發,大量數據的項目或業務邏輯比較複雜(系統須要解決多領域業務的問題)時,缺乏思路。不能分析問題的本質,技術判斷力比較差,對於問題較快能找出臨時的解決辦法,但經常在不斷臨時性的解決辦法中,系統和本身一步步走向崩潰。那怎麼提升本身呢?怎麼能夠挑戰難度更高的系統?

  更高的挑戰在那裏?

  結合我本身的經驗,我列出一些具體挑戰,讓你們先有個感性的認識。

  高性能系統的挑戰在那裏?

  ◆如何選擇Web服務器?要不要使用fast-cgi 模式;

  ◆要不要使用反向代理服務?選擇全內存緩存仍是硬盤緩存?

  ◆是否須要負載均衡?是基於應用層,仍是網絡層? 如何保證高可靠性?

  ◆你的PHP代碼性能如何,使用優化工具後怎麼樣? 性能瓶頸在那裏? 是否須要寫成C的擴展?

  ◆用戶訪問有什麼特色,是讀多仍是寫多?是否須要讀寫分離?

  ◆數據如何存儲?寫入速度和讀出速度如何? 數據增漲訪問速讀如何變化?

  ◆如何使用緩存? 怎麼樣考慮失效?數據的一致性怎麼保證?

  高複雜性系統的挑戰在那裏?

  ◆可否識別業務所對應的領域?是一個仍是多個?

  ◆可否合理對業務進行抽象,在業務規則變化能以很小的代價實現?

  ◆數據的一致性、安全性能否保證?

  ◆是否撐握了面向對象的分析和設計的方法

  這裏所列出的問題,你都能確定的回答,說明在技術上你基本已經可能成爲架構師了。如何你還不能回答,你須要在如下幾個方向增強。

  怎麼樣提升,突破瓶頸

  如何你還不能回答,你須要在如下幾個方向增強:

  ◆分析你所使用的技術其原理和背後運行的機制,這樣能夠提升你的技術判斷力,提升你技術方案選擇的正確性;

  ◆學習大學期間重要的知識, 操做系統原理,數據結構和算法。知道你之前學習都是爲了考試,但如今你須要爲本身學習,讓本身知其因此然;

  ◆從新開始學習C語言,雖然你在大學已經學過。這不只是由於你可能須要寫PHP擴展,並且還由於,在作C的應用中,有一個時刻關心性能、內存控制、變量生命週期、數據結構和算法的環境;

  ◆學習面向對象的分析與設計,它是解決複雜問題的有效的方法。學習抽象,它是解決複雜問題的惟一之道。

相關文章
相關標籤/搜索