兩年的前端職業(yè)生涯,見識了商業(yè)的瞬息萬變和殘酷競爭。
今年的兩個(gè)項(xiàng)目按照測算其實(shí)都能達(dá)到40%以上的毛利率,而且市場需求極其旺盛,也符合國家長期產(chǎn)業(yè)規(guī)劃布局,開發(fā)周期短,資金周轉(zhuǎn)率高,技術(shù)壁壘高,只要能持續(xù)盈利兩年,慢慢攤銷研發(fā)成本,日子就會好起來。立項(xiàng)的時(shí)候每個(gè)人都滿懷期待,都相信肯定能大賺一筆。
然而短短幾個(gè)月時(shí)間,政策和商業(yè)模式就能天翻地覆,換了人間。這一切現(xiàn)在都化成了泡影,行業(yè)內(nèi)總會有聰明人想賺快錢,一家互聯(lián)網(wǎng)公司把核心算法全部公開,一次性幾千元買斷使用權(quán),任何人都可以擁有核心技術(shù)。
技術(shù)泛濫的后果就是大量黑作坊進(jìn)場,黑作坊成本低廉,供應(yīng)鏈完善但是品控一般,黑作坊進(jìn)場不可避免就是血腥價(jià)格戰(zhàn),而大部分硬件廠商都是重資產(chǎn)模式,運(yùn)營成本高昂,輕易就被華強(qiáng)北黑作坊擊敗。
這種情況下,自研核心技術(shù),自建工廠反而變成了劣勢。今年項(xiàng)目組全年凈虧損**多萬,**多萬對集團(tuán)來說不值一提,但到了具體的項(xiàng)目組,壓到每個(gè)人的頭上,真如泰山壓頂一般,難以承受。我現(xiàn)在很迷惑,自主研發(fā),遵紀(jì)守法,對員工好,品控優(yōu)良,難道這些都有錯嗎?
也許這就是大勢吧,勢來不可擋,勢去不可扼。雖然集團(tuán)仁慈,全額發(fā)了年終獎,但隨著項(xiàng)目組劇烈的調(diào)整變動和不斷的更換領(lǐng)導(dǎo),我心態(tài)也漸漸落入低谷。心累了,一切的心血都付之東流,突然就不想干了。看著自己住的員工價(jià)別墅,高檔餐廳,還有詩一樣的辦公環(huán)境,真如一場夢境。現(xiàn)在夢醒了,就該搬回城中村里繼續(xù)搬磚了。
最近在頻繁面試,寫寫感悟吧,其實(shí)32歲這個(gè)年紀(jì),沒到35,簡歷基本還能通過初篩,面試官其實(shí)也,愿意和你聊聊天,聊聊項(xiàng)目,說說工作感悟啥的,氣氛也比較輕松,以談話為主。這一個(gè)多月時(shí)間面了歡聚,字節(jié),cvte,聯(lián)通,瑪卡和云宏,華為OD七家,除了字節(jié)成了備胎,華為OD交了白卷,云宏不匹配之外。其他全部通過,超過50%的通過率,還是很開心的。
第一家是廣州瑪卡,是個(gè)創(chuàng)業(yè)公司,17年我用過他們產(chǎn)品,很有好感就投了,因?yàn)槲乙獌r(jià)3w,沒有相應(yīng)的開發(fā)崗位,所以就直接安排面架構(gòu)師,一面是CTO,很干練,年輕有為,估計(jì)也是大廠出來的,問的東西都很有深度,單鏈表反轉(zhuǎn),長短輪詢,前端vitals優(yōu)化,keepalive原理之類的,然后手?jǐn)]了一個(gè)快排算法,面試通過之后,第二天就到CEO面,效率很高,CEO的履歷我面試前查過,是工商管理畢業(yè)的,不懂技術(shù)。所以面試的時(shí)候特意跟他聊了聊老東家關(guān)于項(xiàng)目周轉(zhuǎn)率和規(guī)模成本的控制,CEO很感興趣,在這方面和我聊了很多,我也很長見識。到最后是例行打壓工資環(huán)節(jié),他問我如何看待有些畢業(yè)生一畢業(yè)就有我這樣的水平,而且體力更好,頭腦更靈活,問我是怎么看待的。他著重強(qiáng)調(diào)了而且二字。我告訴他,我也負(fù)責(zé)招聘,我們集團(tuán)每年招聘500多研發(fā)畢業(yè)生,一年后能有卓越成績的只有3-4人,1%都不到,貴司現(xiàn)在就招一個(gè)架構(gòu)師,你怎么能保證你招進(jìn)來的畢業(yè)生就能勝任業(yè)務(wù),就是這1%呢?CEO聽完笑了笑,沒說話,然后說如果你現(xiàn)在能定下來,就能拿到35w年薪。我不喜歡這種緊迫的感覺,所以直接回復(fù)他,考慮一周再答復(fù)您,也就是婉拒了。
我這里插一句,其實(shí)招聘就是玄學(xué),除了學(xué)歷之外,其他的都可以造假,而且沒法證偽,一個(gè)人能不能勝任業(yè)務(wù),能不能融入團(tuán)隊(duì),性格有沒有缺陷,通過兩三場面試是很難看出來的。所以CEO講的畢業(yè)生一畢業(yè)就有我這樣的水平,而且體力更好,頭腦更靈活,這種情況根本就是一個(gè)偽命題,他是不可能提前知曉這個(gè)人能否勝任。大公司招人都要靠絕對的數(shù)量來抵消這種不確定性,小公司只招一個(gè)人,那就只能聽天由命了。
然后就是聯(lián)通,面了兩輪技術(shù)面,都不是很難,很重基礎(chǔ),我想應(yīng)該是因?yàn)閲蠛兔衿蟮膫?cè)重點(diǎn)不一樣吧。但面完之后,我意識到一個(gè)嚴(yán)重的問題,就是大廠都是在用react,而我?guī)缀鯖]有react的經(jīng)驗(yàn),又想要高薪,這樣就只能去小公司了,但去小公司又沒有保障,自己也不甘心,所以干脆選擇閉關(guān),過年那十天在B站找視頻,開始速成react,redux,saga,然后看了umi,dva,antd和antv,直到我看完了antd pro和ProComponent,我感覺我react已經(jīng)入門了,應(yīng)該可以繼續(xù)面試了,此時(shí)已經(jīng)是大半個(gè)月之后,過完年的事情了。
第三家是cvte,效率也特別高,一周之內(nèi)三輪面試,問的特別深入,都是要闡述原理的那種發(fā)散性問題,比如你覺得為什么cookie不能跨域、瀏覽器是怎么實(shí)現(xiàn)跨平臺的、同時(shí)并發(fā)20個(gè)http請求,但每次只能有三個(gè)請求發(fā)出去,如何實(shí)現(xiàn)、1000個(gè)if,elseif嵌套在一起怎么優(yōu)化、settimeout會不會阻塞ui、webpack的CDN怎么玩等等,都是這種很發(fā)散的問題,還好我以前也不是正經(jīng)的前端,天天玩硬件和通信,基本都能答得上來,最后終面是視頻筆試,給面試官共享屏幕寫代碼,一共二個(gè)題,只記得其中一個(gè):判斷一個(gè)字符串中的{}是否閉合。要求先寫測試用例,然后編碼,最后執(zhí)行用例看結(jié)果,我用棧平衡算法寫的,我感覺用正則應(yīng)該也行,但是我不太會,就沒敢寫,最后棧平衡也通過那些測試用例了,終面通過。
然后是歡聚,也是廣州的大廠,除了基礎(chǔ)之外,還問了好多關(guān)于視頻原理的問題,比如STUN和ICE區(qū)別,h264編碼原理,mp4預(yù)加載過程等等,考察的很深入,很重基礎(chǔ),和cvte面的感覺差不多,很多東西都是面試官聊的時(shí)候臨時(shí)問出來的,靠刷題是絕對過不了的。
之后是字節(jié),字節(jié)在廣州是飛書團(tuán)隊(duì)。不得不說字節(jié)是真的拼,hr和面試官,直接約我周日面,面了一下午,聽說字節(jié)是996,然后到了周日也不休息,還要來面試嗎,太夸張了吧?搞不太懂。不過面試官非常nice,出了一個(gè)場景和我討論如何實(shí)現(xiàn)一個(gè)繪圖需求, 主要是關(guān)于canvas的優(yōu)化方案,我給出了分層渲染,編碼壓縮,圖形碰撞檢測的一些方案。圖形這一塊我主要是研究vr和3d這些,canvas用的很少,我感覺面的效果不是很理想,面完面試官也沒給結(jié)果,估計(jì)就成了字節(jié)的備胎了,和當(dāng)年在深圳面平安集團(tuán)的感覺是一樣一樣的,隔個(gè)十天半個(gè)月就回來詐個(gè)尸,喊你繼續(xù)面。那我也把你當(dāng)備胎,互為備胎,哈哈。
然后是華為OD,開始還以為是華為在招人,就答應(yīng)面試了,然后面的時(shí)候告訴我是華為外包,一聽華為外包就火大,一下子讓我想起當(dāng)年在深圳被中軟欺負(fù)的事情,本想著當(dāng)場拒了的,然后那個(gè)hr居然用錢誘惑我,說我找工作為了什么,就是錢啊,外包也能給你很多很多的錢,不比正式員工少,只要你能面過,你沒有理由拒絕的。好吧,你贏了,看在錢的份上就繼續(xù)參加,然后hr給了我一個(gè)連接,進(jìn)入之后是一個(gè)倒計(jì)時(shí),90分鐘三道算法題,具體題目:一個(gè)是大量數(shù)字排序(快排),一個(gè)是大量字符串匹配(KMP),還有一個(gè)是組織結(jié)構(gòu)篩選(B樹后序遍歷)。然后每個(gè)題都有空間和時(shí)間復(fù)雜度的限制,一下我就傻了,我大概知道是用這三個(gè)算法,但是手?jǐn)]還是有點(diǎn)費(fèi)勁,時(shí)間復(fù)雜度都不達(dá)標(biāo),所以掙扎了50分鐘就放棄了,交了白卷。沒想到時(shí)隔許久,又栽在華為外包上了,雖然這次沒有給我造成經(jīng)濟(jì)損失,但侮辱性極強(qiáng),我以后再也不參加任何和華為有關(guān)的面試了,真的受不了了。
最后一家云宏,他家約面試比較晚了,我當(dāng)時(shí)已經(jīng)接了offer,也提了離職,新房子都租好了,所以就比較輕松,面試官也挺好的,看我也沒有求職需求,就一直在跟我介紹自家的業(yè)務(wù)。這其實(shí)是一家小而美的行業(yè)獨(dú)角獸,在通信虛擬機(jī)行業(yè)近乎壟斷級別的存在,感覺他家老板眼光很獨(dú)到,找到這樣一個(gè)賽道,幾乎沒有競爭對手,躺著就把錢賺了。真是生了一雙慧眼啊。
這次的跳槽面試就這樣了,前端我是從17年自學(xué)轉(zhuǎn)行,19年自學(xué)完成開始找工作,那一年我30歲,在深圳四處碰壁,拿著7k的工資,到31歲翻倍到18k,今年32歲又有了一次漲幅,兩年間翻了接近四倍。前端程序員這個(gè)行業(yè)真的是鍥而不舍,金石可鏤,只要扎扎實(shí)實(shí)打磨技術(shù),付出就會有回報(bào),也祝大家都能心想事成
---------------這是分割線-----------------
下面是我最近遇上的一些題和我經(jīng)常面別人的題,希望對大家有所幫助
BFC是什么
函數(shù)this指向
-
長輪詢和短輪詢區(qū)別
短輪詢由瀏覽器控制定時(shí)器,長輪詢由服務(wù)器控制定時(shí)器
-
307狀態(tài)碼意義
實(shí)現(xiàn)冪等性
時(shí)鐘角度
-
常用的vitals項(xiàng)
TTFB,LCP,CP,CLS
元素如何居中
css中哪些屬性能夠繼承
-
electron 調(diào)用系統(tǒng)函數(shù)
libuv中使用binding
實(shí)現(xiàn)一個(gè)簡單RPC調(diào)用
-
STUN和ICE區(qū)別
ICE是通用標(biāo)準(zhǔn),STUN是一種常用的NAT穿透技術(shù)
-
h264編碼原理
I:關(guān)鍵幀,P:前項(xiàng)幀,參考前一幀生成畫面,B:雙向幀
-
數(shù)組去重
Set,lodash.uniq,原生方法
concat會不會改變數(shù)組
-
如何判斷圖形被選中
獲取點(diǎn)擊位置, 射線法
-
vue的keepalive原理
在VNode中設(shè)置一個(gè)標(biāo)志,跳過從新渲染和數(shù)據(jù)獲取
-
快排時(shí)間復(fù)雜度
最慢n2 一般nlogn
-
一個(gè)函數(shù)中有100個(gè)if,else如何優(yōu)化
策略模式
-
前端圖片壓縮方法
canvas, new Image()
你項(xiàng)目中為什么不用canvas壓縮圖片,卻要自己寫轉(zhuǎn)碼函數(shù)
-
你的轉(zhuǎn)碼函數(shù)為什么用多種語言重構(gòu)過,談?wù)刵ode,java和go的區(qū)別
node是單進(jìn)程,異步IO,發(fā)布訂閱模式,適合IO密集型應(yīng)用,不適合計(jì)算密集型,是并行弱,并發(fā)強(qiáng)的一種語言
go可以發(fā)揮cpu多核優(yōu)勢,適合計(jì)算密集型應(yīng)用
java適合大型應(yīng)用后臺,特點(diǎn)在于分布式,服務(wù)發(fā)現(xiàn),動態(tài)擴(kuò)容,負(fù)載均衡
cookie如何跨域
-
如何判斷單鏈表有環(huán)
我: 給指針一個(gè)生命周期,生命長度為鏈表長度,生命結(jié)束時(shí)還沒走出鏈表,證明有環(huán).
再想想
我: 快慢雙指針,如果快指針追上慢指針說明有環(huán)
這兩種方案有何優(yōu)劣
第一種適合鏈表狀態(tài)已知的情況,有局限性
-
es6的import和commonJS引用有何區(qū)別
import相當(dāng)于C++中的#define,是一個(gè)指針, 在打包時(shí)就執(zhí)行了, require是一個(gè)實(shí)例,在運(yùn)行時(shí)才執(zhí)行
-
同時(shí)并發(fā)20個(gè)http請求如何做到
用函數(shù)體發(fā)送
-
同時(shí)并發(fā)20個(gè)http請求,但每次只能有三個(gè)請求發(fā)出去
設(shè)計(jì)了一個(gè)帶索引值的消息隊(duì)列
-
aria-label了解嗎?
一種針對盲人的web設(shè)計(jì)規(guī)則
-
settimeout會不會阻塞ui,為什么
不會,ui由v8控制, timer,io,net這些由libuv控制,兩者互不干擾,只有大量計(jì)算才會阻塞UI
-
如何處理大量計(jì)算
多線程+消息訂閱
-
優(yōu)化webpack打包速度
dll, tree-shaking, cdn
-
webpack的hash有哪幾種
hash,chunkhash,contentHash
-
如何配置CDN
externals
-
MP4和flv有什么區(qū)別
區(qū)別不大,都是容器,mp4通過多個(gè)buffer緩沖來預(yù)加載,flv直接獲得流
凸圖形和凹圖形如何判斷碰撞
-
canvas優(yōu)化方案
多圖層渲染(參考H264)
-
編程題
判斷一個(gè)字符串中的{}是否閉合 (先寫測試用例 {{]), 123, }{}111, {\t\n\r}, {\}} {a:123} , 大概就是這么幾種情況吧,然后我寫了一個(gè)堆棧平衡的算法,勉強(qiáng)通過)
function(str:String):Boolean=>{ if(typeof str !=='string' || !str) return false if(str.indexOf('{')===-1) return false const stack :String[] =[] let startNumber=0 str.split('').forEach((i,index) => { if(i==='{'){ stack.push(i) startNumber=index } if(i==='}'&&startNumber>0){ if(stack.length>0){ stack.pop() }else{ return false } } }); return stack.length===0 }
手寫快排算法和插入排序算法
//快排
function qsAdjust(arr: number[], low: number, high: number): number {
const temp = arr[low];
while (low < high) {
while (low < high && arr[high] >= temp) {
high--;
}
if (low < high) {
arr[low] = arr[high];
}
while (low < high && arr[low] <= temp) {
low++;
}
if (low < high) {
arr[high] = arr[low];
}
}
arr[low] = temp;
return low;
}
function qs(arr: number[], low?: number, high?: number): number[] {
if (high <= low) return;
if (!low) low = 0;
if (!high) high = arr.length - 1;
const standard = this.qsAdjust(arr, low, high);
this.qs(arr, low, standard - 1);
this.qs(arr, standard + 1, high);
return [...arr];
}
//插入排序
function insert<T>(array: Array<T>): Array<T> {
for (let i = 0; i < array.length - 1; i++) {
const value = array[i + 1];
let j = i;
for (; j >= 0 && value < array[j]; j--) {
array[j + 1] = array[j];
}
array[j + 1] = value;
}
return [...array];
}
-
一個(gè)json結(jié)構(gòu)的組織層級[{id:1,children:[]}, {id:2}],從中刪除一個(gè)節(jié)點(diǎn)
function clearTreeNode(tree,id){ if(!(tree instanceof Array) || isNaN(id) || !tree.length) return false let find=false for(let i=0; i<tree.length;i++){ if(tree[i].id=id){ tree.splice(i,1) find=true }else if(tree[i].children&&tree[i].children.length){ find=clearTreeNode(tree[i].children,id) } if(find) break; } return find } -
單鏈表反轉(zhuǎn)
while(n1) n0=null n1.next=n0 n0=n1 n1=n2 if(n2){ n2=n2.next } }
-
前端的未來是什么
5g時(shí)代嵌入式,vr和音視頻造前端會普及
遇到過壓力最大的事是什么
職業(yè)生涯中感覺最困難的是什么
遇到過最不能忍受的事情是什么
對你影響最大的人是哪位
一個(gè)技術(shù)團(tuán)隊(duì)中最重要最需要關(guān)注的是什么
為什么離職
-
是否主導(dǎo)開發(fā)? 前端團(tuán)隊(duì)規(guī)模? 項(xiàng)目用戶多少?
前端基礎(chǔ)
元素如何居中
css中flex:1 什么意思
flex能被繼承嗎?
sass中變量怎么定義
與css相比sass優(yōu)勢和不足
true || false ? 1 : 2 輸出是什么
父子組件通信
生命周期,什么時(shí)候請求向后端數(shù)據(jù),渲染了幾次
router 有哪些形式, 區(qū)別是什么
設(shè)計(jì)數(shù)組增刪改方法, 要求不能改變原數(shù)組
v-if和v-show區(qū)別【Vue】
為什么data要返回一個(gè)函數(shù)【Vue】
useEffect, 第二個(gè)參數(shù)什么意思, 不填會怎么樣【React】
如何更新組件狀態(tài), this.state.name='A'可以嗎? 為什么【React】
給實(shí)習(xí)生解釋泛型/ type interface區(qū)別/ interface 有什么用
給實(shí)習(xí)生解釋redux【React】
給實(shí)習(xí)生解釋vuex【Vue】
場景:logo, 測試環(huán)境下顯示logoTest, 生產(chǎn)環(huán)境下logoPro, 代碼怎么寫
import require 有何區(qū)別, 按需加載如何實(shí)現(xiàn)
計(jì)算機(jī)基礎(chǔ)
如何判斷單鏈表有環(huán)
二叉樹前序遍歷abc,后序遍歷是什么
快排時(shí)間復(fù)雜度
一個(gè)函數(shù)中有100個(gè)if,else如何優(yōu)化
內(nèi)存垃圾怎么清理
cookie如何跨域
項(xiàng)目經(jīng)驗(yàn)
websocket : 101狀態(tài)碼
websocket 和http區(qū)別
長輪詢和短輪詢區(qū)別
gzip原理
描述你設(shè)計(jì)的圖片壓縮算法
優(yōu)化webpack打包速度
webpack輸出到cdn,如何配置
webpack的hash有哪幾種
-
常用的vitals項(xiàng)
TTFB,LCP,CP,CLS
304狀態(tài)的意思,哪些類型文件需要設(shè)置
尷尬專用
期望年薪多少
上一份工作中最有成就感的事情
壓力最大的事請是做什么,怎么克服的
一個(gè)技術(shù)團(tuán)隊(duì)中最重要最需要關(guān)注的是什么
為什么離職