野生程序員的故事
本文摘自:《Web 全棧工程師的自我修養》
野生程序員是指僅憑對計算機開發的興趣進入這個行業,從前端到后臺一手包攬,但各方面能力都不精通的人。野生程序員有很強大的單兵作戰能力,但是在編入“正規軍”之后,可能會不適應新的做事方法。
遭遇“野生程序員”
騰訊公司內部的團隊很多,在團隊管理上有項目和專業兩個維度。也就是說,有些團隊是項目維度的,整個團隊共同維護一個產品,成員來自不同的職業崗位;有些團隊是專業維度的,比如一個組都是前端工程師,維護不同的產品。
因為前端組是設計部最接近后臺技術的團隊,所以團隊平時的工作和技術交流分享,都不局限于前端技術領域,還包括很多服務器端或者移動端的技術。從前端到后端,一些技術問題都要我們自己來解決。
在招聘前端工程師的時候,我們對應聘者的要求是,在掌握基本前端技術的前提下,最好有更為全面的技術。這樣,即使我們的項目人力結構、平臺和方向發生變化的時候,他也能夠更加靈活地轉移到其他角色中。而且技術的全面更能表現一個人對技術的熱情以及較強的學習能力。從團隊多樣性來講,多一些技術種類的話,大家在一起也能碰撞出新的火花。
有一次,我在 QQ 群發布了一條簡單的信息:“招聘前端工程師,全棧更佳。”隨后有一個“全棧工程師”A君向我自薦。
我仔細看了他的簡歷:“三年工作經驗,擅長 PHP、MySQL 數據庫、jQuery、HTML 和 CSS,對 CDN 加速和網絡安全也頗有研究。”他的簡歷讓我眼前一亮,于是我跟他進行了一次簡單的電話面試。
電話面試的第一個環節照例是讓A君簡短地介紹自己。A君在一個傳統行業的小公司做 IT 技術支持工作,公司的 3 個網站項目都是他一手搭建,從架構到編碼細節他都如數家珍。他號稱能解決一切技術問題,老板提出的所有需求都能完成,而且只有他能完成。隨著最近公司業務量越來越大,他還招了兩個下屬,但是主要的編程工作還是他在做。
我問他:“我們的職位是前端工程師,那么您有哪些前端方面的技能呢?”他回答:“我擅長 HTML、CSS 和 JavaScript。”
“對于 Web 性能優化,您有哪些了解和經驗嗎?”他思索了一陣答道:“我們在發布項目之前壓縮 CSS 和 JavaScript 源代碼,這樣文件體積就變小了,用戶加載必要資源所花的時間也就更短了。”我繼續說道,很好,還有嗎?他想了半天,答不上來了。
其實關于 Web 性能優化,有非常多的方面可以去做,我希望應聘者能盡量多回答一些。
我想既然他對 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恤(在行業展會上免費拿的)牛仔褲,平時也喜歡宅在家里,不會像同樣收入的金融白領,平時愛好聽歌劇打高爾夫球”。這種差異一方面是外部人士對軟件工程師職業的偏見,另一方面也是程序員行業的自黑習慣。在招聘時崗位要求就已經放到最低:不要求學歷、上班不要求著裝、上下班時間靈活,這樣才好更方便地招聘。而金融行業有意識地塑造一種“精英”文化,從學歷就設置高門檻,即使有些工作根本不需要那么高的學歷。
回到畢業生的話題,很多跨專業的學生發現自己興趣在互聯網和計算機方向的時候,就開始了自學之路,基本上學習方式有這樣幾種。
- 書:在計算機圖書領域,技術難度跟圖書銷量是成反比的,從標簽教起的 HTML/CSS 基礎書籍賣得最好,其次是關于 JavaScript 和 jQuery 的書,Angular 和 Node.js 之類的就沒那么暢銷了。
- 互聯網:得益于全世界都在互聯網上共享的資源,現在的學習者有了更多的選擇,比如關于 Web 開發基礎教學的 W3CSchool,還有海量的技術博客。我個人喜歡訂閱一些英文大站,比如 Smashing Magazine(http://www.smashingmagazine.com/)、tuts+(http://tutsplus.com/)等。我在讀大學的時候,Google Reader 還沒有永久關閉,那時候我很喜歡用 RSS 來關注這些站點的更新情況。Google Reader 下線后,就基本上廢棄了 RSS 閱讀的習慣,轉而用一些社交網站來追蹤更新情況,但是有時還是會淹沒在大量無用的信息里面。
- 社團:學校的網站社團也孕育了許多能力很強的開發者,社團經過歷屆的傳幫帶,技術有所積累,比如師兄會教師弟用 Sublime 編輯器,這就比還在用 Dreamweaver 的同學更有優勢。此外,學校社團有一些定點客戶,比如學校教務處、周邊商戶,所以有更多的實戰經驗,在畢業時作品集也豐富了不少。
因為有這樣一些自學渠道,所以不一定只有計算機專業畢業的學生才有機會進入互聯網行業。畢業之后,這些計算機愛好者進入不同的工作崗位,不同的是,有些進入大公司,有些進入小公司。這兩者的成長軌跡往往會不太一樣。
小公司有很多野生程序員
流水線工作流程有諸多優點,但一般來說,大公司才需要很多專精某種技術的工程師,組成一個 Web 開發團隊。創業公司只需要幾個技術全面的人來做開發和技術支持,有時候甚至只有一兩個人而已。
當然,最主要的原因就是成本和回報的問題。招聘和維持龐大的 IT 研發團隊需要一筆不小的開支,小公司并沒有那么多 Web 服務的需求,一般企業可能只需要一個公司站點就可以了,現在甚至完全不需要 Web 站點,可以用微信公共賬號或者淘寶這樣的大平臺來完成。如果招聘一個完整的 Web 研發團隊,從用戶研究到交互設計、從 App 開發到數據庫管理,直接后果就是整個團隊大部分時間都空閑著,無事可做。與之相比,聘請一個或多個全棧工程師會更高效、更省錢。
第二個原因是,很多傳統線下公司并不會特別依賴 IT 技術,有些時候線下渠道占據了公司大部分收入來源,所以公司不需要架設十分完善的線上服務。由于線上服務的用戶量少,所以 Web 服務對穩定性、承受壓力、用戶體驗的要求都沒有那么高。此外,由于沒有太多重要的用戶數據,所以異地容災也不需要。
因為公司的開發團隊小,所以網站無論出現什么問題,都需要他們去解決。從域名到服務器,從前端到后臺,從設計到內容,都是一人包攬。野生程序員了解的知識越來越多,但是樣樣都不精通。我認識幾個小公司的程序員,他們沒有明確的職稱,開發者都統稱為程序員,設計師都統稱為美工。
在 Web 技術的任何方向,比如前端開發或者服務器端開發,他們既沒有很強的經驗,也沒有明確的興趣。那么當他想跳槽到大公司的時候,會發現大公司對崗位和職責的細分非常明確,而自己的能力達不到某個細分崗位的要求。所以他們很難在專業上繼續進步,從而陷入原地踏步的窘境。
大公司還是創業公司
在許多論壇上,常常會看到畢業生提出這樣的問題:現在有一個大公司和一個創業公司的機會擺在我面前,我應該選擇哪一個?
其實每個人有不同的想法、不同的風險偏好,旁人沒辦法針對這個寬泛的問題給出標準的答案。但是既然提問者是畢業生,這種情況下我還是建議選擇大公司,因為會選擇創業公司的人往往有自己的主見,已經接受創業公司的邀請去工作了,不會去發帖詢問大家的意見。
當然這是開玩笑,真正的原因是,在大公司的頭兩年,是從學生到職場人士的一個轉變,您可能會從大平臺學習到一些規范的流程方法,養成一些足以影響您一生的習慣,認識更多的能對您職場有幫助的人脈。
大公司能給您的
- 較小的風險
每個公司都有倒閉的可能,但是,顯然大公司比小公司的風險低多了。如果您的風險承受能力較低,那么不得不考慮這個因素。
- 技術最佳實踐
在大公司,對代碼質量和一致性的要求很高,所以一般在最終發布前會有代碼審查(Code Review)流程和項目總結會等。如果您完成了一個任務,但是沒有采用最佳實踐,只是 hack 了一下,那么其他同事可能都會指出您的問題,并且要求您改正之后再提交。小公司或者創業公司人力比較緊張,在他們看來,快速實現和上線,比優雅地上線更重要,所以對于一些最佳實踐類的問題,只能睜一只眼閉一只眼啦。
[所謂 hack,就是不優雅的解決方案。比如一個界面的調整,如果采用最佳實踐,需要用 MVC 架構來分離出界面相關的代碼,并且把有可能相關的變量提取出來,合理命名并且放在合理的位置。如果是 hack,可能就不管這么多,看見哪里需要修改就原地修改了,表面上看很快解決了問題,可是這會給后面跟進的同事造成很大的困擾。]
- 垂直專精的技能
大公司專業分工很細,而且有更多技術溝通和沉淀的氛圍,所以容易讓人在垂直專精的技術方向有足夠的發展。在小公司更能鍛煉技術的廣度,深度上缺乏鍛煉的環境。但是其實二者的利弊,都是外界的,技術人員的個人成長除了工作時間的鍛煉,還要靠下班后的時間,外界只是給予一個環境或者機會。
- 服務海量用戶的經驗
同樣是做一個網站,服務少數用戶量和服務海量用戶量時需要考慮的事情是完全不同的。小網站遇到的問題,大網站一定遇到過,而大網站遇到的問題,小網站就不一定遇到過了。當一個網站發展到業內最強時,它的問題沒有人遇到過,這時候就不能凡事問百度、Google 或 Stack Overflow 了,而要自己去探索解決方案。
- 軟技能
硬技能是指每個職位需要的專業技能,軟技能則是通用的技能,比如溝通、影響力、項目管理和演講等。越是大公司,越是看重影響力,所以會有很多培訓教您如何提高影響力。
我在面試一些來自小公司的應聘者時,就發現他平時的工作中,周邊環境很少有分享和沉淀的習慣。沉淀和總結是很重要的,在騰訊,設計師做完一次設計定稿之后,就會把設計的思路,包括整體的設計風格、設計規范和色彩的確定等都總結成一封郵件或者 PPT,發送給部門同事。每個人都要有意識地維護自己的作品集,它在半年一次的考核、晉升面試甚至以后的跳槽中都非常有用。但是小公司的設計師不太會總結個人作品集,時間緊急是一方面原因,另一個主要原因是環境不需要他這樣做,因此就缺乏了這方面的鍛煉。
- 人脈
每年都有不少人從大公司離職去創業,這是非常自然的事情。對于大公司出來的人來說,之前積累的人脈資源這時候會起到很大的作用,比如創業期間的一些合作機會或者資源的互利,等等。萬一創業失敗,也不會很慘,因為您之前接觸的人脈可以給您提供工作機會。但如果您剛畢業就選擇創業,創業失敗之后沒有人能給您提供工作機會。
- 心態
其實大公司能給予畢業生最大的優勢,就是提供一個心智培育的土壤。之前參加面試官培訓的時候,我大概了解過公司招聘一個畢業生投入的成本。從校園招聘,到安排面試官面試候選人,再到封閉培訓和一些課程培訓,再給一段時間熟悉項目,最后 3 個月試用期后可能還要淘汰掉一些。如果把成本平攤到每一個人身上,這些投入要一年才能收回來。而小公司不會有這么大的耐心去培育一個新人。如果沒有足夠的時間去學習和成長,可能在一兩年后,員工的能力也比較全面,但是樣樣都不精通,也說不清楚自己的目標是什么,于是就變成了“野生程序員”。
綜合來講,在大公司中,從硬技能到軟技能都會有很多經驗豐富的前輩能夠教您,您會在大平臺上學習到很多東西。工作幾年之后,員工的選擇也很多,要么走技術路線繼續發展下去,做高級工程師;要么學習管理和領導力;要么出去創業。
所以,我的個人建議是,從畢業生自己前途發展的角度來看,先加入一家上市大公司是個不錯的選擇。
留言列表