您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)drupal對(duì)比thinkphp看國(guó)內(nèi)開(kāi)源環(huán)境的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
將ThinkPHP和Drupal(翻譯成中文為“水滴”的意思)放在一起聊會(huì)讓很多開(kāi)發(fā)者感到好奇,但從中外軟件生態(tài)發(fā)展來(lái)看,這真的是一個(gè)好的討論起點(diǎn),本文對(duì)這兩系統(tǒng)在各方面都做了一些對(duì)比,但對(duì)比不是寫(xiě)作本文的主要目的,主要是分享中外軟件行業(yè)的不同,以及由此引發(fā)的一些思考,幫助開(kāi)發(fā)者規(guī)劃職業(yè)生涯,為IT決策者提供決策依據(jù)。
這兩系統(tǒng)都是開(kāi)源、免費(fèi)的PHP應(yīng)用,首先做個(gè)簡(jiǎn)要介紹:
ThinkPHP:
產(chǎn)品定位:PHP開(kāi)發(fā)框架,開(kāi)發(fā)者在此基礎(chǔ)上繼續(xù)開(kāi)發(fā)搭建自己的應(yīng)用系統(tǒng)
開(kāi)發(fā)機(jī)構(gòu):由國(guó)內(nèi)“上海頂想信息科技有限公司”開(kāi)發(fā)
創(chuàng)始人:劉晨,沒(méi)有太多資料,百度查詢(xún)?yōu)殚_(kāi)源軟件資深顧問(wèn),資深PHP程序員,看云CEO,超過(guò)15年的互聯(lián)網(wǎng)產(chǎn)品開(kāi)發(fā)和管理經(jīng)驗(yàn),主要研究領(lǐng)域包括Web應(yīng)用架構(gòu)和開(kāi)發(fā),產(chǎn)品用戶(hù)體驗(yàn)設(shè)計(jì),致力于國(guó)內(nèi)的開(kāi)源事業(yè)
發(fā)展時(shí)間:最早誕生于2006年初
開(kāi)源協(xié)議: Apache 2
官網(wǎng)地址:http://www.thinkyisu.com/
用戶(hù)群體:中國(guó)國(guó)內(nèi)小微企業(yè),在國(guó)內(nèi)開(kāi)發(fā)者圈中具有較高知名度,其官網(wǎng)自我描述為“是國(guó)內(nèi)最有影響力的PHP框架和先驅(qū)者!”
著名案例:56群組、聯(lián)想問(wèn)吧、中青旅開(kāi)心遨游、寶礦力水特、星巴克、美特斯邦威的邦購(gòu)商城、TCL的在線(xiàn)商城、新浪微壇,澳星、中車(chē)友科技等
團(tuán)隊(duì)規(guī)模:沒(méi)有官方數(shù)據(jù),但框架的每個(gè)文件有作者信息,據(jù)此統(tǒng)計(jì)一共有7人,其中主要開(kāi)發(fā)者有兩人(貢獻(xiàn)90%以上代碼),這些數(shù)據(jù)不包括社區(qū)生態(tài)圈的貢獻(xiàn)開(kāi)發(fā)者,依據(jù)企查查平臺(tái)對(duì)頂想公司查詢(xún)結(jié)果顯示,公司規(guī)模小于50人,參保人數(shù)3人
系統(tǒng)文件:按目前的6.0.7版本算,初裝文件數(shù)569個(gè),占用空間2.41MB
Drupal:
產(chǎn)品定位:完整的后端系統(tǒng)(后端數(shù)據(jù)與控制中心),用于APP、小程序、網(wǎng)站、物聯(lián)網(wǎng)等的后端開(kāi)發(fā)
開(kāi)發(fā)機(jī)構(gòu):全球兩百多個(gè)國(guó)家共建,Drupal基金會(huì)組織的非盈利開(kāi)源社區(qū)
創(chuàng)始人:最初由比利時(shí)的Dries Buytaert博士發(fā)起,Dries 2008年的大學(xué)博士論文是《Java應(yīng)用程序性能分析和優(yōu)化分析技術(shù)》,Java的發(fā)明者詹姆斯·高斯林(James Gosling)是其博士答辯委員會(huì)的成員,Dries個(gè)人主頁(yè)地址https://dri.es/about
發(fā)展時(shí)間:最早誕生于2000年
開(kāi)源協(xié)議:GPL 2.0
官網(wǎng)地址:https://www.Drupal.org/
用戶(hù)群體:全球各國(guó)的企業(yè)、政府機(jī)構(gòu)、大學(xué)、個(gè)人等,其中世界五百?gòu)?qiáng)企業(yè)市場(chǎng)占有率超過(guò)80%,著名IDE:phpstorm直接集成了Drupal項(xiàng)目新建
著名案例:國(guó)內(nèi)有:華為、京東、百度、騰訊、清華、北大、貴州市政府站群、真功夫等,國(guó)外有:特斯拉、谷歌、本田、高通、聯(lián)合國(guó)、歐盟、哈佛大學(xué)、麻省理工大學(xué)、迪士尼、NASA、輝瑞制藥等
團(tuán)隊(duì)規(guī)模:
擁有全球最大最活躍的開(kāi)源社區(qū),核心開(kāi)發(fā)者1800余人,處于活躍狀態(tài)的貢獻(xiàn)者(代碼、文檔、設(shè)計(jì)等人員)共有超過(guò)12萬(wàn)人,其中中國(guó)分社區(qū)兩千余人,主力推動(dòng)公司Acquia雇員超過(guò)1100人。當(dāng)前平均每周產(chǎn)生1300次左右代碼提交。
系統(tǒng)文件:按目前的9.1.7版本算,初裝文件數(shù)18770個(gè),占用空間71.2MB
為什么是ThinkPHP和 Drupal:
一個(gè)是中國(guó)國(guó)內(nèi)的流行框架,一個(gè)是國(guó)際流行的完整后端系統(tǒng)(也是目前世界上最強(qiáng)大靈活的系統(tǒng),沒(méi)有之一),從它們的體量看這完全不在一個(gè)重量級(jí),從其市場(chǎng)定位看,也沒(méi)有比較的意義,但探索它們對(duì)了解中外軟件生態(tài)具有重要意義,此外如果直接告訴你ThinkPHP能做的事情,Drupal都能做,而且還更加優(yōu)雅和簡(jiǎn)潔呢?事情是不是就變的很有意思了,繼續(xù)。
通常使用Drupal的國(guó)內(nèi)開(kāi)發(fā)者都是有很多年經(jīng)驗(yàn)的開(kāi)發(fā)老手,是伴隨時(shí)代從各種系統(tǒng)一步一步淌出來(lái)的,他們一定知道或多少了解ThinkPHP,但使用ThinkPHP的開(kāi)發(fā)者卻不一定了解Drupal,使用ThinkPHP的開(kāi)發(fā)者選擇ThinkPHP的理由一般是:框架較底層PHP進(jìn)一步的提供了常用基礎(chǔ),靈活自由,和對(duì)帝國(guó)CMS這樣的系統(tǒng)進(jìn)行二次開(kāi)發(fā)相比,不受限制,能夠隨意實(shí)現(xiàn)自己的功能,但是在Drupal面前,事情就變的不一樣了,可能會(huì)讓開(kāi)發(fā)者有如獲至寶的感覺(jué),在此需要先簡(jiǎn)要介紹一下Drupal的系統(tǒng)架構(gòu),整個(gè)Drupal系統(tǒng)是分層建設(shè)的:
最底層:
是框架層,基于流行的Symfony框架,Symfony可謂是PHP的行業(yè)標(biāo)準(zhǔn),是世界最著名的框架,另一個(gè)著名的PHP框架Laravel本身很多部分也都是基于或來(lái)自Symfony,懂得Symfony框架的開(kāi)發(fā)者可以很快上手開(kāi)發(fā)Drupal,Symfony框架的作者法比安是一個(gè)傳奇人物,其另一個(gè)廣為人知的作品是Twig模板引擎,該引擎也用在Drupal中,Drupal是Symfony最著名的案例,其官網(wǎng)將Drupal列在第一位,Drupal社區(qū)也參與Symfony的代碼貢獻(xiàn)。
第二層:
是數(shù)據(jù)層,以實(shí)體為代表,向上提供各種數(shù)據(jù),數(shù)據(jù)庫(kù)封裝即屬于該層,ORM概念以及ThinkPHP中的模型概念類(lèi)似于實(shí)體概念在很早很早時(shí)期的樣子
第三層:
應(yīng)用層,開(kāi)發(fā)者在這一層處理各種業(yè)務(wù)邏輯
這里需要注意開(kāi)發(fā)者在使用Drupal時(shí),不一定要一層一層往下調(diào)用,而是可以跨越,直接去面向某一層,所以當(dāng)直接面向框架層開(kāi)發(fā)時(shí),就可以將整個(gè)系統(tǒng)當(dāng)做框架來(lái)使用,就像ThinkPHP開(kāi)發(fā)者直接使用ThinkPHP框架一樣,這就是為什么說(shuō)ThinkPHP能做的Drupal都能做的原因,所不同的是Drupal采用Symfony框架,題外話(huà)ThinkPHP深受Symfony影響,甚至直接采用了其部分組件,許多方面高度借鑒了Symfony框架(任何創(chuàng)造者都值得尊敬,因此不用“抄襲”這個(gè)詞,而用“借鑒”),主干流程幾乎相同,但在成熟度和細(xì)節(jié)上相差甚遠(yuǎn),這種差距舉個(gè)例子來(lái)形象的說(shuō)明:
當(dāng)人類(lèi)先祖在結(jié)繩計(jì)數(shù)的那個(gè)時(shí)代,一個(gè)果子就是一個(gè)果子,一條魚(yú)就是一條魚(yú),當(dāng)從一個(gè)個(gè)具體事物中抽象出背后的數(shù)字“1”時(shí),人類(lèi)就面臨了一次巨大的飛躍,此刻的意義不亞于火的使用,進(jìn)而發(fā)明數(shù)字、數(shù)學(xué)等,在時(shí)間和空間上,人類(lèi)一直處于對(duì)世界的不停探索、抽象之中,無(wú)數(shù)次累積才有了今天的文明,可以說(shuō)抽象程度越高,意味著越強(qiáng),越直達(dá)本質(zhì)。
許多偉大的作品都需要巨大的人力和時(shí)間去積累,那么ThinkPHP和Symfony之間,或者說(shuō)ThinkPHP和Drupal之間積累的差距有多大呢?這里可以直接果斷的告訴你是小學(xué)和大學(xué)之間的差距,中間還隔著初中、高中,主要原因在于社區(qū)規(guī)模、生態(tài)和時(shí)間上。ThinkPHP和Symfony同為框架,是最直接的競(jìng)爭(zhēng)者,ThinkPHP要有存在的必要就需要一條自主創(chuàng)新的路,卻又大量借鑒Symfony,這是一件非常尷尬的事情,作為開(kāi)發(fā)者為什么不直接使用Symfony呢?同級(jí)別的CI框架(CodeIgniter)就完全自主發(fā)展,在許多全球排名中都看不到ThinkPHP的影子,但在國(guó)內(nèi),你可以在很多招聘信息中看到ThinkPHP的影子,這是個(gè)很奇特的現(xiàn)象,因?yàn)門(mén)hinkPHP是一個(gè)十足的地方性產(chǎn)品,連注釋文檔都是中文,本文也正是基于此才選擇了ThinkPHP來(lái)作為研究中外軟件狀態(tài)的起點(diǎn)。
何為好系統(tǒng)?我們需要什么?
俗話(huà)說(shuō)工欲善其事必先利其器,這里列出幾個(gè)點(diǎn)來(lái)說(shuō)明一個(gè)優(yōu)秀的系統(tǒng)應(yīng)該具備什么特性,下文我們將以此來(lái)對(duì)比ThinkPHP和Drupal:
完備性:
所謂完備性你可以認(rèn)為是某個(gè)工具或組件被設(shè)計(jì)出來(lái)已經(jīng)充分考慮到了所有的情況,比如PHP原生提供的字符串截取函數(shù)會(huì)把UTF-8字符截?cái)?,產(chǎn)生亂碼,而你設(shè)計(jì)了一個(gè)截取函數(shù),不但不會(huì)這樣,還不會(huì)截?cái)嘤⑽膯卧~,還考慮到了不截?cái)郒TML中的標(biāo)簽,那么你這個(gè)工具就比PHP原生函數(shù)更加完備,一旦發(fā)現(xiàn)有滿(mǎn)足不了的用列就需要改進(jìn)以提高完備性,Drupal很多地方的設(shè)計(jì)是“完備”的,盡管Drupal也在持續(xù)探索和進(jìn)化,但這種完備程度遠(yuǎn)超ThinkPHP,舉個(gè)例子,Drupal的路由系統(tǒng)可以天然支持基于域名、協(xié)議、HTTP方法、數(shù)據(jù)格式、選項(xiàng)等進(jìn)行路由,在都匹配的情況下有優(yōu)先級(jí)分級(jí),而這些是ThinkPHP不完全具備的,這種組件設(shè)計(jì)上的完備依賴(lài)于對(duì)事務(wù)本質(zhì)認(rèn)知的深度和大量開(kāi)發(fā)經(jīng)驗(yàn),完備性讓人類(lèi)站在前人的基礎(chǔ)上繼續(xù)前行。
標(biāo)準(zhǔn)化:
標(biāo)準(zhǔn)化是大規(guī)模協(xié)作的前提,系統(tǒng)分層結(jié)構(gòu)、跨系統(tǒng)通訊、解耦組件等都離不開(kāi)標(biāo)準(zhǔn)化,Drupal完全面向RFC文檔,而不是自成體系,在注釋或討論中經(jīng)??吹綄?duì)RFC的引用,RFC文檔是IT互聯(lián)網(wǎng)的基石,類(lèi)似在產(chǎn)品上常見(jiàn)的國(guó)家標(biāo)準(zhǔn),常被用戶(hù)忽略,但又異常重要。
完整性:
合作分工,當(dāng)把發(fā)展的足夠完備的組件湊到一起,大家都來(lái)使用它們,這就構(gòu)成了完整性,然后人們不必自己再重復(fù)造輪子,突破內(nèi)卷,完整性也會(huì)反過(guò)來(lái)促使完備性的提高,Symfony和Drupal就以組件和模塊的方式來(lái)解決完整性問(wèn)題。
低耦合性:
系統(tǒng)設(shè)計(jì)各組件間需要盡可能解耦,這樣就能給各組件更多的發(fā)展提高的空間,不好的組件也便于替換,Drupal采用模塊化設(shè)計(jì),連核心都是模塊化的,用戶(hù)可以在用戶(hù)空間中替換任何核心文件,而不直接修改,避免功能不足和阻礙升級(jí),相對(duì)而言ThinkPHP耦合較緊。
掌握邊界:
一個(gè)好的系統(tǒng)勢(shì)必是分寸拿捏得當(dāng)?shù)南到y(tǒng),但這真的有點(diǎn)難,且仁者見(jiàn)仁智者見(jiàn)智,總的來(lái)看大方向或者主干系統(tǒng)必須是簡(jiǎn)潔的,這里舉一個(gè)例子,在ThinkPHP中支持按路由參數(shù)決定路由控制器,即:Route::get(':action/blog/:id', 'Blog/:action');,而Drupal不允許這樣做,實(shí)現(xiàn)類(lèi)似功能時(shí)通常采用代理控制器實(shí)現(xiàn),簡(jiǎn)而言之即該效果不應(yīng)該在路由層面實(shí)現(xiàn),而應(yīng)該在控制器層面實(shí)現(xiàn),這樣使得路由系統(tǒng)更加簡(jiǎn)潔,系統(tǒng)架構(gòu)更加清晰,這種思想貫穿Drupal,使得Drupal系統(tǒng)主干十分簡(jiǎn)單干凈,當(dāng)你要某個(gè)細(xì)化功能時(shí),首先進(jìn)入對(duì)應(yīng)大支流再進(jìn)入到不同的細(xì)化支流當(dāng)中,是不是像一顆樹(shù)?但你更喜歡哪種方式呢?
簡(jiǎn)潔性:
大道至簡(jiǎn),系統(tǒng)需要流程清晰,調(diào)用統(tǒng)一,規(guī)則一致,不允許有另外,或盡量避免另外,這樣的好處是易于新人學(xué)習(xí),并且追蹤、排查都很方便。
生命力:
系統(tǒng)的生命力也在于可持續(xù)性,生態(tài)圈和開(kāi)發(fā)者就是系統(tǒng)的養(yǎng)料,下文還會(huì)講到,這里略過(guò)。
對(duì)比ThinkPHP和Drupal:
ThinkPHP和Drupal相比總的來(lái)說(shuō),在于ThinkPHP抽象程度不足,積累不足,這是根本上的不足,它像一個(gè)孩子,Drupal是一個(gè)經(jīng)歷歲月的成年人,懂得更多,知道事物背后蘊(yùn)含的通用道理,做的也更進(jìn)一步,假設(shè)我們是在建造一棟大廈,ThinkPHP提供了混凝土、磚塊、鋼筋等等建筑基礎(chǔ)材料,開(kāi)發(fā)者需要去探索如何修建,如何設(shè)計(jì)等建筑學(xué)問(wèn)題,而Drupal不但提供了基礎(chǔ)材料,還附帶了施工隊(duì)和設(shè)計(jì)院,很多時(shí)候你只需要說(shuō)出你要什么樣感覺(jué)和功能的大廈就行了(你遇到的需求,通常已經(jīng)有人遇到過(guò),形成了數(shù)量龐大的貢獻(xiàn)模塊,安裝即可),當(dāng)然如果你有興趣,你也可以參與修建的過(guò)程得到你自定義的結(jié)果。
本章在技術(shù)架構(gòu)層面上來(lái)對(duì)比二者,如果你不是開(kāi)發(fā)者,或者對(duì)具體技術(shù)不感興趣,可以直接跳過(guò)本章,接著看下一章,這里都以當(dāng)前各自最新的版本ThinkPHP 6.0.7和Drupal 9.1.7,由于篇幅有限,僅選擇部分重要內(nèi)容進(jìn)行對(duì)比:
事件:
在ThinkPHP中將事件定位為替代原來(lái)的行為和Hook機(jī)制,由此可見(jiàn)作者并沒(méi)有認(rèn)識(shí)到事件和鉤子之間的本質(zhì)區(qū)別,相同點(diǎn)都是用第三方代碼來(lái)介入當(dāng)前邏輯的處理,但在這個(gè)大前提下鉤子重參與,事件重通知,它們?cè)跀?shù)量和性質(zhì)上都有很大不同,ThinkPHP將其混為一談,而Drupal認(rèn)識(shí)的更加本質(zhì),由于ThinkPHP對(duì)“事件”概念的認(rèn)識(shí)不足也導(dǎo)致實(shí)現(xiàn)上松散復(fù)雜,且功能上有重大不足,比如ThinkPHP事件沒(méi)有優(yōu)先級(jí)概念,這在有順序要求的情況下至關(guān)重要,同時(shí)也沒(méi)有事件傳播終止機(jī)制,又比如ThinkPHP可以不要求實(shí)現(xiàn)事件類(lèi),實(shí)際上要處理事件通常必須要有參數(shù)傳遞,且需要將處理結(jié)果反饋給事件發(fā)源地,因此事件類(lèi)是必須的,ThinkPHP非常初淺,而Drupal中統(tǒng)一采用事件派發(fā)器服務(wù)處理所有事件,對(duì)訂閱器和偵聽(tīng)器也無(wú)特殊限制,在系統(tǒng)任何地方處理事件相關(guān)邏輯只需要面對(duì)事件派發(fā)器服務(wù)即可
中間件:
在ThinkPHP和Drupal中都有“中間件”概念,但二者定位有很大不同,在ThinkPHP里中間件實(shí)現(xiàn)的功能,在Drupal中是由事件派發(fā)器負(fù)責(zé)的,比如ThinkPHP文檔提到中間件主要用于攔截或過(guò)濾應(yīng)用的HTTP請(qǐng)求,這在Drupal中是派發(fā)請(qǐng)求事件做的事情,此外還有路由中間件、控制器中間件都是如此,它們對(duì)應(yīng)路由事件、控制器事件,而Drupal中的中間件主要作用是將HTTP處理核心由一個(gè)變成多個(gè),在邏輯架構(gòu)上Drupal要比ThinkPHP優(yōu)雅和清晰很多,這也是ThinkPHP對(duì)事件機(jī)制理解不足導(dǎo)致的,這讓系統(tǒng)結(jié)構(gòu)雜亂了,為將來(lái)的升級(jí)埋下了包袱
入口文件:
兩者的入口文件都很簡(jiǎn)單,邏輯也比較類(lèi)似,區(qū)別主要有三點(diǎn):
1、Drupal直接在入口文件中向處理核心注入請(qǐng)求對(duì)象,從字面上直接體現(xiàn)“任何web系統(tǒng)都是將請(qǐng)求轉(zhuǎn)化為響應(yīng)的系統(tǒng)”這一理念,而ThinkPHP的HTTP服務(wù)的run方法雖然也可以,但沒(méi)有在入口處體現(xiàn),但這點(diǎn)沒(méi)什么本質(zhì)區(qū)別,區(qū)別大的是ThinkPHP缺乏對(duì)“子請(qǐng)求”功能的支持,即系統(tǒng)運(yùn)行過(guò)程中向自己再提交請(qǐng)求進(jìn)行處理的能力,不需要跳出系統(tǒng)再回來(lái),該功能對(duì)系統(tǒng)架構(gòu)影響很大(貫穿整個(gè)體系,子請(qǐng)求除不能影響到主請(qǐng)求的環(huán)境狀態(tài)外還要考慮性能),此一點(diǎn)最能看出Drupal的系統(tǒng)架構(gòu)比ThinkPHP強(qiáng)大太多,完備性高出不少,Drupal更能應(yīng)對(duì)復(fù)雜的業(yè)務(wù)邏輯
2、真正的大道至簡(jiǎn),Drupal全局只有一個(gè)入口文件,不管是多應(yīng)用,還是單應(yīng)用的前后臺(tái)等,都只有一個(gè)入口,雖然用戶(hù)可以設(shè)置多個(gè),但并不推薦多個(gè),這減少?gòu)?fù)雜性保持簡(jiǎn)單,且為URL別名系統(tǒng)打下基礎(chǔ),而ThinkPHP有復(fù)雜的多入口機(jī)制,在多應(yīng)用時(shí)尤其如此,這也對(duì)URL別名的支持會(huì)較困難
3、Drupal在初始狀態(tài)下將類(lèi)加載器傳遞到處理核心中,這就天然支持替換或修改類(lèi)加載器,而ThinkPHP不支持,它只是加載而已,當(dāng)需要修改類(lèi)加載器時(shí),無(wú)法獲取,這一點(diǎn)導(dǎo)致靈活性大打折扣,比如很多類(lèi)不能替換為用戶(hù)自己的,比如你要替換“\think\Http”類(lèi)就比較麻煩。
多應(yīng)用:
兩者都支持多應(yīng)用,即多個(gè)系統(tǒng)復(fù)用同一套代碼,但具體做法上Drupal要簡(jiǎn)潔的多
面向接口編程:
在ThinkPHP的很多實(shí)現(xiàn)中,對(duì)類(lèi)沒(méi)有提取出接口,甚至有些重要類(lèi)也沒(méi)有接口,比如:
\think\App
\think\Request
它們是如此核心和重要,但都沒(méi)有自己的獨(dú)立接口,ThinkPHP不是嚴(yán)格按照接口編程的,在靈活性上大打折扣,比如我想實(shí)現(xiàn)一個(gè)自己的app類(lèi)去替換\think\App就做不到了,只能去修改核心,這樣每次升級(jí)是個(gè)問(wèn)題,而在Drupal中是嚴(yán)格按照接口的,架構(gòu)上完全面向接口,參數(shù)類(lèi)型約束全部是接口,我們可以替換核心提供的任何類(lèi),而不必修改核心,包括最為重要的HTTP核心類(lèi):DrupalKernel,該類(lèi)類(lèi)似ThinkPHP的app類(lèi)。
不嚴(yán)格按照接口編程除影響擴(kuò)展性外,還有諸多其他壞處,比如對(duì)IDE不友好,文檔提取自動(dòng)化難,代碼注釋無(wú)繼承,協(xié)作討論不方便等等
路由系統(tǒng):
引用ThinkPHP官方教程的一句原文:
“ThinkPHP并非強(qiáng)制使用路由,如果沒(méi)有定義路由,則可以直接使用“控制器/操作”的方式訪(fǎng)問(wèn)”
可見(jiàn)框架作者對(duì)路由的本質(zhì)認(rèn)識(shí)不足,如前文所述尚未抽象出數(shù)字1來(lái),所說(shuō)的“控制器/操作”的方式也應(yīng)屬于默認(rèn)路由或者內(nèi)部路徑路由,而不是不用路由,看似無(wú)傷大雅的一點(diǎn)其實(shí)很重要,涉及本質(zhì)認(rèn)知,進(jìn)而導(dǎo)致行為很不一樣。
路由是進(jìn)入系統(tǒng)后的分岔路口,必定存在,許多業(yè)務(wù)邏輯都需要在這里處理,比如權(quán)限控制、參數(shù)轉(zhuǎn)化、路徑別名處理、語(yǔ)言處理等等,在ThinkPHP中認(rèn)為可以沒(méi)有路由,這導(dǎo)致了另外,這樣的認(rèn)知結(jié)果勢(shì)必將事情變的松散和復(fù)雜,比如代碼冗余、使用不統(tǒng)一等。
而入口處理只是路由的兩大功能之一,另一大功能是出口處理,也就是全系統(tǒng)URL的生成,這對(duì)URL別名處理、語(yǔ)言協(xié)商、SEO等至關(guān)重要,但ThinkPHP中只有簡(jiǎn)單的實(shí)現(xiàn),尚未充分認(rèn)識(shí)到路由系統(tǒng)的該責(zé)任,比如這里提出一個(gè)需求:
用戶(hù)在一個(gè)自定義函數(shù)中給全系統(tǒng)的URL加上“target="_blank"”怎么實(shí)現(xiàn)?
容器與依賴(lài)注入:
該概念和叫法起源于Symfony框架,詳見(jiàn):
https://symfony.com/doc/current/components/dependency_injection.html
簡(jiǎn)而言之其主要思想是在系統(tǒng)中設(shè)置一個(gè)中央大對(duì)象,也可以叫做母對(duì)象,其負(fù)責(zé)收集、保存、自動(dòng)實(shí)例化我們常用的對(duì)象,在Symfony中,這個(gè)大對(duì)象稱(chēng)為容器,其中保存的對(duì)象稱(chēng)為服務(wù),服務(wù)的定義可以采用YAML靜態(tài)提供或服務(wù)提供器方式動(dòng)態(tài)提供,“定義”具備一定的格式,當(dāng)我們需要某服務(wù)時(shí),容器對(duì)象會(huì)依據(jù)定義去實(shí)例化服務(wù)對(duì)象,然后保存并返回,定義中涉及類(lèi)、參數(shù)、工廠方法、實(shí)例化后回調(diào)、配置器、公私有屬性、特征繼承、延遲實(shí)例化等概念,容器形成前還會(huì)有服務(wù)編譯過(guò)程,以便處理服務(wù)組群、參數(shù)修改等高級(jí)功能,在容器中每一個(gè)服務(wù)都有一個(gè)ID,稱(chēng)為服務(wù)ID,在使用之處通過(guò)該ID取得服務(wù)對(duì)象,容器中除了保存服務(wù)外還保存容器參數(shù)、服務(wù)別名等。
ThinkPHP的容器概念有Symfony的影子,但還非常幼小和初級(jí),其實(shí)現(xiàn)離大道至簡(jiǎn)相去甚遠(yuǎn),較混亂,比如沒(méi)有明確的服務(wù)ID概念,在Symfony容器里的服務(wù)對(duì)象,必有對(duì)應(yīng)的服務(wù)ID,而ThinkPHP將類(lèi)似概念稱(chēng)為abstract,其可以是標(biāo)識(shí)符或者類(lèi)名,但部分容器方法又將其視為類(lèi)名使用,比如:
\think\App::register
\think\App::getService
看起來(lái)作者是想盡可能靈活,但卻導(dǎo)致了由不統(tǒng)一引發(fā)的混亂,在ThinkPHP中“服務(wù)”概念有單獨(dú)的定義(有點(diǎn)像操作系統(tǒng)的服務(wù)),但本質(zhì)上還是Symfony服務(wù),只是進(jìn)行了特殊處理,在Symfony中將服務(wù)放到容器里面叫做對(duì)服務(wù)進(jìn)行“收集”,或者叫“注入”到容器,而ThinkPHP稱(chēng)為將服務(wù)“綁定”到容器,顧名思義容器就是用來(lái)裝東西的,為什么要叫綁定呢?這種叫法非常拗口,還有很多名字也詞不達(dá)意,比如運(yùn)行容器中對(duì)象的實(shí)例化后操作,ThinkPHP稱(chēng)為“執(zhí)行后”操作,而不叫“實(shí)例化后”操作,計(jì)算機(jī)界有句名言:“什么難?緩存和命名”,在這一塊上ThinkPHP需要改進(jìn),現(xiàn)在的一些命名對(duì)新手不友好。
另外服務(wù)(在ThinkPHP中應(yīng)該稱(chēng)為綁定到容器中的類(lèi)、對(duì)象或回調(diào)才對(duì))又可以向容器綁定服務(wù)這個(gè)特性看起來(lái)靈活,但是對(duì)代碼追蹤和調(diào)試非常不友好,增加新人接手系統(tǒng)的難度,而Drupal得益于模塊化設(shè)計(jì),使得可以做到集中聲明(因?yàn)槟K必定知道服務(wù)會(huì)依賴(lài)哪些服務(wù),通過(guò)容器編譯機(jī)制也可以判斷某服務(wù)是否存在),這樣在追蹤代碼和調(diào)試時(shí)就做到了盡可能簡(jiǎn)單,導(dǎo)出運(yùn)行時(shí)容器中的服務(wù)定義也很方便,不用真的去實(shí)例化每個(gè)服務(wù)。
門(mén)面Fa?ade:
這只是ThinkPHP中的概念,用來(lái)以靜態(tài)方式調(diào)用被包裝類(lèi)的動(dòng)態(tài)方法,即用靜態(tài)方式代理類(lèi)到方法級(jí)別,這只是形式上的調(diào)整,內(nèi)部依然需要實(shí)例化對(duì)象,其實(shí)該概念并沒(méi)有存在的必要,不但對(duì)IDE十分不友好還違背了PHP靜態(tài)方法設(shè)計(jì)初衷,只是彌補(bǔ)了ThinkPHP中容器功能的不足,在Drupal中無(wú)此概念,其功能目的是統(tǒng)一采用\Drupal::service($id)靜態(tài)方法獲取服務(wù)實(shí)例,進(jìn)而由開(kāi)發(fā)者自行調(diào)用其動(dòng)態(tài)方法,如需不同實(shí)例則自行克隆,這也避免了use引入代理類(lèi)的麻煩。
助手函數(shù)
ThinkPHP中有個(gè)助手函數(shù)的概念,文檔提到其目的是享受IDE自動(dòng)提醒的便利,這相當(dāng)于Drupal中的“\Drupal”全局類(lèi)提供的靜態(tài)方法,或者快捷函數(shù),但Drupal并不是因?yàn)镮DE,而是更加便捷的獲取服務(wù),因?yàn)镻HP函數(shù)或靜態(tài)類(lèi)方法是超全局可用的。
控制器和模型:
在ThinkPHP中認(rèn)為控制器是用來(lái)做業(yè)務(wù)處理前邏輯的,必須是一個(gè)php類(lèi)或閉包,業(yè)務(wù)邏輯是“模式器”的事情,其實(shí)這是很僵化教條的一點(diǎn),首先控制器可以是任何形式表示的php回調(diào),包括函數(shù)、容器實(shí)例的方法(用容器ID進(jìn)行定義)等,其次現(xiàn)實(shí)中業(yè)務(wù)邏輯的邊界并沒(méi)有那么清晰,很難抽象出“模式”然后還能給出這個(gè)名字,再次控制器應(yīng)該已經(jīng)是業(yè)務(wù)處理的開(kāi)始,而ThinkPHP概念中的控制器所做的事情應(yīng)該是在路由中處理,這一點(diǎn)ThinkPHP已經(jīng)意識(shí)到了,并在文檔中一筆帶過(guò)。
多語(yǔ)言處理:
在實(shí)現(xiàn)上ThinkPHP和Drupal都是基于英語(yǔ)作為開(kāi)發(fā)元語(yǔ)言,ThinkPHP的翻譯實(shí)現(xiàn)非常簡(jiǎn)陋,在現(xiàn)實(shí)中通常不能滿(mǎn)足需求,開(kāi)發(fā)國(guó)際化應(yīng)用時(shí)尤其如此(這應(yīng)是應(yīng)用范圍覆蓋不足導(dǎo)致的),Drupal具備完整的多語(yǔ)言系統(tǒng),已經(jīng)完整處理以下概念:
語(yǔ)言單復(fù)數(shù)問(wèn)題(部分語(yǔ)言還不止單復(fù)數(shù))上下文問(wèn)題(“may”翻譯成“可以”還是“五月”呢?)JS里面文字的翻譯界面、配置和內(nèi)容語(yǔ)言的翻譯團(tuán)隊(duì)翻譯協(xié)作機(jī)制向左文字語(yǔ)種的處理等等
而這些ThinkPHP都不具備,僅簡(jiǎn)單的實(shí)現(xiàn)了模板里面文字的翻譯,語(yǔ)句中變量的替換;此外Drupal天然具備多種語(yǔ)言協(xié)商機(jī)制,如用戶(hù)設(shè)置、URL前綴、會(huì)話(huà)信息、域名、HTTP頭、用戶(hù)代理標(biāo)識(shí)等等,支持通過(guò)插件自定義語(yǔ)言協(xié)商機(jī)制,在ThinkPHP中默認(rèn)僅支持URL、HTTP頭變量、cookie、瀏覽器,注意如果你以Cookie來(lái)傳遞語(yǔ)言信息,在開(kāi)發(fā)國(guó)際系統(tǒng)時(shí)可能會(huì)遇到法律問(wèn)題,很多國(guó)家要求系統(tǒng)明確提問(wèn)用戶(hù)是否能夠使用其Cookie;綜上使用ThinkPHP時(shí)需要開(kāi)發(fā)者自行解決大多數(shù)語(yǔ)言問(wèn)題,但實(shí)際上多語(yǔ)言系統(tǒng)貫穿整個(gè)系統(tǒng),非常龐大復(fù)雜,Drupal由于是國(guó)際共建的系統(tǒng),多語(yǔ)言是其一大亮點(diǎn),是天然的多語(yǔ)言系統(tǒng),只此一項(xiàng)就可能難住ThinkPHP開(kāi)發(fā)者。
緩存系統(tǒng):
完整的緩存系統(tǒng)有三要素:超期時(shí)間、失效標(biāo)簽、上下文,Drupal對(duì)其有完整實(shí)現(xiàn),而ThinkPHP只實(shí)現(xiàn)了時(shí)間和標(biāo)簽,沒(méi)有實(shí)現(xiàn)上下文,何為上下文呢?簡(jiǎn)單的說(shuō)它指示同一個(gè)緩存鍵KEY下,被緩存物屬于誰(shuí)在何種環(huán)境條件下進(jìn)行的緩存,比如用戶(hù)的權(quán)限、登錄狀態(tài)、語(yǔ)言、ip、協(xié)議版本、主題信息等都屬于緩存上下文,同一個(gè)KEY在不同上下文條件下需要讀取不同的緩存物,這對(duì)大型系統(tǒng)設(shè)計(jì)至關(guān)重要,且該系統(tǒng)非常龐大,ThinkPHP需要開(kāi)發(fā)者自行解決緩存上下文的問(wèn)題,此外ThinkPHP未提供緩存合并機(jī)制,這將無(wú)法實(shí)現(xiàn)緩存的分層分級(jí)處理,要實(shí)現(xiàn)高效緩存,該功能是必不可少的。
會(huì)話(huà)Session:
使用ThinkPHP的開(kāi)發(fā)者得自己解決會(huì)話(huà)相關(guān)問(wèn)題了,為什么呢?IT發(fā)展到今天,僅小微系統(tǒng)只使用一臺(tái)服務(wù)器,大多數(shù)系統(tǒng)都會(huì)負(fù)載均衡到多臺(tái)服務(wù)器上,因此應(yīng)用必須要求無(wú)狀態(tài),那么會(huì)話(huà)數(shù)據(jù)就不能存儲(chǔ)在本機(jī),通常的解決辦法是存儲(chǔ)到數(shù)據(jù)庫(kù)中,基于此,由于ThinkPHP是一個(gè)框架無(wú)法提供數(shù)據(jù)庫(kù)儲(chǔ)存會(huì)話(huà)的現(xiàn)存方案,因此需要開(kāi)發(fā)者自行處理,而Drupal本身已經(jīng)考慮到負(fù)載均衡、應(yīng)用無(wú)狀態(tài)等事情,會(huì)話(huà)默認(rèn)已經(jīng)儲(chǔ)存到數(shù)據(jù)庫(kù),可以開(kāi)箱即用,盡管ThinkPHP提供了擴(kuò)展能力,開(kāi)發(fā)者還是要付出許多人力成本去實(shí)現(xiàn)開(kāi)發(fā)
在ThinkPHP的會(huì)話(huà)實(shí)現(xiàn)中有個(gè)問(wèn)題:會(huì)話(huà)的保存不在腳本結(jié)束之后進(jìn)行,而是在腳本里面執(zhí)行,這樣當(dāng)用戶(hù)調(diào)用die或exit就會(huì)導(dǎo)致無(wú)法保存,應(yīng)當(dāng)注冊(cè)關(guān)機(jī)函數(shù)才對(duì),詳見(jiàn)php函數(shù):
register_shutdown_function
數(shù)據(jù)庫(kù):
ThinkPHP和Drupal都支持多數(shù)據(jù)庫(kù),該特性在ThinkPHP中自創(chuàng)了一個(gè)“分布式數(shù)據(jù)庫(kù)”的概念來(lái)描述,Drupal沒(méi)有專(zhuān)門(mén)渲染概念,只用業(yè)務(wù)標(biāo)識(shí)對(duì)不同數(shù)據(jù)庫(kù)進(jìn)行區(qū)分,二者也都支持主從配置和讀寫(xiě)分離;但在實(shí)現(xiàn)上很明顯Drupal優(yōu)雅很多,比如在數(shù)據(jù)庫(kù)配置的數(shù)據(jù)結(jié)構(gòu)上,Drupal采用一個(gè)多維數(shù)組,第一級(jí)鍵名是業(yè)務(wù)標(biāo)識(shí),第二級(jí)鍵名是主從標(biāo)識(shí),其值就是連接配置信息,這樣的結(jié)構(gòu)十分簡(jiǎn)單,如果你要實(shí)現(xiàn)一個(gè)數(shù)據(jù)庫(kù)負(fù)載調(diào)度子系統(tǒng),那么該結(jié)構(gòu)的接口是非常簡(jiǎn)單的,而ThinkPHP的配置數(shù)據(jù)結(jié)構(gòu)中,把所有的主機(jī)地址儲(chǔ)存在一個(gè)數(shù)組鍵下,把所有的密碼儲(chǔ)存在另外一個(gè)數(shù)組鍵下,等等諸如此類(lèi)的還有用戶(hù)名等,這樣的結(jié)構(gòu)在生成連接信息時(shí)還需要再次解析配置信息,不但閱讀修改不直觀還消耗了系統(tǒng)性能,數(shù)據(jù)庫(kù)負(fù)載調(diào)度子系統(tǒng)的接口也較復(fù)雜,非常不優(yōu)雅。
二者也都支持多類(lèi)型數(shù)據(jù)庫(kù),Drupal核心自帶對(duì)mysql、pgsql、sqlite三種數(shù)據(jù)庫(kù)的支持,加上社區(qū)模塊幾乎完整實(shí)現(xiàn)了對(duì)所有常用數(shù)據(jù)庫(kù)的支持,在底層,Drupal將不同數(shù)據(jù)庫(kù)的差異稱(chēng)為“方言”,不同方言的處理在驅(qū)動(dòng)層完成,向上層提供統(tǒng)一接口,換句話(huà)說(shuō)上層數(shù)據(jù)庫(kù)操作類(lèi)感知不到底層用的是什么數(shù)據(jù)庫(kù),采用標(biāo)準(zhǔn)的SQL規(guī)范,這樣就完美屏蔽差異,實(shí)現(xiàn)了數(shù)據(jù)庫(kù)解耦,模塊開(kāi)發(fā)者就不用去考慮用戶(hù)用的是什么數(shù)據(jù)庫(kù),建表、查詢(xún)、修改等等全部是統(tǒng)一的,在應(yīng)用層切換不同種類(lèi)數(shù)據(jù)庫(kù)時(shí)可以做到一鍵搞定。
關(guān)于數(shù)據(jù)庫(kù)操作,Drupal由于是一個(gè)完整系統(tǒng),已經(jīng)默認(rèn)實(shí)現(xiàn)了一整套非常先進(jìn)的數(shù)據(jù)儲(chǔ)存結(jié)構(gòu),該結(jié)構(gòu)提供了對(duì)系統(tǒng)數(shù)據(jù)層的支持,當(dāng)所有人都基于統(tǒng)一數(shù)據(jù)結(jié)構(gòu)時(shí),奇妙的事情就產(chǎn)生了,分布在全球的人們可以合作實(shí)現(xiàn)豐富的上層應(yīng)用,該結(jié)構(gòu)造就了大名鼎鼎的實(shí)體概念,由此Drupal也提供了更多關(guān)于數(shù)據(jù)的操作,比如實(shí)體查詢(xún),用戶(hù)實(shí)現(xiàn)了開(kāi)箱即用, Drupal是包容的,用戶(hù)也可以定義自己的數(shù)據(jù)結(jié)構(gòu)。
對(duì)數(shù)據(jù)層的支持ThinkPHP是無(wú)法做到的,ThinkPHP用模型來(lái)處理數(shù)據(jù)封裝和操作,模型和實(shí)體相比,是非常初期和幼小的概念,它能做的實(shí)體皆可做,反過(guò)來(lái)則不行,比如模型不支持輸入用的字段控件、輸出用的格式化器、表單和查看的顯示控制等等,究其原因,是因?yàn)檫@些都需要更高層面的實(shí)現(xiàn)。
中外開(kāi)源生態(tài)與聯(lián)系:
在充分對(duì)比后,會(huì)明白ThinkPHP能做的Drupal都能做,而且做的更好,反過(guò)來(lái)卻不行,因?yàn)镈rupal是一個(gè)完整后端系統(tǒng),被人譽(yù)稱(chēng)為WEB操作系統(tǒng),已幫助做了更多的事情,常用需求基本都有了,開(kāi)箱即用,ThinkPHP開(kāi)發(fā)者想要那些功能,則需要在ThinkPHP基礎(chǔ)上走非常遠(yuǎn)的路,先不提質(zhì)量問(wèn)題,單就時(shí)間消耗就是一個(gè)驚人的數(shù)字(比如Drupal 8正式版發(fā)布之前,其各種開(kāi)發(fā)版,就由一千多名國(guó)際頂級(jí)開(kāi)發(fā)者為此工作了五年),事實(shí)上很多Drupal開(kāi)發(fā)者確實(shí)也不屑于去學(xué)習(xí)ThinkPHP或者是其他框架,但在國(guó)內(nèi)可以發(fā)現(xiàn)一個(gè)很奇特的現(xiàn)象:為什么國(guó)內(nèi)還有很多小公司在用ThinkPHP?(關(guān)于這一點(diǎn),可以到各招聘平臺(tái)搜索PHP招聘信息就可略知一二),要解釋這一點(diǎn)有兩方面原因:
文化交流受阻:
中外文化、生活等的交流依然還只限于一小部分人,大部分人是沒(méi)有異國(guó)朋友的,主要原因是眾所周知的網(wǎng)絡(luò)屏障和語(yǔ)言問(wèn)題,語(yǔ)言不通應(yīng)該是主要原因,我國(guó)發(fā)展太快,目前國(guó)內(nèi)開(kāi)發(fā)者主力是70后到90后這一批人,絕大部分英語(yǔ)溝通水平欠佳,啞巴英語(yǔ),或者閱讀困難,他們往往本能的不會(huì)去接觸英文資料,00后或者10后的英語(yǔ)水平則高很多(得益于教授早,互聯(lián)網(wǎng)等),在未來(lái)他們會(huì)更多融入國(guó)際環(huán)境,所幸的是現(xiàn)在科技發(fā)達(dá),翻譯軟件水準(zhǔn)越來(lái)越高,也越來(lái)越多人投身到技術(shù)引進(jìn)上面來(lái),比如Drupal在中國(guó)就有“Drupal中國(guó)”、“愛(ài)碼文檔匯”、“水滴間”、“Drupal大學(xué)”、“Think in Drupal”、“寧皓網(wǎng)”等等一大批技術(shù)平臺(tái),這些平臺(tái)或博客提供了巨量、幾乎完整的中文文檔,掃平了語(yǔ)言障礙。在北上廣深、成都、南寧、寧波等等城市均有以Drupal作為核心技術(shù)的開(kāi)發(fā)公司。
壓力下導(dǎo)致的快餐現(xiàn)象:
中國(guó)人絕對(duì)是世界上最勤勞的人群之一,這種勤勞很大程度上和壓力相關(guān),住房、結(jié)婚、醫(yī)療、教育、養(yǎng)老每一個(gè)都是一座大山,“搞錢(qián)”必須是頭等重要的大事,對(duì)于大多數(shù)普通民眾來(lái)說(shuō),保持匠心做長(zhǎng)線(xiàn)積累風(fēng)險(xiǎn)太大,缺乏安全感,眼下能搞的錢(qián)先搞了再說(shuō),社會(huì)發(fā)展那么快誰(shuí)能知道以后什么樣子,這種現(xiàn)象對(duì)我國(guó)基礎(chǔ)科學(xué)領(lǐng)域傷害巨大,同樣的在快速發(fā)展的IT業(yè)更是如此,我國(guó)開(kāi)發(fā)者身上的擔(dān)子太重了,996甚至被大公司推崇,長(zhǎng)期做著CURD這樣簡(jiǎn)單的碼農(nóng)的工作,很多開(kāi)發(fā)者根本沒(méi)有太多時(shí)間去學(xué)習(xí),稍有時(shí)間得用來(lái)陪陪家人、孩子、女朋友,自己休息的時(shí)間很少,學(xué)習(xí)深究就更難了,如果有多余時(shí)間通常用來(lái)接私活搞外快,在這樣的大環(huán)境下,大家習(xí)慣于“吃快餐”,有鋤頭用就先用著,學(xué)習(xí)挖掘機(jī)沒(méi)有空,發(fā)展挖掘機(jī)更是成本高昂,最終導(dǎo)致了我國(guó)開(kāi)源事業(yè)難以發(fā)展,為數(shù)不多的開(kāi)源項(xiàng)目帶著濃濃的商業(yè)味,其中小公司靠廣告補(bǔ)貼,靠開(kāi)源項(xiàng)目引流商業(yè)項(xiàng)目盈利(看看ThinkPHP的首頁(yè)就能感受到),大公司則出于培養(yǎng)后備人才、免費(fèi)消除Bug等等而選擇開(kāi)源,帶著濃厚的“勢(shì)力范圍”色彩,總的來(lái)說(shuō)純粹的熱愛(ài)和興趣占比很小,但這不應(yīng)責(zé)備中國(guó)的開(kāi)發(fā)者們,這是重壓力的大環(huán)境所致,現(xiàn)在也出現(xiàn)了逃離一線(xiàn)城市的現(xiàn)象,許多人去到不那么繁忙,有些閑暇時(shí)間的二線(xiàn)城市,也許他們是開(kāi)源的一種力量,得到APP(羅輯思維)也預(yù)測(cè)中國(guó)的創(chuàng)新中心可能會(huì)移動(dòng)到那些擁有閑暇的二線(xiàn)城市。
相反國(guó)際開(kāi)源的土壤好的多,由許多發(fā)達(dá)國(guó)家主導(dǎo),而這些國(guó)家通常是福利型國(guó)家,相比壓力不大,人們靠興趣做事的空間很大,許多參與開(kāi)源的人首要考慮的是人生意義,關(guān)于此有個(gè)“馬斯洛需求模型”讀者可以了解下,“喜歡”保證了“質(zhì)量”,福利可以讓開(kāi)發(fā)者不考慮年齡、工作,在一年一度的DrupalCon大會(huì)上,你可以看到很多開(kāi)發(fā)者年齡都非常大,五六十歲的人很多,他們?cè)谝黄鹧壑袔Ч獾恼務(wù)摷夹g(shù),將一生的積累注入到Drupal中。
當(dāng)然國(guó)際開(kāi)源也并非主要由發(fā)達(dá)國(guó)家參與,英語(yǔ)系的不發(fā)達(dá)國(guó)家也是重點(diǎn)參與者,他們往往是通過(guò)開(kāi)源衍生的商業(yè)項(xiàng)目賺取外匯,典型國(guó)家就是印度,在印度兩極分化嚴(yán)重,曾經(jīng)被英國(guó)殖民過(guò),在其高端人群中英語(yǔ)普及率很高,這一點(diǎn)讓印度高度融入國(guó)際開(kāi)源,相應(yīng)的造就了印度較高的軟件開(kāi)發(fā)實(shí)力。
開(kāi)發(fā)者職業(yè)規(guī)劃:
這一節(jié)討論下國(guó)內(nèi)開(kāi)發(fā)者的職業(yè)規(guī)劃問(wèn)題,在國(guó)內(nèi)社會(huì)一直有一種聲音:“程序員是吃青春飯的”,對(duì)應(yīng)的通常就是35歲門(mén)檻,你可能經(jīng)常看到某某大公司辭退35歲的大齡開(kāi)發(fā)者,一些公司招聘年齡要求不能超過(guò)35歲,很奇怪,35歲正是能力上積累較深,很多事情的分寸上拿捏得當(dāng)?shù)哪昙o(jì),為什么會(huì)出現(xiàn)這個(gè)現(xiàn)象呢?我們來(lái)探索下:
首先那些新聞?dòng)泻苤氐牟┭矍蛳右桑拖瘛芭緳C(jī)”一樣,實(shí)際上女司機(jī)的事故率比男司機(jī)還少,正是因?yàn)樯偎圆攀切侣?,才能讓你瀏覽,但這樣的新聞多了你會(huì)形成錯(cuò)覺(jué),因此35歲門(mén)檻一定程度上被過(guò)度渲染了,造成了不好的影響,甚至有些人無(wú)理由跟風(fēng)。
但35歲門(mén)檻又有一些道理,這要選擇性區(qū)分,如果開(kāi)發(fā)者一直做著CURD這樣簡(jiǎn)單、重復(fù)性的體力活(真正的碼農(nóng)),那么當(dāng)達(dá)到35歲時(shí),和剛出校門(mén)一兩年的年輕人比,競(jìng)爭(zhēng)力可想而知,35歲時(shí)孩子上學(xué)、父母身體、住房等壓力會(huì)很大,逼迫開(kāi)發(fā)者提出更高的待遇要求,家庭事務(wù)、應(yīng)酬交際等也多,不愿加班,通常工齡長(zhǎng)累加的工資相對(duì)更高,如果你做的事情年輕人也能做,老板選誰(shuí)呢?同時(shí)年紀(jì)大了多少有些面子問(wèn)題,如果上司是個(gè)比自己小很多的年輕人,是否服管呢?對(duì)于年輕人來(lái)說(shuō)管理一個(gè)比自己年長(zhǎng)很多的人有時(shí)也挺尷尬。根據(jù)這些可見(jiàn)35歲門(mén)檻的存在有一定的道理。
時(shí)間不等任何人,那么開(kāi)發(fā)者如何避免35歲門(mén)檻,該如何規(guī)劃自己的一生呢?
如果你發(fā)現(xiàn)自己并不真的喜歡技術(shù),那么你應(yīng)該在年紀(jì)上還有競(jìng)爭(zhēng)力時(shí)趁早轉(zhuǎn)型,跟隨內(nèi)心,找到喜歡的事情并開(kāi)始積累競(jìng)爭(zhēng)力。
如果你真的很喜歡技術(shù),并愿意且準(zhǔn)備好以此度過(guò)一生,那么你就需要高效積累,不停學(xué)習(xí),時(shí)刻注意拉開(kāi)和年輕人的技術(shù)差距,他們有壓力小和體力強(qiáng)的優(yōu)勢(shì),你需要以技術(shù)優(yōu)勢(shì)進(jìn)行彌補(bǔ),大神之路不是你可選可不選,而是必須選擇的,當(dāng)?shù)竭_(dá)35歲時(shí),你必須是一個(gè)大神,擔(dān)起年輕人難以勝任的系統(tǒng)崗位。
這里需要提醒你隨著社會(huì)的發(fā)展,技術(shù)的門(mén)檻其實(shí)是在逐步提高的,比如你可能聽(tīng)說(shuō)過(guò)“全棧工程師”,但那只屬于互聯(lián)網(wǎng)時(shí)代初期,現(xiàn)在社會(huì)分工太細(xì)太深,已經(jīng)不存在全棧了,如果存在那可以換個(gè)叫法“樣樣懂,門(mén)門(mén)差”,因?yàn)槿说木Σ罹嗖粫?huì)太大,你選擇研究全部,別人選擇鉆研一處,而用人單位是按崗位用人的,你需要考慮誰(shuí)更有優(yōu)勢(shì),理智會(huì)讓你選擇深鉆一門(mén),周邊懂得即可,但這樣你會(huì)成為一個(gè)大機(jī)器上的一個(gè)部件,你的選擇自由被限制,細(xì)分門(mén)檻要求會(huì)很精專(zhuān),淺嘗輒止,不求精深必面臨淘汰。
做這樣的機(jī)器部件不適合有創(chuàng)業(yè)理想的人,那么創(chuàng)業(yè)會(huì)面臨些什么呢?看看中國(guó)社會(huì)的發(fā)展,所有通用的IT需求你可能都沒(méi)有機(jī)會(huì),比如網(wǎng)站被公眾號(hào)取代,不多的網(wǎng)站市場(chǎng)也被SaaS平臺(tái)占領(lǐng),與這樣的平臺(tái)競(jìng)爭(zhēng),他們只需要點(diǎn)鼠標(biāo)初始化即可,你得寫(xiě)代碼,他們按時(shí)間收費(fèi)可以很低,你得一次性收費(fèi),站在客戶(hù)角度首要考慮的當(dāng)然是成本問(wèn)題,通用需求還包括電商系統(tǒng)、直播系統(tǒng)、內(nèi)容付費(fèi)系統(tǒng)等等,而這些都有很成熟的現(xiàn)存解決方案,在規(guī)模優(yōu)勢(shì)上,微盟、有贊、微擎、微積木等等這些都是已經(jīng)發(fā)展起來(lái)的很不錯(cuò)的SaaS平臺(tái),非通用的IT需求呢?會(huì)形成許多垂直領(lǐng)域的解決方案,山頭被搶占瓜分,比如美團(tuán)、滴滴、土巴兔、頂呱呱等等,他們所在的領(lǐng)域你都很難再有機(jī)會(huì),留給開(kāi)發(fā)者的僅剩下數(shù)量不多的真正需要定制化的需求,這樣的需求有個(gè)特點(diǎn),由于是定制,成本原因決定了客單價(jià)必須高,此時(shí)客戶(hù)會(huì)對(duì)創(chuàng)業(yè)者公司的實(shí)力有所要求,你有多少員工?有多大的辦公室?有多長(zhǎng)時(shí)間的歷史積累?有多少案例?注冊(cè)資本有多高?
此外IT發(fā)展到今天,同一個(gè)應(yīng)用系統(tǒng)在軟件形式上會(huì)呈現(xiàn)多種形式,通常需要App、小程序、網(wǎng)頁(yè)等中的一種或幾種,還涉及到跨平臺(tái)(APP有安卓、IOS和即將出現(xiàn)的鴻蒙,小程序涉及微信、支付寶、百度、抖音等等),雖然有UNIAPP這樣的工具,但在客戶(hù)要求原生應(yīng)用時(shí)仍然所需技能很多,這就導(dǎo)致必須組建團(tuán)隊(duì),團(tuán)隊(duì)成員還包括非技術(shù)人員等,比如業(yè)務(wù)員、財(cái)務(wù)等,這些都形成了一定的進(jìn)入門(mén)檻,最終你會(huì)發(fā)現(xiàn)創(chuàng)業(yè)需要的不止是技術(shù)更多的是資金。
說(shuō)到這里你是否感覺(jué)路很難?但請(qǐng)你相信不是只有IT領(lǐng)域是這樣的,有競(jìng)爭(zhēng)的地方都會(huì)這樣,任何成功皆不容易,唯有你的興趣能保證你能走多遠(yuǎn)、走多高,所以請(qǐng)跟隨自己的內(nèi)心。
如果你跟隨內(nèi)心,深思后依然選擇了做技術(shù),當(dāng)一個(gè)了不起的大神,那么你該怎么做呢?首先你必須要注重積累,尤其是要站在巨人的肩膀上向著未開(kāi)發(fā)的土地猛沖,你需要找到所在細(xì)分領(lǐng)域最有前景的生態(tài)圈,加入進(jìn)去,回到PHP開(kāi)發(fā)框架上來(lái),小白看框架它只是進(jìn)一步封裝提供了要的功能,而大神看框架是它提供了一個(gè)統(tǒng)一的協(xié)作平臺(tái),大家都在同一個(gè)平臺(tái)上進(jìn)行創(chuàng)造,這樣才能避免自己重復(fù)造輪子,在經(jīng)濟(jì)成本上才足夠劃算,借助眾人的力量才能騰出手來(lái)發(fā)展自己的事情。
基礎(chǔ)平臺(tái)的統(tǒng)一性非常重要,只有這樣人類(lèi)才能累積向前,才能降低成本,但統(tǒng)一平臺(tái)的形成有個(gè)很有意思的規(guī)律,那就是最終只會(huì)剩一個(gè)作為主要平臺(tái),然后有個(gè)處于第二位的平臺(tái)來(lái)形成競(jìng)爭(zhēng)后備,第三第四位的基本可以忽略不計(jì)了,且第一位和第二位在體量上會(huì)選差很遠(yuǎn),這樣的列子有很多,比如歷史上有幾千個(gè)操作系統(tǒng),最終剩下window和linux,二者用戶(hù)數(shù)量選差很遠(yuǎn),又比如安卓和蘋(píng)果、淘寶和京東、抖音和快手、美團(tuán)和餓了么等等皆是如此,一旦格局形成,便很難撼動(dòng),比如微軟就撼不動(dòng)安卓,不是因?yàn)榧夹g(shù),而是因?yàn)闈L雪球效應(yīng)在發(fā)揮作用,王者會(huì)更強(qiáng)、更大,敗者逐漸落寞消失,即便王者犯了些小錯(cuò)發(fā)展也不可改變,比如現(xiàn)在我們使用的鍵盤(pán),其字母排列其實(shí)不是最合理的,歷史上也出現(xiàn)過(guò)排布合理的鍵盤(pán),但由于大家已經(jīng)習(xí)慣于現(xiàn)在的鍵盤(pán),所以也就延續(xù)使用了,要成為王者有兩點(diǎn)很重要:技術(shù)層面的先進(jìn)性要足夠、社區(qū)生態(tài)要建立滾雪球效應(yīng),這兩點(diǎn)相輔相成。
那么在PHP框架領(lǐng)域誰(shuí)會(huì)成為這個(gè)統(tǒng)一的基礎(chǔ)平臺(tái)呢?開(kāi)源項(xiàng)目的主要發(fā)展力量應(yīng)該是大批使用者在使用過(guò)程中不斷的提煉并總結(jié),然后一起對(duì)其的持續(xù)討論并改進(jìn),而不是幾個(gè)人單憑自己的思考或經(jīng)驗(yàn),因此如果在ThinkPHP和Symfony中做選擇,答案已經(jīng)非常清楚,其實(shí)很早Symfony就意識(shí)到統(tǒng)一平臺(tái)的意義所在,因此致力于解耦的、完備的基礎(chǔ)組件的建立,并反復(fù)迭代,以至于現(xiàn)存其他一些框架也用Symfony的組件,比如Laravel和ThinkPHP,Symfony一再?gòu)?qiáng)調(diào)“標(biāo)準(zhǔn)”,且現(xiàn)在也已經(jīng)存為php開(kāi)發(fā)領(lǐng)域的事實(shí)標(biāo)準(zhǔn),因?yàn)闃?biāo)準(zhǔn)化就是統(tǒng)一平臺(tái)的必備條件。
至于Drupal則是在Symfony基礎(chǔ)上建立起來(lái)的更高一層的統(tǒng)一標(biāo)準(zhǔn)平臺(tái),成為了完整系統(tǒng)的標(biāo)準(zhǔn)基礎(chǔ),在這里常用的應(yīng)用層功能幾乎都已被提供,人們正在此統(tǒng)一平臺(tái)上,基于模塊化設(shè)計(jì),創(chuàng)建更多面向未來(lái)的功能,實(shí)現(xiàn)Drupal的理想“提供卓越的數(shù)字體驗(yàn)”。
決策者技術(shù)選型:
如果你是一位創(chuàng)業(yè)老板,或項(xiàng)目總監(jiān),正為項(xiàng)目進(jìn)行技術(shù)選型,那么這里為你提供幾個(gè)注意事項(xiàng):
控制成本:
這似乎不用多說(shuō),理所當(dāng)然,但你真的控制到了嗎?軟件是無(wú)形的,如果你不是專(zhuān)業(yè)人士,很難控制成本,這里說(shuō)一些坑:
在目前環(huán)境下,想做個(gè)長(zhǎng)遠(yuǎn)規(guī)劃的項(xiàng)目,能自己開(kāi)發(fā),就不要外包,有些東西看起來(lái)一樣實(shí)則差距非常大,不專(zhuān)業(yè)的人很難看出健壯性、擴(kuò)展性、安全性、持續(xù)性等等性質(zhì)在兩個(gè)系統(tǒng)間有何不同,比如同樣功能的系統(tǒng),負(fù)載五千和負(fù)載五千萬(wàn)的開(kāi)發(fā)成本是完全不同的,又比如軟件文檔工作量有時(shí)會(huì)遠(yuǎn)高于軟件開(kāi)發(fā)本身,文檔是保障系統(tǒng)長(zhǎng)遠(yuǎn)發(fā)展的重點(diǎn),但外包很難做到文檔齊全,外包質(zhì)量通常會(huì)讓你在日后買(mǎi)單,究其原因,不是因?yàn)橥獍緦?shí)力不行,而是成本問(wèn)題。
少欠技術(shù)債:
不要在開(kāi)始因?yàn)槭″X(qián),找一些積累不夠的開(kāi)發(fā)者,這里分享個(gè)故事:有位老板和技術(shù)總監(jiān)在人才招聘上出現(xiàn)了分歧,技術(shù)總監(jiān)要求給出崗位工資1.5萬(wàn),來(lái)了一個(gè)應(yīng)聘者只要八千,技術(shù)總監(jiān)不要,但老板大喜,認(rèn)為賺到了,為什么要傻傻的多給錢(qián)呢?有時(shí)小白會(huì)在系統(tǒng)中留下巨大隱患,這位技術(shù)總監(jiān)就是看到了技術(shù)債問(wèn)題,開(kāi)發(fā)團(tuán)隊(duì)一定要有積累深的技術(shù)骨干來(lái)把控系統(tǒng),同時(shí)在選擇基礎(chǔ)系統(tǒng)時(shí)不要選擇成熟度低的東西,這樣保證盡可能不欠技術(shù)債,否則你會(huì)開(kāi)始輕車(chē)熟路,后面深陷泥潭,如果遇到商業(yè)關(guān)鍵窗口期,那么神仙也救不了你
借力加速:
社會(huì)發(fā)展到今天,其實(shí)很多IT系統(tǒng)功能都已經(jīng)有了,而且非常齊全,你不需要自己去開(kāi)發(fā),比如要在ThinkPHP和Drupal之間選擇,我會(huì)毫不猶豫的選擇Drupal,因?yàn)門(mén)hinkPHP只是個(gè)半成品,通常在各種業(yè)務(wù)系統(tǒng)中有些功能是必須的,比如垃圾回收系統(tǒng)、狀態(tài)系統(tǒng)、鍵值儲(chǔ)存、批處理系統(tǒng)、計(jì)劃任務(wù)系統(tǒng)、數(shù)據(jù)類(lèi)型化系統(tǒng)、Ajax系統(tǒng)、數(shù)據(jù)查看引擎、版本支持系統(tǒng)、權(quán)限系統(tǒng)等等,這些在ThinkPHP都沒(méi)有,而Drupal很完備,而要在ThinkPHP上開(kāi)發(fā)出這些,需要數(shù)月到數(shù)年,不但談不上基礎(chǔ)統(tǒng)一平臺(tái)的優(yōu)勢(shì),也很難保證自己開(kāi)發(fā)的代碼質(zhì)量,不但白白浪費(fèi)了資源,在后期新加成員還需要付出高昂的培訓(xùn)費(fèi)用,有現(xiàn)成的基礎(chǔ)齊全的、成熟的系統(tǒng)為什么不用呢?
融入大環(huán)境:
開(kāi)發(fā)體系要融入大環(huán)境,除了借力加速外,還在于后備人才的獲取,讓開(kāi)發(fā)者和項(xiàng)目解耦,不要因?yàn)樵诂F(xiàn)有開(kāi)發(fā)者離職或不夠時(shí),找不到足夠的開(kāi)發(fā)者快速加入項(xiàng)目,融入大環(huán)境,解耦開(kāi)發(fā)者很大程度保障了項(xiàng)目的發(fā)展安全。
國(guó)家開(kāi)源建議:
這一節(jié)我們站在國(guó)家層面,來(lái)看看應(yīng)當(dāng)如何對(duì)待開(kāi)源,我國(guó)日漸強(qiáng)大,很多國(guó)人都期待著超越美國(guó)那一天早日到來(lái),那么中國(guó)要突破美國(guó)封鎖,達(dá)到超越的目的,就必須要參與國(guó)際開(kāi)源成為貢獻(xiàn)主力,而不是自己搞一套獨(dú)立的體系(自建體系應(yīng)發(fā)生在新生事物上,比如下一代物聯(lián)網(wǎng)操作系統(tǒng)鴻蒙),因?yàn)殚_(kāi)源是全人類(lèi)的開(kāi)源,而不是哪一個(gè)國(guó)家的開(kāi)源,閉門(mén)造車(chē)出門(mén)不合轍,會(huì)讓中國(guó)遠(yuǎn)離世界,要知道中國(guó)只有十四億人,而全世界有七十多億人,生態(tài)力量無(wú)法和全世界對(duì)抗,因此理性的做法是參與開(kāi)源,努力做出奉獻(xiàn),一則繼承已有的人類(lèi)發(fā)展成果,站在巨人基礎(chǔ)上發(fā)展更快,二則選擇和大多數(shù)人在一起,開(kāi)放國(guó)門(mén),建立影響力,才有可能樹(shù)立大國(guó)形象。
關(guān)于“drupal對(duì)比thinkphp看國(guó)內(nèi)開(kāi)源環(huán)境的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。