軟體開發經歷幾十年的發展到今天,開發者的關注點其實只有兩個:系統架構和軟體架構。下圖中列出的內容有的屬於系統架構層面,比如異地容災、網路專線、網路防護等等;有些屬於軟體架構層面,比如資料庫、高併發、檔案儲存等等。
不論是系統架構還是軟體架構,目的都是保證業務邏輯的正確性和高效性。換句話說,都是圍繞業務邏輯展開。
以這兩個關注點為基礎,逐漸演化出了現今普遍的技術研發團隊的職能分配結構。比如以系統架構為基礎演化出運維工程師,又可細分為面向軟體的運維和面向硬體的運維;以軟體架構為基礎演化出資料庫工程師、服務端工程師以及前端工程師。
各職能有不同的分工,要求從業者具備其所屬職能的專有領域知識,進而造成各職能之間存在明顯的隔離邊界。而邊界的存在必然會對多職能的協作和交流產生不良影響。
極限程式設計是kent beck在2023年提出的一種軟體工程方法,後又演化出三種耳熟能詳的具體落地方案:封閉開發、敏捷開發和結對程式設計。前兩者跟本文的話題關聯不大,所以略過。下圖展示的便是經典的前後端結對開發的場景:
雖然結對程式設計縮短了空間距離令溝通更便捷,但是空間並非是影響溝通的唯一甚至主要因素。由於前後端之間存在明顯的職能邊界,所以現實中的結對程式設計絕大多數達不到理想中的結果。而空間距離的縮短不僅沒有促成高效溝通,反而弄巧成拙為兩人的吵架提供了便利。
而這個問題在雲開發模式下被極大地弱化甚至完全消除。為何會如此,我們先從雲計算的歷史講起。
從物理機到雲主機再到paas,雲計算一步步降低了開發者對於系統架構的關注,減少運維投入和經濟成本。serverless則更進一步,弱化開發者對軟體架構的感知和關注。
那麼faas+baas的serverless模型還缺什麼?雲開發如何彌補serverless的不足?
從以上對比中可以提取出雲儲存相對於傳統cdn的兩個提公升點:一是更安全便捷的許可權控制;二是更語義化的程式語言api。
這也是雲開發在serverless基礎上解決對端「最後一公里」問題的兩個核心出發點。
關於雲開發對於serverless的加強請參閱延伸閱讀《雲開發如何解決serverless對端的最後一公里問題》。自bff誕生以來一直存在著「bff層誰來做」的爭議。bff層本質上是server,要求開發者有服務端開發的領域知識和能力。所以交給傳統的前端工程師來做必然會有一定的學習成本以及服務穩定性方面的隱患,即使直接招聘有此能力的前端也會消耗相對傳統前端更多的僱傭成本。
那麼bff交給後端開發者不就行了嗎?如此,那跟傳統的研發職能分配有何不同呢?前端仍然寫互動、後端仍然寫邏輯,協作流程上沒有任何改動,意義何在?效率何在?
如此難以抉擇的根本是因為前端工程師不會寫業務邏輯?還是因為前端不熟悉服務端的程式語言?
當然不是。
程式語言是各職能之間最表層也是最容易跨過得一道門檻,業務邏輯則更不是問題。傳統前端之所以寫不好server,本質上是因為缺乏服務端開發的專有領域知識,而這些領域知識是跟程式語言和業務邏輯無關。
所以,雲開發模式下由雲函式承載業務邏輯充當bff層的代替者,對於開發者的唯二要求便是熟悉程式語言和編寫業務邏輯的能力,而與兩者無關的其他領域知識一概消除。
則必然,前後端分離的邊界下沉到bff之下,進而傳統的前後端職能分配結構被重新洗牌。
而洗牌之後的工程模型也更新換代。
研發職能的單一化必然帶動迭代效率的提公升,從另一方面,前後端由單一職能負責也提供了玩更多花樣的環境,比如同構程式設計。
雖然目前普遍認為serverless=faas+baas,但serverless是一種理念,一種指導思想,並不會侷限於固定的模型。雲開發在serverless理念的基礎之上,以端sdk+接入層的模式彌補了serverless對端能力的不足。在此基礎之上,傳統的研發職能結構被進一步洗牌。
延伸閱讀:
敏捷開發模式下的BA崗
傳統的瀑布開發模式下需求分析崗是必不可少的。那麼敏捷專案沒有需求分析嗎?在很多人的印象中,敏捷軟體開發是種類似黑客行為的過程,是程式設計師最愛的勾當。不寫文件,不作需求分析,沒有專案經理,做什麼東西完全是程式設計師自己的行為。他們認為這樣的過程無法滿足真正大型專案和複雜專案的需要,因此在經過考慮後,...
敏捷開發模式下的質量管理
出處 前幾天,筆者與一位在大型網際網路公司從事質量保證的朋友交談,作為網際網路產品質量和測試的負責人,他最近負責的質量管理方面遇到了很多困難。主要有 1 測試團隊在敏捷開發模式下的價值非常有限 2 開發人員只顧自已寫 沒有任何文件,測試人員無從下手,3 由於進度的原因,測試人員測試的時間非常有限,上...
開發模式與產品模式下的PHP報錯處理
程式報錯總是在所難免,儘管我們書寫 時已經格外小心。在開發php程式時,我們希望遇到php報錯,可以第一時間展示給我們,以便於除錯。當程式開發完成,成為正式產品時,我們希望將沒有 到的報錯資訊記錄到錯誤日誌中,而不是將這些報錯資訊展示給使用者,因為使用者極有可能利用這些暴露出指令碼路徑 資料庫資訊或...