一、前端(1)何為前端簡(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),比如CSDN頁(yè)面上的內(nèi)容。 舉一個(gè)更具體的例子,就是如果你在我的文章末尾點(diǎn)個(gè)贊,那么頁(yè)面對(duì)你點(diǎn)贊這個(gè)動(dòng)作做出了響應(yīng),就是在后臺(tái)數(shù)據(jù)庫(kù)里面把我的點(diǎn)贊量加1。并且在頁(yè)面上顯示視頻點(diǎn)贊量加1之后的數(shù)量。 (2)前端常用的技術(shù)前端開(kāi)發(fā)用到的基礎(chǔ)技術(shù)就是HTML,CSS和JavaScript,分別用來(lái)控制網(wǎng)頁(yè)里面的內(nèi)容、視覺(jué)效果和用戶交互。 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)簽組合嵌套而成的。拿我前些日子的文章來(lái)舉例,在這篇文章上,文章的標(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)簽,而文章里的文字對(duì)應(yīng)著yt-formatted-string類型的標(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),改動(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í)行。這里插一句,JavaScript與Java并沒(méi)有什么關(guān)系,兩者之間的特性差的很遠(yuǎn),這就好比是印度跟印度尼西亞一樣,兩者之間沒(méi)有什么關(guān)系。 不管用什么語(yǔ)言,通常都不會(huì)重復(fù)的造輪子,而是會(huì)調(diào)用該語(yǔ)言現(xiàn)成的庫(kù)(library)來(lái)實(shí)現(xiàn)一些常見(jiàn)的功能,讓開(kāi)發(fā)過(guò)程更加高效。 對(duì)于前端加web的開(kāi)發(fā),React是目前比較流行的庫(kù)(library),React這個(gè)庫(kù)不僅可以用來(lái)實(shí)現(xiàn)與用戶的交互邏輯和事件響應(yīng),事實(shí)上頁(yè)面上幾乎全部的HTML代碼都可以通過(guò)React來(lái)生成,這種在瀏覽器端生成HTML代碼進(jìn)行渲染的方式叫做Client-side Rendering,與之相反的就是Server-side Rendering,也就是頁(yè)面完整的HTML代碼是全部由網(wǎng)站的前端服務(wù)器生成好了之后再發(fā)給瀏覽器。 這里提到了前端服務(wù)器,就順便說(shuō)一下,前端服務(wù)器的邏輯可以通過(guò)任何編程語(yǔ)言來(lái)實(shí)現(xiàn),比如Java、JavaScript、PHP、Python甚至是Scheme,只要服務(wù)器的行為遵守HTTP的協(xié)議就可以了。Client-side Rendering和Server-side Rendering兩種渲染方式各有優(yōu)缺點(diǎn),因此前端工程師在開(kāi)發(fā)網(wǎng)頁(yè)的時(shí)候,需要結(jié)合實(shí)際情況選擇最合適的頁(yè)面渲染方式。 除了React,另外一種比較流行的JavaScript 庫(kù)就是Vue,在國(guó)內(nèi)用的比較多,比如B站的HTML代碼用的就是Vue。 以上介紹的這些就是前端開(kāi)發(fā)的一些常規(guī)技術(shù),HTML瀏覽器和前端服務(wù)器的工作原理,一般會(huì)在學(xué)校里面計(jì)算機(jī)網(wǎng)絡(luò)課程教,CSS、JavaScript和React就主要靠自學(xué)了。
二、后端1.何為后端講完了前端,現(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)到的CRUD,從而實(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ù)的AP、架構(gòu)圖、數(shù)據(jù)庫(kù),以及寫(xiě)代碼實(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ì)考到的系統(tǒng)設(shè)計(jì),做系統(tǒng)設(shè)計(jì)非??疾炱綍r(shí)知識(shí)的積累。 2.后端必備技能和工具(1)后端服務(wù)器 那么后端工程師平時(shí)一般需要與哪些技術(shù)和工具打交道呢?首先就是后端服務(wù)器了,和前端服務(wù)器一樣,后端服務(wù)器也可以由幾乎任何一種編程語(yǔ)言實(shí)現(xiàn),只要能把正確的數(shù)據(jù)返回給調(diào)用者就可以了。 主流的編程語(yǔ)言也有各自流行的Web框架,也就是現(xiàn)成的輪子,來(lái)幫助大家站在框架的肩膀上,快速的實(shí)現(xiàn)一個(gè)后端服務(wù)。比如基于Java的Web框架有Spring Boot和Dropwizard,基于JavaScript的有Express,基于Python的有Flask,這幾個(gè)web框架每一個(gè)都有大廠在使用,不同的公司具體選擇哪種框架,一定程度上是看創(chuàng)始的程序員們最喜歡哪種語(yǔ)言,哪種框架用的最6。 還有一些后端服務(wù)的框架可以支持你用多種編程語(yǔ)言來(lái)開(kāi)發(fā),而不是綁在一門(mén)特定的語(yǔ)言上,比如gRPC這個(gè)遠(yuǎn)程調(diào)用框架,支持用Java、C 、Python、GO等語(yǔ)言來(lái)開(kāi)發(fā)。 這么多的語(yǔ)言和框架,**如果你想去某個(gè)公司做后端開(kāi)發(fā),一定需要對(duì)他們使用的語(yǔ)言和框架很熟練嗎?**一般來(lái)講,不會(huì)。對(duì)公司來(lái)說(shuō),你會(huì)其中一部分就夠了,很多東西都是在工作里面學(xué)的,而且事實(shí)上2~3周內(nèi)上手一門(mén)新的語(yǔ)言,是一名職業(yè)程序員的基本素養(yǎng)。 (2)數(shù)據(jù)庫(kù) 除了開(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的LeveIDB。這些數(shù)據(jù)庫(kù)在某些特定的情況下,可能會(huì)比關(guān)系型數(shù)據(jù)庫(kù)更適合你的業(yè)務(wù)需求,可以在工作中去學(xué)習(xí)它的原理和特性。 數(shù)據(jù)庫(kù)往往是后端系統(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ù)的速度,比如用Kafka把數(shù)據(jù)寫(xiě)入異步化,提升后端寫(xiě)數(shù)據(jù)的性能。 關(guān)于服務(wù)器和數(shù)據(jù)庫(kù),過(guò)幾天我會(huì)專門(mén)更新文章來(lái)詳細(xì)介紹,感謝的小伙伴可以關(guān)注我。
三、全棧何為全棧?全棧就是全干,就是自己能過(guò)構(gòu)建和部署一個(gè)完整的可以工作的Web APP,能夠獨(dú)立編寫(xiě)前端、后端代碼,能夠配置服務(wù)器,還能夠設(shè)計(jì)數(shù)據(jù)庫(kù),基本上前面所提及的前端和后端技能及工作內(nèi)容你讀得掌握。 不過(guò)薪資也會(huì)比較高,比前端工程師或后端工程師都要高,雖然1個(gè)人要干2個(gè)人的活兒,但一般情況下還是拿不到2個(gè)人的錢,當(dāng)然了,技術(shù)牛逼的話1個(gè)頂好幾個(gè)普通程序員。 四、一些建議(1)主做前端?主做后端?還是做全棧工程師? 我覺(jué)得你不需要這么早下結(jié)論,你只要去工作就可以了,在工作中學(xué)習(xí),最后你自己會(huì)從中發(fā)現(xiàn)適合你的方向。比如我自己,從一開(kāi)始剛出來(lái)工作時(shí)主做前端開(kāi)發(fā),后面做著做著遇到了瓶頸,技術(shù)和薪資都沒(méi)怎么提升,后面自己去認(rèn)真學(xué)了后端,加上一些機(jī)遇,部門(mén)里剛好做后端的離職了緊缺人,讓我頂上去,結(jié)果我一頂上去就沒(méi)下來(lái)過(guò),雖然工資沒(méi)有翻倍,但也加了不少,自此成為全棧工程師。 (2)面試刷題必不可少 不管你是面試前端還是后端,都會(huì)涉及算法的考察,刷題是必不可少的,刷題的網(wǎng)站有很多,比如??途W(wǎng)、力扣、賽碼等等,都是很不錯(cuò)的。 (3)前端和后端哪個(gè)更容易? 從我這么多年的程序員生涯來(lái)看,我并不覺(jué)得前端和后端哪個(gè)更好或者更容易,區(qū)別就在于使用的技術(shù)和考慮的方面不同。前端主要考慮用戶體驗(yàn),后端主要考慮底層業(yè)務(wù)邏輯、平臺(tái)穩(wěn)定和性能,最主要是要看你想做哪一部分?你是喜歡做用戶看得見(jiàn)的部分,還是考慮用戶看不見(jiàn)的部分。 (4)女生更適合做前端? 我經(jīng)常聽(tīng)到有些人說(shuō)“女生審美好,更適合做前端”這種話,我就納了悶了,這跟性別審美有關(guān)嗎?我以前做前端的時(shí)候,公司里面都有統(tǒng)一的界面規(guī)格,做什么都直接調(diào)用庫(kù)里面現(xiàn)成的component,按鈕、字體和邊框長(zhǎng)啥樣,內(nèi)容排序都不是我決定,是PM和UI設(shè)計(jì)師決定,你的審美也肯定沒(méi)有設(shè)計(jì)師專業(yè)。 我就納了悶了,這跟性別審美有關(guān)嗎?我以前做前端的時(shí)候,公司里面都有統(tǒng)一的界面規(guī)格,做什么都直接調(diào)用庫(kù)里面現(xiàn)成的component,按鈕、字體和邊框長(zhǎng)啥樣,內(nèi)容排序都不是我決定,是PM和UI設(shè)計(jì)師決定,你的審美也肯定沒(méi)有設(shè)計(jì)師專業(yè)。 所以并不是女生就更適合做前端。
|