Python 、 Node.js 與 Java 在開發(fā)后端上的一些區(qū)別和優(yōu)劣?
如果僅僅是后端的話
優(yōu)點(diǎn)
? ? python:調(diào)試快,語法好,爬蟲數(shù)據(jù)分析類工具多好用,類庫中等質(zhì)量還可以,內(nèi)存占用還不錯(cuò)。機(jī)器學(xué)習(xí)領(lǐng)域的庫依然是最好的。
? ? node.js: 調(diào)試快,語法一般(ts語法好但是還不是完全普及),類庫多,內(nèi)存占用還不錯(cuò)。適合全棧開發(fā),僅h5項(xiàng)目的確無需分前后端,2-3人參與的小項(xiàng)目尤其合適,快速可交付。
? ? java: 語言全面發(fā)達(dá),工程化程度高適合多人合作,類庫大而全幾乎所有問題都可以google后庫解決,解決問題的規(guī)模從QPS1到QPS1W均可,對各類中間件全面支持,性能極限高。開發(fā)流程上的各類工具穩(wěn)定,學(xué)習(xí)門檻低。java開發(fā)成本其實(shí)比較低,因?yàn)榫蜆I(yè)市場供給充足,比python node.js都好招聘。性能分析等等工具鏈?zhǔn)滞晟啤?/p>
缺點(diǎn)
? ? python:? 運(yùn)行環(huán)境如果不是自己做的docker鏡像,麻煩。高性能解決方案一般。如果不是個(gè)人項(xiàng)目,那么需要組內(nèi)代碼規(guī)范約束code review得比較好,否則容易屎山。類庫不夠全面,存在功能缺失。
? ? node.js: 依賴的類庫質(zhì)量中等偏下,又多又雜。核心框架與開發(fā)流程上的工具近今年才稍微穩(wěn)定,但是代碼質(zhì)量上存疑。java script對于后端來說是一門質(zhì)量低下的語言不為過,需要ts。本身線程模型因?yàn)閚ode.js的原因比較固定,如果要盡量利用多核性能需要走多進(jìn)程方案,天然不適合CPU密集型應(yīng)用比如大數(shù)據(jù)處理這類。對于多人項(xiàng)目,對項(xiàng)目工程化管理要求比python更高,很容易寫出屎山,管理難度最大。一個(gè)穩(wěn)定的編譯運(yùn)行環(huán)境最好借助docker 否則可能會出一些奇怪的問題。npm install后項(xiàng)目無法運(yùn)行過去常見,依賴類庫需要鎖好版本。
? ? java: 最大的缺點(diǎn)就是低負(fù)載應(yīng)用,占用內(nèi)存依然不少,對于小成本項(xiàng)目非常致命,成本飆升。編譯速度慢,debug速度慢,提高開發(fā)成本。主流的spring boot依然是同步線程模型,對比node.js來說CPU占用高性能還差(需要用vert.x這類線程模型)。開發(fā)過程中的idea占用資源巨大,并且筆記本大概率風(fēng)扇狂轉(zhuǎn),debug多個(gè)進(jìn)程要很好的電腦,分布式環(huán)境docker-compose后32G內(nèi)存是剛需。
個(gè)人樂字節(jié)觀點(diǎn)是node.js是javascript基因的東西,歷史角度講會消失。python在數(shù)據(jù)挖掘,爬蟲等領(lǐng)域依然比java好用,java對于中大型項(xiàng)目依然很強(qiáng)勢,go會把node.js? php 以及java的一部分占掉,java未來在native編譯成熟后(目前速度等都不理想)會反彈一波。
個(gè)人小型項(xiàng)目,熟悉什么用什么,python當(dāng)然很好。
小公司的中小型項(xiàng)目,java,go均可,可上可下。
中大型項(xiàng)目,java工程化比python,node.js高太多了,這點(diǎn)項(xiàng)目成本上來說java是最優(yōu)的,并且中后期的消息隊(duì)列,緩存,分布式,支持完備簡單好用。2個(gè)node.js或者python可以做的項(xiàng)目需要6個(gè)java?非后端項(xiàng)目,管理后臺類項(xiàng)目有可能,但是純后端項(xiàng)目從未見過,公司項(xiàng)目做到中型用java重構(gòu)倒是常見。
腳本語言工程化的問題,對于一般開發(fā)而言可能無感知,但是如果你負(fù)責(zé)一個(gè)項(xiàng)目,乃至公司的很多項(xiàng)目的架構(gòu),你想要維護(hù)代碼質(zhì)量,你就會發(fā)現(xiàn)python和node.js維護(hù)質(zhì)量的成本是要高于java的,你要培訓(xùn)的內(nèi)容更多,并且可以借助的文檔相對較少,工具也較少。舉個(gè)例子,對于java而言,阿里的java規(guī)范作為培訓(xùn)內(nèi)容就好,idea也有很好用的工具。
至于java開發(fā)啟動(dòng)效率低,只能說這里介紹一下java開發(fā)中小型項(xiàng)目的流程防止對java不熟悉的人不了解:
git clone url://[starter_project]
git remote rename origin starter
git remote add origin [respo_url]
準(zhǔn)備一臺測試機(jī) yum install docker
講本季的ssh_key加入測試機(jī)進(jìn)行授權(quán)
修改application.yml pom.xml內(nèi)配置,比如數(shù)據(jù)庫地址,部署目標(biāo)機(jī)器IP端口,項(xiàng)目名稱等等。
sh [proejctpath]/bin/deploy_test.sh 腳本包含 編譯->運(yùn)行測試->docker鏡像編譯->docker推送->docker重啟遠(yuǎn)程機(jī)器->檢測部署成功 所有功能。
至此包含一個(gè)登陸注冊發(fā)短信,用戶推廣,充值,會員,金幣體系,轉(zhuǎn)盤抽獎(jiǎng),微信相關(guān),甚至分布式鎖,性能監(jiān)控日志工具(慢請求SQL慢查詢等UI記錄)等等基本功能的后端工程已經(jīng)測試環(huán)境運(yùn)行完成,文檔swagger也生成完畢,前端直接通過部署機(jī)器ip查看。
根據(jù)此項(xiàng)目特殊性,定義數(shù)據(jù)結(jié)構(gòu)Entity類,數(shù)據(jù)庫自動(dòng)生成表。
此文章轉(zhuǎn)自樂字節(jié)。