我剛開始做Web開發的時候,根本沒有前端,後端之說。
原因很簡單,那個時候服務器端的代碼就是一切:接受浏覽器的請求,實現業務邏輯,訪問數據庫,用JSP生成HTML,然後發送給浏覽器。
即使後來Javascript在浏覽器中添加了一些AJAX的效果,那也是錦上添花,絕對不敢造次。因爲頁面的HTML主要還是用所謂“套模板”的方式生成:美工生成HTML模板,程序員用JSP,Veloctiy,FreeMaker等技術把動態的內容添加上去,僅此而已。
那個時候最流行的圖是這個樣子:
在最初的J2EE體系中,這個表示層可不僅僅是浏覽器中運行的頁面,還包括Java寫的桌面端,只是Java在桌面端太不爭氣, 沒有發展起來。
每個程序員都是所謂“全棧”工程師,不僅要搞定HTML, JavaScript, CSS,還要實現業務邏輯,編寫訪問數據庫的代碼。等到部署的時候,就把所有的代碼打成一個WAR包,往Tomcat指定的目錄一扔,測試一下沒問題,收工回家!
不差錢的公司會把程序部署到Weblogic,Websphere這樣的應用服務器中,還會用上高大上的EJB。
雖然看起來生活“簡單”又“惬意”,但實際上也需要實現那些多變的、不講邏輯的業務需求,苦逼的本質並沒有改變。
1、前後端的分離
隨著大家對浏覽器頁面的視覺和交互要求越來越高,“套模板”的方式漸漸無法滿足要求,這個所謂的表示層慢慢地遷移到浏覽器當中去了,一大批像Angular, ReactJS之類的框架崛起,前後端分離了!
後端的工程師只負責提供接口和數據,專注于業務邏輯的實現,前端取到數據後在浏覽器中展示,各司其職。
像Java這樣的語言很適合去實現複雜的業務邏輯,尤其是一些MIS系統,行業軟件如稅務、電力、煙草、金融,通信等等。 所以剝離表示層,只做後端挺合適的。
但是如果僅僅是實現業務邏輯,那後端也不會需要這麽多技術了,搞定SSH/SSM就行了。
2、後端技術
互聯網,尤其是移動互聯網開始興起以後,海量的用戶呼嘯而來,一個單機部署的小小War包肯定是撐不住了,必須得做分布式。
原來的單個Tomcat得變成Tomcat的集群,前邊弄個Web服務器做請求的負載均衡,不僅如此,還得考慮狀態問題,session的一致性。
(注:參見文章《小白科普:分布式和集群》)
業務越來越複雜,我們不得不把某些業務放到一個機器(或集群)上,把另外一部分業務放到另外一個機器(或集群)上,雖然系統的計算能力,處理能力大大增強,但是這些系統之間的通信就變成了頭疼的問題,消息隊列(MQ),RPC框架(如Dubbo)應運而生,爲了提高通信效率,各種序列化的工具(如Protobuf)也爭先空後地問世。
單個數據庫也撐不住了,那就做數據庫的讀寫分離,如果還不行,就做分庫和分表,把原有的數據庫垂直地切一切,或者水平地切一切, 但不管怎麽切,都會讓應用程序的訪問非常麻煩,因爲數據要跨庫做Join/排序,還需要事務,爲了解決這個問題,又有各種各樣“數據訪問中間件”的工具和産品誕生。
爲了最大程度地提高性能,緩存肯定少不了,可以在本機做緩存(如Ehcache),也可以做分布式緩存(如Redis),如何搞數據分片,數據遷移,失效轉移,這又是一個超級大的主題了。
互聯網用戶喜歡上傳圖片和文件,還得搞一個分布式的文件系統(如FastDFS),要求高可用,高可靠。
數據量大了,搜索的需求就自然而然地浮出水面,你得弄一個支持全文索引的搜索引擎(如Elasticsearch ,Solr)出來。
林子大了,什麽鳥都有,必須得考慮安全,數據的加密/解密,簽名、證書,防止SQL注入,XSS/CSRF等各種攻擊。
3、“大後端”
前面提到了這麽多的系統,還都是分布式的,每次上線,運維的同學說:把這麽多系統協調好,把老子都累死了。
得把持續集成做好,能自動化地部署,自動化測試(其實前端也是如此),後來出現了一個革命化的技術docker, 能夠讓開發、測試、生成環境保持一致,系統原來只是在環境(如Ngnix, JVM,Tomcat,MySQL等)上部署代碼,現在把代碼和環境一並打包, 運維的工作一下子就簡化了。
公司自己購買服務器比較貴,維護也很麻煩,又難于彈性地增長,那就搞點虛擬的服務器吧,硬盤、內存都可以動態擴展(反正是虛擬的), 訪問量大的時候多用點,沒啥訪問量了就釋放一點,按需分配,很方便,這就是雲計算的一個場景。
隨著時間的推移,各個公司和系統收集的數據越來越多,都堆成一座大山了,難道就放在那裏白白地浪費硬盤空間嗎?
有人就驚奇地發現,咦,我們利用這些數據搞點事情啊, 比如把數據好好分析一下,預測一下這個用戶的購買/閱讀/浏覽習慣,給他推薦一點東西嘛。
可是這麽多數據,用傳統的方式計算好幾天甚至好幾個月才能出個結果,到時候黃花菜都涼了,所以也得利用分布式的技術,想辦法把計算分到各個計算機去,然後再把計算結果收回來, 時勢造英雄,Hadoop及其生態系統就應運而生了。
之前聽說過一個大前端的概念,把移動端和網頁端都歸結爲“前端”,我這裏造個詞“大後端”,把那些用戶直接接觸不到的、發生在服務器端的都歸結進來。
4、怎麽學好後端?
現在無論是前端還是後端,技術領域多如牛毛,都嚴重地細分了,所以我認爲真正的全棧工程師根本不存在,因爲一個人精力有限,不可能搞定這麽多技術領域,太難了。
培訓機構所說的“全棧”,我認爲就是前後端還在拉拉扯扯,藕斷絲連,沒有徹底分離的時候的“全棧”工程師。
那麽問題來了, 後端這麽多東西,我該怎麽學?
之前寫過一篇文章叫做《上天還是入地》,說了學習的廣度和深度,在這裏也是相通的。
往深度挖掘,可以成爲某個技術領域的專家,如搜索方面的專家、安全方面的專家,分布式文件的專家等等,不管是哪個領域,重點都不是學會使用某個工具和框架, 而是保證你可以自己的知識和技術去搞定這個領域的頂尖問題。
往廣度發展,各個技術領域都要了解,對于某種需求,能夠選取合適的軟件和技術架構來實現它,把需求轉化成合適的技術組件,讓這些組件以合適的方式連接、部署、運行,這也需要持續地學習和不斷的經驗積累。
最後,以一張漫畫來結束吧!
想要在程序員生涯內有更高的成就的話,C/C++就是一個既可以強化思維能力,又可以打好編程基礎的編程語言,你想要做軟件開發,成爲核心程序員的話,學習C/C++的話筆者有一個C/C++的編程千人羣(Q艘索:C語言編程學習聚集地(無言建立))你如果感覺自學C/C++語言有困難的話,有興趣學習或者了解一下C/C++編程的小夥伴就可以進來交流。
C/C++高級工程師學習路線圖: