如何看待Yii框架創始人Qiang Xue轉投Go語言?
比如Yii框架創始人, Qiang Xue (猜測為:薛強,下同), 從 2015年開始再也沒有往Yii2的倉庫提交過代碼。 觀察其GitHub主頁面,可以看到他是轉而去寫他的Go框架了 Ozzo Framework ,最近的活躍提交全部是針對他自己的 Go倉庫,成了又一個被Go語言搶走的(優秀)PHP程序員。
很早之前就有熱心群眾問過薛強的去向 Has Qiang Xue abandoned the project? 而未得到明確答覆,雖然如今在 Yii 項目主頁上 About Yii | Yii PHP Framework,Qiang Xue 仍然是項目領導,但是從如上總總跡象想來看早已是甩手掌柜。
目前很多PHP程序員在轉投Go,是否表示了Go在取代PHP的實力和底氣上日漸強勢?
我個人不認為程序員有任何的『轉投』、『拋棄』、『轉換陣營』等等的概念。
請不要在這個純潔的領域裡面搞聖戰。
技術沒有對錯,只有合適與否。哪個資深的工程師都不會只學習一兩門語言。
從我04年上大學,開始學習C、C++、Java,把Java寫到周圍公認比較厲害的程度(當然,只是小圈子,並不是真正的大牛)之後,08年依然換了PHP從事工作,因為當時想從事的行業,PHP比Java更加合適而已。然後在12年開始接觸Golang,從14年開始在生產環境裡面使用Golang來承擔部分主要業務至今。
不管是Java、PHP、還是Golang,都沒有誰替代誰的想法。甚至我中間還接觸過Electron、swift、oc等等語言。
工程師的職責是,在遇到問題的時候,用合適的技術來解決,而不是站陣營,玩聖戰,拼個你死我活。
最後,真愛生命,遠離聖戰!
不僅Yii創始人,技術上比Yii領先一個身位的Swoole,其創始人也在力挺Go。
Go和PHP是絕佳的互補,跟PHP一樣簡單實用,PHP開發想掌握Go語言,只要看一本兩百頁的書就足夠了。Go的Web框架都很簡單,甚至可以不用框架,內置的httpserver也可以用了。
如果要用Java去補PHP短板,得依次看完Java編程語言,Java編程思想,Effective Java,和Java並發編程,加起來已經超過2000頁了。看完這些,如果走傳統Java路線,還要去學習Spring和Hibernate/Mybatis那套打法,Spring的文檔也有大幾百頁了,hibernate也有幾百頁,即使用Spring Boot,也繞不過把Spring搞明白這個檻。這些看完還不夠,還要把netty和vertx啃下來,然後得到的只是callback hell,想要coroutine?等Java 11吧,Java 10都不會有。想要主流Java生態支持coroutine?2020年之前不可能了,2022年都懸。
如果工作中用不到,需要業餘時間自學,完全弄明白Java那套玩法,可以列個3年計劃,或者只用3個月搞定Go,反正在補PHP的地方,Java能做的Go也都能做。
請允許我瞎說幾句大實話
- PHP only是不合適的,有些地方需要1-2門更合適的語言去補充
- 最適合PHP或Python開發去投入的備胎,是Go和Java,且Go &> Java
- 越懂PHP的人越擁抱其它語言,越不懂PHP的越堅持PHP最好
如和看待Yii框架創始人Qiang Xue轉投Go語言?
當然是當作榜樣學習了,PHPer多學一兩門備胎語言不是什麼壞事,萬一需要備胎上位了呢。
狡兔都知道三窟,煮酒論架構的時候都知道要有熱備,自己賴以生存的職業上,怎麼就那麼死守PHP了?最近國內好多公司從PHP轉Java轉Go,甚至還有轉Node的。萬一哪天PHP小眾了,背負著上百萬房貸的你,拖著30多歲甚至40多歲的身體,去跟20幾歲的人搶那剩下的幾個職位嗎?
門檻高的東西,不怕小眾,沒有門檻的東西,一旦小眾了,疊加上中年危機的魔法傷害,後患無窮。如果有機會學點別的,一定不要錯過,尤其是公司出錢,讓你拿項目練手的時候,這麼好的事情,不要抱怨和發帖求助,也不要偷笑,跟公司給你配備的這方面的老手搞好關係,有人指點會事半功倍。
2017-12-29更新,回復一下幾個評論
@Donny Yang Java曾經是有過green threads,但是不是1.5的時候,是Java 1.1,後來因為種種問題廢棄了。直到Java 9發布,Java只有原生線程,並沒有協程。JDK第一次比較好的支持非同步風格編程,是從Java 8引入CompletableFuture開始的。ExecutorService充其量不過是個比較方便使用的線程池,跟非同步或者協程一毛錢關係都沒有。
@完顏二雷 hibernate可以不學,但是spring多少還是要懂一些,即使用vertx,也可以用springboot去管理依賴。future並不難解決callback hell的問題,比如在循環里做callback調用的時候,往往要轉化成遞歸形式去寫。如果future好用,就不會有async和await了。
Kotlin是不錯,我已經在線上用了一年了,處理了千億次的請求。但是Kotlin還是不夠成熟,想用好Kotlin,前提是很熟悉Java。到此時此刻為止,Kotlin的memory model的spec還在制定中。memory model對並發編程的重要性,我想不會有人質疑。
2017-12-30更新
@Donny Yang 回答一下你的問題,但這兩個pattern效果上有什麼區別?
Type result = executor.submit(synctask).get();
let result = await asyncTask()
並發量小的時候是沒區別,但是高並發的時候區別大了,一個阻塞任務佔用線程池中一個線程,1000個阻塞任務要佔用1000個線程,比如一個典型的互聯網後端,一次請求中要多次請求第三方,假設走完一次要1秒,10000QPS的後端,需要10000個線程來應付,10萬QPS的後端呢?堆機器開10萬個線程?
高延遲阻塞型IO跟高並發,是天生互斥的。那麼callback或者future能解決阻塞這個問題,但是引入了別的問題,寫hello world可能區別不大,但是稍微複雜一點點呢?
for (t in tasks) {
r = await t(...)
if (r == 1) {
c = await check_a(...)
if (c == 1) return ...
} else if (r == 2) {
c = await check_b(...)
if (c == 3) return ...
}
}
現實中的業務比這個還要複雜的多,一次請求可能會產生十幾次的阻塞介面調用,這十幾次有循環有嵌套,比起對思路幾乎無侵入的coroutine方案,對開發人員的要求要高出許多。
並發低的時候確實不需要coroutine,並發上去之後,需求就很強烈了,為此JDK社區搞了Loom項目。目的很明確,讓線程API更高效和省資源,讓並發更簡單。
Project Loom will introduce fibers as lightweight, efficient threads
managed by the Java Virtual Machine, that let developers use the samesimple abstraction but with better performance and lower footprint. We
want to make concurrency simple(r) again!
coroutine和thread在API上可以一模一樣,但是重量完全不同,你可以在一個進程內很輕鬆的開10萬個甚至100萬個coroutine,比線程高出1-2個數量級。
Java不需要coroutine的論調,跟PHP不需要多線程是一樣的。
轉投這個詞用的感覺像是江湖上另立山頭的感覺。編程語言本身是為了解決問題而存在的,如何使用何種編程語言也可以更快更好的解決問題,這個是程序員最重要的選擇。
Golang有比PHP出色很多的地方,我很喜歡它的高性能、協程、交叉編譯等特性和功能。Golang的框架要比PHP的框架寫起來有趣多了,而PHP框架則是越寫越大,可能早期寫框架的是一批Java程序員轉投過來的,玩的就是高大全。
在PHP有swoole這類擴展的加持下,也有了非同步、協程、網路編程的特性,把PHP的生命周期從單一的網頁請求擴展到後台服務,也算是開了不少眼,至少轉投了Golang三個月的我拜讀了swoole的文檔後是被留下來了。
人的想法有很多,各有選擇各有所需吧,但也不能因為這個問題而上升到語言的優劣上來,更何況PHP宇宙第一編程語言不是誰隨隨便便可以稱得上的,哈哈為了解決業務問題,我們用php,為了有個輕量級的框架我們對yaf進行二次開發為了提升api性能,我們用了lua,
為了優雅的處理隊列消息,我們用c開發了mkc服務,
為了更快抓數據,我們用了python想告訴你的是,團隊的技術棧都是多元化的,語言只是拿來解決問題,用合適的技術方案解決針對性的問題,別再掉入語言之爭這個陷阱需知道,一方陣營的意識形態,突然 轉變到 別的 意識形態(左翼or右翼),
那麼這人 很可能是 被洗腦了(逃
難道不是 哪個適合自己用 就用哪個嗎?
我自己也是靠php吃飯的!
我 不一樣 去看看 前端的 然後看看Go
技多不壓身啊!!!!!!!!
我看評論里 有個人 總是出現在我首頁! 這哥們總是說 php多好多好! 總是說 php的swoole + php7 多叼... 雖然我是以php吃飯的!但是 不同的場景,我也會說 php也有不好用的地方! 比如到一定量的時候!就是搞不過Go!
什麼語言不重要,重要的是解決了問題! 有人挖土用勺子,有人用鐵鍬!只要人家用的爽,隨便人家用啥!
拒絕聖戰!
還有,我看好Go,而且搞php的 學一下Go 對你絕對有百分之一千的好處!
以上!
庸才注重形式(語言),高手注重思想。
忘記是哪個大牛說的了。跟nodejs tj一樣,他只是換了工作方向,換了把趁手的兵器而已。Go的優雅才是吸引人的地方。人家不會因為寫了yii就只是PHP程序員。人家是牛逼的程序員,無關語言。
都是工作
yii這個框架,讓我想起了老媽做的紅燒肉,老媽做了十年,我也吃了十年,直到有一天,家裡多了哥哥的小孩,他不喜歡吃紅燒肉,喜歡吃回鍋,之後媽媽大多數都做回鍋肉,很少做紅燒肉了,我問媽媽,「你是不是不愛我了?」媽媽說道:「你已經長大了,你外甥還小,再說你也該找個女朋友了,讓她給你做。」
求一個會做紅燒肉的女朋友!2015年就沒提交了,但是yii2是更好更成熟了,社區也一直沒中斷這就足夠了。而且,學PHP都會多學幾門語言,比如go,node,python什麼的。就好像會css,html,jq,bootstrap一樣,拿來先用不是么。
首先,框架並不是什麼核心的技術,你可以把它視為一個規模很大的模板,你可以利用這個模板快速的達成一些需求,從而節約開發時間。
其次,TP、Yii、Laravel等框架的缺陷就跟windows一樣:要照顧兼容性。為了兼容各種需求,它必須先把很多東西抽象出來,然後一層層的繼承了很多次,這必然導致性能的下降,對於PHP這個語言來說,下降的幅度更加嚴重。
再次,大部分有開發實力的公司都不會使用開源框架製作關鍵產品,都是自己設計和編寫框架以求達到最貼合業務以及最高性能。
最後,這個跟Go或者PHP的發展趨勢沒有什麼關係,真不明白為什麼那麼多人都在花大量時間去討論某個語言的趨勢,彷彿找到了正確的趨勢就能讓自己押對了寶一樣。
編程的核心能力永遠都不是哪個語言用得666。
妄想在職業生涯中永遠依靠掌握一種所謂「牛逼」語言然後就可以一招鮮吃遍天的,必然是個失敗的Coder。
哈,瀉藥
這個哥們用他自身經歷證明了一點:框架就是個p
不奇怪啊,我們傳統用java的也已經逐步淘汰掉各種亂七八糟的框架了
輕裝上陣,又不是什麼很難的事,幹嘛包來包去?無非就那麼點io和crud
還要整什麼框架,你不煩我都煩了
以前spring只是di的時候,還能接受,但是現在也是瘋狂滴亂懟其它東西上來
就這麼說,現在不搞框架,拋棄框架,直接從語言入手才是正道
這哥們只是隨了一次大流而已
有啥奇怪的?
我們走得更遠了,才一個語言怎麼能滿足我們嘛,polyglot才爽嘛
我們上了n個語言,具體可以參考:Vert.x的一個常見問題以及多語言制霸環境配置
框架就是個束縛,什麼都不是,當你擺脫了框架之後,你就會發現
外面的世界天地寬啊
腳本我們有js, ruby, groovy,隨便選一個
fp+oop我們有kotlin, scala, latte,隨便選一個
以後我們希望還有pure fp的haskell和lisp(clojure),隨便選一個
在不同領域選擇不同語言才是王道
用go的也就欺負欺負這些死套框架的罷了
結合個人開發經驗,說實話,PHP框架對於PHP開發真心無足輕重.就連PHP之父Rasmus都公開批評過PHP框架.PHP不像Java,沒了框架就成了殘廢.PHP本質其實是C實現的高度封裝Web開發工具集,什麼東西都有了,語言本身就是開箱即用的開發工具.所以別太把PHP框架當回事.
近年來真正給PHP帶來革命性變化的是PHP7和Swoole這種項目:
PHP7大幅提升了PHP性能,回應Facebook HHVM的挑釁.
Swoole則提供了簡單實用的非同步編程支持,回應Node.js的挑釁.
PHP7+Swoole,要速度有速度,要非同步有非同步,要常駐能常駐,要效率有效率.
Go跟PHP比,除了計算密集類場景有優勢,在其他方面真的很一般,包括並發.
期待PHP開發者轉Go來帶動Go生態,不現實,還是去找哈Google的Python粉絲吧.
感受一下PHP+Swoole的澎湃性能,下面這個寥寥幾行代碼的例子,包含了多個非同步服務:
多進程非同步HTTP伺服器,非同步HTTP客戶端,非同步Redis客戶端.
&on(request, function ($req, $res) {
$client = new swoole_http_client(127.0.0.1, 80);
$client-&>post(/dump.php, array(key =&> value), function ($client) use ($req, $res) {
$redis = new swoole_redis();
$redis-&>connect(127.0.0.1, 6379, function ($redis, $result) use ($req, $res, $client) {
$redis-&>get(test_key, function ($redis, $result) use ($req, $res, $client) {
$res-&>end({$client-&>body} . {$result});
$client-&>close();
$redis-&>close();
});
});
});
});
$server-&>start();
當然,Swoole還提供了很多其他協議的非同步客戶端和伺服器端,以及定時器等各種實用的API甚至協程支持,Swoole讓PHP能幹的事更多,並做得更好.
Swoole同樣也協程支持,包括伺服器端和客戶端(TCP/UDP/HTTP/Redis/MySQL)的實現,而且無需關鍵字,程序隱式切換:
https://wiki.swoole.com/wiki/page/p-coroutine_realization.html
其實很多時候,並不需要非同步,比如Redis非阻塞的常規操作都是內存級別的操作,IO延遲本來就很低,這時使用PHP原來的同步阻塞型API如phpredis就好,而像 subscribe/blpop/brpop/brpoplpush 這些Redis阻塞類命令,才建議使用非同步的swoole_redis避免進程被阻塞.至於MySQL操作,也不建議上非同步,因為資料庫IO性能擺在那,非同步雖然不阻塞PHP進程,但大量的資料庫請求會讓資料庫自身就撐不住,所以用PHP自帶的同步的MySQL客戶端PDO或MySQLi配合長連接是項目起步時不錯的選擇,沒必要一上來又是非同步,又是連接池,徒增複雜度.
PHP7與Swoole齊飛,秋水共長天一色.
沒什麼特色的東西大多喜歡鼓吹自己優雅.Go感覺就是個低不成高不就的語言,底層搞不過C,中層搞不過Java生態,上層不如PHP,很尷尬.而且Go的殺手級應用居然是Docker這種容器工具,跟其鼓吹的並發優勢其實幾乎不沾邊.再看看Mozilla的Rust,Firefox Quantum(即Firefox 57)就是用Rust重寫了多個組件如CSS引擎Servo,充分利用多個核心並行計算,大幅提升Firefox速度.
他跳槽了。在新公司用go寫了RESTful的OZZO api框架。 Yii1/2仍然在用。
有益的互補,不是很好嗎?
因為是GO是新興語言啊。可以與PHP形成互補。
而且整個Yii2的舞台都搭好了。總不能讓導演也上去演吧。而且其他程序員也能很好的讓Yii2持續發展。
而且薛強老師這就是給廣大php程序員做了一個很好的示範。php成員也能很好的掌握其他語言。要善於跟蹤新的發展趨勢。一個成熟的社區標記就是,即便創始人沒有足夠的精力來管理。社區的其他成員也能很好的管理。目前來看Yii2並沒有因為薛強老師投入精力少,而不活躍了。相反,其他開發成員仍然很熱情的在提交新的代碼。而且也有不少國內的大牛其中做貢獻。
這才是大家參與開源項目的方式。國人的參與,也能夠讓Yii2在設計上更多的傾聽中國人的聲音。這難道不好么?