PHP 第27章 PHPER之路 PHP 第27章 PHPER之路

2016-07-27

一、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交互(存储后端、逻辑后端、反作弊 后端、外部服务) -> 更多后端 酱紫的复杂业务;

能够支撑每天数千万到数亿流量网站的正常开发维护工作。

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开微信扫一扫,即可进行扫码打赏哦

阅读 3500