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