一文看懂Web后端開發(fā)
前言
由于網(wǎng)絡(luò)上系統(tǒng)地介紹后端開發(fā)的文章實(shí)在太少,而最近有恰巧有許多同學(xué)問我“什么是后端開發(fā)?”、“你為什么喜歡后端開發(fā)?”、“做后端都需要學(xué)什么?”,那么我們就來講一講,到底什么才是后端開發(fā)。
定義
后端開發(fā)(Back-End Development,也稱服務(wù)端開發(fā)、服務(wù)器端開發(fā)等)是創(chuàng)建完整可運(yùn)行的Web應(yīng)用服務(wù)端程序(服務(wù)端程序和資源合稱為后端,即在服務(wù)器上運(yùn)行的、不涉及用戶界面的部分)的過程,是Web應(yīng)用程序開發(fā)的一部分。后端開發(fā)者使用Java、Golang等語言及其衍生的各種框架、庫和解決方案來實(shí)現(xiàn)Web應(yīng)用程序的核心業(yè)務(wù)邏輯,并向外提供特定的API,使得Web應(yīng)用能夠高效、安全、穩(wěn)定地運(yùn)行。
說人話!
好吧,如果你看了定義仍然很懵,那我就用一些非常易于理解的表達(dá)形式來說一說“什么是后端開發(fā)”。雖然這些表述可能并不嚴(yán)謹(jǐn)或完全正確,但是我相信這樣一定能使你明白什么是后端開發(fā)。
這里我們拿前端來類比一下,因?yàn)槲蚁嘈沤^大多數(shù)看到這篇文章的人都已經(jīng)對(duì)“什么是前端開發(fā)”、“什么是前端”有一定了解了:
- 前端就相當(dāng)于我們的肉體,后端就相當(dāng)于我們的靈魂和思想;
- 前端是如何操作游戲,后端是具體的游戲規(guī)則;
- 前端是用戶能看到的,后端是用戶看不到的;
- 前端是跑在瀏覽器上的,后端是跑在服務(wù)器上的;
- 前端采集用戶的輸入,后端處理用戶的輸入;
- 前端開發(fā)是寫代碼給用戶看,后端開發(fā)是寫代碼給服務(wù)器看。
是不是這樣一講就明白了?那我們接著往下看。
具體職責(zé)
- 實(shí)現(xiàn)Web應(yīng)用程序的實(shí)際業(yè)務(wù)邏輯。即:實(shí)現(xiàn)Web應(yīng)用程序的具體功能(如注冊、發(fā)表和查詢信息等)或Web應(yīng)用程序在服務(wù)端執(zhí)行的具體操作。這是后端開發(fā)這項(xiàng)工作的主要內(nèi)容;
- 使用API和創(chuàng)建API。后端需要向前端提供前端所需的數(shù)據(jù),也需要使用第三方API來完成業(yè)務(wù)邏輯(如完成某個(gè)功能需要通過API調(diào)用其他應(yīng)用、在使用框架進(jìn)行開發(fā)時(shí)需要使用語言和框架的API、操作數(shù)據(jù)庫時(shí)需要使用數(shù)據(jù)庫或ORM框架的API等)。因?yàn)樵诤蠖碎_發(fā)的過程中經(jīng)常需要與API打交道,所以有人也把后端開發(fā)稱為“API開發(fā)”,就像有些人將前端稱為“GUI開發(fā)”一樣;
- 優(yōu)化。在用戶量達(dá)到一定程度后,就會(huì)出現(xiàn)諸如響應(yīng)慢等各種問題(不理解的話想想你們大學(xué)的選課系統(tǒng));同時(shí),隨著代碼行數(shù)的增多,許多架構(gòu)上的缺陷可能也會(huì)隨之暴露出來,如代碼邏輯混亂、模塊劃分不正確等。此時(shí)就需要后端開發(fā)人員對(duì)Web應(yīng)用程序進(jìn)行優(yōu)化,如重構(gòu)、分布式部署、優(yōu)化業(yè)務(wù)邏輯、單體應(yīng)用拆分成微服務(wù)等;
- 架構(gòu)設(shè)計(jì)。雖然一般只有高級(jí)的后端開發(fā)人員和架構(gòu)師才需要關(guān)注架構(gòu)問題,但是架構(gòu)設(shè)計(jì)是后端開發(fā)中非常重要的一環(huán),因?yàn)樗鼪Q定了如何組織代碼、某個(gè)模塊負(fù)責(zé)解決什么樣的問題、系統(tǒng)的擴(kuò)展性和可維護(hù)性如何、業(yè)務(wù)邏輯如何進(jìn)行組織等,也會(huì)一定程度上影響到業(yè)務(wù)邏輯的具體實(shí)現(xiàn)(比如微服務(wù)和單體架構(gòu)這兩種架構(gòu)下,同一種業(yè)務(wù)邏輯的實(shí)現(xiàn)可能完全不同)。
特征
- 后端是工作在服務(wù)器上的,負(fù)責(zé)通過API向前端或其他系統(tǒng)提供其所需的信息(如數(shù)據(jù)等);
- 后端開發(fā)實(shí)際上是開發(fā)Web應(yīng)用中對(duì)用戶不可見的部分(如核心業(yè)務(wù)邏輯、數(shù)據(jù)庫等),大多數(shù)的后端開發(fā)都是不涉及用戶界面的(除了在前后端不分離的架構(gòu)中將前端的靜態(tài)頁面通過模板引擎改造成動(dòng)態(tài)頁面時(shí));
- 通常情況下,一個(gè)Web應(yīng)用的絕大多數(shù)代碼都屬于后端代碼,因?yàn)楹蠖顺袚?dān)了Web應(yīng)用實(shí)際的業(yè)務(wù)邏輯;
- 后端開發(fā)的壓力通常比前端開發(fā)要大,因?yàn)楹蠖耸荳eb應(yīng)用的“靈魂”,它影響著Web應(yīng)用的方方面面,除了業(yè)務(wù)邏輯之外還需要考慮安全性、穩(wěn)定性、可維護(hù)性、可擴(kuò)展性、伸縮性等問題。
技術(shù)
-
程序設(shè)計(jì)語言。許多語言都可以用于后端開發(fā),比較流行的是
Java和Go。例如我所使用的就是Go語言,也曾經(jīng)使用過Java。此外,由于后端開發(fā)中經(jīng)常需要和數(shù)據(jù)庫打交道,所以作為后端開發(fā)者,還需要懂SQL語言(如果使用了NoSQL的話,也需要懂NoSQL數(shù)據(jù)庫的語言); -
數(shù)據(jù)庫。數(shù)據(jù)庫作為一種簡單易用的持久化機(jī)制,可以讓用戶的信息不因?yàn)閿嚯姷裙收隙鴣G失,Web應(yīng)用開發(fā)中經(jīng)常需要用到數(shù)據(jù)庫,甚至許多簡單的Web應(yīng)用本質(zhì)上都只是“數(shù)據(jù)庫的可視化系統(tǒng)”,也因?yàn)榻^大多數(shù)簡單的業(yè)務(wù)邏輯本質(zhì)上都只是對(duì)數(shù)據(jù)庫的增刪改查(即
CRUD); -
框架、庫和解決方案。想要高效率地開發(fā)Web應(yīng)用,框架、庫和解決方案是必不可少的,比如MVC框架、ORM框架、RPC框架、微服務(wù)開發(fā)框架、云基礎(chǔ)設(shè)施(如Service Mesh、容器編排工具等)、運(yùn)行時(shí)環(huán)境/容器(如Docker)、消息隊(duì)列(Message Queue,MQ)、日志收集和分析工具等;這部分有一些框架是可以跨語言通用的,比如
gRPC(RPC框架)、Istio(Service Mesh),也有一些是某種語言專用的,如Spring Cloud(微服務(wù)開發(fā)工具,JVM技術(shù)棧專用)、Gin(MVC框架,Go語言專用); - 架構(gòu)和指導(dǎo)思想。架構(gòu)是后端開發(fā)中非常重要的一部分,作為一名后端開發(fā)者需要了解常見的架構(gòu),如三層架構(gòu)、SOA、微服務(wù)架構(gòu)、六邊形架構(gòu)等,還需要了解常用于后端開發(fā)中的指導(dǎo)思想,如設(shè)計(jì)模式、MVC模式、DDD、CQRS/ES等;
-
包管理工具/項(xiàng)目管理工具。因?yàn)楹蠖碎_發(fā)中經(jīng)常要用到各種框架和庫,所以用于管理這些框架和庫的管理工具是非常重要的。每一門語言都有自己的包管理工具,如Java的
Maven,Go語言的go mod等; - 基礎(chǔ)知識(shí)。不管是前端開發(fā)還是后端開發(fā),都需要對(duì)操作系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò)、數(shù)據(jù)結(jié)構(gòu)等基礎(chǔ)知識(shí)有一定了解,還需要了解對(duì)應(yīng)語言的編碼規(guī)范、重構(gòu)等知識(shí),這可以幫助你理解框架和庫,也能幫助你寫出更高質(zhì)量的代碼;
- 開發(fā)方法。實(shí)際上這個(gè)也可以說是屬于指導(dǎo)思想的一部分,包括CI/CD、敏捷開發(fā)、DevOps等;
-
版本管理工具。相信我,幾乎沒有人能離開這玩意。最常用的是
Git。
誤解
有不少人其實(shí)對(duì)后端開發(fā)誤解很深,以下是一些常見的誤解:
- 后端開發(fā)就是CRUD/后端開發(fā)太簡單了;
- 不同系統(tǒng)的后端面臨的問題高度相似;
- 后端開發(fā)很枯燥;
- 后端的邏輯比前端復(fù)雜;
- 對(duì)于后端開發(fā)者來說,設(shè)計(jì)業(yè)務(wù)邏輯是一件很簡單的事情;
- 后端開發(fā)的工作太單一了/后端不是一個(gè)綜合的領(lǐng)域;
這些誤解有時(shí)候會(huì)勸退一些有意從事后端開發(fā)的同學(xué),我們現(xiàn)在就來澄清一下這些誤解:
- 我不否認(rèn)很多簡單的Web應(yīng)用確實(shí)就是CRUD,但是絕大多數(shù)的Web應(yīng)用都不僅僅是CRUD。至于“太簡單了”,能說出這話的人一定沒做過后端,或者只做過CRUD,或者是超級(jí)大牛。如果不是超級(jí)大牛的話,請說這話的人寫一個(gè)能撐住五萬并發(fā)的秒殺系統(tǒng)出來,并做壓力測試,然后再看看這句話;另外,后端開發(fā)是一個(gè)非常綜合的領(lǐng)域,既有非常抽象的架構(gòu)和指導(dǎo)思想,又有具體的解決方案和業(yè)務(wù)邏輯,還涉及到許多計(jì)算機(jī)底層問題(如多線程、網(wǎng)絡(luò)、I/O等)。并且,雖然后端技術(shù)穩(wěn)定,但也不至于學(xué)了點(diǎn)東西就可以到哪里都通吃,例如,如果你沒聽說過云原生、微服務(wù)、Serverless等新技術(shù)的話,那說明你已經(jīng)很久沒有跟上后端技術(shù)的發(fā)展了;以及,如果你現(xiàn)在還在用JSP,那我敢肯定你一定沒有意識(shí)到諸如前后端分離之類的新問題;
- 這個(gè)說法也完全不對(duì)。不同的系統(tǒng)所面臨的具體問題是完全不同的。先不說對(duì)一個(gè)具體的需求可能有很多種不同的解決方案(如針對(duì)單點(diǎn)登錄(Single Sign On,SSO)問題就有長連接(雖然我沒見過落地案例)、共享Session、JWT等方案),有時(shí)候甚至當(dāng)你拿到一個(gè)需求時(shí),可能連要解決什么問題都搞不清楚,這也就是為什么諸如DDD這樣的系統(tǒng)分析方法一直備受關(guān)注,且重構(gòu)也經(jīng)常在各種規(guī)模的Web應(yīng)用中都引起重視,因?yàn)橛脩粜枨笸皇悄敲疵鞔_,可能會(huì)引導(dǎo)我們做出錯(cuò)誤的設(shè)計(jì);
- 記住,枯燥的是CRUD,而不是后端。后端開發(fā)的技術(shù)含量實(shí)際上是非常高的,也非常有意思,充滿了未知與挑戰(zhàn)。像微服務(wù)、云原生、DDD、CQRS/ES、高并發(fā)、負(fù)載均衡、緩存、消息隊(duì)列、多線程、微服務(wù)監(jiān)控、Service Mesh等技術(shù),每一項(xiàng)都值得我們?nèi)パ芯?,而這些技術(shù)中有很多都是在大型Web應(yīng)用中被頻繁使用的,如果你真正了解后端開發(fā)的話,是絕無可能說出“后端開發(fā)很枯燥”這樣的話的。請記住,并不是不涉及界面的工作就一定很枯燥;
- 在大多數(shù)的系統(tǒng)中是這樣的,但是有些Web應(yīng)用的前端邏輯復(fù)雜程度可能不亞于后端,甚至可能還會(huì)超過后端,比如像石墨文檔這樣的多人協(xié)作文檔系統(tǒng),還有ProcessOn這樣的在線繪圖系統(tǒng),其前端邏輯可能都是非常復(fù)雜的;
- 參見2。能說出這話的人一定沒重構(gòu)過一個(gè)“大泥球”一樣的應(yīng)用,也沒設(shè)計(jì)過一個(gè)用戶需求非常模糊的系統(tǒng)(比如用戶只給了一條需求:做一個(gè)CMS(內(nèi)容管理系統(tǒng)),你覺得簡單你可以來試試,然后用它一個(gè)月,如果你不是個(gè)有經(jīng)驗(yàn)的后端開發(fā)者的話,我相信你一定會(huì)被你自己所寫的這個(gè)系統(tǒng)逼瘋,恨不得將它完全重構(gòu));
- 參見1和2。如果后端開發(fā)還不綜合的話,那什么才是綜合的呢?
我不否認(rèn)做一個(gè)只會(huì)CRUD的后端開發(fā)者很簡單,但既然對(duì)后端開發(fā)感興趣,那我們就要有更高的志向,不能把自己框死在CRUD里。
這里送給各位未來的后端開發(fā)者一句話:“我等采石之人,當(dāng)心懷大教堂之愿景”。如果自己一個(gè)人完成一個(gè)簡簡單單的CRUD項(xiàng)目,你可以有自己的想法,例如在其中應(yīng)用DDD和CQRS,或不斷地優(yōu)化它以達(dá)到最佳狀態(tài);如果迫于工作經(jīng)驗(yàn)而不得不CRUD,你也可以用業(yè)余時(shí)間去提升自己的技術(shù),讓自己有更光明的未來。
什么樣的人適合做后端?
說了這么多,那什么樣的人才適合做后端開發(fā)這份工作呢?
- 討厭寫用戶界面或與用戶界面打交道的人。有很多人是因?yàn)橛憛拰懡缑妫ㄓ绕涫荂SS這種反人類的東西)才來做后端開發(fā)的。這里沒有界面,討厭與用戶界面打交道的人不妨嘗試一下后端開發(fā);
- 細(xì)心的人。后端開發(fā)實(shí)際上比前端開發(fā)更需要細(xì)心。就如前文所述,后端是Web應(yīng)用程序的“靈魂”,后端開發(fā)中的許多問題都決定著Web應(yīng)用的“生死存亡”,尤其是數(shù)據(jù)校驗(yàn)、多線程/多進(jìn)程、鎖、異步編程、事務(wù)/分布式事務(wù)、與第三方系統(tǒng)的交互等,這些問題有非常非常多的細(xì)節(jié),且既復(fù)雜又非常重要,一旦在細(xì)節(jié)上出現(xiàn)問題(如數(shù)據(jù)校驗(yàn)不完全或加鎖解鎖的邏輯出現(xiàn)錯(cuò)誤),輕則出現(xiàn)錯(cuò)誤的數(shù)據(jù)或業(yè)務(wù)邏輯不能正常運(yùn)行,重則直接導(dǎo)致整個(gè)Web應(yīng)用掛掉或出現(xiàn)安全問題(如數(shù)據(jù)校驗(yàn)不完全導(dǎo)致的文件上傳漏洞、函數(shù)使用錯(cuò)誤導(dǎo)致的遠(yuǎn)程命令執(zhí)行漏洞等)。所以如果你想從事后端開發(fā),那足夠細(xì)心絕對(duì)是一個(gè)必要的條件;
- 喜歡與機(jī)器打交道多于與人打交道的人。與前端開發(fā)是“寫代碼給人看”的不同,后端開發(fā)是“寫代碼給服務(wù)器看”(或者說給前端/第三方系統(tǒng)看)的。雖然這兩個(gè)說法都不太嚴(yán)謹(jǐn),但是后端開發(fā)更多的就是與服務(wù)器打交道(如降低資源使用率、提高Web應(yīng)用程序的運(yùn)行效率等等),而不是與人打交道(如提高頁面的美觀程度、思考用戶的使用邏輯和心理等等);
- 想編寫實(shí)際的業(yè)務(wù)邏輯的人,或喜歡算法和邏輯的人。前端的邏輯更多的是交互邏輯,如點(diǎn)擊某個(gè)按鈕應(yīng)該彈出什么窗口、怎么把數(shù)據(jù)渲染成用戶想要看到的頁面等,而后端的邏輯更多的是實(shí)際的業(yè)務(wù)邏輯,如完成某個(gè)功能需要怎樣做、請求某個(gè)API應(yīng)該返回什么樣的數(shù)據(jù)等。如果你和我一樣寫前端時(shí)因?yàn)榭偸墙佑|不到實(shí)際的業(yè)務(wù)邏輯而感到不爽,那么大后端歡迎你;
- 好奇心強(qiáng)、自學(xué)能力強(qiáng)且有終身學(xué)習(xí)的覺悟的人,或者喜歡鉆研技術(shù)的人,或喜歡充滿挑戰(zhàn)性的工作的人。后端看似簡單,實(shí)際上技術(shù)含量是非常高的。就如前面所說,現(xiàn)在的后端可不僅僅是CRUD,而是隨著互聯(lián)網(wǎng)和云計(jì)算技術(shù)的發(fā)展而不斷改變,Web應(yīng)用程序在需求不斷變化的過程中功能變得越來越強(qiáng),架構(gòu)變得越來越復(fù)雜,對(duì)性能的考驗(yàn)也越來越嚴(yán)峻,技術(shù)含量自然也就越來越高。作為一名后端開發(fā)工程師,需要有不斷學(xué)習(xí)新技術(shù)的覺悟,還需要有一定的自學(xué)能力,因?yàn)椴皇鞘裁醇夹g(shù)都有人教你的,在學(xué)習(xí)和使用最新技術(shù)時(shí)對(duì)著英文文檔啃是常有的事;
- 對(duì)系統(tǒng)架構(gòu)感興趣或想要成為架構(gòu)師的人。雖然不可否認(rèn)的是由于前端至今沒有“一統(tǒng)天下”的解決方案而使得前端開發(fā)人員經(jīng)常會(huì)比后端開發(fā)人員更早地接觸到架構(gòu)的部分,但是傳統(tǒng)意義上的前端說白了也就是瀏覽器那“一畝三分地”(前端同學(xué)別噴我,這里僅僅說的是傳統(tǒng)的Web前端,“大前端”是不算的哈),而后端技術(shù)的天花板則是“地球上人類的數(shù)量”(接觸過高并發(fā)的同學(xué)看到這句話應(yīng)該很有感觸吧,哈哈),而核心的業(yè)務(wù)邏輯往往存在于后端,后端的優(yōu)化壓力往往比前端更大,這就使得初級(jí)的后端開發(fā)者在進(jìn)行開發(fā)時(shí)需要對(duì)系統(tǒng)的架構(gòu)有一定了解、高級(jí)的后端開發(fā)者需要經(jīng)常思考系統(tǒng)的架構(gòu)設(shè)計(jì)的問題,這也使得后端開發(fā)者更容易成長為架構(gòu)師;
- 沉得住氣的人。除了有第5條中提到的“后端的技術(shù)含量實(shí)際上是非常高的”這一原因之外,還有一個(gè)原因就是后端并不是“所見即所得”的,經(jīng)常需要你編寫幾十甚至幾百行代碼、做無數(shù)復(fù)雜的配置才能把Web應(yīng)用運(yùn)行起來(注意,是運(yùn)行,寫業(yè)務(wù)邏輯的話需要更多代碼),另一個(gè)原因是后端開發(fā)的門檻比前端要高——你至少得掌握一門語言和這門語言在后端開發(fā)方面的一些框架或庫才能開始開發(fā)。所以,后端開發(fā)者必須要沉得住氣,不能因?yàn)閷憥仔写a看不到任何效果就想放棄;
-
對(duì)系統(tǒng)的基礎(chǔ)設(shè)施(如框架、庫和解決方案等)感興趣的人。據(jù)我所知,許多在云原生方面有深刻造詣的大佬都是從后端開發(fā)者成長起來的,許多框架的作者曾經(jīng)也是后端開發(fā)者。如果你碰巧像我一樣對(duì)框架、庫和解決方案(如
Spring Boot、Spring Cloud、Gin、Kubernetes、Istio等)十分感興趣,那么可以從成為一名后端開發(fā)者開始,在編寫業(yè)務(wù)代碼的過程中慢慢體會(huì)框架的重要性和所用框架的優(yōu)缺點(diǎn),以及如何設(shè)計(jì)一個(gè)好的框架。
雖然你并不需要滿足以上每一項(xiàng)才能成為一個(gè)后端開發(fā)工程師,但是如果你發(fā)現(xiàn)你滿足上面的某一條或某幾條,而且你還沒有找到自己的方向,那么不妨來嘗試一下后端開發(fā)。
我為什么喜歡后端開發(fā)
先簡單介紹以下我的經(jīng)歷吧。我從2019年1月開始接觸前端開發(fā),于2019年8月正式轉(zhuǎn)向后端開發(fā),并一直從事后端開發(fā)至今。我喜歡后端開發(fā)的原因,其實(shí)很簡單:
- 我反感寫界面,痛恨GUI編程,每次一寫界面我就想遁地。后端開發(fā)不需要考慮界面的問題,這里沒有界面,只有API;
- 我喜歡寫實(shí)在的業(yè)務(wù)邏輯,不想總是隔著個(gè)API而“任人擺布”,解決實(shí)際問題對(duì)我來說簡直棒極了;
- 我喜歡與機(jī)器打交道,可以寫一天的代碼而不感到無聊,但我不喜歡與人打交道,尤其是面對(duì)面交談非技術(shù)問題時(shí)總會(huì)感到不自然(當(dāng)然,聊技術(shù)我能聊一天都不嫌煩);
- 我想要成為一名架構(gòu)師,想成就優(yōu)秀的設(shè)計(jì),而后端開發(fā)能更多地接觸到系統(tǒng)的架構(gòu)和設(shè)計(jì);
- 接觸到后端開發(fā)后,我發(fā)現(xiàn)我對(duì)這一領(lǐng)域內(nèi)的絕大多數(shù)事物都感興趣,如云原生、DDD、Service Mesh、系統(tǒng)架構(gòu)等;
- 寫前端會(huì)讓我感到痛苦萬分,因?yàn)槲覍徝涝幃?、不擅長思考用戶的使用邏輯、不擅長編寫交互邏輯,寫出來的東西又丑又反人類。而當(dāng)我開始寫后端時(shí),我發(fā)現(xiàn)我的思考方式經(jīng)常和真實(shí)的業(yè)務(wù)邏輯出奇地一致,有時(shí)候還能在做項(xiàng)目的過程中發(fā)現(xiàn)當(dāng)前所使用的工具的不足,并且思考如何才能設(shè)計(jì)得更好;
- 做后端開發(fā)做了一年左右,我越來越感覺到我喜歡這份工作。
如果你也和我有一樣的想法,那么你說不定也非常適合從事后端開發(fā)的工作。大后端歡迎你的到來。
結(jié)語
很多人對(duì)后端開發(fā)的誤解源于缺少一篇系統(tǒng)地介紹后端開發(fā)的文章。雖然作為一個(gè)僅僅入行一年半(截止到2021年3月)的菜鳥,我對(duì)后端開發(fā)的理解肯定還有許多不足與偏頗,這篇文章也并不那么“系統(tǒng)”,但我仍希望這篇文章能幫助到其他同學(xué)了解后端開發(fā)或消除對(duì)后端開發(fā)的誤解,抑或找到自己的方向而走上后端開發(fā)這條路。
如果發(fā)現(xiàn)文中的錯(cuò)漏之處,歡迎發(fā)表評(píng)論或聯(lián)系我進(jìn)行改正。希望能幫到更多對(duì)后端開發(fā)感興趣的同學(xué)。