前端開(kāi)發(fā)的難點(diǎn)到底在什么地方?
2020-11-13 05:05:42
你要問(wèn)前端開(kāi)發(fā)難不難,我就得說(shuō)計(jì)算機(jī)領(lǐng)域里常說(shuō)的一句話(huà),這句話(huà)就是『難的不會(huì),會(huì)的不難』,對(duì)于不熟悉某領(lǐng)域技術(shù)的人來(lái)說(shuō),因?yàn)椴涣私馑援a(chǎn)生神秘感,神秘感就會(huì)讓人感覺(jué)很難,也就是『難的不會(huì)』;當(dāng)學(xué)會(huì)這項(xiàng)技術(shù)之后,知道什么什么技術(shù)能做到什么做不到,只是做起來(lái)花多少時(shí)間的問(wèn)題而已,沒(méi)啥難的,所以就是『會(huì)的不難』。
但是,對(duì)于前端開(kāi)發(fā)這個(gè)方向,即使『會(huì)了』……依然感覺(jué)很難,唉,說(shuō)多了都是淚呀,我用三個(gè)親身經(jīng)歷的怪現(xiàn)象來(lái)說(shuō)明吧。
第一個(gè)怪現(xiàn)象:誰(shuí)都可以指手畫(huà)腳的前端開(kāi)發(fā)
我職業(yè)生涯很長(zhǎng)一段時(shí)間都在做前端開(kāi)發(fā),我也做過(guò)后端開(kāi)發(fā),兩者一對(duì)比,給我影響最深的不是技術(shù)差異,而是——前端開(kāi)發(fā)者聽(tīng)到的『需求修改意見(jiàn)』要比后端多得多。
后端這東西,畢竟是藏在后面的,外行不懂就是不懂,裝不出來(lái),他們也不好自取其辱亂比劃,但是,前端嘛……誰(shuí)都能看得見(jiàn),沒(méi)吃過(guò)豬肉還沒(méi)見(jiàn)過(guò)豬跑,所以,誰(shuí)都可以指手畫(huà)腳提一點(diǎn)意見(jiàn)。
只看得見(jiàn)界面的產(chǎn)品經(jīng)理可以提一些意見(jiàn)。
項(xiàng)目經(jīng)理可以有一些意見(jiàn)。
啥也不懂的老板也可以提一些意見(jiàn)。
甚至連后端都可以來(lái)提一些意見(jiàn)。
……
正因?yàn)榍岸说漠a(chǎn)出是看得見(jiàn)摸得著的,所以造成了誰(shuí)都可以『提一些意見(jiàn)』的現(xiàn)象。
前端開(kāi)發(fā)最大的痛啊!
第二個(gè)怪現(xiàn)象:被鄙視但又十分搶手的前端
前端開(kāi)發(fā)者,你懂的,居于開(kāi)發(fā)者鄙視鏈的低端,業(yè)務(wù)邏輯大多都居于后端,超大并發(fā)量是后端實(shí)現(xiàn)的,超牛逼的AI、大數(shù)據(jù)分析、商業(yè)邏輯都在后端,前端要做的只是一個(gè)功能展示,所以,后端開(kāi)發(fā)普遍看不上前端開(kāi)發(fā)的工作,直到……到了公司舉辦黑客馬拉松活動(dòng)的時(shí)候。
黑客馬拉松,就是讓程序員自行結(jié)隊(duì),在幾天之內(nèi)快速開(kāi)發(fā)出來(lái)一個(gè)小型項(xiàng)目,到活動(dòng)結(jié)束的時(shí)候,每個(gè)隊(duì)要演示自己的產(chǎn)品,于是,問(wèn)題來(lái)了,平時(shí)你可以鄙視前端開(kāi)發(fā)者,你可以把前端開(kāi)發(fā)貶得一文不值,但是,到了黑客馬拉松的時(shí)候,才知道前端開(kāi)發(fā)的必不可少,因?yàn)闆](méi)有前端你無(wú)法『演示』你的想法。
這時(shí)候,后端開(kāi)發(fā)者也會(huì)發(fā)現(xiàn),平時(shí)覺(jué)得前端開(kāi)發(fā)很簡(jiǎn)單,但是自己寫(xiě)一個(gè)最簡(jiǎn)單的AJAX form表單提交也要學(xué)半天,不管你的后端想法多么牛,如果最后沒(méi)有熟練的前端開(kāi)發(fā)者,最后到了演示環(huán)節(jié)也要抓瞎。
所以,每到黑客馬拉松時(shí),平時(shí)居于鄙視鏈最低端的前端開(kāi)發(fā)者,突然就變成了最炙手可熱的紅人。
誰(shuí)都覺(jué)得前端開(kāi)發(fā)不重要,但是又離不開(kāi)前端開(kāi)發(fā)。
是不是很諷刺?
第三個(gè)怪現(xiàn)象:苦不堪言的多端開(kāi)發(fā)
一個(gè)正經(jīng)的產(chǎn)品,為了滿(mǎn)足用戶(hù)不同設(shè)備上使用的要求,需要提供多客戶(hù)端,最起碼要有網(wǎng)頁(yè)端、iOS端和安卓端,現(xiàn)在大部分產(chǎn)品還要考慮小程序端,這還沒(méi)算iOS要分iPhone和iPad,安卓也要考慮手機(jī)和平板,甚至要考慮機(jī)頂盒設(shè)備的界面……
各種設(shè)備、各種安卓版本、各種瀏覽器都有各自的特(bu)點(diǎn)(g),每個(gè)前端開(kāi)發(fā)者都有體會(huì),很多精力都消耗在處理某個(gè)特定平臺(tái)/版本/瀏覽器的bug上,唉,說(shuō)到這里真想流淚……
因?yàn)橐С诌@么多不同的客戶(hù)端,一個(gè)產(chǎn)品的前端開(kāi)發(fā)者種類(lèi)也不止一個(gè),要有網(wǎng)頁(yè)開(kāi)發(fā)者、iOS開(kāi)發(fā)者和安卓開(kāi)發(fā)者,大一點(diǎn)的項(xiàng)目,靠一個(gè)人支撐一種客戶(hù)端就不行了,需要的是網(wǎng)頁(yè)開(kāi)發(fā)團(tuán)隊(duì)、iOS開(kāi)發(fā)團(tuán)隊(duì)和安卓開(kāi)發(fā)團(tuán)隊(duì)。
其實(shí),不同客戶(hù)端實(shí)現(xiàn)的都是同一種功能,完全是因?yàn)檫@個(gè)世界存在這么多種客戶(hù)端,所以我們才被迫為各個(gè)客戶(hù)端寫(xiě)一套代碼。
雖然多端的存在,增加了不少程序員的就業(yè)機(jī)會(huì),但是,干過(guò)實(shí)際項(xiàng)目的都知道,這其實(shí)很麻煩,很麻煩很麻煩!為了給用戶(hù)最好的體驗(yàn),肯定希望各端提供一致的功能界面,如果有新功能,要上一起發(fā)布上線(xiàn),但是,不同團(tuán)隊(duì)之間開(kāi)發(fā)周期肯定不同,很難保證同時(shí)完成任務(wù),最后,花費(fèi)開(kāi)發(fā)時(shí)間最長(zhǎng)的那一端的開(kāi)發(fā)團(tuán)隊(duì)就成為整個(gè)產(chǎn)品的短板。
每每想到這里,就緬懷秦始皇,秦始皇你要是不光把度量衡統(tǒng)一,把所有客戶(hù)端也統(tǒng)一了多好:-)
前端開(kāi)發(fā)難在哪里?
好了,看完上面這三種行業(yè)怪現(xiàn)象,不難看出,前端開(kāi)發(fā)很真的很有難度,我這里只列出最關(guān)鍵的三點(diǎn):
第一,當(dāng)需求發(fā)生變化的時(shí)候,第一線(xiàn)中槍的往往就是前端,而且很多需求變化和后端無(wú)關(guān),單純就是前端的改變。這些需求改變有的是不合理的瞎折騰,但是,客觀(guān)來(lái)說(shuō),也有不少是有必要的需求改變,應(yīng)該用戶(hù)是上帝,用戶(hù)的喜好會(huì)變化,用戶(hù)的喜好我們也要反復(fù)揣摩,必須要伺候好用戶(hù),也就是要適應(yīng)需求變化,所以,難點(diǎn)就成了——如何讓前端開(kāi)發(fā)適應(yīng)快速變化的需求?
第二,平臺(tái)、瀏覽器生態(tài)復(fù)雜,要考慮的場(chǎng)景太多,不同平臺(tái)上實(shí)現(xiàn)同一界面功能的重復(fù)勞動(dòng)嚴(yán)重,這個(gè)難點(diǎn)在于——如何消除前端開(kāi)發(fā)的重復(fù)勞動(dòng)?
第三,前端的學(xué)習(xí)曲線(xiàn)其實(shí)挺陡,很多后端開(kāi)發(fā)者以為前端只是玩一玩HTML,到了自己上手的時(shí)候發(fā)現(xiàn)其實(shí)要學(xué)很多,下面只是一個(gè)簡(jiǎn)化了的網(wǎng)頁(yè)前端學(xué)習(xí)路線(xiàn)圖。
上面這么多知識(shí)點(diǎn)學(xué)會(huì),只能算入門(mén),更不要說(shuō):
- 如果要做到高性能,要考慮CDN優(yōu)化、JavaScript Profiling、打包策略……
- 如果要做到安全,要防止注入攻擊,要防止XSS攻擊,要防止CSRF攻擊……
這說(shuō)的還只是網(wǎng)頁(yè)前端,沒(méi)說(shuō)安卓和iOS開(kāi)發(fā)、小程序開(kāi)發(fā),如果把這些都帶上,需要學(xué)習(xí)的知識(shí)量又要翻倍。
而且,前端也不是說(shuō)讀幾本書(shū)就可以上手做真實(shí)項(xiàng)目的,如果沒(méi)有對(duì)這個(gè)領(lǐng)域長(zhǎng)時(shí)間的浸淫,做出來(lái)的東西很可能就是漏洞百出,這個(gè)難點(diǎn)就是——如何讓前端學(xué)習(xí)曲線(xiàn)變得不陡?
總結(jié)一下:
- 如何讓前端開(kāi)發(fā)適應(yīng)快速變化的需求?
- 如何消除前端開(kāi)發(fā)的重復(fù)勞動(dòng)?
- 如何讓前端學(xué)習(xí)曲線(xiàn)變得不陡?
長(zhǎng)期以來(lái),雖然無(wú)數(shù)仁人志士想要解決這些問(wèn)題,也取得了一些成果,但是,前端是個(gè)被普遍低估了難度的開(kāi)發(fā)活動(dòng)!
前端開(kāi)發(fā)的出路在何方?
請(qǐng)注意,我現(xiàn)在說(shuō)『前端開(kāi)發(fā)的出路在何方』,并不只是要解決『前端開(kāi)發(fā)工程師35歲之后怎么找工作』的問(wèn)題,我想說(shuō)的是整個(gè)行業(yè)如何定位前端開(kāi)發(fā)的問(wèn)題,或者說(shuō)開(kāi)發(fā)團(tuán)隊(duì)整體應(yīng)該怎么解決前面說(shuō)過(guò)的前端開(kāi)發(fā)困難的問(wèn)題,反過(guò)來(lái),如果我們認(rèn)清了整個(gè)行業(yè)對(duì)于前端開(kāi)發(fā)的定位,你作為前端開(kāi)發(fā)工程師也就清楚35歲之后如何找到合適的工作。
在我看來(lái),問(wèn)題的關(guān)鍵點(diǎn)就是——現(xiàn)在很多前端開(kāi)發(fā)的工作都是在重復(fù)勞動(dòng)。
難道不是嗎?
你去問(wèn)一個(gè)網(wǎng)頁(yè)前端開(kāi)發(fā)工程師,他們?cè)谇耙粋€(gè)項(xiàng)目里做的功能,和后一個(gè)項(xiàng)目里做得功能,本質(zhì)有多大區(qū)別?
你去讓一個(gè)網(wǎng)頁(yè)工程師、安卓工程師和iOS工程師一起討論一下實(shí)現(xiàn)的功能,難道差不多就是一樣的,只不過(guò)用不同語(yǔ)言、部署在不同的平臺(tái)嗎?
你去問(wèn)一下這個(gè)公司的前端,再去問(wèn)一下另一個(gè)公司的前端,他們要考慮的性能、安全性問(wèn)題,解決方法難道不都是很雷同嗎?
我不敢說(shuō)所有前端開(kāi)發(fā)工作都是重復(fù)勞動(dòng),對(duì)于一些極具開(kāi)創(chuàng)新的界面和功能,是開(kāi)拓一片新的天地,需要前端開(kāi)發(fā)工程師開(kāi)發(fā)全新的應(yīng)用,但是,讓我們承認(rèn)吧,對(duì)于大部分應(yīng)用,尤其是對(duì)于一些工具類(lèi)應(yīng)用,歷史上已經(jīng)被開(kāi)發(fā)過(guò)無(wú)數(shù)回了,實(shí)在沒(méi)有必要再重復(fù)造輪子了。
只是,每一個(gè)應(yīng)用的開(kāi)發(fā)團(tuán)隊(duì),都很容易以為,自己的應(yīng)用是『獨(dú)一無(wú)二』的,這種想法也可以理解,畢竟,世界上每一個(gè)應(yīng)用都有自己的獨(dú)特一面,但是,這不表示所有的工作都應(yīng)該從零開(kāi)始。
這個(gè)行業(yè)已經(jīng)這么成熟了,應(yīng)該有一種盡量通用的框架來(lái)抽象可重復(fù)使用的功能,從而避免重復(fù)勞動(dòng),避免了重復(fù)勞動(dòng),也就解決了前端開(kāi)發(fā)的最大難題。
像React、Vue和Angular這樣的前端框架,就是一種程度上的抽象,也很通用,但我認(rèn)為并非是前面結(jié)論中指向的最佳答案,事實(shí)上,行業(yè)發(fā)展多年,也不乏很多平臺(tái)在為了前端開(kāi)發(fā)的輕量化、功能模塊化而不懈努力著,最近看到APICloud發(fā)布了一些新的前端能力,也驗(yàn)證了我前面說(shuō)的觀(guān)點(diǎn)。
了解APICloud新產(chǎn)品特性
低代碼+高性能移動(dòng)開(kāi)發(fā)
低代碼雖然早在海外應(yīng)用多年,但直到這兩年才逐漸被國(guó)內(nèi)所關(guān)注,其倡導(dǎo)代碼復(fù)用,以及通過(guò)模型或翻譯引擎自動(dòng)生成大量代碼,這些都是很好解決前端開(kāi)發(fā)重復(fù)性工作和高效迭代的方向;我對(duì)于APICloud的認(rèn)可,也是建立在他們?cè)械目缙脚_(tái)開(kāi)發(fā)技術(shù)上進(jìn)而實(shí)現(xiàn)了向低代碼開(kāi)發(fā)平臺(tái)的轉(zhuǎn)變。
這次APICloud的產(chǎn)品迭代方向再次指向了前端,當(dāng)然,我們都知道,現(xiàn)實(shí)中的開(kāi)發(fā),不可能一步跨入共產(chǎn)主義,歷史上拖泥帶水的代碼依然存在,開(kāi)發(fā)人員也不大可能一下子換到另一種語(yǔ)言,這一點(diǎn)在AVM這個(gè)框架上得到了解決,同時(shí)支持React和Vue,無(wú)論來(lái)自于什么開(kāi)發(fā)框架背景,都可以在APICloud上快速上手。
上文我也說(shuō)到,前端開(kāi)發(fā)最大的痛苦,就是多端支持,這一點(diǎn)在APICloud新發(fā)布的產(chǎn)品上得到進(jìn)一步補(bǔ)充,一套代碼開(kāi)發(fā),自動(dòng)生成適合安卓、iOS、微信小程序、HTML5的引用,所有跨平臺(tái)瀏覽器的問(wèn)題得到解決,當(dāng)然,市面上很多技術(shù)都在吹噓類(lèi)似的『多端支持框架』,但依然要寫(xiě)很多很多代碼,這一點(diǎn)可以參考APICloud的做法,就是在功能層實(shí)現(xiàn)最大的復(fù)用, 其實(shí)一款應(yīng)用中的功能大部分已經(jīng)由成熟的云廠(chǎng)商提供了,比如你寫(xiě)個(gè)應(yīng)用,最常用的IM、支付、統(tǒng)計(jì)、地圖等等,但我們集成到自己的應(yīng)用中還需要編寫(xiě)代碼的工作量,這點(diǎn)APICloud則通過(guò)統(tǒng)一的標(biāo)準(zhǔn),封裝到自己的平臺(tái),開(kāi)發(fā)者一鍵集成確實(shí)省了不少的事,不用苦逼地重復(fù)寫(xiě)fetch了!
其實(shí)現(xiàn)在所有的云服務(wù)都有一個(gè)趨勢(shì),那就是簡(jiǎn)單易用化,原因也很簡(jiǎn)單,既然是『云服務(wù)』了,意味著可以很快用上,也可以很容易換另一家『云服務(wù)』,如果某個(gè)云服務(wù)的學(xué)習(xí)曲線(xiàn)很陡,那么很快就會(huì)讓用戶(hù)流失,因?yàn)橛脩?hù)會(huì)選擇其他服務(wù),從這一點(diǎn)上來(lái)說(shuō),可以相信APICloud這樣的低代碼開(kāi)發(fā)平臺(tái)學(xué)習(xí)曲線(xiàn)相對(duì)更加平緩。
我更認(rèn)可APICloud的方面,是APICloud不只是一個(gè)框架,還提供SDK支持,官方的開(kāi)發(fā)工具SDK就包含APICloud Studio、Sublime APICloud Plugins、WebStormAPICloud Plugins,你可以選擇用官方Studio,并且新版本基于VSCode定制了,也可以使用Sublime或者WebStorm這樣已經(jīng)用慣了的IDE插件來(lái)開(kāi)發(fā)。
了解更多前端開(kāi)發(fā)文檔
最后來(lái)說(shuō)說(shuō),什么人會(huì)喜歡APICloud。
從應(yīng)用開(kāi)發(fā)的角度(也就是從管錢(qián)管資源的領(lǐng)導(dǎo)角度),APICloud這樣的低代碼開(kāi)發(fā)平臺(tái)模式,能夠真正解決前端開(kāi)發(fā)的三個(gè)大痛苦;但是,從前端開(kāi)發(fā)者角度(也就是出勞力拿工資的打工仔角度),是不是感覺(jué)到了一絲絲威脅,如果像APICloud這樣進(jìn)一步將前端開(kāi)發(fā)者的工作量簡(jiǎn)化,那么豈不是前端開(kāi)發(fā)者都要丟掉工作了?
非也非也!
首先,低代碼平臺(tái)不是無(wú)代碼平臺(tái),該寫(xiě)的還是要寫(xiě),前端開(kāi)發(fā)這個(gè)工種并不會(huì)消失,只是工作方式和內(nèi)容發(fā)生了變化。
而且,大家要以清醒認(rèn)識(shí)到,幾十年前根本沒(méi)有程序員這個(gè)職位,更不要說(shuō)前端開(kāi)發(fā)職位,同樣,再過(guò)幾十年,有一些職業(yè)也會(huì)消亡或者改變,與其哀嚎世界變化快,還不如主動(dòng)擁抱變化,APICloud主導(dǎo)的這種高性能移動(dòng)開(kāi)發(fā)+低代碼開(kāi)發(fā)的模式,是一種趨勢(shì),既然改變不了,還不如主動(dòng)接受。
不光是接受代碼開(kāi)發(fā)的方式,以及這些平臺(tái)所提供的商業(yè)眾包資源也在成為很多平臺(tái)用戶(hù)獲得額外收入的一個(gè)主要來(lái)源。
如果不想一直996,或者不想35歲之后找不到工作,好好考慮一下吧:-)