本文轉載自公眾號“讀芯術(shù)”(ID:AI_Discovery)。
今天是2018年夏天。我的老板阿德里安(Adrian)請我與加拿大一家大公司的首席技術(shù)官詹姆斯(James)一起進(jìn)行Skype通話(huà)。
在相互了解的同時(shí),我發(fā)現詹姆斯是一個(gè)有雄心壯志的聰明人。他的愿景是將大規模的桌面WPF應用程序遷移到云中的Web。
我喜歡他的友好態(tài)度,可以說(shuō)出他渴望與我們合作。他已經(jīng)在印度擁有開(kāi)發(fā)合作伙伴,但是他們缺乏構建Web應用程序的經(jīng)驗。
我和Adrian在這種情況下遵循標準方法。我們還有幾個(gè)電話(huà),然后我們開(kāi)始發(fā)現階段,在此階段我們試圖把握全局并找到非功能性需求。這些是我們應重點(diǎn)關(guān)注的要點(diǎn):
一個(gè)大型應用程序-超過(guò)220頁(yè),其中大多數是維護屏幕,其中大約20%是高度定制的。
顯示大量數據,尤其是在具有各種功能的網(wǎng)格中:分組,列凍結,行擴展,自定義列,即可為其命名。
模塊化架構,允許多個(gè)團隊同時(shí)處理項目。
多年項目。新功能將隨著(zhù)時(shí)間的推移而增加。
不需要離線(xiàn)支持。
為新團隊成員快速入門(mén),特別是對使用舊桌面應用程序的.NET開(kāi)發(fā)人員而言。
作為一名架構師,我的任務(wù)是創(chuàng )建一個(gè)技術(shù)提案,其中包含架構細節,方法,路線(xiàn)圖,指南,最重要的是將要使用的技術(shù)棧。
James多次提到他想要一種面向未來(lái)的技術(shù),他不贊成Angular,因為在A(yíng)ngularJS被棄用之后,它的聲譽(yù)很差。
我已經(jīng)使用Angular和React成功地實(shí)現了一些中小型項目,因此我對其中的任何一個(gè)都沒(méi)有真正的興趣。我覺(jué)得任何一個(gè)都能勝任。
對于這個(gè)項目,我選擇React with Redux…兩年后我會(huì )后悔的。
我們指定了一個(gè)由三名開(kāi)發(fā)人員組成的團隊來(lái)進(jìn)行概念驗證,兩個(gè)月后,它成功了。超級響應的用戶(hù)界面,超快的構建時(shí)間和高開(kāi)發(fā)速度。每個(gè)人都很開(kāi)心。
障礙1:.NET開(kāi)發(fā)人員加入團隊
經(jīng)過(guò)概念驗證后,是時(shí)候讓客戶(hù)外包團隊的開(kāi)發(fā)人員加入了。我們還沒(méi)有開(kāi)始知識共享會(huì )議,CTO給我發(fā)送了一封電子郵件,說(shuō):“嘿,拉茲萬(wàn)。我們真的必須明天與我的外包團隊見(jiàn)面。”
我們開(kāi)會(huì ),技術(shù)負責人向我提出問(wèn)題和解決方案:
“依賴(lài)注入在哪里?“不需要一個(gè)是什么意思?”這是一個(gè):InversifyJS!
“功能組件?不不不。我們不喜歡他們。讓我們使用類(lèi)組件!”
“為什么這些函數只是四處徘徊,為什么不將它們封裝在服務(wù)類(lèi)中以使其靜態(tài)化?”
“ API的重試策略在哪里?讓我們使用PollyJS實(shí)現一個(gè)。”
“當類(lèi)名是PascalCase時(shí),為什么文件名會(huì )變成破折號?它應反映類(lèi)名,因此從現在開(kāi)始,我們將其命名為SomePageComponent.tsx。”
而且,最讓我煩惱的是:“如何使用Visual Studio而不是Visual Studio Code運行它?”
對我來(lái)說(shuō)很清楚他們想在React中使用.NET準則和設計模式。我已經(jīng)多次看到這種情況發(fā)生-開(kāi)發(fā)人員很難適應新技術(shù)的工作方式。因此,我不害怕就為何這些是React的異常模式展開(kāi)辯論。
但是在這種情況下,CTO支持他的團隊,這很正常。在與團隊合作多年的時(shí)候,他認識我只有兩個(gè)月。我必須做出讓步,并同意他們的建議。
我剛剛意識到React不是Java或.NET開(kāi)發(fā)人員友好的。由于類(lèi)似的設計模式,在這種情況下,Angular會(huì )是更好的選擇。
障礙2:永遠只有React
React是一個(gè)沒(méi)有觀(guān)點(diǎn)的庫,這意味著(zhù)它對如何實(shí)現跨領(lǐng)域關(guān)注沒(méi)有意見(jiàn)。因此,您和您的團隊有責任就如何使用它,尤其是要使用的其他庫提出意見(jiàn)。當然,您將使用第三方庫,因為您不想重新發(fā)明輪子。在React中,有很多選項可供選擇。
對于概念驗證,我已經(jīng)對如何處理大多數跨領(lǐng)域問(wèn)題有意見(jiàn)?,F在,他們必須與新的團隊成員一起重新驗證。這是討論的基本主題列表:
應該使用哪個(gè)路由器?
除了Redux,異步動(dòng)作還應該使用什么?Trunk?Saga
我們應該使用Axios還是訪(fǎng)存瀏覽器API?
Redux-Forms,Formiq還是Final-Form?
樣式組件,makeStyle,SASS還是純CSS?
國際化庫?
因此,我們又花了三個(gè)星期來(lái)做出這些決定。我可以感覺(jué)到您對我尖叫:“快點(diǎn),伙計!不可能花三個(gè)星期的時(shí)間來(lái)挑選那些庫!”
好吧……歡迎來(lái)到企業(yè)項目。有很多決定。對于每一項,您都必須創(chuàng )建決策標準,進(jìn)行研究,通過(guò)創(chuàng )建概念證明來(lái)驗證發(fā)現,提出發(fā)現,在決策日志中記錄所有內容以及使庫保持最新。這花費了瘋狂的時(shí)間,而且甚至沒(méi)有樂(lè )趣。
而且,我什至沒(méi)有考慮每個(gè)開(kāi)發(fā)人員花費在學(xué)習所有這些第三方庫上的時(shí)間。我從未見(jiàn)過(guò)兩個(gè)具有相同依賴(lài)項,項目結構和準則的React項目。這意味著(zhù)知識無(wú)法在項目之間轉移,就像在A(yíng)ngular或Vue中一樣。
在實(shí)施功能用戶(hù)故事方面未取得任何進(jìn)展的三周后,CTO開(kāi)始擔心。
障礙3:React Hooks受歡迎
九個(gè)月后,我們創(chuàng )建了50多個(gè)頁(yè)面。開(kāi)發(fā)人員注意到功能組件與類(lèi)組件一樣好,并開(kāi)始使用它們。因此,現在該項目不再遵循原始的編碼準則。對于每個(gè)開(kāi)發(fā)人員來(lái)說(shuō),這更像是個(gè)人選擇。對我來(lái)說(shuō),那沒(méi)關(guān)系。
React Hooks已發(fā)布并廣受歡迎。球隊有百感交集。有人認為類(lèi)會(huì )使人和機器混淆,有些開(kāi)發(fā)者對此感到不滿(mǎn),而另一些人則熱衷于新的編碼模式。
我們正在使用的所有第三方庫都增加了對Hooks的支持,整個(gè)React世界似乎都朝著(zhù)這個(gè)方向發(fā)展。那我們該怎么辦呢?我們是否應該偏離原始的編碼準則,并添加實(shí)現組件的第三種方法?無(wú)法退回并將現有頁(yè)面和組件遷移到Hooks!
該團隊贊成使用Redux Hooks,因為不需要使用Redux connect()并將轉儲組件與容器分開(kāi)。這是有道理的,我們同意從現在開(kāi)始,新頁(yè)面和新組件將使用Hooks。我們將保留舊的。
這就是我們最終得到三種處理方式的方式。不再有一致性。
更糟的是,一些開(kāi)發(fā)人員開(kāi)始提出不再使用Redux而是使用useState的想法。這意味著(zhù)我們將破壞擁有一個(gè)單一全球狀態(tài)的想法。
懸念仍然是實(shí)驗性功能。我擔心它發(fā)布后會(huì )發(fā)生什么。
障礙4:開(kāi)發(fā)放緩
當我們進(jìn)行持續集成的設置時(shí),構建大約花了三分鐘,包括npm安裝。但是現在,一年后,大約需要15分鐘。
我們還必須配置Node.js以將RAM擴展到4GB,因為2GB不夠了。這不是大問(wèn)題。令人擔憂(yōu)的是,開(kāi)發(fā)人員已開(kāi)始抱怨構建時(shí)間太長(cháng),在45-60分鐘的開(kāi)發(fā)后熱加載就停止工作,并且重新啟動(dòng)要花5分鐘以上的時(shí)間-特別是對于那些使用Windows機器(顯然是Linux系統的用戶(hù))對于Node.js來(lái)說(shuō)要快得多)。有時(shí),他們不得不完全刪除node_modules并再次下載依賴(lài)項,因為否則它將無(wú)法正常工作。
當node_modules中有1200多個(gè)依賴(lài)項,總大小為600MB時(shí),您會(huì )期望什么?
對于企業(yè)應用程序,一切都與成本有關(guān)。假設開(kāi)發(fā)人員每天必須以每小時(shí)$ 40的速度重新啟動(dòng)六次。六次/天x五分鐘x 240天/年x $ 40 /小時(shí)x八個(gè)開(kāi)發(fā)人員= $ 38,400 /年對于企業(yè)而言,這并不是一筆大數目,但是對于項目發(fā)起人來(lái)說(shuō),這是一筆不錯的年度獎金。畢竟,它等于全新的Tesla Model 3。
障礙5:Redux-Saga快死了
大多數開(kāi)發(fā)人員不同意我的觀(guān)點(diǎn),但是我認為大部分業(yè)務(wù)邏輯都在Redux異步操作內部。在大多數情況下,它是唯一可以進(jìn)行驗證,API調用,錯誤處理,觸發(fā)redux突變或觸發(fā)通知烤面包機的地方。如果不將這些視為前端應用程序上的業(yè)務(wù)邏輯,那又是什么?
我們使用Redux-Saga,這是一個(gè)糟糕的決定,因為它增加了不必要的復雜性。Thunk足夠好了。
在企業(yè)應用程序中,您必須不時(shí)地升級并重新驗證依賴(lài)關(guān)系。這是一個(gè)好習慣,因為您希望安全更新,性能改進(jìn)和較小的增量API更改,同時(shí)希望不進(jìn)行重大更改??磥?lái)Redux-Saga已落伍。上一次更新是一年多以前的,而沒(méi)有任何人修復它們,GitHub問(wèn)題的數量仍在增加。
開(kāi)發(fā)人員喜歡React的原因有三個(gè):簡(jiǎn)單性,靈活性和生態(tài)系統。React的團隊喜歡嘗試新的想法,但這正在破壞生態(tài)系統!他們應該勇敢承擔責任!
實(shí)際上,React大多是向后兼容的,但是React周?chē)纳鷳B(tài)系統卻不是。開(kāi)發(fā)人員和第三方庫將始終使用最新的功能和體系結構模式,而舊的實(shí)驗將被淘汰。對于中小型項目,這應該不成問(wèn)題,因為您可以更輕松地進(jìn)行調整。但是對于大型的多年項目,這些實(shí)驗可能會(huì )破壞交易。
已經(jīng)是2020年9月,我決定將React-Saga納入技術(shù)指導委員會(huì )的風(fēng)險評估結果中。
因為30%的業(yè)務(wù)邏輯都在saga中,所以我將其標記為高風(fēng)險。那是當我們開(kāi)始項目時(shí),首席技術(shù)官發(fā)脾氣,并責怪我做出了錯誤的決定。
這只是產(chǎn)品經(jīng)理需要的火花。他以此為契機開(kāi)始提出如下問(wèn)題:
“為什么我們必須花很多時(shí)間來(lái)升級庫?”
“為什么發(fā)展放緩?”
“為什么應用程序變得有bug和不穩定?”
事情升級到管理層。我花了很多時(shí)間尋找證據來(lái)證明我們當時(shí)做出了最好的決定,而不是我想度過(guò)周末的方式。
幾次回顧會(huì )議之后,我們再次駛過(guò)平靜的水面。畢竟,該項目即將完成。即將進(jìn)入維護模式。
結論
我愛(ài)React。我將其用于我的所有個(gè)人項目,并希望將其推薦用于新的工作計劃。但是,在經(jīng)歷了令人不愉快的經(jīng)歷之后,我將不鼓勵將其用于企業(yè)應用程序。再沒(méi)有。
順便說(shuō)一下,我并不孤單。
原文鏈接:
https://medium.com/better-programming/i-almost-got-fired-for-choosing-react-in-our-enterprise-app-846ea840841c