drupal对比thinkphp,看国内的开源环境ThinkPHP

住房、结婚、医疗、教育、养老每一个都是一座大山,“搞钱”必须是头等重要的大事,谁有空搞开源?于是仅两个核心开发者打造的ThinkPHP成为了很多人的希望,而另外一边,没有“程序员是吃青春饭的”,开源软件社区聚会上常常见到五六十岁的人还在眼中带光的谈论技术,他们寻找生命的意义,不被生计太多打扰,将一生的积累注入到开源,他们梦想自己所做的能照亮世界,将人生化做伟大的作品伴随人类文明流传下去,于是Drupal被万众捧出,并急速驶向星辰大海。本文讲述了一个忧伤的故事,思考着看同种文字的人们该何去何从,这个故事应被更多人知道。

这两系统都是开源、免费的PHP应用,首先做个简要介绍:

ThinkPHP:

产品定位:PHP开发框架,开发者在此基础上继续开发搭建自己的应用系统

开发机构:由国内“上海顶想信息科技有限公司”开发

创始人:刘晨,没有太多资料,百度查询为开源软件资深顾问,资深PHP程序员,看云CEO,超过15年的互联网产品开发和管理经验,主要研究领域包括Web应用架构和开发,产品用户体验设计,致力于国内的开源事业

开源协议:Apache2

用户群体:中国国内小微企业,在国内开发者圈中具有较高知名度,其官网自我描述为“是国内最有影响力的PHP框架和先驱者!”

著名案例:56群组、联想问吧、中青旅开心遨游、宝矿力水特、星巴克、美特斯邦威的邦购商城、TCL的在线商城、新浪微坛,澳星、中车友科技等

团队规模:没有官方数据,但框架的每个文件有作者信息,据此统计一共有7人,其中主要开发者有两人(贡献90%以上代码),这些数据不包括社区生态圈的贡献开发者,依据企查查平台对顶想公司查询结果显示,公司规模小于50人,参保人数3人

系统文件:按目前的6.0.7版本算,初装文件数569个,占用空间2.41MB

Drupal:

产品定位:完整的后端系统(后端数据与控制中心),用于APP、小程序、网站、物联网等的后端开发

开发机构:全球两百多个国家共建,Drupal基金会组织的非盈利开源社区

开源协议:GPL2.0

用户群体:全球各国的企业、政府机构、大学、个人等,其中世界五百强企业市场占有率超过80%,著名IDE:phpstorm直接集成了Drupal项目新建

著名案例:国内有:华为、京东、百度、腾讯、清华、北大、贵州市政府站群、真功夫等,国外有:特斯拉、谷歌、本田、高通、联合国、欧盟、哈佛大学、麻省理工大学、迪士尼、NASA、辉瑞制药等

团队规模:

拥有全球最大最活跃的开源社区,核心开发者1800余人,处于活跃状态的贡献者(代码、文档、设计等人员)共有超过12万人,其中中国分社区两千余人,主力推动公司Acquia雇员超过1100人。当前平均每周产生1300次左右代码提交。

系统文件:按目前的9.1.7版本算,初装文件数18770个,占用空间71.2MB

为什么是ThinkPHP和Drupal:

一个是中国国内的流行框架,一个是国际流行的完整后端系统(也是目前世界上最强大灵活的系统,没有之一),从它们的体量看这完全不在一个重量级,从其市场定位看,也没有比较的意义,但探索它们对了解中外软件生态具有重要意义,此外如果直接告诉你ThinkPHP能做的事情,Drupal都能做,而且还更加优雅和简洁呢?事情是不是就变的很有意思了,继续。

通常使用Drupal的国内开发者都是有很多年经验的开发老手,是伴随时代从各种系统一步一步淌出来的,他们一定知道或多少了解ThinkPHP,但使用ThinkPHP的开发者却不一定了解Drupal,使用ThinkPHP的开发者选择ThinkPHP的理由一般是:框架较底层PHP进一步的提供了常用基础,灵活自由,和对帝国CMS这样的系统进行二次开发相比,不受限制,能够随意实现自己的功能,但是在Drupal面前,事情就变的不一样了,可能会让开发者有如获至宝的感觉,在此需要先简要介绍一下Drupal的系统架构,整个Drupal系统是分层建设的:

最底层:

是框架层,基于流行的Symfony框架,Symfony可谓是PHP的行业标准,是世界最著名的框架,另一个著名的PHP框架Laravel本身很多部分也都是基于或来自Symfony,懂得Symfony框架的开发者可以很快上手开发Drupal,Symfony框架的作者法比安是一个传奇人物,其另一个广为人知的作品是Twig模板引擎,该引擎也用在Drupal中,Drupal是Symfony最著名的案例,其官网将Drupal列在第一位,Drupal社区也参与Symfony的代码贡献。

第二层:

是数据层,以实体为代表,向上提供各种数据,数据库封装即属于该层,ORM概念以及ThinkPHP中的模型概念类似于实体概念在很早很早时期的样子

第三层:

应用层,开发者在这一层处理各种业务逻辑

这里需要注意开发者在使用Drupal时,不一定要一层一层往下调用,而是可以跨越,直接去面向某一层,所以当直接面向框架层开发时,就可以将整个系统当做框架来使用,就像ThinkPHP开发者直接使用ThinkPHP框架一样,这就是为什么说ThinkPHP能做的Drupal都能做的原因,所不同的是Drupal采用Symfony框架,题外话ThinkPHP深受Symfony影响,甚至直接采用了其部分组件,许多方面高度借鉴了Symfony框架(任何创造者都值得尊敬,因此不用“抄袭”这个词,而用“借鉴”),主干流程几乎相同,但在成熟度和细节上相差甚远,这种差距举个例子来形象的说明:

何为好系统?我们需要什么?

俗话说工欲善其事必先利其器,这里列出几个点来说明一个优秀的系统应该具备什么特性,下文我们将以此来对比ThinkPHP和Drupal:

完备性:

所谓完备性你可以认为是某个工具或组件被设计出来已经充分考虑到了所有的情况,比如PHP原生提供的字符串截取函数会把UTF-8字符截断,产生乱码,而你设计了一个截取函数,不但不会这样,还不会截断英文单词,还考虑到了不截断HTML中的标签,那么你这个工具就比PHP原生函数更加完备,一旦发现有满足不了的用列就需要改进以提高完备性,Drupal很多地方的设计是“完备”的,尽管Drupal也在持续探索和进化,但这种完备程度远超ThinkPHP,举个例子,Drupal的路由系统可以天然支持基于域名、协议、HTTP方法、数据格式、选项等进行路由,在都匹配的情况下有优先级分级,而这些是ThinkPHP不完全具备的,这种组件设计上的完备依赖于对事务本质认知的深度和大量开发经验,完备性让人类站在前人的基础上继续前行。

标准化:

标准化是大规模协作的前提,系统分层结构、跨系统通讯、解耦组件等都离不开标准化,Drupal完全面向RFC文档,而不是自成体系,在注释或讨论中经常看到对RFC的引用,RFC文档是IT互联网的基石,类似在产品上常见的国家标准,常被用户忽略,但又异常重要。

完整性:

合作分工,当把发展的足够完备的组件凑到一起,大家都来使用它们,这就构成了完整性,然后人们不必自己再重复造轮子,突破内卷,完整性也会反过来促使完备性的提高,Symfony和Drupal就以组件和模块的方式来解决完整性问题。

低耦合性:

系统设计各组件间需要尽可能解耦,这样就能给各组件更多的发展提高的空间,不好的组件也便于替换,Drupal采用模块化设计,连核心都是模块化的,用户可以在用户空间中替换任何核心文件,而不直接修改,避免功能不足和阻碍升级,相对而言ThinkPHP耦合较紧。

掌握边界:

一个好的系统势必是分寸拿捏得当的系统,但这真的有点难,且仁者见仁智者见智,总的来看大方向或者主干系统必须是简洁的,这里举一个例子,在ThinkPHP中支持按路由参数决定路由控制器,即:Route::get(':action/blog/:id','Blog/:action');,而Drupal不允许这样做,实现类似功能时通常采用代理控制器实现,简而言之即该效果不应该在路由层面实现,而应该在控制器层面实现,这样使得路由系统更加简洁,系统架构更加清晰,这种思想贯穿Drupal,使得Drupal系统主干十分简单干净,当你要某个细化功能时,首先进入对应大支流再进入到不同的细化支流当中,是不是像一颗树?但你更喜欢哪种方式呢?

简洁性:

大道至简,系统需要流程清晰,调用统一,规则一致,不允许有另外,或尽量避免另外,这样的好处是易于新人学习,并且追踪、排查都很方便。

生命力:

系统的生命力也在于可持续性,生态圈和开发者就是系统的养料,下文还会讲到,这里略过。

对比ThinkPHP和Drupal:

ThinkPHP和Drupal相比总的来说,在于ThinkPHP抽象程度不足,积累不足,这是根本上的不足,它像一个孩子,Drupal是一个经历岁月的成年人,懂得更多,知道事物背后蕴含的通用道理,做的也更进一步,假设我们是在建造一栋大厦,ThinkPHP提供了混凝土、砖块、钢筋等等建筑基础材料,开发者需要去探索如何修建,如何设计等建筑学问题,而Drupal不但提供了基础材料,还附带了施工队和设计院,很多时候你只需要说出你要什么样感觉和功能的大厦就行了(你遇到的需求,通常已经有人遇到过,形成了数量庞大的贡献模块,安装即可),当然如果你有兴趣,你也可以参与修建的过程得到你自定义的结果。

本章在技术架构层面上来对比二者,如果你不是开发者,或者对具体技术不感兴趣,可以直接跳过本章,接着看下一章,这里都以当前各自最新的版本ThinkPHP6.0.7和Drupal9.1.7,由于篇幅有限,仅选择部分重要内容进行对比:

事件:

中间件:

在ThinkPHP和Drupal中都有“中间件”概念,但二者定位有很大不同,在ThinkPHP里中间件实现的功能,在Drupal中是由事件派发器负责的,比如ThinkPHP文档提到中间件主要用于拦截或过滤应用的HTTP请求,这在Drupal中是派发请求事件做的事情,此外还有路由中间件、控制器中间件都是如此,它们对应路由事件、控制器事件,而Drupal中的中间件主要作用是将HTTP处理核心由一个变成多个,在逻辑架构上Drupal要比ThinkPHP优雅和清晰很多,这也是ThinkPHP对事件机制理解不足导致的,这让系统结构杂乱了,为将来的升级埋下了包袱

入口文件:

两者的入口文件都很简单,逻辑也比较类似,区别主要有三点:

1、Drupal直接在入口文件中向处理核心注入请求对象,从字面上直接体现“任何web系统都是将请求转化为响应的系统”这一理念,而ThinkPHP的HTTP服务的run方法虽然也可以,但没有在入口处体现,但这点没什么本质区别,区别大的是ThinkPHP缺乏对“子请求”功能的支持,即系统运行过程中向自己再提交请求进行处理的能力,不需要跳出系统再回来,该功能对系统架构影响很大(贯穿整个体系,子请求除不能影响到主请求的环境状态外还要考虑性能),此一点最能看出Drupal的系统架构比ThinkPHP强大太多,完备性高出不少,Drupal更能应对复杂的业务逻辑

2、真正的大道至简,Drupal全局只有一个入口文件,不管是多应用,还是单应用的前后台等,都只有一个入口,虽然用户可以设置多个,但并不推荐多个,这减少复杂性保持简单,且为URL别名系统打下基础,而ThinkPHP有复杂的多入口机制,在多应用时尤其如此,这也对URL别名的支持会较困难

3、Drupal在初始状态下将类加载器传递到处理核心中,这就天然支持替换或修改类加载器,而ThinkPHP不支持,它只是加载而已,当需要修改类加载器时,无法获取,这一点导致灵活性大打折扣,比如很多类不能替换为用户自己的,比如你要替换“hinkHttp”类就比较麻烦。

多应用:

两者都支持多应用,即多个系统复用同一套代码,但具体做法上Drupal要简洁的多

面向接口编程:

在ThinkPHP的很多实现中,对类没有提取出接口,甚至有些重要类也没有接口,比如:

hinkApp

hinkRequest

它们是如此核心和重要,但都没有自己的独立接口,ThinkPHP不是严格按照接口编程的,在灵活性上大打折扣,比如我想实现一个自己的app类去替换hinkApp就做不到了,只能去修改核心,这样每次升级是个问题,而在Drupal中是严格按照接口的,架构上完全面向接口,参数类型约束全部是接口,我们可以替换核心提供的任何类,而不必修改核心,包括最为重要的HTTP核心类:DrupalKernel,该类类似ThinkPHP的app类。

不严格按照接口编程除影响扩展性外,还有诸多其他坏处,比如对IDE不友好,文档提取自动化难,代码注释无继承,协作讨论不方便等等

路由系统:

引用ThinkPHP官方教程的一句原文:

“ThinkPHP并非强制使用路由,如果没有定义路由,则可以直接使用“控制器/操作”的方式访问”

可见框架作者对路由的本质认识不足,如前文所述尚未抽象出数字1来,所说的“控制器/操作”的方式也应属于默认路由或者内部路径路由,而不是不用路由,看似无伤大雅的一点其实很重要,涉及本质认知,进而导致行为很不一样。

路由是进入系统后的分岔路口,必定存在,许多业务逻辑都需要在这里处理,比如权限控制、参数转化、路径别名处理、语言处理等等,在ThinkPHP中认为可以没有路由,这导致了另外,这样的认知结果势必将事情变的松散和复杂,比如代码冗余、使用不统一等。

而入口处理只是路由的两大功能之一,另一大功能是出口处理,也就是全系统URL的生成,这对URL别名处理、语言协商、SEO等至关重要,但ThinkPHP中只有简单的实现,尚未充分认识到路由系统的该责任,比如这里提出一个需求:

用户在一个自定义函数中给全系统的URL加上“target="_blank"”怎么实现?

容器与依赖注入:

该概念和叫法起源于Symfony框架,详见:

简而言之其主要思想是在系统中设置一个中央大对象,也可以叫做母对象,其负责收集、保存、自动实例化我们常用的对象,在Symfony中,这个大对象称为容器,其中保存的对象称为服务,服务的定义可以采用YAML静态提供或服务提供器方式动态提供,“定义”具备一定的格式,当我们需要某服务时,容器对象会依据定义去实例化服务对象,然后保存并返回,定义中涉及类、参数、工厂方法、实例化后回调、配置器、公私有属性、特征继承、延迟实例化等概念,容器形成前还会有服务编译过程,以便处理服务组群、参数修改等高级功能,在容器中每一个服务都有一个ID,称为服务ID,在使用之处通过该ID取得服务对象,容器中除了保存服务外还保存容器参数、服务别名等。

ThinkPHP的容器概念有Symfony的影子,但还非常幼小和初级,其实现离大道至简相去甚远,较混乱,比如没有明确的服务ID概念,在Symfony容器里的服务对象,必有对应的服务ID,而ThinkPHP将类似概念称为abstract,其可以是标识符或者类名,但部分容器方法又将其视为类名使用,比如:

hinkApp::register

hinkApp::getService

看起来作者是想尽可能灵活,但却导致了由不统一引发的混乱,在ThinkPHP中“服务”概念有单独的定义(有点像操作系统的服务),但本质上还是Symfony服务,只是进行了特殊处理,在Symfony中将服务放到容器里面叫做对服务进行“收集”,或者叫“注入”到容器,而ThinkPHP称为将服务“绑定”到容器,顾名思义容器就是用来装东西的,为什么要叫绑定呢?这种叫法非常拗口,还有很多名字也词不达意,比如运行容器中对象的实例化后操作,ThinkPHP称为“执行后”操作,而不叫“实例化后”操作,计算机界有句名言:“什么难?缓存和命名”,在这一块上ThinkPHP需要改进,现在的一些命名对新手不友好。

门面Faade:

这只是ThinkPHP中的概念,用来以静态方式调用被包装类的动态方法,即用静态方式代理类到方法级别,这只是形式上的调整,内部依然需要实例化对象,其实该概念并没有存在的必要,不但对IDE十分不友好还违背了PHP静态方法设计初衷,只是弥补了ThinkPHP中容器功能的不足,在Drupal中无此概念,其功能目的是统一采用Drupal::service($id)静态方法获取服务实例,进而由开发者自行调用其动态方法,如需不同实例则自行克隆,这也避免了use引入代理类的麻烦。

助手函数

ThinkPHP中有个助手函数的概念,文档提到其目的是享受IDE自动提醒的便利,这相当于Drupal中的“Drupal”全局类提供的静态方法,或者快捷函数,但Drupal并不是因为IDE,而是更加便捷的获取服务,因为PHP函数或静态类方法是超全局可用的。

控制器和模型:

在ThinkPHP中认为控制器是用来做业务处理前逻辑的,必须是一个php类或闭包,业务逻辑是“模式器”的事情,其实这是很僵化教条的一点,首先控制器可以是任何形式表示的php回调,包括函数、容器实例的方法(用容器ID进行定义)等,其次现实中业务逻辑的边界并没有那么清晰,很难抽象出“模式”然后还能给出这个名字,再次控制器应该已经是业务处理的开始,而ThinkPHP概念中的控制器所做的事情应该是在路由中处理,这一点ThinkPHP已经意识到了,并在文档中一笔带过。

多语言处理:

在实现上ThinkPHP和Drupal都是基于英语作为开发元语言,ThinkPHP的翻译实现非常简陋,在现实中通常不能满足需求,开发国际化应用时尤其如此(这应是应用范围覆盖不足导致的),Drupal具备完整的多语言系统,已经完整处理以下概念:

语言单复数问题(部分语言还不止单复数)上下文问题(“may”翻译成“可以”还是“五月”呢?)JS里面文字的翻译界面、配置和内容语言的翻译团队翻译协作机制向左文字语种的处理等等

而这些ThinkPHP都不具备,仅简单的实现了模板里面文字的翻译,语句中变量的替换;此外Drupal天然具备多种语言协商机制,如用户设置、URL前缀、会话信息、域名、HTTP头、用户代理标识等等,支持通过插件自定义语言协商机制,在ThinkPHP中默认仅支持URL、HTTP头变量、cookie、浏览器,注意如果你以Cookie来传递语言信息,在开发国际系统时可能会遇到法律问题,很多国家要求系统明确提问用户是否能够使用其Cookie;综上使用ThinkPHP时需要开发者自行解决大多数语言问题,但实际上多语言系统贯穿整个系统,非常庞大复杂,Drupal由于是国际共建的系统,多语言是其一大亮点,是天然的多语言系统,只此一项就可能难住ThinkPHP开发者。

缓存系统:

会话Session:

在ThinkPHP的会话实现中有个问题:会话的保存不在脚本结束之后进行,而是在脚本里面执行,这样当用户调用die或exit就会导致无法保存,应当注册关机函数才对,详见php函数:

register_shutdown_function

数据库:

ThinkPHP和Drupal都支持多数据库,该特性在ThinkPHP中自创了一个“分布式数据库”的概念来描述,Drupal没有专门渲染概念,只用业务标识对不同数据库进行区分,二者也都支持主从配置和读写分离;但在实现上很明显Drupal优雅很多,比如在数据库配置的数据结构上,Drupal采用一个多维数组,第一级键名是业务标识,第二级键名是主从标识,其值就是连接配置信息,这样的结构十分简单,如果你要实现一个数据库负载调度子系统,那么该结构的接口是非常简单的,而ThinkPHP的配置数据结构中,把所有的主机地址储存在一个数组键下,把所有的密码储存在另外一个数组键下,等等诸如此类的还有用户名等,这样的结构在生成连接信息时还需要再次解析配置信息,不但阅读修改不直观还消耗了系统性能,数据库负载调度子系统的接口也较复杂,非常不优雅。

二者也都支持多类型数据库,Drupal核心自带对mysql、pgsql、sqlite三种数据库的支持,加上社区模块几乎完整实现了对所有常用数据库的支持,在底层,Drupal将不同数据库的差异称为“方言”,不同方言的处理在驱动层完成,向上层提供统一接口,换句话说上层数据库操作类感知不到底层用的是什么数据库,采用标准的SQL规范,这样就完美屏蔽差异,实现了数据库解耦,模块开发者就不用去考虑用户用的是什么数据库,建表、查询、修改等等全部是统一的,在应用层切换不同种类数据库时可以做到一键搞定。

关于数据库操作,Drupal由于是一个完整系统,已经默认实现了一整套非常先进的数据储存结构,该结构提供了对系统数据层的支持,当所有人都基于统一数据结构时,奇妙的事情就产生了,分布在全球的人们可以合作实现丰富的上层应用,该结构造就了大名鼎鼎的实体概念,由此Drupal也提供了更多关于数据的操作,比如实体查询,用户实现了开箱即用,Drupal是包容的,用户也可以定义自己的数据结构。

对数据层的支持ThinkPHP是无法做到的,ThinkPHP用模型来处理数据封装和操作,模型和实体相比,是非常初期和幼小的概念,它能做的实体皆可做,反过来则不行,比如模型不支持输入用的字段控件、输出用的格式化器、表单和查看的显示控制等等,究其原因,是因为这些都需要更高层面的实现。

中外开源生态与联系:

文化交流受阻:

中外文化、生活等的交流依然还只限于一小部分人,大部分人是没有异国朋友的,主要原因是众所周知的网络屏障和语言问题,语言不通应该是主要原因,我国发展太快,目前国内开发者主力是70后到90后这一批人,绝大部分英语沟通水平欠佳,哑巴英语,或者阅读困难,他们往往本能的不会去接触英文资料,00后或者10后的英语水平则高很多(得益于教授早,互联网等),在未来他们会更多融入国际环境,所幸的是现在科技发达,翻译软件水准越来越高,也越来越多人投身到技术引进上面来,比如Drupal在中国就有“Drupal中国”、“爱码文档汇”、“水滴间”、“Drupal大学”、“ThinkinDrupal”、“宁皓网”等等一大批技术平台,这些平台或博客提供了巨量、几乎完整的中文文档,扫平了语言障碍。在北上广深、成都、南宁、宁波等等城市均有以Drupal作为核心技术的开发公司。

压力下导致的快餐现象:

相反国际开源的土壤好的多,由许多发达国家主导,而这些国家通常是福利型国家,相比压力不大,人们靠兴趣做事的空间很大,许多参与开源的人首要考虑的是人生意义,关于此有个“马斯洛需求模型”读者可以了解下,“喜欢”保证了“质量”,福利可以让开发者不考虑年龄、工作,在一年一度的DrupalCon大会上,你可以看到很多开发者年龄都非常大,五六十岁的人很多,他们在一起眼中带光的谈论技术,将一生的积累注入到Drupal中。

当然国际开源也并非主要由发达国家参与,英语系的不发达国家也是重点参与者,他们往往是通过开源衍生的商业项目赚取外汇,典型国家就是印度,在印度两极分化严重,曾经被英国殖民过,在其高端人群中英语普及率很高,这一点让印度高度融入国际开源,相应的造就了印度较高的软件开发实力。

开发者职业规划:

这一节讨论下国内开发者的职业规划问题,在国内社会一直有一种声音:“程序员是吃青春饭的”,对应的通常就是35岁门槛,你可能经常看到某某大公司辞退35岁的大龄开发者,一些公司招聘年龄要求不能超过35岁,很奇怪,35岁正是能力上积累较深,很多事情的分寸上拿捏得当的年纪,为什么会出现这个现象呢?我们来探索下:

首先那些新闻有很重的博眼球嫌疑,就像“女司机”一样,实际上女司机的事故率比男司机还少,正是因为少所以才是新闻,才能让你浏览,但这样的新闻多了你会形成错觉,因此35岁门槛一定程度上被过度渲染了,造成了不好的影响,甚至有些人无理由跟风。

但35岁门槛又有一些道理,这要选择性区分,如果开发者一直做着CURD这样简单、重复性的体力活(真正的码农),那么当达到35岁时,和刚出校门一两年的年轻人比,竞争力可想而知,35岁时孩子上学、父母身体、住房等压力会很大,逼迫开发者提出更高的待遇要求,家庭事务、应酬交际等也多,不愿加班,通常工龄长累加的工资相对更高,如果你做的事情年轻人也能做,老板选谁呢?同时年纪大了多少有些面子问题,如果上司是个比自己小很多的年轻人,是否服管呢?对于年轻人来说管理一个比自己年长很多的人有时也挺尴尬。根据这些可见35岁门槛的存在有一定的道理。

如果你发现自己并不真的喜欢技术,那么你应该在年纪上还有竞争力时趁早转型,跟随内心,找到喜欢的事情并开始积累竞争力。

如果你真的很喜欢技术,并愿意且准备好以此度过一生,那么你就需要高效积累,不停学习,时刻注意拉开和年轻人的技术差距,他们有压力小和体力强的优势,你需要以技术优势进行弥补,大神之路不是你可选可不选,而是必须选择的,当到达35岁时,你必须是一个大神,担起年轻人难以胜任的系统岗位。

这里需要提醒你随着社会的发展,技术的门槛其实是在逐步提高的,比如你可能听说过“全栈工程师”,但那只属于互联网时代初期,现在社会分工太细太深,已经不存在全栈了,如果存在那可以换个叫法“样样懂,门门差”,因为人的精力差距不会太大,你选择研究全部,别人选择钻研一处,而用人单位是按岗位用人的,你需要考虑谁更有优势,理智会让你选择深钻一门,周边懂得即可,但这样你会成为一个大机器上的一个部件,你的选择自由被限制,细分门槛要求会很精专,浅尝辄止,不求精深必面临淘汰。

说到这里你是否感觉路很难?但请你相信不是只有IT领域是这样的,有竞争的地方都会这样,任何成功皆不容易,唯有你的兴趣能保证你能走多远、走多高,所以请跟随自己的内心。

如果你跟随内心,深思后依然选择了做技术,当一个了不起的大神,那么你该怎么做呢?首先你必须要注重积累,尤其是要站在巨人的肩膀上向着未开发的土地猛冲,你需要找到所在细分领域最有前景的生态圈,加入进去,回到PHP开发框架上来,小白看框架它只是进一步封装提供了要的功能,而大神看框架是它提供了一个统一的协作平台,大家都在同一个平台上进行创造,这样才能避免自己重复造轮子,在经济成本上才足够划算,借助众人的力量才能腾出手来发展自己的事情。

基础平台的统一性非常重要,只有这样人类才能累积向前,才能降低成本,但统一平台的形成有个很有意思的规律,那就是最终只会剩一个作为主要平台,然后有个处于第二位的平台来形成竞争后备,第三第四位的基本可以忽略不计了,且第一位和第二位在体量上会选差很远,这样的列子有很多,比如历史上有几千个操作系统,最终剩下window和linux,二者用户数量选差很远,又比如安卓和苹果、淘宝和京东、抖音和快手、美团和饿了么等等皆是如此,一旦格局形成,便很难撼动,比如微软就撼不动安卓,不是因为技术,而是因为滚雪球效应在发挥作用,王者会更强、更大,败者逐渐落寞消失,即便王者犯了些小错发展也不可改变,比如现在我们使用的键盘,其字母排列其实不是最合理的,历史上也出现过排布合理的键盘,但由于大家已经习惯于现在的键盘,所以也就延续使用了,要成为王者有两点很重要:技术层面的先进性要足够、社区生态要建立滚雪球效应,这两点相辅相成。

那么在PHP框架领域谁会成为这个统一的基础平台呢?开源项目的主要发展力量应该是大批使用者在使用过程中不断的提炼并总结,然后一起对其的持续讨论并改进,而不是几个人单凭自己的思考或经验,因此如果在ThinkPHP和Symfony中做选择,答案已经非常清楚,其实很早Symfony就意识到统一平台的意义所在,因此致力于解耦的、完备的基础组件的建立,并反复迭代,以至于现存其他一些框架也用Symfony的组件,比如Laravel和ThinkPHP,Symfony一再强调“标准”,且现在也已经存为php开发领域的事实标准,因为标准化就是统一平台的必备条件。

至于Drupal则是在Symfony基础上建立起来的更高一层的统一标准平台,成为了完整系统的标准基础,在这里常用的应用层功能几乎都已被提供,人们正在此统一平台上,基于模块化设计,创建更多面向未来的功能,实现Drupal的理想“提供卓越的数字体验”。

决策者技术选型:

如果你是一位创业老板,或项目总监,正为项目进行技术选型,那么这里为你提供几个注意事项:

控制成本:

这似乎不用多说,理所当然,但你真的控制到了吗?软件是无形的,如果你不是专业人士,很难控制成本,这里说一些坑:

在目前环境下,想做个长远规划的项目,能自己开发,就不要外包,有些东西看起来一样实则差距非常大,不专业的人很难看出健壮性、扩展性、安全性、持续性等等性质在两个系统间有何不同,比如同样功能的系统,负载五千和负载五千万的开发成本是完全不同的,又比如软件文档工作量有时会远高于软件开发本身,文档是保障系统长远发展的重点,但外包很难做到文档齐全,外包质量通常会让你在日后买单,究其原因,不是因为外包公司实力不行,而是成本问题。

少欠技术债:

借力加速:

社会发展到今天,其实很多IT系统功能都已经有了,而且非常齐全,你不需要自己去开发,比如要在ThinkPHP和Drupal之间选择,我会毫不犹豫的选择Drupal,因为ThinkPHP只是个半成品,通常在各种业务系统中有些功能是必须的,比如垃圾回收系统、状态系统、键值储存、批处理系统、计划任务系统、数据类型化系统、Ajax系统、数据查看引擎、版本支持系统、权限系统等等,这些在ThinkPHP都没有,而Drupal很完备,而要在ThinkPHP上开发出这些,需要数月到数年,不但谈不上基础统一平台的优势,也很难保证自己开发的代码质量,不但白白浪费了资源,在后期新加成员还需要付出高昂的培训费用,有现成的基础齐全的、成熟的系统为什么不用呢?

融入大环境:

开发体系要融入大环境,除了借力加速外,还在于后备人才的获取,让开发者和项目解耦,不要因为在现有开发者离职或不够时,找不到足够的开发者快速加入项目,融入大环境,解耦开发者很大程度保障了项目的发展安全。

国家开源建议:

这一节我们站在国家层面,来看看应当如何对待开源,我国日渐强大,很多国人都期待着超越美国那一天早日到来,那么中国要突破美国封锁,达到超越的目的,就必须要参与国际开源成为贡献主力,而不是自己搞一套独立的体系(自建体系应发生在新生事物上,比如下一代物联网操作系统鸿蒙),因为开源是全人类的开源,而不是哪一个国家的开源,闭门造车出门不合辙,会让中国远离世界,要知道中国只有十四亿人,而全世界有七十多亿人,生态力量无法和全世界对抗,因此理性的做法是参与开源,努力做出奉献,一则继承已有的人类发展成果,站在巨人基础上发展更快,二则选择和大多数人在一起,开放国门,建立影响力,才有可能树立大国形象。

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

THE END
1.装修设计费怎么收费标准一般的设计公司收费在50-200元每平方不等,如果是请的国内一流设计公司或者是国外的,那设计费就高了https://shaoxing.to8to.com/wenda/20221212_14860461.html
2.从设计工具到SaaS,酷家乐如何赋能家居家装企业爱分析调研效果展示上,平面设计方案已不能满足市场需求, 3D效果图成为家居家装领域体验式营销的新趋势。而3D Max等软件则存在使用门槛高、出图效率低、费用高等问题,应用在销售沟通环节的效率偏低。随着技术的发展,3D云设计工具应运而生。 酷家乐是一个基于快速渲染技术的3D云设计平台,以SaaS方式提升家居品牌商、家装公司在销售http://kujiale.com/ask/3FO4K7RYD0HS/
3.土木工程创新创业计划书(精选5篇)以设计软件这个入口去切家装市场的玩家太多,从2005年最开始的做72home的广州圆方软件开始以装修设计软件切入装修市场到后来的72xuan,美家达人(在线效果图设计网),我家我设计(圆方软件与尚品宅配合作),拖拖我的家,91家居设计软件,以至于最近刚起来的酷家乐。 https://www.yjbys.com/chuangye/ziliao/chuangyejihuashu/633718.html
4.极客研报家装行业的秘密,都在这份报告里极客公园在装修业主和家装公司中间增加了一道导流环节,把用户的装修线索卖给家装公司。这类公司的盈利模式来自于中间费用或广告费用。 a、土巴兔、土拔鼠 2009 年土巴兔装修网上线,成为国内家装行业的最大流量入口之一。2015 年 3 月获得 58 同城、红杉资本中国共计 2 亿美元 C 轮融资。此前,土巴兔还曾在 2011 年 10 https://www.geekpark.net/news/215707
5.91家居装修设计下载91家居装修设计软件官方版下载v109591家居装修设计软件是一款功能强大的家居装修设计软件,主要用于户型的DIY装修。与部分同类型的程序相比,91家居装修设计软件多了两个功能;分享和预算功能,用户可以在这里直接将自己设计好的图片分享给自己的朋友们,让他们也能欣赏到完全属于你的精美作品哦。同时用户在完成最终的设计方案的时候,用户可以使用其预算功能进行https://www.32r.com/soft/4730.html
6.房屋装修设计软件免费版下载室内装修设计app装修设计软件手机版装修设计软件是常用的设计软件。小编为大家整理了实用的装修设计软件合集,其中有72xuan装修设计软件、91家居装修设计软件等等。强大的功能足以让你自己设计创造出自己喜爱的房间,欢迎大家来当易网下载体验!http://www.downyi.com/key/zhuangxiushejiruanjian
7.室内设计app家装设计软件下载装修app排行榜装修app内汇集了市面上所有的装修app可供下载,您可以轻松的找到您想要的装修app,进行家装设计、室内设计等,您在这里无需有着任何操心,只需在给出的设计图案中挑选出自己最满意的设计图就可以了,所有图片都是实景拍摄,其他的各类事项应用官方都为会您解决:联系装修公司等各项事宜,你还可以与各类优秀的设计师一同http://www.downcc.com/k/zhuangxiuapp/
8.装修设计必备下载装修设计必备软件下载软件介绍 技巧攻略 全部平台 历史版本 标签:室内设计 介绍 装修设计必备app,一般又称土巴兔装修设计app。 【手机智能量房】:精准量房,快速绘出3D户型图。【手机完成设计】:软硬装千万模型构件任意布置设计,家居室内设计、全屋定制、橱衣柜定制、别墅工装等设计一网打尽。【家具模型】千万经典模型素材,设计灵感如涌泉https://m.liqucn.com/rj/9209966156091.wml
9.土巴兔装修设计app下载土巴兔装修设计app安卓版下载土巴兔装修设计v1.1.5|报错 软件大小:23.32MB 软件语言:简体中文 更新时间:2024-11-03 05:20:03 系统要求:Android/安卓 71.43% 28.57% 使用二维码下载到手机 这款APP作为一款线上家装设计服务软件,为用户们提供了多种家装方案选择,让房屋设计改造更加智能。软件为各位用户们带来了便捷智能的线上设计房屋,专业的家https://www.crsky.com/soft/416912.html
10.AppStore上的“土巴兔装修设计软件年龄分级 4+ Copyright ? 2022 Tubatu.com 装修设计软件 保留所有权利 价格 免费 开发人员网站 App 支持 隐私政策 证件照制作-最美证件照制作&智能抠图换底色 发型-发型设计与脸型搭配模拟&换发型 爱空间装修-家装设计装修软件 土巴兔设计-装修设计软件https://apps.apple.com/cn/app/id1610452142
11.土巴兔装修怎么在线设计装修方案?土巴兔装修在线设计装修方案教程土巴兔装修怎么在线设计装修方案呢?下面小编就来给大家来介绍下在线设计装修方案的具体操作,感兴趣的小伙伴不要错过哦。 土巴兔装修(家装设计应用) v10.16.4 苹果手机版 类型:效率软件 大小:134.3 MB 语言:简体中文 时间:2024-02-19 查看详情 土巴兔装修在线设计装修方案教程 https://www.jb51.net/softjc/847929.html
12.土巴兔装修设计软件Android版本APK下载土巴兔装修设计软件 版本:5.5.9 (build 244) 大小:29.2 MB 更新时间:2024-11-26 用手机扫描二维码安装 版本:5.5.9 (build 162)大小:28.7 MB 更新时间:2024-11-26 版本:5.5.9 (build 244)大小:29.2 MB 更新时间:2024-11-26 其它版本 5.5.9 (build 243)2024-11-26https://www.pgyer.com/aBkg
13.精选网络策划9篇络营销方案的策划,首先是明确策划的出发点和依据,即明确企业的网络营销目标,以及在特定的网络营销环境下企业所面临的优势、机会和威胁(即swot分析)。然后在确定策划的出发点和依据的基础上,对网络时常进行细分,选择网络营销的目标市场,进行网络营销定位。最后对各种具体的网络营销策略进行设计和集成。https://www.unjs.com/fanwenku/372896.html
14.铁住装修装修设计报价软件下载铁住装修铁住装修-装修设计报价软件 铁住装修网是帮助用户实现一站式装修设计的互联网装修平台 ---特色功能 专属服务--- 1.【装修公司】汇集本地优质口碑装修公司,新房装修、旧房改造、二手房翻新、工装全面覆盖,提供详细的装修资质、装修案例、门店地址作为参考,比朋友亲戚介绍更靠谱。 2.【免费预约设计】专属装修管家对接http://www.appchina.com/app/com.winfoc.li.tz
15.在土巴兔量房设计后最终没有选择在土巴兔装修会产生费用吗,你好,这个是不会产生费用。因为前期都是免费的。送哦夏季 70 浏览 |2024-11-10 04:41:12 魔都魔都 | 2024-11-10 06:36:13 如果只是量房设计的话,那是不收费的,但是如果要求做出了效果图,那肯定是要收费的. 文文兔18 | 2024-11-10 08:14:06 这个肯定不会的 一起装修网和我们这些公司是讲信用的 http://sjz.17house.com/ershoufang/4e41298762a66e77911f6697d33f85dd.html