这两年聊到PHP,很多人的第一反应是“PHP是不是不行了”“还在写PHP是不是有点过时了”。每次在技术群里看到类似的讨论,我都觉得有点哭笑不得。我接触PHP已经有十年左右,从PHP 5.2一路写到现在,经历过ThinkPHP 3.2.3那个“国产框架最热闹”的年代,也看着Laravel一步步成为主流。坦率地讲,PHP确实没有前些年那么“风光”,这个行业也确实越来越卷——但正因为卷,我才更想说清楚一件事:很多PHP程序员把自己的路走窄了,不是因为PHP这个语言不行,而是因为他们在内卷里慢慢丢掉了一个很重要的东西——像庖丁解牛那样,对技术本身纯粹的好奇心和掌控感。
这篇文章想聊的不只是PHP,而是所有被“内卷”裹挟的程序员。我会从PHP的具体处境出发,拆解“内卷”到底卷掉了什么,再用“庖丁解牛”的三重境界,整理一条从“被动追框架”到“主动掌控技术”的成长路径。如果你是刚入行的PHP新人,或者写了两三年代码开始有点迷茫的初级/中级开发,这篇文章应该能给你一些不一样的视角。
1. 卷而不进的PHP程序员,到底卷在了哪里
1.1 用战术上的勤奋掩盖战略上的迷茫
我见过不少PHP程序员,每天忙得脚不沾地,但回头一看,能力几乎没有长进。这种“忙碌”有一个共同特点:都在追赶别人定义好的东西。
框架出新版本了,赶紧学;某大厂面试题里出现了某个冷门概念,赶紧刷;看到别人写技术文章,也跟着写,但写来写去都是那种“ThinkPHP 3.2.3 如何实现文件上传”的搬运文。这种状态,本质上是把“知识收藏”当成了“能力增长”。你收藏了一百篇教程,不意味着你就懂了一百个原理;你刷了三百道面试题,不意味着你就能解决真实项目里那个诡异的Bug。
我认识一个做PHP开发的朋友,工作五年,简历上写了精通ThinkPHP、精通Laravel、精通Redis、精通MySQL优化。有一次他遇到一个问题:线上接口偶尔慢,但数据库单独执行SQL很快。他排查了两天没头绪,最后发现是PHP-FPM的进程数配置太低,请求排队了。这个问题的根源其实非常基础——你只要理解PHP-FPM的工作模型,看一眼pm.max_children的配置就能定位。但因为他平时只关注“怎么把接口写完”,从不关心“这个进程是怎么跑起来的”,所以哪怕工具链再熟,也解决不了这种跨层问题。
这其实就是内卷的一个典型特征:做的事情很多,但都是在同一个“操作层”上重复,没有任何一层往下深挖。
1.2 框架焦虑与技术选型的恶性循环
PHP圈子里的“框架焦虑”比其他语言更明显。根本原因在于PHP的入门门槛低,大量新人涌进来,导致“初级开发者”这个池子极度拥挤。而框架,恰恰是很多人用来证明“我高级”的一种方式。
你想想看,是不是经常能看到这样的情况:某个项目原本是ThinkPHP 3.2.3写的,运行得好好的,但团队里有人提出来“这框架太老了,必须升到新版/换个框架”,然后整个团队花了两三个月重构,中间出一堆兼容问题,最后功能倒是没变,稳定性反而下降了。为什么要换?因为“老框架写简历上不好看”。
我举这个例子不是说框架不该升级,而是说,很多框架层面的选择,根本不是基于技术判断,而是基于焦虑。当一个人把“我的价值”等同于“我用什么框架”的时候,他就已经失去了对技术本身的判断力。你会发现,这类人特别容易被热点牵着走——今天听说Swoole好,就学Swoole;明天听说Hyperf香,就搞Hyperf;后天看到Go语言工资高,干脆想转Go。每个东西都学了个皮毛,每个东西都用不深,五年下来,简历上能写的越来越多,能拿得出手的解决方案却越来越少。
1.3 “搬砖量”不等于“技术深度”
还有一个很迷惑人的内卷陷阱,就是用“产出量”来衡量自己的成长。比如别人一天写500行代码,你一天写800行,你会觉得自己更努力、更有价值。但实际上,代码量的多少和技术深度之间,几乎没有任何正相关关系。
我有段时间带过一个新人,他写代码特别快,特别能加班,一个模块别人要两天,他半天就能给你“糊”出来。但每次review他的代码,我都要花很多时间帮他改——不是风格问题,而是逻辑漏洞太多了。他那个模块看起来能跑,但只要输入稍微极端一点,就报错。他以为自己在“高效产出”,但实际上只是在快速制造问题。
真正的技术深度,是你能不能在写代码之前就想清楚边界条件,能不能在出问题之后十分钟内定位到根因,能不能在别人都在“复制粘贴改改”的时候,写出一个逻辑清晰、结构合理、以后维护起来不痛苦的方案。这个东西,单纯靠“多写”是练不出来的,得靠“多想”。
这就引出了这篇文章的核心话题——PHP程序员在内卷中丢失的初心,到底去哪里找回来?我后来发现,古人其实早就把答案写明白了,就是“庖丁解牛”这四个字。
2. “庖丁解牛”对程序员而言,究竟在说什么
2.1 庖丁解牛不是鸡汤,是一套方法论
很多人听到“庖丁解牛”这四个字,第一反应是:哦,讲的是熟能生巧。这个理解不能说错,但太浅了。庖丁解牛这个故事里最核心的,不是“他杀了多少头牛”,而是他讲的这段话:
始臣之解牛之时,所见无非牛者;三年之后,未尝见全牛也;方今之时,臣以神遇而不以目视。
换句话说,庖丁解牛经历了三个阶段:第一个阶段,看到的是一整头牛,不知道从哪下手;第二个阶段,能看到牛的骨骼、肌肉、筋腱之间的缝隙,知道刀该往哪里走;第三个阶段,根本不需要用眼睛看,凭感觉就知道关节在哪里、缝隙在哪里,刀进去游刃有余。
这哪里是在讲杀牛,分明是在讲任何一种专业技能的学习路径。程序员面对一套代码系统,跟庖丁面对一头牛是一模一样的。
第一阶段,你看到一个项目,就像看到一整头牛——控制器、模型、视图、路由、中间件、服务提供者、数据库迁移文件,乱七八糟一大堆,你不知道哪些是关键路径,哪些是可有可无的;第二阶段,你开始能分辨出各部分之间的“缝隙”——你知道了请求从Nginx到PHP-FPM再走到框架路由再到业务代码的完整路径,知道了框架的“骨架”和“业务逻辑”在哪里分界,知道哪些代码是核心,哪些代码是“肉”;第三阶段,你不光熟悉这套系统,你还能预判它哪里会出问题,哪里可以优化,哪里需要重构,你的刀工已经不受具体框架限制了。
2.2 “初心”的本质不是怀旧,而是对本质的好奇
我写这篇文章时一直在想,到底什么是PHP程序员的“初心”?是守着老技术不动吗?是用PHP写一辈子不转Go吗?都不是。
初心,是你当初第一次写完一个页面、第一次把数据库里的数据展示到网页上时的那种“这个东西竟然真的跑起来了”的兴奋感。是你在排查一个Bug时,顺着日志一层层挖下去,最后找到根因的那一刻的顿悟感。是你把一段又臭又长的代码重构得清清爽爽时,那种发自内心的满足感。
内卷让人丧失的,恰恰就是这些东西。当你的注意力全部放在“别人今年工资多少”“别人学了什么新框架”“公司会不会裁员”上的时候,你的精力就被消耗干净了,根本没有余力去感受技术本身带来的乐趣。你变成了一个工具人——写代码只是为了交付,交付只是为了不被骂,不被骂只是为了保住这份工作。但你有没有想过,如果长期处在这种状态里,你就算保住了工作,你的能力也一直在原地踏步,三年后照样被更年轻、更能拼的人取代。
所以,找回初心不是让你“回到过去”,而是让你重新回到对技术本质的关注上。接下来我想用庖丁解牛的三重境界,对应PHP程序员的成长路径,把这个过程拆开讲。
3. 三重境界:从“见牛是牛”到“游刃有余”的PHP进阶之路
3.1 境界一:所见无非牛者——新手期的“背框架”阶段
庖丁刚开始解牛的时候,看到的是一整头牛。PHP新手也差不多,刚入职或者刚学完基础语法,进入一个项目,看到满屏的代码,最大的感受就是:这玩意儿是怎么串起来的?
在这个阶段,最正常的做法就是“背”。背框架的目录结构,背路由怎么写,背模型怎么调用,背SQL怎么拼接。我很理解这个阶段的人,因为我自己也是从这一步走过来的——当年用ThinkPHP 3.2.3写第一个项目的时候,我连I('post.xxx')这个I函数为什么要用都搞不清楚,只知道照着老代码抄就不会错。
这个阶段有一个特别典型的“背框架”表现:代码风格完全依赖框架,离开框架就写不了程序。你让他用原生PHP写个简单的用户登录,他能憋半天。没有Model类他就不知道数据该怎么取,没有数据库类他就不知道连接该怎么建。这不是他的错,这只是认知阶段的局限——他还没有从“牛是牛”的阶段走出来。
在这个阶段,我不建议新人急着去追新框架、看源码、谈架构。你连一头牛的整体结构都没看清呢,谈什么“目无全牛”?这时候最重要的事情只有一件:踏踏实实把项目跑起来,把功能写出来,弄明白一个请求从浏览器发出到页面显示,中间到底经过了哪些环节。
我当时有一个实操习惯,对新手特别管用——打断点跟请求。每收到一个请求,就在入口文件(比如ThinkPHP 3.2.3的index.php)最前面加一行写日志的代码,把$_SERVER、$_GET、$_POST这些原始数据打出来。然后逐步往框架内部走,看路由是怎么把URL映射到控制器上的,看控制器是怎么把数据交给模板的。这个过程跑两三次,一个PHP项目最基本的运转逻辑就刻在你脑子里了,比你看十篇框架教程都管用。
3.2 境界二:目无全牛——从“会写”到“懂原理”的跨越
“三年之后,未尝见全牛也”——这句话放在程序员身上,意思就是:你开始能透过代码的表象,看到系统内部的“骨骼”和“缝隙”了。
拿PHP来说,这个阶段的典型表现是:你不再把框架当成一个不可拆解的黑盒,而是开始理解框架背后那些底层的东西。举个例子,同样是使用ThinkPHP 3.2.3,境界一的程序员只知道“模型可以查数据”,境界二的程序员会开始思考:
Model->find(1)这行代码,底层到底执行了哪些SQL?- 框架是如何通过
PDO连接MySQL的?连接池是怎么回事? I('post.id')这个函数,是怎么对输入做过滤的?它和直接访问$_POST['id']有什么区别?- PHP-FPM拉起PHP进程、PHP解释器初始化、然后执行脚本,这个过程的时间都耗在了哪里?
到了这个阶段,你开始隐约能看到那头“牛”的关节了。你知道控制器和模型之间应该怎么分工,知道SQL查询在什么情况下会走索引、什么情况下会全表扫描,知道Session和Cookie的区别不只是“一个存在服务器一个存在客户端”。你开始理解,框架只是PHP的一种“组织代码的方式”,而PHP本身、HTTP协议、MySQL、Linux这些才是真正的地基。
怎么判断你到了这个阶段?有两个很直观的指标。第一,你不再害怕“脱离框架”,哪怕让你用原生PHP写一个不带任何框架的API服务,你也能很快理清思路。第二,你开始主动读源码了——不管是框架的源码还是PHP官方文档里那些底层的说明,你不觉得那是负担,反而觉得有意思。
这个阶段最忌讳的,就是“知道了原理但不动手验证”。很多人看完源码觉得“原来是这么回事”,然后就没有下文了。这不行。你要真正“看到”那条缝隙,得自己把框架的代码走一遍,或者干脆用原生PHP把一个控制器路由的简易版写出来——用$_SERVER['REQUEST_URI']取出URL,自己写一个正则去匹配路由规则,匹配上了就include对应的控制器文件。这段代码可能只有几十行,但跑通那一刻你对“路由是什么”的理解,绝对超过你读十篇文章。
3.3 境界三:游刃有余——不依赖具体框架的技术掌控力
“以神遇而不以目视”,说的是一种极其熟练之后的状态:刀已经不需要在牛身上比划,就知道从哪里下。放在PHP程序员身上,就是你不依赖具体的语法和框架,也能基于对原理的理解,快速分析和解决问题。
这个阶段的PHP程序员有以下几个特征。
第一个特征:技术选型有主见,不盲从热点。有人问你“PHP是不是该转Go了”,你不会慌,你会先想清楚:你当前解决的是什么问题?这个语言/框架的核心优势和不可替代点在哪里?你能够从业务需求出发,而不是从技术潮流出发来做决策。
第二个特征:解决Bug的能力质变。不是靠“打日志-猜-再打日志”这种循环,而是靠对系统整体运转模型的理解做推理。比如遇到一个“某个接口在高峰期偶尔超时”的问题,你可能不会直接看代码,而是先看PHP-FPM的进程数、看慢日志、看MySQL的锁等待时间,心里已经有了一张排查路径图,然后按图索骥,快速定位。
第三个特征:有“迁移”能力。庖丁解牛解的是牛,但掌握了关节规律之后,解其他的牲畜虽然不完全一样,也能很快上手。程序员也一样——你在这个公司用ThinkPHP,去了下一家用Laravel,再下一家可能完全不用PHP,但你学习新框架的速度会比别人快很多,因为你理解的不是“这个框架怎么用”,而是“框架一般要解决什么问题、通常怎么解决”。你会知道路由、ORM、模板引擎、事件系统这些概念在哪个框架里都存在,只是叫法和用法不同。
我还想强调一个点:这个境界不是“用PHP十年自动到达”的。它是靠持续的深度思考和规律总结才能逼近的。如果你写了十年PHP,但始终停留在“接需求-写代码-上线”这个循环里,那你可能还是停留在第二甚至第一境界。这就是普通程序员和顶尖程序员的真正差距——不是语言、不是公司、不是学历,而是对规律的理解深度。
4. 回归“解牛”的实操方法:从“卷”回到“掌控”
4.1 停止无效学习,用“原点思维”重新规划技术路线
聊完了三重境界,现在的问题就来了:我承认我确实有点卷,那我该怎么办?
第一个建议是:停止无效学习。把收藏夹里吃灰的教程清一清,把各种“XX天精通PHP”的课程退掉,从今天开始,只学那些能让你更理解“系统如何工作”的东西。
我给自己定过一个技术学习的原则,叫“原点思维”——就是不管学什么东西,都问自己一个问题:这个东西解决了什么本质问题?它的最初设计动机是什么?
拿PHP的Composer来举例。很多人用Composer只是知道“composer install能把依赖装好”,但如果你用原点思维去问:为什么会有Composer?因为PHP项目的代码复用一直很痛苦,以前大家都是手动下载第三方库、手动include,版本冲突还特别严重。Composer的出现就是为了解决“包管理”和“自动加载”这两个痛点。理解了这一层,你再去看Composer的autoload机制、psr-4规范,就不会觉得难了,因为你知道它是在解决什么问题。
同样,学一个新框架以前,先别急着看用法,先问:这个框架比之前的框架好在哪?它解决的是什么痛点?它的作者在设计时做了哪些取舍?带着这些问题去学,你的理解深度会和“照着视频敲一遍”完全不在一个层次。
4.2 找一个“解牛”项目:不要做搬运工,试着从零造一套轮子
我特别建议每个PHP程序员,不管工作多忙,都保持一个“自己的小项目”。但这个项目不一定是为了赚钱,也不一定是为了做产品,而是为了让你找回“解牛”的感觉。
什么叫“解牛”项目?就是把别人做过的东西,从零再实现一遍。比如你已经用过很多次ThinkPHP了,那你能不能自己写一个“迷你版框架”?也不用多复杂,只需要实现:
- 一个入口文件,接收所有请求;
- 一个简单的路由,把URL映射到控制器方法;
- 一个Model基类,封装PDO的连接和基本的CRUD方法;
- 一个模板渲染函数,把PHP变量传到HTML模板里。
看起来很简单?等你真的写起来就会发现,一个“能跑”的框架和“好用”的框架之间差了十万八千里。你会遇到各种问题:路由匹配顺序怎么定?参数绑定怎么处理?SQL注入怎么防?PDO的预处理到底怎么用才对?这些问题看起来简单,但每一个都会逼你去查底层文档、看PHP源码注释,然后在实践中验证。
我自己的体会是,每写完一个这样的小项目,你对PHP的理解就会“通”一次。那种感觉特别像一个厨师自己亲手从切肉开始做了一顿饭,以后再吃到别人做的菜,就不光是尝味道,还能尝出门道来。
4.3 用写作和复盘倒逼深度思考
还有一点非常重要:输出倒逼输入。这是我自己验证过的最有效的学习方式。
你在工作里解决了一个“别人解决不了”的难题,或者踩了一个很隐蔽的坑,不要只是发个朋友圈“搞定”就完了,把它写下来。写什么呢?不是写“今天遇到了一个问题,百度了一下,发现是XXX,改好了”这种流水账,而是要把问题的背景、排查过程、可能的原因、最终方案、背后的原理,一条一条捋清楚。
写不出来,说明你没想透。我有一次写一篇“PHP-FPM进程管理”的文章,写了整整一个周末。一开始觉得自己挺理解的,但真的开始组织文字的时候,才发现很多细节自己其实一知半解——比如pm.max_requests到底是怎么触发重启的、跟pm的几种模式之间有什么配合关系。为了写清楚,我翻了半天源码和文档,还做了好几次实验,最后文章写完了,那个知识点我是真的“刻进骨头”里了,到现在都忘不了。
写作还有一个额外的好处:它会倒逼你形成自己的技术判断和价值体系。当你开始定期输出,你会发现,你不再那么容易被他人的焦虑情绪裹挟了,因为你已经有了自己的思考框架和判断标准。
4.4 把“解决问题”而不是“写代码”作为成就感的来源
最后一个实操建议可能有点“反直觉”:重新定义成就感。
很多程序员在入行前两年,成就感来源于“我今天写了很多代码”;三五年后,成就感会逐渐变成“我解决了一个别人解决不了的问题”。这两种成就感有本质的区别。前者是“量”的思维,很容易被内卷裹挟——因为总有人比你写得多;后者是“质”的思维,它强调的是一种“庖丁解牛”式的通透感——我对这个系统的理解比别人更深,我在关键时刻能稳住局面。
我工作这些年,见过太多“代码写得很热闹、但系统一崩就手足无措”的程序员。他们不缺乏努力,但缺乏对系统的“掌控感”。而掌控感这种东西,恰恰是让你在漫长的职业生涯里保持热爱、不焦虑的“定海神针”。
所以,从今天开始,遇到问题的时候,先别急着自己“写”代码,先停下来“看”代码。把系统当成一头牛来看,找到关节和缝隙,再决定这一刀往哪里下。相信我,这种感觉比盲目卷有意义得多。
5. AI时代,PHP程序员的“道”在哪里
5.1 AI工具不会淘汰程序员,淘汰的是“不会解牛”的程序员
最近两年,ChatGPT、Copilot、各种AI编程工具火得一塌糊涂。很多PHP程序员开始焦虑:AI都能自动写代码了,我们是不是要被取代了?
我的观点是:AI确实替代了一部分“写代码”的工作,但它替代不了“解牛”的工作。AI擅长的是“根据给出的需求生成代码片段”,它不擅长的是“在复杂的、有历史包袱的、缺乏文档的旧系统里,定位一个隐蔽的Bug”。
你想想看,你自己公司的那个运行了五六年的PHP项目,里面有十几个人的“历史代码风格”,有些函数几百行,有些变量名根本看不懂是什么意思,还有一些“看起来没用但删掉就出Bug”的神奇代码。出一个奇怪的问题,你把上下文贴给AI,AI能帮你解决吗?大概率不能。因为它不了解你这头“牛”的特殊结构——哪些地方是“骨头”,哪些地方是“筋”,哪些地方只是“肉”可以大刀阔斧地切掉。这些信息,只掌握在真正“解过这头牛”的程序员手里。
这就是AI时代的悖论:越是用AI,越需要你有庖丁一样的判断力。AI给你生成了一段代码,你要能判断它是不是符合你的系统架构;AI给你提供了一个排查思路,你要能判断它适不适合你的项目场景。而判断力,恰恰来自于你对底层原理的深刻理解。一个连PHP-FPM进程模型都搞不清的人,用AI排查问题的时候,甚至连“让AI看哪个日志”都不知道。
5.2 PHP的“慢”不是劣势,反而是深度思考的机会
还有很多人唱衰PHP,说PHP太“老”了、太“慢”了、生态太乱。我不否认PHP在某些场景下的确不如一些后起之秀,但“老”和“慢”恰恰给PHP程序员提供了一个额外的红利:这个语言太成熟了,原理解析的资料一抓一大把,只要你想深挖,你几乎找不到挖不动的地方。
相比之下,一些很年轻的语言和框架,变化太快,今天学的东西明天就变了,反而不利于沉淀。PHP的语法、运行时、跟Nginx和MySQL的配合方式,这些底层机制早就稳定下来了,它就是一头“骨架清晰”的牛,特别适合用来训练你的“解牛”能力。
所以我的建议是:与其焦虑“PHP是不是要凉了”,不如把这个阶段当成一个难得的“内功修炼期”。把PHP的底层机制研究透,把从HTTP请求到数据库查询这条完整链路搞明白,把架构设计的基本功打扎实。这些能力,不管以后你写PHP、写Go还是写Java,都是可以迁移的,而且是AI时代最稀缺的部分——因为AI可以做“执行”,但做不了“判断”。
6. 一点个人体会
在我自己的职业经历里,见过一波又一波的人从PHP转到别的语言,也见过不少人在PHP这个领域深耕之后,成了团队里解决问题最快、话语权最重的人。他们之间的区别,从来不在语言本身,而在于是否真正掌握了“解牛”的思维方式。
回到开头的那个问题:PHP程序员为什么会在内卷中丧失初心?我的答案很简单——因为我们把太多注意力放在了“别人怎么看”上,而太少放在“我自己是不是真的懂”上。当我们被“框架更新”“薪酬对比”“行业唱衰”这些外界声音牵着走的时候,我们就离“以神遇而不以目视”的状态越来越远了。
如果你想找回那种状态,我建议你不要急着学下一个框架、刷下一道面试题,而是先从你手头最熟悉的那个PHP项目开始,试着回答这几个问题:一个请求从浏览器到数据库再返回,中间每一步都发生了什么?框架里那几行你最常用的代码,底层到底是怎么实现的?你负责的模块里,哪个环节最容易出问题,为什么?
想清楚这几个问题,你其实就已经在“解牛”了。剩下的,就是拿刀,顺着缝隙,一刀下去,游刃有余。