前端程序員,后端程序員,全棧程序員分別都是什么?找工作到底選前端還是后端?為什么美國(guó)很多都是全站程序員呢?帶著這些疑問(wèn),本文來(lái)給大家一一解答,保證讓你對(duì)這些概念搞的明明白白!
首先什么是前端開(kāi)發(fā)?
簡(jiǎn)單來(lái)說(shuō),前端開(kāi)發(fā)就是開(kāi)發(fā)網(wǎng)頁(yè)上的“內(nèi)容展示”,和與用戶的交互;
這里的“內(nèi)容展示”:指的是你在網(wǎng)頁(yè)上能看到的,圖片文字、視頻、數(shù)字等信息。
那么與用戶的交互指的就是,用戶在頁(yè)面上通過(guò)點(diǎn)擊按鈕、輸入文字等動(dòng)作對(duì)網(wǎng)站提供數(shù)據(jù)輸入,然后前端對(duì)用戶的輸入進(jìn)行響應(yīng)。
比如更新頁(yè)面上的內(nèi)容,舉一個(gè)更具體的例子就是,如果你在我的文章下面進(jìn)行評(píng)論,那么頁(yè)面對(duì)你評(píng)論這個(gè)動(dòng)作就會(huì)做出響應(yīng),比如會(huì)在后臺(tái)數(shù)據(jù)庫(kù)里面,把我的評(píng)論量加一。
并且在頁(yè)面上顯示文章評(píng)論后的數(shù)量等,如下圖。
前端開(kāi)發(fā)用到的基礎(chǔ)技術(shù)就是 html
、css
和 javascript
,分別用來(lái)控制網(wǎng)頁(yè)里面的內(nèi)容、視覺(jué)效果和用戶交互。
下面分別簡(jiǎn)單介紹一下。
html 并不是一門(mén)編程語(yǔ)言,他是一種用來(lái)定義結(jié)構(gòu)化數(shù)據(jù)的標(biāo)記語(yǔ)言,你在瀏覽器上看到的網(wǎng)頁(yè),其實(shí)就對(duì)應(yīng)一個(gè) html 文件,這個(gè)文件里裝的就是 html 代碼,而瀏覽器的職責(zé)之一,就是通過(guò)你輸入的網(wǎng)址,從網(wǎng)站上下載對(duì)應(yīng)的 html 代碼,并且把代碼渲染成你肉眼看到的樣子。
那么,前端工程師的工作內(nèi)容之一,就是編寫(xiě) html代碼,或者使用一些技術(shù)來(lái)為頁(yè)面動(dòng)態(tài)的生成 html 代碼,任何一個(gè)網(wǎng)頁(yè),你都可以通過(guò)瀏覽器的開(kāi)發(fā)者工具,看到他對(duì)應(yīng)的 html 代碼。
如果你仔細(xì)查看一段 html 代碼,你會(huì)發(fā)現(xiàn)他其實(shí)就是由一堆各種類型的尖括號(hào)標(biāo)簽組合嵌套而成的,比如某視頻在 youtube 頁(yè)面上,視頻的標(biāo)題,對(duì)應(yīng)于代碼里面一個(gè)title
類型的標(biāo)簽,那視頻的播放器就對(duì)應(yīng)于一個(gè)video
類型的標(biāo)簽;其頭像圖片,對(duì)應(yīng)于一個(gè)嵌套在超鏈接標(biāo)簽里的 image
標(biāo)簽;而評(píng)論里的文字又對(duì)應(yīng)于一個(gè) yt formatted-string
類型的標(biāo)簽,這里的 yt 應(yīng)該只帶的是youtube,那么這個(gè)標(biāo)簽,應(yīng)該就是 youtube 自定義的標(biāo)簽,然后 css 的代碼,則是用來(lái)指定每個(gè) html 的標(biāo)簽,以什么樣的外觀和風(fēng)格來(lái)展示,比如長(zhǎng)寬、位置、顏色居中還是分散字體顯示屬性等等。
css的代碼也是被瀏覽器讀入,并且渲染成你肉眼所看到的效果,有時(shí)候pm會(huì)想把頁(yè)面里面一個(gè)按鈕的大小和顏色進(jìn)行微調(diào),而這個(gè)微調(diào)就是由前端工程師去改動(dòng);這個(gè)按鈕對(duì)應(yīng)的 css代碼來(lái)實(shí)現(xiàn)的,前端開(kāi)發(fā)中真正編程的部分是javascript,網(wǎng)頁(yè)如何與用戶交互,如何與后端交互,都是通過(guò) javascript 的代碼實(shí)現(xiàn)的,就像html代碼和 css代碼是被瀏覽器執(zhí)行一樣,頁(yè)面里面的 javascript 代碼也是交給瀏覽器來(lái)執(zhí)行。
這里插一句,javascrip與java并沒(méi)有什么關(guān)系,兩者之間的特性差的很遠(yuǎn),這就好比是印度跟印度尼西亞差的很遠(yuǎn),熊貓跟小熊貓差的很遠(yuǎn),雷峰和雷峰塔差的很遠(yuǎn)。
說(shuō)回正題,大家在寫(xiě)程序的時(shí)候,不管用什么語(yǔ)言,通常都不會(huì)重復(fù)的造輪子,而是會(huì)調(diào)用該語(yǔ)言現(xiàn)成的 library來(lái)實(shí)現(xiàn)一些常見(jiàn)的功能,讓開(kāi)發(fā)過(guò)程更加高效。
對(duì)于前端javascript的開(kāi)發(fā),react
是目前比較流行的library,也是我在工作中,做前端的時(shí)候會(huì)用到的。react這個(gè)library,不僅可以用來(lái)實(shí)現(xiàn)與用戶的交互邏輯和事件響應(yīng),事實(shí)上頁(yè)面上幾乎全部的 html 代碼,都可以通過(guò) react來(lái)生成,這種在瀏覽器端生成 html代碼進(jìn)行渲染的方式,叫做 client-side rendering
,與之相反的就是 service-side rendering
,也就是頁(yè)面完整的 html代碼,是全部由網(wǎng)站的前端服務(wù)器生成好了之后,再發(fā)給瀏覽器的。
這里提到了前端服務(wù)器,就順便說(shuō)一下,前端服務(wù)器的邏輯,可以通過(guò)任何編程語(yǔ)言來(lái)實(shí)現(xiàn),比如 java、javascript、php 甚至是Scheme,只要服務(wù)器的行為遵守 http 的協(xié)議就可以了,client-side rendering
和 silver-side rendering
兩種方式各有優(yōu)缺點(diǎn),因此前段工程是在開(kāi)發(fā)網(wǎng)頁(yè)的時(shí)候,需要結(jié)合實(shí)際情況,選擇最合適的頁(yè)面渲染方式;
除了 react,另外一種比較流行的 javascript library就是vue
,在國(guó)內(nèi)用的比較多,如果你去查看 b 站的html代碼,你會(huì)發(fā)現(xiàn) b 站的前端也用到了vue。
以上介紹的這些,就是前端開(kāi)發(fā)的一些常規(guī)技術(shù),html、瀏覽器和前端服務(wù)器的工作原理,一般會(huì)在學(xué)校里面的《計(jì)算機(jī)網(wǎng)絡(luò)》課里面介紹,css、javascript、react就主要靠自學(xué)了。
javascript和react學(xué)習(xí)課程感興趣的可以去看《javascript高級(jí)教程》哦!
講完了前端,現(xiàn)在來(lái)講講后端。
什么是后端開(kāi)發(fā)呢?
相當(dāng)一部分的后端開(kāi)發(fā)工作,就是開(kāi)發(fā)數(shù)據(jù)訪問(wèn)服務(wù),使得前端可以通過(guò)調(diào)用后端的服務(wù),來(lái)對(duì)數(shù)據(jù)進(jìn)行增刪查改,也就是大家經(jīng)常聽(tīng)到的 curd,從而實(shí)現(xiàn)前端對(duì)用戶的請(qǐng)求響應(yīng)。
比如你在一個(gè)大型網(wǎng)站注冊(cè)的時(shí)候,這個(gè)網(wǎng)站的前端就會(huì)調(diào)用他的后端,把你的用戶信息寫(xiě)入數(shù)據(jù)庫(kù)。一個(gè)后端服務(wù)其實(shí)不局限于只被前端調(diào)用,他還可以被 mobile app 調(diào)用,還可以被其他的后端服務(wù)調(diào)用。
類比一下,前端往往需要通過(guò)調(diào)用后端服務(wù),來(lái)完成對(duì)用戶的請(qǐng)求響應(yīng),而后端服務(wù)往往需要通過(guò)查詢數(shù)據(jù)庫(kù)。
來(lái)完成對(duì)前端請(qǐng)求的響應(yīng),從這個(gè)類比你可以看出,前端和后端的共性,都是通過(guò)調(diào)用一個(gè)比自己靠后的服務(wù),來(lái)對(duì)前方客戶的請(qǐng)求進(jìn)行響應(yīng),后端工程師的工作范疇很廣,幾個(gè)比較常見(jiàn)的就是,設(shè)計(jì)后端服務(wù)的api,設(shè)計(jì)后端服務(wù)的架構(gòu)圖,設(shè)計(jì)后端服務(wù)的數(shù)據(jù)庫(kù)且代碼實(shí)現(xiàn)后端服務(wù)的業(yè)務(wù)邏輯,同時(shí)你還需要保證你設(shè)計(jì)的后端服務(wù),highly available
,也就是訪問(wèn)量很大的時(shí)候仍然不宕機(jī),并且對(duì)客戶請(qǐng)求的響應(yīng)時(shí)間很短,或者說(shuō)吞吐量高,單位時(shí)間內(nèi)能處理的請(qǐng)求數(shù)量多。
如果要從頭搭建一個(gè)新的后端服務(wù),那么整個(gè)過(guò)程需要進(jìn)行大量的系統(tǒng)設(shè)計(jì),也就是后端工程師面試的時(shí)候,會(huì)考到了System Design,做System Design非常考察平時(shí)知識(shí)的積累。
那么后端工程師平時(shí)一般需要與哪些技術(shù)和工具打交道呢?
首先就是后端服務(wù)器了,和前端服務(wù)器一樣,后端服務(wù)器也可以由幾乎任何一種編程語(yǔ)言實(shí)現(xiàn),只要能把正確的數(shù)據(jù),返回給調(diào)用者就可以了。
主流的編程語(yǔ)言,也有各自流行的 Web Framework,也就是現(xiàn)成的輪子,來(lái)幫助大家站在框架的肩膀上,快速的實(shí)現(xiàn)一個(gè)后端服務(wù),比如基于 PHP的 Web Framework有thinkphp
和laravel
(插一句“PHP是世界上最好的語(yǔ)言”),基于 javascript 有 express
,基于 java 的 Web Framework有Spring Boot
和 Drop wizard
,以及基于python有flask
這幾個(gè)Web Framework,每一個(gè)都有大廠在使用,不同的公司具體選擇哪種框架,一定程度上,是看創(chuàng)始的程序員們最喜歡哪種語(yǔ)言,哪種框架用的最6,還有一些后端服務(wù)的框架,可以支持你用多種編程語(yǔ)言來(lái)開(kāi)發(fā),而不是綁在一門(mén)特定的語(yǔ)言上。
說(shuō)了這么多的語(yǔ)言和框架,如果你想去某個(gè)公司做后端開(kāi)發(fā),一定需要對(duì)他們使用的語(yǔ)言和框架很熟練嗎?
一般來(lái)講不會(huì),我找工作的時(shí)候看到崗位描述,里面有我不會(huì)的語(yǔ)言和框架,也無(wú)所謂,照樣投,對(duì)公司來(lái)說(shuō)你會(huì)其中一部分就夠了,很多東西都是在工作里面學(xué)的,而且事實(shí)上,兩周內(nèi)上手一門(mén)新的編程語(yǔ)言,是一名職業(yè)程序員的基本素養(yǎng),除了開(kāi)發(fā)和維護(hù)后端服務(wù)器,后端工程師還會(huì)花大量的時(shí)間,在數(shù)據(jù)庫(kù)上,不管是為你的后端服務(wù)創(chuàng)建數(shù)據(jù)庫(kù),還是為數(shù)據(jù)庫(kù)的性能調(diào)優(yōu)或者是分析里面的數(shù)據(jù)。
目前最常用到的數(shù)據(jù)庫(kù)是關(guān)系型數(shù)據(jù)庫(kù),比如在工業(yè)界被廣泛使用的MySQL
和PostgreSQL
。
如何設(shè)計(jì)一個(gè)關(guān)系型數(shù)據(jù)庫(kù),如何使用SQL query來(lái)訪問(wèn)數(shù)據(jù),以及如何依靠 index 來(lái)為數(shù)據(jù)查詢加速,這些知識(shí)點(diǎn),在學(xué)校的數(shù)據(jù)庫(kù)課程里面也會(huì)介紹的,然而學(xué)校數(shù)據(jù)庫(kù)課程里面介紹的比較少,但是近年來(lái)用的又越來(lái)越多的是非關(guān)系型的數(shù)據(jù)庫(kù),也就是大家常說(shuō)的No-SQL數(shù)據(jù)庫(kù)。
比如基于JSON文檔的MongoDB
,比如基于LSM tree
的LevelDB
,這些數(shù)據(jù)庫(kù)在某些特定的情況下,可能會(huì)比關(guān)系型數(shù)據(jù)庫(kù)更適合你的業(yè)務(wù)需求,
大家一般也是在工作中去學(xué)習(xí)他的原理和特性,數(shù)據(jù)庫(kù)往往是一個(gè)后端系統(tǒng)里面的性能瓶頸,也就是最慢的一環(huán),因此后端工程師在進(jìn)行系統(tǒng)設(shè)計(jì)的時(shí)候,會(huì)用很多辦法來(lái)使得后端的性能,比如響應(yīng)的時(shí)間,盡量的少被數(shù)據(jù)庫(kù)拖后腿,比如使用MemCached這種緩存系統(tǒng),來(lái)加速讀取數(shù)據(jù)的速度,比如用Kafaka把數(shù)據(jù)寫(xiě)入異步化,提升后端寫(xiě)數(shù)據(jù)的性能,后端開(kāi)發(fā)就大致介紹到這里。
后端開(kāi)發(fā)里的其他重要環(huán)節(jié),比如性能監(jiān)視,比如 DevOps
這里就略過(guò)不講啦!
下面來(lái)講講全棧,全棧就是全干,要能夠自己構(gòu)建和部署一個(gè)完整的,可以工作的Web App,能夠獨(dú)立編寫(xiě)前端,后端代碼能夠配置服務(wù)器,還能夠設(shè)計(jì)數(shù)據(jù)庫(kù)。
我參加工作以來(lái)前端和后端都做,大概80%時(shí)間都是在做后端,對(duì)于要找程序員工作的你,有很多小伙伴問(wèn)我,前端和后端哪個(gè)的發(fā)展前景好轉(zhuǎn),專業(yè)選哪個(gè)比較容易入行,或者女孩子適合做哪個(gè)?這里我推薦大家看看這篇文章《零基礎(chǔ)學(xué)編程應(yīng)該從哪入手?推薦2021年適合學(xué)習(xí)的編程語(yǔ)言》
選前端還是后端區(qū)別只在于使用的技術(shù)和考慮的方面不同,前端主要考慮用戶體驗(yàn),后端主要考慮底層業(yè)務(wù)邏輯,平臺(tái)穩(wěn)定和性能,最主要是看你喜歡做什么,你是喜歡做用戶看得見(jiàn)的部分,還是去考慮用戶看不見(jiàn)的部分呢?
很多人覺(jué)得女生審美好適合做前端,可是公司里面有統(tǒng)一的界面規(guī)格,做什么都直接調(diào)用,library 里面現(xiàn)存的 component,按鈕字體邊框長(zhǎng)啥樣,內(nèi)容排序都不是我決定是 pm 和 ui設(shè)計(jì)師決定,我的審美也肯定沒(méi)有設(shè)計(jì)師專業(yè)。
最后即使你選擇了某一個(gè)方向,你在工作中也會(huì)實(shí)際了解到其他是做什么的,自己喜歡什么想做什么,如果你想轉(zhuǎn)前端或者是后端,可以看看組里公司里有沒(méi)有機(jī)會(huì),也可以自學(xué)尋找其他的機(jī)會(huì),你之前的工作經(jīng)驗(yàn)不會(huì)白費(fèi),公司也總是喜歡技能比較多的員工嘛!
全棧程序員崗位比較多,可能是因?yàn)榧夹g(shù)比較全面,花一份工資請(qǐng)會(huì)兩個(gè)崗位技術(shù)的人,對(duì)于求職者來(lái)講,全棧程序員有幾年工作經(jīng)驗(yàn)的會(huì)高的