索 晉,王智棟
(山西應用科技學院 山西 太原 030000)
當前,前后端分離系統在互聯網項目開發當中應用較為普遍,前端開發主要是指網站頁面的開發,與用戶的交互較為直接。而后端的開發則是一個繁瑣復雜的過程,需要結合數據存儲、業務邏輯、服務器配置等多項元素。不過,無論是前端還是后端,都需要結合計算機編程算法上升全新的臺階[1]。實際上計算機編程算法簡單理解就是利用計算機解決問題的一種方法,執行的過程是一個將抽象問題轉化為數理性問題的過程。生活中解決問題可以通過多種途徑,計算機編程也可以有多種算法。
前后端分離主要的目標是擺脫前后端架構之間的相互依賴,通過對其進行單獨的項目部署實現系統的優化。后端追求的是高并發、高可用、高性能以及存儲業務等的安全,而前端追求的則是頁面表現、設計美感、速度流暢、兼容性等等。其實,前后端分離是一種Web 應用的架構模式,分離后的前端部分是用戶可見的界面,與用戶之間的聯系最為直接,可以是一個網站網頁,也可以是手機的APP。前端展現的內容比較直觀,例如特效、圖片、視頻、音頻等豐富的內容,這時的前端不再是簡單的HTML 文件,而是一個功能齊全的網絡應用小程序[2-3]。前端開發主要內容就是根據方案設計運行顯示界面并為后端開發提供依據,實現數據的顯示和交互功能。整個前端開發是視覺內容的呈現,通過瀏覽器對HTML、CSS、Java 文件進行解析處理以及渲染等流程的運用呈現出來,見圖1。
后端部分主要是指程序的支持,實際上是前端開發的強大后盾。盡管后端是用戶表面上看不到的東西,但所涵蓋的內容異常豐富。整個后端開發比較復雜,既要實現服務器、應用、數據庫的彼此交互,又要通過這些工具的運用編寫代碼來創建或更新Web 應用。整個后端編輯考慮的不僅是業務邏輯、服務器的配置,更有數據的存儲以及跨平臺API 的設計等因素。這些內容并不能被用戶看到,但卻影響著整個平臺以及網站的穩定性以及基礎性能的體現[4]。
實際上,前后端系統分離并不是簡單的代碼分離,其根本在于通過分工合作來實現協同合作效率的提升。例如,在進行網站訪問的時候通常會有一些注冊或登錄的信息,這時候前端就是整個頁面的展現,需要輸入賬號以及密碼并點擊登錄按鈕,從而實現下一個網頁的跳轉。在這樣的過程中后端系統是一直在運行的,因為隨著賬號密碼的輸入,請求接口會將相關信息發送給后端做進一步處理,后端通過信息數據的搜集、查詢來確認賬號信息,并及時地將獲得的信息反饋給前端,反應結果即登錄成功或者登錄失敗。
對于開發團隊來講,前后端的分離開發有助于深度發揮自己擅長的領域優勢,對于技術特性的提升以及代碼編寫質量的提高有著積極的意義,而且并行開發在效率提升方面的表現也是非常明顯的,有助于快速搶占市場,奪得先機[5]。
在計算機程序的運行過程中bug 的出現不可避免,而在前后端分離的基礎上,能夠快速地實現bug 定位,厘清前后端的開發責任,因此并不會出現責任推脫的情況,在發現bug 以后,相應的工程師也會進行迅速處理降低損失。例如頁面布局的邏輯錯誤以及跳轉失誤或者頁面與瀏覽器不兼容等問題,都是前端的責任;而數據接口出錯、請求應答超時等問題都應由后端來負責。這樣的過程雙方互不干擾,且能夠保障每個項目都部署在單獨的服務器上,從實質上降低服務器內部的運行壓力,在頁面響應以及交互體驗上都會有很大提升。
耦合關系的存在會使整個系統的性能變差,且難以控制。但前后端實現分離以后代碼的完全解耦基本實現,因此整個開發過程中的模塊化更為明顯,前端代碼以組件的方式被復用,后端代碼的邏輯也會變得更加清晰。基于此,為項目的維護利用提供了更好的環境,而這些模塊的存在也為深度的開發提供了明確參考。即便后端服務有超時或者暫時的宕機,除了數據刷新失敗,并不會影響前端頁面的訪問[6]。
整個前后端分離的過程主要包含設計階段、開發階段、測試階段以及部署階段,其中設計階段的溝通是前提也是基礎,該過程由前后端架構負責人溝通分析,將項目整體進行拆分,并對整體的API 風格、開發協助模式進行討論確定,接下來明確分工共同制定開發接口,整個溝通設計階段是開發的鋪墊,高效的溝通之上才能夠避免后期聯調的麻煩;整個開發階段前后端工作人員各司其職,后端提供Restful API,前端發送API 請(GET、PUT、POST、DELETE 等)獲取數據(json,xml)渲染頁面;測試階段前端人員會通過mock server 完成模擬測試,這也是保證協同聯調的關鍵,此時的后端人員采用junit 進行API 單元測試,在API 完成之后,前端人員輔助對接;項目部署是整個開發的最后階段,該階段利用nginx 做反向代理,采用Java+nodejs+nginx 方式進行完成整個項目開發。
前后端分離的技術要點在于交互形式、代碼組織方式、開發模式以及數據接口規范流程,4 個要點之間環環相扣,深度體現了計算機編程算法特色。以交互形式來講,前后端分離的構架更傾向于目標的明確,后端主要的職責在于提供可調用的API 服務。HTTP 就是前端與后端的交互形式,只有前端完成了數據收集,后端方可開展下一步的工作進行頁面的組裝與渲染。在代碼的組織方法上,主要有全分離和半分離兩種模式,半分離的模式是指前后兩端共享一個代碼庫,使得前端無法完成獨立的研究與實驗。分離模式的前端代碼可以由自己獨立開發和測試,分離模式的前后端代碼項目可以單獨開發和測試,前端工程師的代碼項目有HTML、JS、CSS 和前端資源,在使用HTTP 發出請求之后再調用后端資源,做到了并行開發,是對傳統開發過程最大的簡化[6-7]。最后,數據接口規范流程尤為重要,它決定了前后端的調用效率和連接跳轉的靈活度,因此前后端必須共同商定好數據接口的交互形式和數據格式,接下來再通過并行開發進行mock 測試,通過功能聯調并校驗格式。
前后端聯調是前后端分離系統融合使用的關鍵,但整個聯調過程中會面對接口字段變更頻繁、接口時間不穩定、接口文檔不同步等痛點,實際上保證前后端聯調的關鍵在于標準化協同流程的操作,其中最重要的還是明確職責分配,加強開發過程的溝通與交流,保證協同合作。整個過程中,數據接口規范流程也是尤為重要的,它決定了前后端的調用效率和連接跳轉的靈活度,因此前后端必須共同商定好數據接口的交互形式和數據格式。該操作過程中最基本的一點就是對頁面以及服務器所提供的數據接口、方式以及格式等進行確定,建立協作調試環境,保證聯調之前端mock 的完成以及后端程序自測完成。接下來收集接口文檔自動化,通過chrome 插件去訂閱差異接口完成錯誤接口的收集,保證接口文檔的規范性,接口規范的過程中可以采用新增(post)、修改(put)、刪除(delete)、獲取(get)等方式,同時完成參數的請求和返回,利用swagger 或者是apipost 工具完成接口文檔。另外,在整個聯調過程中聯調時間的確定也是非常關鍵的,有著以下的公式可以參考:聯調時間=迭代提測時間-第一次增量接口調通時間。
數學算法是計算機編程的基礎,通過一定數學原則和步驟的編制有效減少計算機工作的負擔和工作量。通過某種程序設計語言進行程序代碼編寫,用數學算法將系統運行中出現的問題轉化為合理的數據結構,完成復雜的問題簡單化處理,實際上就是對解題方案進行優化,通過準確完整的描述來實現清晰的指令,整個過程涵蓋范圍包括復雜度、正確性以及健壯性等。其作用對象為程序時空復雜度以生成代碼短的算法為優,通過模型優化的建立對目標函數完成優化,最終達成計算機編程優化的目的。
前后分離系統中前端項目開發涉及的技術有HTML、CSS、JavaScript、jQuery、Ajax 等,可以使用Vue.js、React、Angular.js 等主流前端框架簡化開發流程。IDE可以使用WebStorm 來提高開發效率。后端可以使用SSM后端開發框架,IDE 可以使用IDEA 簡化開發流程,根據項目的設計進行編程算法優化[8]。常用的計算機編程算法優化包含隨機搜索法、梯度下降法、牛頓法以及遺傳算法等。這些算法各有各的優勢,可以應用在不同的前后端分離技術當中。
4.2.1 隨機搜索法
隨機搜索中就會使用隨機數來實現優解的方法,主要是指通過隨機點地分布計算約束函數和目標函數,拋棄壞的點保留好的點來實現質量的提升得到最優解近似解[9]。該種算法以概率論為基礎,計算過程中選取的隨機點越多,得到的優解越大,大多數計算機程序庫中都裝置有隨機數發生器,所以在進行程序編寫時應用隨機搜索法是比較方便的。
4.2.2 梯度下降法
梯度下降法通過對當前位置負梯度方向的搜索完成思想優化,是一種最優化算法,其計算過程求解無約束,搜索方向為負梯度,是一種比較傳統的方法。整個梯度下降法的求解過程當中,需要多次迭代才能夠完成,而梯度下降法又分為隨機梯度下降法和批量梯度下降法,批量梯度下降法能夠將所有訓練樣本的損失函數最小化,因此,求解的全局都是最優解求解的風險函數最小,但有著對大規模樣本來講效率低下的缺陷。而隨機梯度下降法能夠保證每條樣本是函數最小化,盡管該過程當中不能夠保證每次迭代的損失函數都能夠實現最優方向的確定,但整體方向是面向全局最優解的,這種方法適用于大規模的訓練樣本。盡管現在梯度下降法已不具備實用價值,不過很多的有效計算方法都是以其為基礎加以完善與修正而獲得的。
C 語言作為一種高級語言,在計算機編程語言中得以廣泛應用,在其編譯的過程當中,需要執行嚴格的邏輯代碼操作。因此,合理利用數學算法能夠實現編程代碼的簡化提升程序面向過程的整體效率。以S=1×2×3×…× n(1 000 <n <10 000)為例,對S 末尾0 的個數求解為例,該過程當中可以假設 S=a×10b,但a 作為一個正數卻并不可以被10 整除,該問題當中最終的結果就是求取b 值。
實際上,整個計算過程當中可以通過不同的數學算法來進行計算。例如,通過對S 進行計算,尾數出現0 時將其去掉,對0去掉的個數進行記錄,以此為依據進行C語言,程序的編寫。但該過程當中每計算一次都需要做一次判斷,且并不是每個數據都會生成0,該過程中對2 和5 的倍數把握十分關鍵,不過整體來看程序運行次數較多,且運行過程繁瑣,所以該種方法并非最優,只有減少運行次數才能提高效率。
為此對該種數學算法進行深入分析概括的過程當中可以發現5 的倍數能夠生成0,因此整個計算過程當中只需要找到n 的分解數中一共包含有多少個5 就能夠得到結果。不過盡管該種算法相比較原始算法而言有效地減少了運行次數,但所有數值當中包含2 或5 的倍數仍舊擁有龐大的數字量,此時可以進行進一步的優化分析,發現0 的個數和5 的個數密切相關,二者有數量相同的特征,因此可以將原始數據當中的5、10、15、20…以5為單位步長進行循環計算逐步實現轉化為1、2、3、4…通過循環分別以5^2 以及5^3 為步長進行循環計算,直至循環到m 次以后出現步≥n 時停止運行,得出5 的各次方之和為運算結果。
通過合理的數學算法能夠完成對C 語言編程以及面向對象程序的優化,而C++作為面向對象程序避免了C 語言的缺陷,通過合理的算法進行建模可以達到高效穩定程序編寫的目的。
當前,前后端分離系統憑借效率高、性能高、質量高的特點被廣泛應用于網站開發設計中,而實際上前后端分離的過程是一種編程算法的均衡和優化,對于整個程序編寫質量與速率的提升有著積極的指導作用。