野生程式設計師的故事

Web全棧工程師發表於2015-09-07

野生程式設計師是指僅憑對計算機開發的興趣進入這個行業,從前端到後臺一手包攬,但各方面能力都不精通的人。野生程式設計師有很強大的單兵作戰能力,但是在編入“正規軍”之後,可能會不適應新的做事方法。

遭遇“野生程式設計師”

騰訊公司內部的團隊很多,在團隊管理上有專案和專業兩個維度。也就是說,有些團隊是專案維度的,整個團隊共同維護一個產品,成員來自不同的職業崗位;有些團隊是專業維度的,比如一個組都是前端工程師,維護不同的產品。

因為前端組是設計部最接近後臺技術的團隊,所以團隊平時的工作和技術交流分享,都不侷限於前端技術領域,還包括很多伺服器端或者移動端的技術。從前端到後端,一些技術問題都要我們自己來解決。

在招聘前端工程師的時候,我們對應聘者的要求是,在掌握基本前端技術的前提下,最好有更為全面的技術。這樣,即使我們的專案人力結構、平臺和方向發生變化的時候,他也能夠更加靈活地轉移到其他角色中。而且技術的全面更能表現一個人對技術的熱情以及較強的學習能力。從團隊多樣性來講,多一些技術種類的話,大家在一起也能碰撞出新的火花。

有一次,我在 QQ 群釋出了一條簡單的資訊:“招聘前端工程師,全棧更佳。”隨後有一個“全棧工程師”A君向我自薦。

我仔細看了他的簡歷:“三年工作經驗,擅長 PHP、MySQL 資料庫、jQuery、HTML 和 CSS,對 CDN 加速和網路安全也頗有研究。”他的簡歷讓我眼前一亮,於是我跟他進行了一次簡單的電話面試。

電話面試的第一個環節照例是讓A君簡短地介紹自己。A君在一個傳統行業的小公司做 IT 技術支援工作,公司的 3 個網站專案都是他一手搭建,從架構到編碼細節他都如數家珍。他號稱能解決一切技術問題,老闆提出的所有需求都能完成,而且只有他能完成。隨著最近公司業務量越來越大,他還招了兩個下屬,但是主要的程式設計工作還是他在做。

我問他:“我們的職位是前端工程師,那麼您有哪些前端方面的技能呢?”他回答:“我擅長 HTML、CSS 和 JavaScript。”

“對於 Web 效能優化,您有哪些瞭解和經驗嗎?”他思索了一陣答道:“我們在釋出專案之前壓縮 CSS 和 JavaScript 原始碼,這樣檔案體積就變小了,使用者載入必要資源所花的時間也就更短了。”我繼續說道,很好,還有嗎?他想了半天,答不上來了。

其實關於 Web 效能優化,有非常多的方面可以去做,我希望應聘者能儘量多回答一些。

  • 壓縮原始碼和圖片

JavaScript 檔案原始碼可以採用混淆壓縮的方式,CSS 檔案原始碼進行普通壓縮,JPG 圖片可以根據具體質量來壓縮為 50% 到 70%,PNG 可以使用一些開源壓縮軟體來壓縮,比如 24 色變成 8 色、去掉一些 PNG 格式資訊等。

  • 選擇合適的圖片格式

如果圖片顏色數較多就使用 JPG 格式,如果圖片顏色數較少就使用 PNG 格式,如果能夠通過伺服器端判斷瀏覽器支援 WebP,那麼就使用 WebP 格式和 SVG 格式。

  • 合併靜態資源

包括 CSS、JavaScript 和小圖片,減少 HTTP 請求。

  • 開啟伺服器端的 Gzip 壓縮

這對文字資源非常有效,對圖片資源則沒那麼大的壓縮比率。

  • 使用 CDN

或者一些公開庫使用第三方提供的靜態資源地址(比如 jQuery、normalize.css)。一方面增加併發下載量,另一方面能夠和其他網站共享快取。

  • 延長靜態資源快取時間

這樣,頻繁訪問網站的訪客就能夠更快地訪問。不過,這裡要通過修改檔名的方式,確保在資源更新的時候,使用者會拉取到最新的內容。

  • 把 CSS 放在頁面頭部,把 JavaScript 放在頁面底部

這樣就不會阻塞頁面渲染,讓頁面出現長時間的空白。

每一個條目都可以進一步深層挖掘下去。

Web 效能優化分為伺服器端和瀏覽器端兩個方面。

Web 效能優化分為伺服器端和瀏覽器端兩個方面。

此外,由於中文的歧義性,Web 效能優化這個詞既可以解讀成頁面載入速度(Page Speed)的優化,也可以解讀成頁面渲染效能(Page Performance)的優化。或者是二者的集合。所以,應聘者如果能在這個問題上多做一些分析,會有很高的加分。但是A君在網路效能方面的研究只是淺嘗輒止,停留在壓縮資源方面,這說明他還沒有足夠理解 HTTP 協議本身。

關於網路效能和 HTTP 協議,作為大公司的前端工程師是非常看重的,因為每一個頁面都會有億萬使用者訪問量,任何一點對伺服器頻寬壓力都會積少成多,最終造成很大的成本。關於這方面的技術詳解,我在後面會有一篇單獨的文章來分析。

接著上面的故事,我想既然他對 Web 效能優化方面不太熟悉,可能他是一個偏後臺的程式設計師,因而就又問道:“關於伺服器端 MVC 架構的技術實現,您是怎樣理解的?”他說:“是資料模型、檢視、控制器的分離。”

我更進一步問道:“這種架構方式有什麼好處?您在專案中是如何應用這一架構的?”他回答說:“MVC 的架構方式會讓專案可維護性更高,所有涉及介面的程式碼都在檢視(View)裡面,所有涉及核心邏輯的程式碼都在模型(Model)裡面,URL 路由之類的程式碼都在控制器(Controller)裡面。我在專案中使用了 MVC 架構的 PHP 框架——CodeIgniter。”

我一邊開啟他的網站,一邊繼續跟他電話溝通。當看到網站的 CSS 程式碼都直接內嵌在 HTML 頭部的時候,我忍不住問他:“為什麼您的網站的 CSS 程式碼都內嵌在 HTML 裡面呢,是使用自動化工具合併進去的嗎?”他支支吾吾地說:“因為在本地除錯的時候,CSS 檔案修改經常不生效,所以就直接在 HTML 裡面改了,這樣比較快。”

好吧,我想這是一個典型的“知易行難”的開發者,他知道採用 MVC 架構的專案的可維護性更高,可是在分離樣式與結構上面還沒有達到最基本的要求,甚至把 CSS 寫在 HTML 中。至於他說的在本地環境上發現 CSS 檔案經常快取,可能要看看本地伺服器的快取設定是否有問題,然後再做除錯。稍微瞭解一點 HTTP 的瀏覽器端快取,這就不是難事了。我更欣賞在開發流程上花工夫去理解和優化的應聘者,而不是馬馬虎虎,只是以完成需求為目標的人。

我突然想到他說的“所有需求他都能完成,且只有他能完成”,於是就想問問他程式碼版本管理方面的問題。我說:“您們團隊現在加入了兩個新人,那麼您們如何進行程式碼版本管理?”他回答:“我們有一臺測試伺服器,用 FTP 來測試程式碼,如果在測試機上沒有問題的話,我們就會發布到生產環境。”

我說:“等等,我不是問您們程式碼部署的問題,是平時您們如何管理程式碼版本,如何分工協作的?”他說:“我們把程式碼從測試伺服器上拷下來,修改完了之後再傳上去。”

到這裡,我終於明白為什麼他們團隊的新人無法快速融入專案了,因為專案沒有使用 SVN 或者 Git 這樣的版本管理工具。團隊只有一個人在寫程式碼的時候,缺乏版本管理工具的問題可能還不會暴露出來,但是當更多成員加入時,整個專案就會寸步難行,大家都要花大量的時間合併程式碼,以及找回丟失的程式碼。萬一出現了外網 bug,版本工具也能幫我們把站點狀態快速恢復到之前的時間點。在本書的後面章節,我會詳細介紹版本管理工具。

最後我抱著幾乎絕望的心情,問了下關聯式資料庫設計原則方面的問題,他的回答也不是很理想。

我知道,我又遭遇了“野生程式設計師”。

什麼是“野生程式設計師”

所謂“野生程式設計師”,就是沒有計算機基礎知識和相關教育經歷,靠著對計算機開發的興趣進入這個行業,雖然知識面比較廣,但是各方面都一知半解的開發者。

這幾年我從一個求職者,轉變成一個招聘者,有一個感受就是,中國高等教育與市場需求不接軌。學校不瞭解市場究竟需要什麼樣的人才,其設立的課程和技術往往比市場技術現狀落後了 5 年以上。我在大學學習用 ASP 建站,但是現在已經幾乎沒有人用 ASP 建站了。一個直接的後果是,很多高校畢業生不能滿足企業的要求。

與此同時,中國網際網路市場蓬勃發展,特別是移動網際網路的發力,讓中國跳過“WAP 時代”,直接進入“App 時代”。市場的熱錢都投入到網際網路行業,“BAT”等大公司不斷擴張,創業公司也如雨後春筍,整個市場對軟體工程師的需求缺口巨大,所以很多公司在招人的時候,沒法招聘到“專業”的計算機專業畢業生。

在美國,因為教育與市場穩定發展了很多年,供求關係相對平衡,計算機相關專業本科已經成為基本要求。舉例而言,美國的矽谷公司(如 Google)絕大部分前端開發招聘崗位都有一個最低要求——本科學歷,計算機相關專業。

相比而言,從中國的大公司(如騰訊)的招聘網站上可以看出,有一些前端開發崗位沒有對學歷的要求,也有一些要求“本科及以上學歷”,少數才會要求“本科學歷,計算機相關專業”。我們的團隊中就有一些成員是大專學歷。許多企業在招聘的時候往往放鬆了對學歷的要求,只看重專案和經驗,而不看重學歷。這是一件好事,代表市場在高等教育的規模和質量都跟不上市場要求的情況下,給予更多有興趣和能力的年輕人進入 IT 領域的機會,也填補了人才市場的空缺。

美國矽谷,是世界網際網路公司的中心,是所有求職者夢寐以求的聖地。在最開始,矽谷之所以名字當中有一個“矽”字,是因為當地企業多數是從事加工製造高濃度矽的半導體行業和電腦工業。隨後,網際網路公司和軟體公司漸漸取代傳統的硬體公司,讓矽谷獲得了新的生命,但矽谷這個名字保留了下來。在矽谷從誕生到發展壯大的整個生命週期中,史丹佛大學起到了很大的作用,我認為稱之為矽谷的母親也不為過。

在中國,由於政策、環境、歷史原因,還有大學教育投入上的差異,導致大學在整個網際網路發展中起的作用沒那麼大。中美兩國 IT 人才市場供求關係上的這些差別,也反映在整個行業文化中。

一個直觀的反映就是軟體工程師的“草根”化。其實很多軟體工程師的收入都很高,處於中上層水平,相比金融行業的白領也毫不遜色,但是一談起程式設計師,大家的印象還是“一年四季的T恤(在行業展會上免費拿的)牛仔褲,平時也喜歡宅在家裡,不會像同樣收入的金融白領,平時愛好聽歌劇打高爾夫球”。這種差異一方面是外部人士對軟體工程師職業的偏見,另一方面也是程式設計師行業的自黑習慣。在招聘時崗位要求就已經放到最低:不要求學歷、上班不要求著裝、上下班時間靈活,這樣才好更方便地招聘。而金融行業有意識地塑造一種“精英”文化,從學歷就設定高門檻,即使有些工作根本不需要那麼高的學歷。

回到畢業生的話題,很多跨專業的學生髮現自己興趣在網際網路和計算機方向的時候,就開始了自學之路,基本上學習方式有這樣幾種。

  1. 書:在計算機圖書領域,技術難度跟圖書銷量是成反比的,從標籤教起的 HTML/CSS 基礎書籍賣得最好,其次是關於 JavaScript 和 jQuery 的書,Angular 和 Node.js 之類的就沒那麼暢銷了。
  2. 網際網路:得益於全世界都在網際網路上共享的資源,現在的學習者有了更多的選擇,比如關於 Web 開發基礎教學的 W3CSchool,還有海量的技術部落格。我個人喜歡訂閱一些英文大站,比如 Smashing Magazine(http://www.smashingmagazine.com/)、tuts+(http://tutsplus.com/)等。我在讀大學的時候,Google Reader 還沒有永久關閉,那時候我很喜歡用 RSS 來關注這些站點的更新情況。Google Reader 下線後,就基本上廢棄了 RSS 閱讀的習慣,轉而用一些社交網站來追蹤更新情況,但是有時還是會淹沒在大量無用的資訊裡面。
  3. 社團:學校的網站社團也孕育了許多能力很強的開發者,社團經過歷屆的傳幫帶,技術有所積累,比如師兄會教師弟用 Sublime 編輯器,這就比還在用 Dreamweaver 的同學更有優勢。此外,學校社團有一些定點客戶,比如學校教務處、周邊商戶,所以有更多的實戰經驗,在畢業時作品集也豐富了不少。

因為有這樣一些自學渠道,所以不一定只有計算機專業畢業的學生才有機會進入網際網路行業。畢業之後,這些計算機愛好者進入不同的工作崗位,不同的是,有些進入大公司,有些進入小公司。這兩者的成長軌跡往往會不太一樣。

小公司有很多野生程式設計師

流水線工作流程有諸多優點,但一般來說,大公司才需要很多專精某種技術的工程師,組成一個 Web 開發團隊。創業公司只需要幾個技術全面的人來做開發和技術支援,有時候甚至只有一兩個人而已。

當然,最主要的原因就是成本和回報的問題。招聘和維持龐大的 IT 研發團隊需要一筆不小的開支,小公司並沒有那麼多 Web 服務的需求,一般企業可能只需要一個公司站點就可以了,現在甚至完全不需要 Web 站點,可以用微信公共賬號或者淘寶這樣的大平臺來完成。如果招聘一個完整的 Web 研發團隊,從使用者研究到互動設計、從 App 開發到資料庫管理,直接後果就是整個團隊大部分時間都空閒著,無事可做。與之相比,聘請一個或多個全棧工程師會更高效、更省錢。

第二個原因是,很多傳統線下公司並不會特別依賴 IT 技術,有些時候線下渠道佔據了公司大部分收入來源,所以公司不需要架設十分完善的線上服務。由於線上服務的使用者量少,所以 Web 服務對穩定性、承受壓力、使用者體驗的要求都沒有那麼高。此外,由於沒有太多重要的使用者資料,所以異地容災也不需要。

因為公司的開發團隊小,所以網站無論出現什麼問題,都需要他們去解決。從域名到伺服器,從前端到後臺,從設計到內容,都是一人包攬。野生程式設計師瞭解的知識越來越多,但是樣樣都不精通。我認識幾個小公司的程式設計師,他們沒有明確的職稱,開發者都統稱為程式設計師,設計師都統稱為美工。

在 Web 技術的任何方向,比如前端開發或者伺服器端開發,他們既沒有很強的經驗,也沒有明確的興趣。那麼當他想跳槽到大公司的時候,會發現大公司對崗位和職責的細分非常明確,而自己的能力達不到某個細分崗位的要求。所以他們很難在專業上繼續進步,從而陷入原地踏步的窘境。

大公司還是創業公司

在許多論壇上,常常會看到畢業生提出這樣的問題:現在有一個大公司和一個創業公司的機會擺在我面前,我應該選擇哪一個?

其實每個人有不同的想法、不同的風險偏好,旁人沒辦法針對這個寬泛的問題給出標準的答案。但是既然提問者是畢業生,這種情況下我還是建議選擇大公司,因為會選擇創業公司的人往往有自己的主見,已經接受創業公司的邀請去工作了,不會去發帖詢問大家的意見。

當然這是開玩笑,真正的原因是,在大公司的頭兩年,是從學生到職場人士的一個轉變,您可能會從大平臺學習到一些規範的流程方法,養成一些足以影響您一生的習慣,認識更多的能對您職場有幫助的人脈。

大公司能給您的

  • 較小的風險

每個公司都有倒閉的可能,但是,顯然大公司比小公司的風險低多了。如果您的風險承受能力較低,那麼不得不考慮這個因素。

  • 技術最佳實踐

在大公司,對程式碼質量和一致性的要求很高,所以一般在最終釋出前會有程式碼審查(Code Review)流程和專案總結會等。如果您完成了一個任務,但是沒有采用最佳實踐,只是 hack 了一下,那麼其他同事可能都會指出您的問題,並且要求您改正之後再提交。小公司或者創業公司人力比較緊張,在他們看來,快速實現和上線,比優雅地上線更重要,所以對於一些最佳實踐類的問題,只能睜一隻眼閉一隻眼啦。

[所謂 hack,就是不優雅的解決方案。比如一個介面的調整,如果採用最佳實踐,需要用 MVC 架構來分離出介面相關的程式碼,並且把有可能相關的變數提取出來,合理命名並且放在合理的位置。如果是 hack,可能就不管這麼多,看見哪裡需要修改就原地修改了,表面上看很快解決了問題,可是這會給後面跟進的同事造成很大的困擾。]

  • 垂直專精的技能

大公司專業分工很細,而且有更多技術溝通和沉澱的氛圍,所以容易讓人在垂直專精的技術方向有足夠的發展。在小公司更能鍛鍊技術的廣度,深度上缺乏鍛鍊的環境。但是其實二者的利弊,都是外界的,技術人員的個人成長除了工作時間的鍛鍊,還要靠下班後的時間,外界只是給予一個環境或者機會。

  • 服務海量使用者的經驗

同樣是做一個網站,服務少數使用者量和服務海量使用者量時需要考慮的事情是完全不同的。小網站遇到的問題,大網站一定遇到過,而大網站遇到的問題,小網站就不一定遇到過了。當一個網站發展到業內最強時,它的問題沒有人遇到過,這時候就不能凡事問百度、Google 或 Stack Overflow 了,而要自己去探索解決方案。

  • 軟技能

硬技能是指每個職位需要的專業技能,軟技能則是通用的技能,比如溝通、影響力、專案管理和演講等。越是大公司,越是看重影響力,所以會有很多培訓教您如何提高影響力。

我在面試一些來自小公司的應聘者時,就發現他平時的工作中,周邊環境很少有分享和沉澱的習慣。沉澱和總結是很重要的,在騰訊,設計師做完一次設計定稿之後,就會把設計的思路,包括整體的設計風格、設計規範和色彩的確定等都總結成一封郵件或者 PPT,傳送給部門同事。每個人都要有意識地維護自己的作品集,它在半年一次的考核、晉升面試甚至以後的跳槽中都非常有用。但是小公司的設計師不太會總結個人作品集,時間緊急是一方面原因,另一個主要原因是環境不需要他這樣做,因此就缺乏了這方面的鍛鍊。

  • 人脈

每年都有不少人從大公司離職去創業,這是非常自然的事情。對於大公司出來的人來說,之前積累的人脈資源這時候會起到很大的作用,比如創業期間的一些合作機會或者資源的互利,等等。萬一創業失敗,也不會很慘,因為您之前接觸的人脈可以給您提供工作機會。但如果您剛畢業就選擇創業,創業失敗之後沒有人能給您提供工作機會。

  • 心態

其實大公司能給予畢業生最大的優勢,就是提供一個心智培育的土壤。之前參加面試官培訓的時候,我大概瞭解過公司招聘一個畢業生投入的成本。從校園招聘,到安排面試官面試候選人,再到封閉培訓和一些課程培訓,再給一段時間熟悉專案,最後 3 個月試用期後可能還要淘汰掉一些。如果把成本平攤到每一個人身上,這些投入要一年才能收回來。而小公司不會有這麼大的耐心去培育一個新人。如果沒有足夠的時間去學習和成長,可能在一兩年後,員工的能力也比較全面,但是樣樣都不精通,也說不清楚自己的目標是什麼,於是就變成了“野生程式設計師”。

綜合來講,在大公司中,從硬技能到軟技能都會有很多經驗豐富的前輩能夠教您,您會在大平臺上學習到很多東西。工作幾年之後,員工的選擇也很多,要麼走技術路線繼續發展下去,做高階工程師;要麼學習管理和領導力;要麼出去創業。

所以,我的個人建議是,從畢業生自己前途發展的角度來看,先加入一家上市大公司是個不錯的選擇。

本文摘自:《Web 全棧工程師的自我修養》

相關文章