经典的PHPer为什么被认为是草根?


Posted in PHP onApril 02, 2007

PHPer是草根吗?
从PHP诞生之日起,PHP就开始在Web应用方面为广大的程序员服务。同时,作为针对Web开发量身定制的脚本语言,PHP一直秉承简单、开源的思想,这也使得PHP得以快速的发展,并且大力地推动Web2.0的出现与发展。但是,长期以来,PHPer(PHP Programmers)被认为是处于草根阶层的程序员,被认为是技术含量少,层次低的程序员。这点在国内尤其突出。

记得一个技术主管说过这样一个事情。他给一个程序员分配了PHP的开发任务,没想到那个程序员居然说:“我是学Java出身的,你让我去写PHP,你这不是在贬低我吗?”。这件事情给我印象很深、触动也很大。虽然这不能代码大部分程序员的看法,但是这么认为的人应该不少。还有人说,现在如果是大型的政府项目,PHP是肯定不会被列入考虑的范围之内的。

那么为什么PHPer会被认为是草根阶层,是因为它很简单,人人都可以学会,所以没什么难度吗?我以前也是这么认为。PHP入门很快,处理文件,数据,远程连接,网络编程都非常方便,官方也有这样的说法:PHP学习的成本很低,所以你容易去使用它。这个想法也是普遍的,甚至大部分的PHPer自己都这样认为。

说到这里,我想大家就会想到我为什么要写这些文字。因为一年多的PHP推广工作让我了解到许许多多的使用PHP的公司的大概情况。在这些过程中我慢慢体会到其中的根本原因。这里我说是根本原因虽然是个人的看法,但是我觉得事实就是如此。

那么为什么PHPer会被看成草根阶层,根本原因是PHPer所作的事情(通过代码实现)的绝大部分都是表现层的东西,这个熟悉PHP的人都知道。当然也会有PHP会说他用MVC结构编写的某某框架具备的如何如何的功能。但是这些还是表现层。所以只会处理表现层的程序员就被看成草根阶层了。事实上也是如此,因为这种情况下PHP确实很难构造大型的应用。

这就找到原因了,不是的。为什么PHPer总是在负责表现层的东西呢。答案是底层的数据处理(Web应用就是数据存储和查找)我们一般不去触及!好,那么说到这里有些人可能已经想到了,那不就是数据库吗!对,就是数据库!让PHPer一直当草根的元凶就是数据库。为什么?

因为目前流行的web架构中,前端是负载均衡系统,中间是web服务器,后面是数据库服务器。所以,大部分PHPer工作在Web服务器层面。因为数据库已经很好地为我们组织数据了。所以PHP中没有太多的算法,而且大家潜意识下也觉得不需要,更何况会影响性能。

这种情况下,PHPer就成为了数据库使用者,他总是在操作数据库。而不是在做程序。一个最简单的PHP脚本就是,连接数据库,把数据取出来,然后用命令输出到浏览器。整个过程不超过10行代码。给人的感觉就是太简单了。没有任何技术含量。为什么了,因为数据处理部分都已经被数据库做完了。尤其是MySQL的使用!MySQL是免费的,所以大多数程序员可以自由地使用它,另外MySQL的速度够快了,所以做个PHP应用程序非常的简单。这就相当于给你枪以后你觉得没有必要学习武功一样。当然,我不是说枪没有武工好。而是说,枪的出现,小孩都可以轻松便捷地杀人了。

我们再详细说说为什么是数据库!这里我说一个例子。我去过北京一家非常著名的网站,当时我们还有一个比较资深的PHP程序员在那说些系统架构的事情。我记得当时那个程序员问大家一个数据结构中的算法问题的时候,全场没有一个人能答得出来(包括我)。然后那个程序员就开始给大家讲些很基础的数据结构的东西了。让我一下子回想到大学时候学的数据结构课。而这些基础的数据排序、查找、传递的问题在其他高级语言(比如C)是非常普遍的。但是在PHP没有!PHPchina.com的论坛也有个板块叫PHP的数据结构和算法。这个板块的帖子也是寥寥无几。

仔细回想下,目前网络上大家讨论的最多的是两个方面的问题。一个是PHP的类的使用(处理过程的封装),还有一个是开发框架问题。但是我们仔细分析的话,发现这些所谓的PHP中比较复杂的概念里面没有数据处理!为什么,有数据库!用一个Adodb或者PHP5的PDO就可以搞定了!真的搞定了吗?不是,这些无非是在连接数据库,没有数据处理!所以PHPer似乎就没有什么可以拿出台面上的东西。

再说一个具体的代码问题,无级分类。这个概念我想大家都不会陌生了吧。我见过两种处理方式。第一个是地道的PHPer的处理方式,也是目前比较流行的。就是用数据库来处理。而且字段很少,只需要加个父类的字段并加以判断就行了。而且这个方法很实用。效率也高!但是这个不是数据处理的范畴了,而是数据库的查找!
第二个是C程序员用PHP写出来的,他把所有的分类信息都从数据库取出来,然后用数据结构算法进行排列分布,然后输出。
这里我们不对这两种方式的效率进行对比,我想大家都有各自的想法。但是我想说明一个问题,就是这两种做法的本质的区别。PHPer习惯性地用数据库来处理,而且有很巧的处理方式,效率也很高!这种方式就是数据库查询。而第二种方法是比较有特点的。他认为数据库就是存放数据的地方,具体的逻辑处理还要靠自己的逻辑。
因此,结论是第二种方法的使用者觉得自己强些,因为数据的逻辑是他组织的!并且觉得PHPer的那种做法无非就是会查询数据库罢了。所以他认为PHPer是草根级的,只懂得操作数据库和排列页面(smarty搞搞那种)。

说到这里,我想大家都已经回忆了不少自己平时用PHP做开发的经历了吧,是否发现大家确实都在操作数据库呢。

那么我们来讨论下这个问题。数据库不好吗?为什么我一直用数据库处理数据都没有问题。我要说的是数据库是有问题的,而且有很大的问题!当然这里我并不是说不能用数据库,也不是在贬低数据库的性能。而是,我们没有充分认识到数据库所起到的作用。

我的想法源起于这样一个事情,有一次一个网站的技术总监问我,为什么他们的网站那么慢,要怎么办。当时,我的MSN里Zend总部的工程师正好在线,我就问他PHP响应比较慢了,怎么办?他当时直接告诉我,数据库问题!肯定是数据库没有优化设计好。所以,我没有给那个技术总监确切的答案了,因为他们的数据库设计我们是不能涉及的。所以就给了大概的数据库优化的建议。这样的事情屡次发生,我就开始怀疑,为什么Zend总部的工程师每次都跟我说是数据库的问题呢,难道我们不能从PHP层面来解决这个问题吗?答案是不能!因为PHP目前的运行速度已经是很快了,通过Zend的性能分析也能看到一个用户的点击,PHP的运行时间只有10%不到,那PHP在干吗?它在等。等数据库的查询结果。这个方面在目前的PHP产品中有了很大的提高,那就是Caching和网页静态化两个方案。Caching可能大家会比较陌生,但是网也静态化现在连PHP产品的用户都非常清楚了。速度快、容易被搜索到等等,好处不言而喻。开玩笑地说,现在网站的主页实现网页静态化只需要硬盘足够大。J至于Caching就比较复杂些,也是大多数PHPer感到头疼的地方。甚至于有些人会用C来实现。因为Caching中的数据有效期验证、查找、提取、更新等等都是比较难处理。当然,也有人会用数据库来处理Caching问题。

所以,当访问量激增的时候,PHP架构的网站会出现的很多问题都因数据库而起。数据库的同步问题还不算什么。关键是数据库的响应速度会有指数级的降低。这个问题我在10月23号LAMP发布会的时候问过MySQL的副总裁。他当时也没有给我比较完美的答案(这也我的意料之中),因为数据库总会有瓶颈的,除非是神仙数据库,哈哈!
这里有个题外话,LAMP大会的时候我跟Yahoo的一个技术高管聊的时候,我问他Yahoo在选择MySQL还是Oracle的时候是怎么考虑,他的答案令我非常惊讶。他说大部分的时候我们是会用MySQL的,因为它的性能已经达到我们的要求。但是什么时候我们会选用Oracle呢,就是当我们需要存储收费用户的数据的时候。我就问为什么,难道Oracle比MySQL稳定吗?他说,这个倒没有特别考虑。关键是如果使用Oracle的话,当出现问题的时候我们可以找到负责人,Oracle会负责事故的处理,但是如果用MySQL的话,我们找谁去?

所以,我们对数据库的看法应该纠正过来,就是说数据库不是万能的。如果有实力的话自己开发数据库。听说Google就是那样的。

那么我们怎么看待数据库呢?我个人的理解是数据库只是用来降低开发成本的手段。因为采用数据库以后我们不需要考虑数据的存储,尤其是排序和查找。但是这会带来什么问题呢?就是当业务膨胀的时候,数据库就成为瓶颈了!这个时候问题就会非常棘手!因为这个是底层的数据处理。牵一发而动全身。
所以我认为正确的观点是,数据库是一个数据备份机!怎么理解,我们只需要保证数据的存储有效性就行了。而这本来就是数据库的核心功能,只不过因为数据库的方便的排序等功能让大家把过多的处理都交给数据库来操作了。一个用户的点击PHP就把一大堆的任务交给数据库,然后把结果排列下给用户就完事了。这对数据库是不公平的!也是因此大家开始抱怨数据库的性能了。

针对这个观点,我们再举个例子,有一次我去拜访一个大型的网络公司(基本上国内只要上过互联网的都知道),他们使用PHP很少,但是我了解到他们其它业务是怎么使用数据库。他们自豪地跟我介绍说他们在数据库的外围有个第二数据库(我这里起名叫第二数据库)。为什么叫第二数据库呢,原来它是一个缓存系统。那么开发工程师怎么去这个缓存系统获取数据呢?那个技术总监自豪地说,他们这个缓存系统由SQL查询语句!我当时很惊讶,但是后来想想确实需要这个。因为当你的缓存系统达到一定量级的时候从缓存获取数据都非常复杂,干脆写个SQL查询语句让缓存系统分析、处理并返回数据。而且他们告诉我,在他们那里,就算是用PHP的话也是让PHP去那个缓存系统读取数据。

所以说,如果你能处理好这样的问题的话,把数据存放在数据库,然后数据库只起到备份的作用。然后你用自己的中间层来处理分析数据,效果是90%以上的用户访问不访问数据库。有人就会说了,这不就类似连接池的东西吗?是的!因为数据库的瓶颈是无法解决的,我们只能在Web服务器和数据库中间加个中间层来做缓冲。

可能大家会说了,切,这个我们早就知道了!那好,这里我要说的是它引发的两点思考:
第一,              有些语言已经有连接池技术的基础上,那些程序员可以方便地使用连接池而构建大型应用。那么如果他们认为PHPer只会是用数据库,那么我们是不是可以说他们只会是用连接池呢?连接池和数据库在这个概念上有何区别?

       第二,     当PHPer开始构建自己的缓存系统的时候,他是不是突破了PHPer只会是用数据库的层次?因为他参与了数据逻辑的处理工作。那么他还是草根吗?

最后,新一代的PHPer是草根吗?

PHP 相关文章推荐
解析php中heredoc的使用方法
Jun 17 PHP
php的array数组和使用实例简明教程(容易理解)
Mar 20 PHP
PHP面向对象程序设计之接口用法
Aug 20 PHP
PHP开发框架Laravel数据库操作方法总结
Sep 03 PHP
ThinkPHP表单自动验证实例
Oct 13 PHP
Laravel中使用自己编写类库的3种方法
Feb 10 PHP
PHP删除指定目录中的所有目录及文件的方法
Feb 26 PHP
PHP递归调用数组值并用其执行指定函数的方法
Apr 01 PHP
PHP代码实现表单数据验证类
Jul 28 PHP
PHP下载远程图片并保存到本地方法总结
Jan 22 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
Nov 14 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 PHP
在任意字符集下正常显示网页的方法二(续)
Apr 01 #PHP
在任意字符集下正常显示网页的方法一
Apr 01 #PHP
用PHP实现的生成静态HTML速度快类库
Mar 31 #PHP
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
Mar 29 #PHP
实现dedecms全站URL静态化改造的代码
Mar 29 #PHP
PHP中动态显示签名和ip原理
Mar 28 #PHP
收集的PHP中与数组相关的函数
Mar 22 #PHP
You might like
留言板翻页的实现详解
2006/10/09 PHP
生成ubuntu自动切换壁纸xml文件的php代码
2010/07/17 PHP
UCenter中的一个可逆加密函数authcode函数代码
2010/07/20 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
一个PHP实现的轻量级简单爬虫
2015/07/08 PHP
php session的锁和并发
2016/01/22 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
php5对象复制、clone、浅复制与深复制实例详解
2019/08/14 PHP
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
jquery 简单的进度条实现代码
2010/03/11 Javascript
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
javascript中强制执行toString()具体实现
2013/04/27 Javascript
使用Node.js实现HTTP 206内容分片的教程
2015/06/23 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
Bootstrap Table使用心得总结
2016/11/29 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
2017/03/10 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
2019/09/24 Javascript
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
python中使用%与.format格式化文本方法解析
2017/12/27 Python
Python异常处理操作实例详解
2018/05/10 Python
python urllib爬虫模块使用解析
2019/09/05 Python
python属于解释型语言么
2020/06/15 Python
Python三维绘图之Matplotlib库的使用方法
2020/09/20 Python
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
French Connection官网:女装、男装及家居用品
2019/03/18 全球购物
教师师德承诺书
2014/03/26 职场文书
委托书英文
2015/01/28 职场文书
2016十一国庆节感言
2015/12/09 职场文书
Python保存并浏览用户的历史记录
2022/04/29 Python
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android