野生程序員的故事
野生程序員是指僅憑對計算機開發(fā)的興趣進入這個行業(yè),從前端到后臺一手包攬,但各方面能力都不精通的人。野生程序員有很強大的單兵作戰(zhàn)能力,但是在編入“正規(guī)軍”之后,可能會不適應新的做事方法。
遭遇“野生程序員”
騰訊公司內(nèi)部的團隊很多,在團隊管理上有項目和專業(yè)兩個維度。也就是說,有些團隊是項目維度的,整個團隊共同維護一個產(chǎn)品,成員來自不同的職業(yè)崗位;有些團隊是專業(yè)維度的,比如一個組都是前端工程師,維護不同的產(chǎn)品。
因為前端組是設(shè)計部最接近后臺技術(shù)的團隊,所以團隊平時的工作和技術(shù)交流分享,都不局限于前端技術(shù)領(lǐng)域,還包括很多服務器端或者移動端的技術(shù)。從前端到后端,一些技術(shù)問題都要我們自己來解決。
在招聘前端工程師的時候,我們對應聘者的要求是,在掌握基本前端技術(shù)的前提下,最好有更為全面的技術(shù)。這樣,即使我們的項目人力結(jié)構(gòu)、平臺和方向發(fā) 生變化的時候,他也能夠更加靈活地轉(zhuǎn)移到其他角色中。而且技術(shù)的全面更能表現(xiàn)一個人對技術(shù)的熱情以及較強的學習能力。從團隊多樣性來講,多一些技術(shù)種類的 話,大家在一起也能碰撞出新的火花。
有一次,我在QQ群發(fā)布了一條簡單的信息:“招聘前端工程師,全棧更佳。”隨后有一個“全棧工程師”A君向我自薦。
我仔細看了他的簡歷:“三年工作經(jīng)驗,擅長PHP、MySQL數(shù)據(jù)庫、jQuery、HTML和CSS,對CDN加速和網(wǎng)絡安全也頗有研究。”他的簡歷讓我眼前一亮,于是我跟他進行了一次簡單的電話面試。
電話面試的第一個環(huán)節(jié)照例是讓A君簡短地介紹自己。A君在一個傳統(tǒng)行業(yè)的小公司做IT技術(shù)支持工作,公司的3個網(wǎng)站項目都是他一手搭建,從架構(gòu)到編 碼細節(jié)他都如數(shù)家珍。他號稱能解決一切技術(shù)問題,老板提出的所有需求都能完成,而且只有他能完成。隨著最近公司業(yè)務量越來越大,他還招了兩個下屬,但是主 要的編程工作還是他在做。
我問他:“我們的職位是前端工程師,那么您有哪些前端方面的技能呢?”他回答:“我擅長HTML、CSS和JavaScript。”
“對于Web性能優(yōu)化,您有哪些了解和經(jīng)驗嗎?”他思索了一陣答道:“我們在發(fā)布項目之前壓縮CSS和JavaScript源代碼,這樣文件體積就變小了,用戶加載必要資源所花的時間也就更短了。”我繼續(xù)說道,很好,還有嗎?他想了半天,答不上來了。
其實關(guān)于Web性能優(yōu)化,有非常多的方面可以去做,我希望應聘者能盡量多回答一些。
壓縮源碼和圖片
JavaScript文件源代碼可以采用混淆壓縮的方式,CSS文件源代碼進行普通壓縮,JPG圖片可以根據(jù)具體質(zhì)量來壓縮為50%到70%,PNG可以使用一些開源壓縮軟件來壓縮,比如24色變成8色、去掉一些PNG格式信息等。
選擇合適的圖片格式
如果圖片顏色數(shù)較多就使用JPG格式,如果圖片顏色數(shù)較少就使用PNG格式,如果能夠通過服務器端判斷瀏覽器支持WebP,那么就使用WebP格式和SVG格式。
合并靜態(tài)資源
包括CSS、JavaScript和小圖片,減少HTTP請求。
開啟服務器端的Gzip壓縮
這對文本資源非常有效,對圖片資源則沒那么大的壓縮比率。
使用CDN
或者一些公開庫使用第三方提供的靜態(tài)資源地址(比如jQuery、normalize.css)。一方面增加并發(fā)下載量,另一方面能夠和其他網(wǎng)站共享緩存。
延長靜態(tài)資源緩存時間
這樣,頻繁訪問網(wǎng)站的訪客就能夠更快地訪問。不過,這里要通過修改文件名的方式,確保在資源更新的時候,用戶會拉取到最新的內(nèi)容。
把CSS放在頁面頭部,把JavaScript放在頁面底部
這樣就不會阻塞頁面渲染,讓頁面出現(xiàn)長時間的空白。
每一個條目都可以進一步深層挖掘下去。
Web性能優(yōu)化分為服務器端和瀏覽器端兩個方面。
Web性能優(yōu)化分為服務器端和瀏覽器端兩個方面。
此外,由于中文的歧義性,Web性能優(yōu)化這個詞既可以解讀成頁面加載速度(Page Speed)的優(yōu)化,也可以解讀成頁面渲染性能(Page Performance)的優(yōu)化。或者是二者的集合。所以,應聘者如果能在這個問題上多做一些分析,會有很高的加分。但是A君在網(wǎng)絡性能方面的研究只是淺 嘗輒止,停留在壓縮資源方面,這說明他還沒有足夠理解HTTP協(xié)議本身。
關(guān)于網(wǎng)絡性能和HTTP協(xié)議,作為大公司的前端工程師是非常看重的,因為每一個頁面都會有億萬用戶訪問量,任何一點對服務器帶寬壓力都會積少成多,最終造成很大的成本。關(guān)于這方面的技術(shù)詳解,我在后面會有一篇單獨的文章來分析。
接著上面的故事,我想既然他對Web性能優(yōu)化方面不太熟悉,可能他是一個偏后臺的程序員,因而就又問道:“關(guān)于服務器端MVC架構(gòu)的技術(shù)實現(xiàn),您是怎樣理解的?”他說:“是數(shù)據(jù)模型、視圖、控制器的分離。”
我更進一步問道:“這種架構(gòu)方式有什么好處?您在項目中是如何應用這一架構(gòu)的?”他回答說:“MVC的架構(gòu)方式會讓項目可維護性更高,所有涉及界面 的代碼都在視圖(View)里面,所有涉及核心邏輯的代碼都在模型(Model)里面,URL路由之類的代碼都在控制器(Controller)里面。我 在項目中使用了MVC架構(gòu)的PHP框架——CodeIgniter。”
我一邊打開他的網(wǎng)站,一邊繼續(xù)跟他電話溝通。當看到網(wǎng)站的CSS代碼都直接內(nèi)嵌在HTML頭部的時候,我忍不住問他:“為什么您的網(wǎng)站的CSS代碼 都內(nèi)嵌在HTML里面呢,是使用自動化工具合并進去的嗎?”他支支吾吾地說:“因為在本地調(diào)試的時候,CSS文件修改經(jīng)常不生效,所以就直接在HTML里 面改了,這樣比較快。”
好吧,我想這是一個典型的“知易行難”的開發(fā)者,他知道采用MVC架構(gòu)的項目的可維護性更高,可是在分離樣式與結(jié)構(gòu)上面還沒有達到最基本的要求,甚 至把CSS寫在HTML中。至于他說的在本地環(huán)境上發(fā)現(xiàn)CSS文件經(jīng)常緩存,可能要看看本地服務器的緩存設(shè)置是否有問題,然后再做調(diào)試。稍微了解一點 HTTP的瀏覽器端緩存,這就不是難事了。我更欣賞在開發(fā)流程上花工夫去理解和優(yōu)化的應聘者,而不是馬馬虎虎,只是以完成需求為目標的人。
我突然想到他說的“所有需求他都能完成,且只有他能完成”,于是就想問問他代碼版本管理方面的問題。我說:“您們團隊現(xiàn)在加入了兩個新人,那么您們 如何進行代碼版本管理?”他回答:“我們有一臺測試服務器,用FTP來測試代碼,如果在測試機上沒有問題的話,我們就會發(fā)布到生產(chǎn)環(huán)境。”
我說:“等等,我不是問您們代碼部署的問題,是平時您們?nèi)绾喂芾泶a版本,如何分工協(xié)作的?”他說:“我們把代碼從測試服務器上拷下來,修改完了之后再傳上去。”
到這里,我終于明白為什么他們團隊的新人無法快速融入項目了,因為項目沒有使用SVN或者Git這樣的版本管理工具。團隊只有一個人在寫代碼的時 候,缺乏版本管理工具的問題可能還不會暴露出來,但是當更多成員加入時,整個項目就會寸步難行,大家都要花大量的時間合并代碼,以及找回丟失的代碼。萬一 出現(xiàn)了外網(wǎng)bug,版本工具也能幫我們把站點狀態(tài)快速恢復到之前的時間點。在本書的后面章節(jié),我會詳細介紹版本管理工具。
最后我抱著幾乎絕望的心情,問了下關(guān)系數(shù)據(jù)庫設(shè)計原則方面的問題,他的回答也不是很理想。
我知道,我又遭遇了“野生程序員”。
什么是“野生程序員”
所謂“野生程序員”,就是沒有計算機基礎(chǔ)知識和相關(guān)教育經(jīng)歷,靠著對計算機開發(fā)的興趣進入這個行業(yè),雖然知識面比較廣,但是各方面都一知半解的開發(fā)者。
這幾年我從一個求職者,轉(zhuǎn)變成一個招聘者,有一個感受就是,中國高等教育與市場需求不接軌。學校不了解市場究竟需要什么樣的人才,其設(shè)立的課程和技 術(shù)往往比市場技術(shù)現(xiàn)狀落后了5年以上。我在大學學習用ASP建站,但是現(xiàn)在已經(jīng)幾乎沒有人用ASP建站了。一個直接的后果是,很多高校畢業(yè)生不能滿足企業(yè) 的要求。
與此同時,中國互聯(lián)網(wǎng)市場蓬勃發(fā)展,特別是移動互聯(lián)網(wǎng)的發(fā)力,讓中國跳過“WAP時代”,直接進入“App時代”。市場的熱錢都投入到互聯(lián)網(wǎng)行 業(yè),“BAT”等大公司不斷擴張,創(chuàng)業(yè)公司也如雨后春筍,整個市場對軟件工程師的需求缺口巨大,所以很多公司在招人的時候,沒法招聘到“專業(yè)”的計算機專 業(yè)畢業(yè)生。
在美國,因為教育與市場穩(wěn)定發(fā)展了很多年,供求關(guān)系相對平衡,計算機相關(guān)專業(yè)本科已經(jīng)成為基本要求。舉例而言,美國的硅谷公司(如Google)絕大部分前端開發(fā)招聘崗位都有一個最低要求——本科學歷,計算機相關(guān)專業(yè)。
相比而言,從中國的大公司(如騰訊)的招聘網(wǎng)站上可以看出,有一些前端開發(fā)崗位沒有對學歷的要求,也有一些要求“本科及以上學歷”,少數(shù)才會要求 “本科學歷,計算機相關(guān)專業(yè)”。我們的團隊中就有一些成員是大專學歷。許多企業(yè)在招聘的時候往往放松了對學歷的要求,只看重項目和經(jīng)驗,而不看重學歷。這 是一件好事,代表市場在高等教育的規(guī)模和質(zhì)量都跟不上市場要求的情況下,給予更多有興趣和能力的年輕人進入IT領(lǐng)域的機會,也填補了人才市場的空缺。
美國硅谷,是世界互聯(lián)網(wǎng)公司的中心,是所有求職者夢寐以求的圣地。在最開始,硅谷之所以名字當中有一個“硅”字,是因為當?shù)仄髽I(yè)多數(shù)是從事加工制造 高濃度硅的半導體行業(yè)和電腦工業(yè)。隨后,互聯(lián)網(wǎng)公司和軟件公司漸漸取代傳統(tǒng)的硬件公司,讓硅谷獲得了新的生命,但硅谷這個名字保留了下來。在硅谷從誕生到 發(fā)展壯大的整個生命周期中,斯坦福大學起到了很大的作用,我認為稱之為硅谷的母親也不為過。
在中國,由于政策、環(huán)境、歷史原因,還有大學教育投入上的差異,導致大學在整個互聯(lián)網(wǎng)發(fā)展中起的作用沒那么大。中美兩國IT人才市場供求關(guān)系上的這些差別,也反映在整個行業(yè)文化中。
一個直觀的反映就是軟件工程師的“草根”化。其實很多軟件工程師的收入都很高,處于中上層水平,相比金融行業(yè)的白領(lǐng)也毫不遜色,但是一談起程序員, 大家的印象還是“一年四季的T恤(在行業(yè)展會上免費拿的)牛仔褲,平時也喜歡宅在家里,不會像同樣收入的金融白領(lǐng),平時愛好聽歌劇打高爾夫球”。這種差異 一方面是外部人士對軟件工程師職業(yè)的偏見,另一方面也是程序員行業(yè)的自黑習慣。在招聘時崗位要求就已經(jīng)放到最低:不要求學歷、上班不要求著裝、上下班時間 靈活,這樣才好更方便地招聘。而金融行業(yè)有意識地塑造一種“精英”文化,從學歷就設(shè)置高門檻,即使有些工作根本不需要那么高的學歷。
回到畢業(yè)生的話題,很多跨專業(yè)的學生發(fā)現(xiàn)自己興趣在互聯(lián)網(wǎng)和計算機方向的時候,就開始了自學之路,基本上學習方式有這樣幾種。
-
書:在計算機圖書領(lǐng)域,技術(shù)難度跟圖書銷量是成反比的,從標簽教起的HTML/CSS基礎(chǔ)書籍賣得最好,其次是關(guān)于JavaScript和jQuery的書,Angular和Node.js之類的就沒那么暢銷了。
-
互聯(lián)網(wǎng):得益于全世界都在互聯(lián)網(wǎng)上共享的資源,現(xiàn)在的學習者有了更多的選擇,比如關(guān)于Web開發(fā)基礎(chǔ)教學的W3CSchool,還有海量的技術(shù)博客。我個人喜歡訂閱一些英文大站,比如Smashing Magazine、tuts+等。我在讀大學的時候,Google Reader還沒有永久關(guān)閉,那時候我很喜歡用RSS來關(guān)注這些站點的更新情況。Google Reader下線后,就基本上廢棄了RSS閱讀的習慣,轉(zhuǎn)而用一些社交網(wǎng)站來追蹤更新情況,但是有時還是會淹沒在大量無用的信息里面。
-
社團:學校的網(wǎng)站社團也孕育了許多能力很強的開發(fā)者,社團經(jīng)過歷屆的傳幫帶,技術(shù)有所積累,比如師兄會教師弟用Sublime編輯器,這就比還在用 Dreamweaver的同學更有優(yōu)勢。此外,學校社團有一些定點客戶,比如學校教務處、周邊商戶,所以有更多的實戰(zhàn)經(jīng)驗,在畢業(yè)時作品集也豐富了不少。
因為有這樣一些自學渠道,所以不一定只有計算機專業(yè)畢業(yè)的學生才有機會進入互聯(lián)網(wǎng)行業(yè)。畢業(yè)之后,這些計算機愛好者進入不同的工作崗位,不同的是,有些進入大公司,有些進入小公司。這兩者的成長軌跡往往會不太一樣。
小公司有很多野生程序員
流水線工作流程有諸多優(yōu)點,但一般來說,大公司才需要很多專精某種技術(shù)的工程師,組成一個Web開發(fā)團隊。創(chuàng)業(yè)公司只需要幾個技術(shù)全面的人來做開發(fā)和技術(shù)支持,有時候甚至只有一兩個人而已。
當然,最主要的原因就是成本和回報的問題。招聘和維持龐大的IT研發(fā)團隊需要一筆不小的開支,小公司并沒有那么多Web服務的需求,一般企業(yè)可能只 需要一個公司站點就可以了,現(xiàn)在甚至完全不需要Web站點,可以用微信公共賬號或者淘寶這樣的大平臺來完成。如果招聘一個完整的Web研發(fā)團隊,從用戶研 究到交互設(shè)計、從App開發(fā)到數(shù)據(jù)庫管理,直接后果就是整個團隊大部分時間都空閑著,無事可做。與之相比,聘請一個或多個全棧工程師會更高效、更省錢。
第二個原因是,很多傳統(tǒng)線下公司并不會特別依賴IT技術(shù),有些時候線下渠道占據(jù)了公司大部分收入來源,所以公司不需要架設(shè)十分完善的線上服務。由于 線上服務的用戶量少,所以Web服務對穩(wěn)定性、承受壓力、用戶體驗的要求都沒有那么高。此外,由于沒有太多重要的用戶數(shù)據(jù),所以異地容災也不需要。
因為公司的開發(fā)團隊小,所以網(wǎng)站無論出現(xiàn)什么問題,都需要他們?nèi)ソ鉀Q。從域名到服務器,從前端到后臺,從設(shè)計到內(nèi)容,都是一人包攬。野生程序員了解 的知識越來越多,但是樣樣都不精通。我認識幾個小公司的程序員,他們沒有明確的職稱,開發(fā)者都統(tǒng)稱為程序員,設(shè)計師都統(tǒng)稱為美工。
在Web技術(shù)的任何方向,比如前端開發(fā)或者服務器端開發(fā),他們既沒有很強的經(jīng)驗,也沒有明確的興趣。那么當他想跳槽到大公司的時候,會發(fā)現(xiàn)大公司對崗位和職責的細分非常明確,而自己的能力達不到某個細分崗位的要求。所以他們很難在專業(yè)上繼續(xù)進步,從而陷入原地踏步的窘境。
大公司還是創(chuàng)業(yè)公司
在許多論壇上,常常會看到畢業(yè)生提出這樣的問題:現(xiàn)在有一個大公司和一個創(chuàng)業(yè)公司的機會擺在我面前,我應該選擇哪一個?其實每個人有不同的想法、不 同的風險偏好,旁人沒辦法針對這個寬泛的問題給出標準的答案。但是既然提問者是畢業(yè)生,這種情況下我還是建議選擇大公司,因為會選擇創(chuàng)業(yè)公司的人往往有自 己的主見,已經(jīng)接受創(chuàng)業(yè)公司的邀請去工作了,不會去發(fā)帖詢問大家的意見。當然這是開玩笑,真正的原因是,在大公司的頭兩年,是從學生到職場人士的一個轉(zhuǎn) 變,您可能會從大平臺學習到一些規(guī)范的流程方法,養(yǎng)成一些足以影響您一生的習慣,認識更多的能對您職場有幫助的人脈。
大公司能給您的
較小的風險
每個公司都有倒閉的可能,但是,顯然大公司比小公司的風險低多了。如果您的風險承受能力較低,那么不得不考慮這個因素。
技術(shù)最佳實踐
在大公司,對代碼質(zhì)量和一致性的要求很高,所以一般在最終發(fā)布前會有代碼審查(Code Review)流程和項目總結(jié)會等。如果您完成了一個任務,但是沒有采用最佳實踐,只是hack{![所謂hack,就是不優(yōu)雅的解決方案。比如一個界面 的調(diào)整,如果采用最佳實踐,需要用MVC架構(gòu)來分離出界面相關(guān)的代碼,并且把有可能相關(guān)的變量提取出來,合理命名并且放在合理的位置。如果是hack,可 能就不管這么多,看見哪里需要修改就原地修改了,表面上看很快解決了問題,可是這會給后面跟進的同事造成很大的困擾。]}了一下,那么其他同事可能都會指 出您的問題,并且要求您改正之后再提交。小公司或者創(chuàng)業(yè)公司人力比較緊張,在他們看來,快速實現(xiàn)和上線,比優(yōu)雅地上線更重要,所以對于一些最佳實踐類的問 題,只能睜一只眼閉一只眼啦。
垂直專精的技能
大公司專業(yè)分工很細,而且有更多技術(shù)溝通和沉淀的氛圍,所以容易讓人在垂直專精的技術(shù)方向有足夠的發(fā)展。在小公司更能鍛煉技術(shù)的廣度,深度上缺乏鍛 煉的環(huán)境。但是其實二者的利弊,都是外界的,技術(shù)人員的個人成長除了工作時間的鍛煉,還要靠下班后的時間,外界只是給予一個環(huán)境或者機會。
服務海量用戶的經(jīng)驗
同樣是做一個網(wǎng)站,服務少數(shù)用戶量和服務海量用戶量時需要考慮的事情是完全不同的。小網(wǎng)站遇到的問題,大網(wǎng)站一定遇到過,而大網(wǎng)站遇到的問題,小網(wǎng) 站就不一定遇到過了。當一個網(wǎng)站發(fā)展到業(yè)內(nèi)最強時,它的問題沒有人遇到過,這時候就不能凡事問百度、Google或Stack Overflow了,而要自己去探索解決方案。
軟技能
硬技能是指每個職位需要的專業(yè)技能,軟技能則是通用的技能,比如溝通、影響力、項目管理和演講等。越是大公司,越是看重影響力,所以會有很多培訓教您如何提高影響力。
我在面試一些來自小公司的應聘者時,就發(fā)現(xiàn)他平時的工作中,周邊環(huán)境很少有分享和沉淀的習慣。沉淀和總結(jié)是很重要的,在騰訊,設(shè)計師做完一次設(shè)計定 稿之后,就會把設(shè)計的思路,包括整體的設(shè)計風格、設(shè)計規(guī)范和色彩的確定等都總結(jié)成一封郵件或者PPT,發(fā)送給部門同事。每個人都要有意識地維護自己的作品 集,它在半年一次的考核、晉升面試甚至以后的跳槽中都非常有用。但是小公司的設(shè)計師不太會總結(jié)個人作品集,時間緊急是一方面原因,另一個主要原因是環(huán)境不 需要他這樣做,因此就缺乏了這方面的鍛煉。
人脈
每年都有不少人從大公司離職去創(chuàng)業(yè),這是非常自然的事情。對于大公司出來的人來說,之前積累的人脈資源這時候會起到很大的作用,比如創(chuàng)業(yè)期間的一些 合作機會或者資源的互利,等等。萬一創(chuàng)業(yè)失敗,也不會很慘,因為您之前接觸的人脈可以給您提供工作機會。但如果您剛畢業(yè)就選擇創(chuàng)業(yè),創(chuàng)業(yè)失敗之后沒有人能 給您提供工作機會。
心態(tài)
其實大公司能給予畢業(yè)生最大的優(yōu)勢,就是提供一個心智培育的土壤。之前參加面試官培訓的時候,我大概了解過公司招聘一個畢業(yè)生投入的成本。從校園招 聘,到安排面試官面試候選人,再到封閉培訓和一些課程培訓,再給一段時間熟悉項目,最后3個月試用期后可能還要淘汰掉一些。如果把成本平攤到每一個人身 上,這些投入要一年才能收回來。而小公司不會有這么大的耐心去培育一個新人。如果沒有足夠的時間去學習和成長,可能在一兩年后,員工的能力也比較全面,但 是樣樣都不精通,也說不清楚自己的目標是什么,于是就變成了“野生程序員”。
綜合來講,在大公司中,從硬技能到軟技能都會有很多經(jīng)驗豐富的前輩能夠教您,您會在大平臺上學習到很多東西。工作幾年之后,員工的選擇也很多,要么走技術(shù)路線繼續(xù)發(fā)展下去,做高級工程師;要么學習管理和領(lǐng)導力;要么出去創(chuàng)業(yè)。
所以,我的個人建議是,從畢業(yè)生自己前途發(fā)展的角度來看,先加入一家上市大公司是個不錯的選擇。
本文摘自:《Web全棧工程師的自我修養(yǎng)》