前端難 OR 后端難?八年后端開發(fā)有話說
這個(gè)問題我被私信過至少 50 次,每次技術(shù)交流會(huì)也必定有人問。今天就從我八年后端開發(fā)的角度,掰扯掰扯這個(gè)老生常談的話題。
先說結(jié)論:都不容易,但難的點(diǎn)完全不一樣。
我為什么有資格聊這個(gè)話題
2018 年大學(xué)畢業(yè),第一份工作是在一家傳統(tǒng)軟件公司寫 Java。那時(shí)候前后端還沒完全分離,我經(jīng)常要寫 JSP 頁面,跟前端的界限很模糊。后來跳槽到互聯(lián)網(wǎng)公司,開始純后端開發(fā),從 Spring Boot 到微服務(wù),從 MySQL 到 Redis 集群,從單機(jī)部署到 K8s,該踩的坑基本都踩過了。
這八年里,我跟至少 20 個(gè)前端同事合作過,從 90 后到 00 后,從 Vue 黨到 React 粉,也算是見證了前端圈的風(fēng)起云涌。更重要的是,我業(yè)余時(shí)間寫項(xiàng)目時(shí)也會(huì)寫點(diǎn)前端代碼,對(duì)兩邊的痛苦都有體感。
前端的難:看得見的復(fù)雜度
技術(shù)棧焦慮是真實(shí)存在的。我認(rèn)識(shí)一個(gè)前端朋友,工作三年換了四次技術(shù)棧:從 Angular.js 到 Vue 2,再到 React,最后到 Vue 3。每次換工作都像重新學(xué)習(xí)一門語言。不像大部分 Java 后端,Spring 那套東西學(xué)會(huì)了基本可以吃一輩子。
但前端的難不只是技術(shù)更新快。真正讓我佩服前端同事的是,他們要在有限的瀏覽器環(huán)境里,實(shí)現(xiàn)各種"不可能"的需求。產(chǎn)品經(jīng)理拿著 App Store 上的炫酷動(dòng)效說:"網(wǎng)頁能不能也做成這樣?"然后前端就要用 CSS 和 JavaScript 硬擼出來。
我印象最深的一次,產(chǎn)品要求做一個(gè)類似 Excel 的在線表格,支持萬行數(shù)據(jù)的流暢滾動(dòng)。前端同事為了優(yōu)化虛擬滾動(dòng),研究了兩周的瀏覽器渲染機(jī)制,最后用 Canvas 重寫了整個(gè)組件。那種對(duì)性能細(xì)節(jié)的把控,真的不是隨便誰都能做到的。
前端要對(duì)用戶體驗(yàn)負(fù)責(zé)。前端動(dòng)畫卡頓一下,用戶立馬就能察覺。我們后端寫的 bug,大不了返回個(gè)錯(cuò)誤碼;前端的 bug,用戶截圖就發(fā)到群里了。
后端的難:藏在深處的復(fù)雜度
后端的難是系統(tǒng)性的。從初級(jí)開發(fā)到高級(jí)開發(fā),每個(gè)階段都有不同的坑等著你踩。
- 初級(jí):技術(shù)基礎(chǔ)不扎實(shí),SQL、異常處理、并發(fā)等基本問題
- 中級(jí):業(yè)務(wù)邏輯復(fù)雜,狀態(tài)管理、事務(wù)處理等業(yè)務(wù)相關(guān)問題
- 高級(jí):系統(tǒng)架構(gòu)設(shè)計(jì),微服務(wù)拆分、分布式系統(tǒng)等架構(gòu)問題
- 資深:業(yè)務(wù)架構(gòu)和團(tuán)隊(duì)協(xié)作,平衡各方面需求的綜合能力
復(fù)雜的業(yè)務(wù)邏輯往往比技術(shù)實(shí)現(xiàn)更頭疼。一個(gè)看似簡(jiǎn)單的"轉(zhuǎn)賬"功能,涉及賬戶狀態(tài)檢查、余額校驗(yàn)、風(fēng)控規(guī)則、手續(xù)費(fèi)計(jì)算、匯率轉(zhuǎn)換、稅務(wù)處理、審計(jì)日志,還要考慮各種異常情況:網(wǎng)絡(luò)中斷怎么辦?數(shù)據(jù)庫宕機(jī)怎么辦?第三方接口超時(shí)怎么辦?
還有運(yùn)維和數(shù)據(jù)安全的壓力。前端部署就是打個(gè)包上傳 CDN,后端部署要考慮數(shù)據(jù)庫遷移、服務(wù)依賴、灰度發(fā)布、回滾策略。安全問題更是如履薄冰,SQL 注入、權(quán)限繞過、數(shù)據(jù)泄露,任何一個(gè)疏忽都可能導(dǎo)致嚴(yán)重后果。
其實(shí)最大的誤區(qū)是:覺得對(duì)方簡(jiǎn)單
后端看前端:"不就是寫寫頁面調(diào)調(diào)接口嗎?"這是最大的偏見。現(xiàn)代前端工程師要掌握的技能棧不比后端少:組件化開發(fā)、狀態(tài)管理、構(gòu)建優(yōu)化、性能監(jiān)控、自動(dòng)化測(cè)試、CI/CD,哪一個(gè)都不簡(jiǎn)單。
前端看后端:"CRUD boy 天天增刪改查有什么技術(shù)含量?"這也是誤解。業(yè)務(wù)系統(tǒng)的復(fù)雜度往往體現(xiàn)在數(shù)據(jù)流轉(zhuǎn)、狀態(tài)管理、異常處理上,表面的 CRUD 背后可能是復(fù)雜的業(yè)務(wù)規(guī)則和技術(shù)架構(gòu)。
我覺得最好的合作狀態(tài)是互相理解對(duì)方的難處。前端理解后端為什么接口設(shè)計(jì)會(huì)有限制,后端理解前端為什么有些需求實(shí)現(xiàn)起來困難。
從市場(chǎng)需求和薪資看:各有機(jī)會(huì)
前端的優(yōu)勢(shì):需求量大,入門相對(duì)容易,能快速出成果。特別是現(xiàn)在大前端的概念,React Native、Flutter、小程序,前端的邊界在不斷擴(kuò)大。而且前端更容易轉(zhuǎn)向產(chǎn)品、設(shè)計(jì)等崗位,職業(yè)道路相對(duì)多元。
后端的優(yōu)勢(shì):技術(shù)積累更有持續(xù)性,核心技術(shù)變化相對(duì)慢,越老越值錢。而且后端更容易理解業(yè)務(wù)邏輯,在技術(shù)管理和架構(gòu)設(shè)計(jì)方面有優(yōu)勢(shì)。從我身邊的情況看,后端轉(zhuǎn)技術(shù)管理的比例確實(shí)更高一些。
薪資方面,其實(shí)都差不多。前端在一二線城市需求旺盛,薪資漲得快;后端在傳統(tǒng)行業(yè)和 B 端市場(chǎng)更有優(yōu)勢(shì)。真正拉開差距的不是技術(shù)棧,而是個(gè)人能力和機(jī)遇。
我的建議:選擇比努力更重要
如果你還在糾結(jié)選哪個(gè)方向,我建議你問自己幾個(gè)問題:
你是愿意每隔幾年就學(xué)習(xí)新技術(shù),還是希望在一個(gè)技術(shù)棧上深耕? 你是喜歡看到即時(shí)的視覺反饋,還是更享受解決復(fù)雜邏輯問題的成就感? 你是外向型喜歡跟產(chǎn)品設(shè)計(jì)打交道,還是內(nèi)向型更適合專注于技術(shù)本身?
如果你已經(jīng)選定了方向,我的建議是:不要只做增刪改查,要主動(dòng)尋找有挑戰(zhàn)性的項(xiàng)目。前端可以深入研究性能優(yōu)化、工程化建設(shè);后端可以關(guān)注分布式系統(tǒng)、高并發(fā)架構(gòu)。技術(shù)深度比技術(shù)廣度更重要。
最重要的是:保持學(xué)習(xí)的熱情。這行最不缺的就是新技術(shù),最需要的是持續(xù)學(xué)習(xí)的能力。我見過寫了十年代碼還在用五年前技術(shù)的"老油條",也見過工作兩年就能獨(dú)當(dāng)一面的"技術(shù)新星"。差距在哪?在于是否保持了對(duì)技術(shù)的好奇心和學(xué)習(xí)動(dòng)力。
寫在最后
八年后端開發(fā)經(jīng)歷讓我明白,技術(shù)選擇沒有對(duì)錯(cuò),只有適不適合。前端和后端都是為了解決實(shí)際問題而存在,都有自己的價(jià)值和意義。
與其糾結(jié)哪個(gè)更難,不如想想自己能為這個(gè)行業(yè)創(chuàng)造什么價(jià)值。技術(shù)是手段,解決問題才是目的。無論選擇前端還是后端,都要記住我們的使命:用代碼讓世界變得更美好一點(diǎn)。