導讀:zhuoqun原來是雅虎(中國)和淘寶的一名技術工程師,目前正在一家公司做前端工程師。他最近的一篇部落格《開發與研發》引發了業界的討論和思考。在他看來,“程式開發大概可以劃分成兩類:開發和研發,相應也就有開發工程師和研發工程師。很多人覺得做開發和做研發沒什麼區別,都是一樣對著電腦寫程式,但其實這兩者是完全不一樣的,zhuoqun拋開公司對員工的期望、社會對工程師的需求等其它因素,單純從國內網際網路行業“工程師個人發展”的角度解讀了自己對這兩類 工作的看法。” 以下是全文。
按:這幾天我一直在寫這篇東西,本來是胸有成竹,沒想到後來越寫越發現自己在這個題目下有太多話想說,而以我現在的能力又不能很好地概括總結,以至於越寫越長,文章結構也變得混亂,到後來修改的時候每次都要考慮好久才能下筆,所以決定拆成兩部分來發,以便閱讀。這篇寫得我心力交瘁,質量不算好,湊合著看吧。
同樣是寫程式,不同的崗位工作內容不一樣,對程式質量以及工程師的要求也不一樣。程式開發大概可以劃分成兩類:開發和研發,相應也就有開發工程師和研發工程師。很多人覺得做開發和做研發沒什麼區別,“都是一樣對著電腦寫程式啊”,但其實這兩者是完全不一樣的,下面我想拋開公司對員工的期望、社會對工程師的需求等其它因素,單純從國內網際網路行業“工程師個人發展”的角度來說一下我個人對這兩類工作的看法。
開發
開發一般是指產品開發,開發工程師直接為產品貢獻程式碼。每個公司都有自己的產品線,拿 Google 來說吧,它有 Gmail, Chrome 等產品,每個產品都有很多開發工程師在後面支援,這些產品的開發、維護以及升級都是由相應的開發工程師負責的。由於開發工程師的工作直接關係到產品的質量和線上情況,所以開發工程師的責任是很重的,他可能經常為了下個版本的釋出而加班,為了產品的故障不得不在休假的時候開啟電腦工作,甚至在過年的時候都會接到領導的電話。所以你看到那些總抱怨加班太多,總是說自己是“IT民工”的,大部分都是開發工程師。在工程師當中,大部分人都是做產品開發的,畢竟公司都是要靠產品盈利,招聘的大部分人也要直接為產品服務。
做開發是很辛苦,但也有好處,因為需要對產品線負責,所以會是公司的核心,裁員對你威脅不大,如果你負責的產品恰好又是盈利產品的話,那麼加薪、獎金、集體出遊等福利都不會少。如果你足夠幸運地加入了一家快速發展的創業公司,說不定一下子就發家了。還有很重要的一點是,作為產品的開發人員可以看到自己做的東西被那麼多人使用,那是一種莫大的鼓勵和肯定。
苦悶的開發工程師
儘管我很尊重開發工程師,但是我不得不承認,在國內大部分的公司,做開發工程師是沒有前途的。首先,從微博到開心,有多少國內的產品不是山寨的?這也罷了,最噁心的是有一些產品經理連產品設計圖都懶得自己畫,直接去擷取別人產品的圖片,假如我是一個人人網的開發工程師,每天看到產品經理把 Facebook 新上線功能的截圖拿過來讓我做,你讓我如何對產品有榮譽感和認同感?而如果一個開發工程師對自己做的東西沒有榮譽感和認同感,那麼他堅守自己的崗位要麼是因為公司給的錢多,要麼是因為他還沒有找到下家。我個人認為,做開發最大的一個好處就是可以親手實現一個“自己的作品”,就算平時很累,但最後完成它的時候也還是會無比滿足,這點被剝奪了之後,和飯店打工的服務員有什麼兩樣?不一樣是為了餬口嗎?
我不知道別人怎樣,但我自參加工作以來就一直糾結於此——甚至開發的大部分產品都不好意思寫上自己的名字;直到前不久有機會去做一個公司內部使用的平臺,才終於有個作品讓自己覺得滿意。相信很多開發工程師參加工作之前都對網際網路上很多諸如Gmail, Facebook 等優秀的產品耳熟能詳,自己也常夢想做出那樣的產品,但萬萬沒有想到的是,工作之後要學習的第一課就是“不要對自己做的東西有感情”——有了感情你就不願意做廣告彈窗,不願意看到它下線,不願意為了短期利益傷害使用者。與此同時,你還要繼續聽產品經理和老大們滿懷激情地說“我們一定要讓使用者喜歡我們的產品 ”。一個連開發工程師本人都覺得無聊的產品如何讓使用者真正喜歡呢?拿搜尋巨人來說吧,Google 把社交網站看作是某種形式的娛樂而不是有用的工具,所以它會在社交領域失敗,再牛的技術也無法遮蓋情感上的空白。不過話說回來,這好像對於國內大部分的公司都不是問題,因為它們做一款產品只是想從使用者那裡拿到錢,如果以後使用者流失了就下線,然後再開發一個新的。他們要的不是使用者的長期感情,而是一夜/情,開發工程師就是一夜/情的工具。
其次,國內幾乎所有公司的技術流程和技術積累都做得很爛,大部分都只是片面地追求開發速度。我們在大學裡受到的教育是“文件和註釋很重要”,工作之後才發現文件和註釋是很稀有的東西,只有特別負責任的工程師才會擠時間去寫。有一個很有意思的現象是,國內很多產品釋出之後會特別自豪地說“XX是我們開發團隊在時間緊迫的情況下,封閉開發了X天就完成的!只有最牛的工程師才能創造這樣的奇蹟!!多少個凌晨,XX寫字樓上只有我們辦公室的燈還亮著……”,然後你會覺得“好感動啊”,但冷靜下來想一想,這種拼命趕工做出來的東西質量會過硬嗎?拋開產品質量不談,沒有時間寫文件、沒有時間寫註釋、沒有時間做 code review,沒有時間做階段總結……沒有了這些,作為一個開發工程師你通過這個專案可以提升多少呢?所以好多開發工程師一開始是“程式碼民工”,過了幾年還是“程式碼民工 ”,而一個人年富力強的時間又有幾年呢?怪不得那麼多人說工程師和JN一樣,都是吃青春飯的。
發展方向
我個人認為,國內的開發工程師大概有三個發展方向:1. 做管理。 2. 去做架構等與產品關係不那麼緊密的研發。3. 提升其它方面的能力,做 “A+Player”,然後自己創業。我對管理沒有研究,也沒有興趣,這裡就不說了。研發我會在下篇中細說,這裡主要說一下第三條。
為什麼要關注程式碼之外的事情
如果你只會埋頭寫程式碼,那麼程式碼寫得再好也可能不會是一個好的開發工程師。做開發不是做學術研究,你的任務不是去鑽研技術,而是利用自己的技術把產品做出來。儘管技術能力是基礎,但如果無法把能力很好地應用到開發當中,那麼你在團隊中就沒什麼價值。舉個例子,如果你不能很好地理解產品需求,那麼就會根據自己的理解去做技術方面的架構和編碼,等到後來發現了再去修改就特別麻煩,這個時候技術能力強反而成了壞事,南轅北轍的故事我想大家都聽說過。
很多開發工程師屬於那種“很本分”的人,從來不會提出意見,不關心產品形態和細節,只是去做產品經理提出的需求。我覺得別人把工程師叫做“程式碼民工”也就算了,但是工程師對自己做的東西完全沒有看法,那就是甘心淪落為民工了。這也有文化的原因,國內的公司都喜歡那些不愛抱怨的員工,因為他們聽話而且符合中國傳統的價值觀,但我更喜歡那些愛抱怨並且抱怨得有道理的人,因為國內(不只是網際網路上面)粗製濫造的東西實在太多了,不抱怨才不正常,有不滿才會去思考如何做得更好。
曾經聽到有人談論如何管理技術人員的時候說:“管理技術人員很簡單,找一個比他們都牛的人就行了。” 這個人很瞭解工程師的脾氣。工程師去判斷其他工程師的時候,往往只看他的技術能力,覺得誰的技術好誰就最牛,其它的都無所謂。沒錯,技術牛的工程師寫的程式碼質量很高,但這只是一個方面而已,判斷一個人在團隊中是不是“很牛”要看他對團隊對產品的整體貢獻,而不是他的個人能力。他能很好地理解產品需求嗎?能很好地理解設計師的意圖嗎?和團隊其他成員溝通順利嗎?寫出的程式碼方便測試嗎?會對產品提出好的建議嗎?……這些都是判斷一個開發工程師的標準,整體素質越高在團隊中的價值也就越大。
所以要想做一個好的開發工程師,就要在寫好程式碼的同時努力提高其它方面的能力。我知道大部分的工程師都喜歡和機器而不是和人打交道,所以遇到和產品經理、設計師以及 QA 等部門協調溝通的時候就皺眉頭。協調溝通確實是一件鬧心的事情,但從另一方面來說,這是開發工程師的一個得天獨厚的優勢:你可以深入接觸產品生產線上的所有環節。需求評審的時候,你可以瞭解產品設計;開發介面的時候,你可以瞭解到視覺和互動設計;測試的時候,你可以瞭解到產品測試的細節;上線的時候,你也可以多觀察 Ops 同事的操作。如果你可以在協調溝通的時候學會換位思考,多從對方的角度看問題,多想一下“他為什麼要這麼做”,那麼不知不覺就會對各個領域有一些瞭解,進而發現原來每個領域都大有學問,就不會因為周圍那些學藝不精的人而輕視他們所在的領域。
學習設計
對於工程師來說,測試和上線都是技術性的工作,和開發有很多相通的地方,而產品設計、互動設計和視覺設計等設計領域則比較陌生。對於自己不瞭解的東西,我們的看法往往會趨於兩個極端:要麼是看得高深莫測,要麼是看得一文不值。其實對於大部分的東西,只要不笨並且願意下功夫學習,總是可以學會的。儘管達到大師的水平可能需要傳說中的“天賦”,但做到中等水平並不是特別困難。關於設計領域我一直在斷斷續續地在學習,到現在可能連略窺門徑也算不上,這裡只是說一下我個人對設計的理解和心得,供大家參考。
產品設計
產品設計看上去比較簡單,因為只要清楚自己想要做什麼,那麼自然可以慢慢勾勒出產品的形態和功能。要做好產品設計,就需要平時多下一些功夫,多研究一下網際網路上那些已有的產品,另外還需要多看一些諸如社會學、歷史等“閒書”,舉個例子,假如你想開發一款針對臺灣使用者的產品,那麼瞭解一下臺灣的文化肯定是有必要的。總之,學習產品設計是慢功夫,沒有什麼速成的捷徑,只有一點一滴地不斷積累才能培養出敏銳的產品意識和深刻的洞察力。
工程師學習產品設計有一個優勢,那就是設計出來的產品是自己親手實現的,你可以在實現的過程中不斷重新反思原來的設計,然後加以修改和完善。這就好像寫文章一樣,很多時候你寫東西的時候並不清楚自己具體要寫什麼,但只要是下筆開始寫,寫著寫著就會發現新的想法,寫作的過程同時也是思考的過程。寫作和寫程式碼很像,它們不僅可以表達想法,還可以創造想法。
視覺設計
很多工程師聽到視覺設計會立刻退避三舍,覺得自己“不會畫畫”、“不懂配色”是不可能學習視覺設計的。誠然,視覺設計是需要更多藝術方面的基本功,要完全掌握需要長期的訓練,但我們還是可以從簡單的學起,慢慢培養對設計的感覺。我個人在這方面所知非常有限,但是對視覺設計中的完美主義印象深刻。
程式設計的時候,如果你的某行程式碼多了一個空行可能不會有什麼問題,但在視覺設計中差了 1 個畫素或者 10% 的透明度就是不可容忍的,很多設計師要求的都是 “Pixel-Perfect”——畫素級別的完美。如果你不苛刻地追求完美,幾個這樣的“小瑕疵”就可以把整個作品毀掉。在我沒有接觸過視覺設計的時候很難理解這一點,切頁面的時候並不會特別仔細地去看設計圖,而且為了降低技術難度會想當然地篡改設計師的意圖,比如把一些微小的漸變用純色代替,這是很無知的做法。所以當設計師要求你做一個 1px 的修改的時候,即使會花掉你幾個小時的時間也要聽他的——只有這樣才可以把介面做到百分之一百的完美。當然,設計師自己做不到完美另當別論。
此外,作為一個頁面設計師,從職位名稱上來看他的最終作品應該是頁面,而不只是視覺效果圖。所以我覺得頁面設計師應該精通 CSS,只有自己才可以精確實現自己的設計意圖。對於那些沒有受過設計訓練的工程師來說,很難注意到頁面上色彩、字型和漸變的細節,讓他們精確實現一個設計師的意圖幾乎是不可能的。精通 CSS 對於頁面設計師來說並不算一個過分的要求,很多國外的設計師甚至可以自己用 PHP 寫出產品原型,相比之下,國內的頁面設計師進化得實在太慢了。
互動設計
互動設計是有關行為的設計,它更關注如何讓產品更好用。舉個例子,網頁中一般都有很多超連結,當你把滑鼠移動到超連結上的時候,滑鼠形狀會變成手型,暗示它是可以點選的,而且訪問過的超連結和普通超連結的顏色是不同的,這樣就很好地引導了使用者行為。
之前我一直把設計和“視覺設計”等同起來,但在深入瞭解了之後發現,對於網際網路產品來說,互動設計要比視覺設計重要得多,而且互動設計相對於視覺設計也更加有跡可循,對“感覺”要求沒那麼高,工程師完全可以把重點放在互動設計上。如果互動設計做得好,視覺設計遵循一些標準,那麼完全可以做出一款 “不難看並且好用”的產品。沒有人特別誇讚 Google 的產品“好看”,但它們都特別好用,Google 注重的是易用、快速,使用者體驗是很棒的。
網際網路行業的大部分頁面設計師(Web Designer)都是學習平面設計出身的,但我覺得網頁和軟體設計更像是“顯示器裡面的工業設計”。很多平面設計師設計出的頁面很好看,好像海報一樣,非常適合列印出來,但往往對互動方面重視不夠。不太好看影響不會很大,但不好用就沒有辦法留住使用者,而且有時候太注重外觀的視覺效果反而會分散使用者的注意力進而影響產品的使用,這種 “eye candy” 是糟糕的設計。現在專門培養互動設計師的機構不多,我很希望對網際網路有興趣的工業設計師們到這個行業中來。
關於設計我就說這麼多,以後有機會再另外撰文專門探討這些主題。值得一提的是,沒有人可以真正把設計和開發全部精通,如果深入到細節,無論設計和開發都會佔用你大量的時間和腦力。單從設計來說,需要掌握的就有顏色、字型排印(Typography)、排版(Layout)、互動設計等,其中每一種技能又涵蓋無數細節,真的是要皓首窮經才可以在其中的某個領域成為大師。不過,即使你對這些知識只是有一個大致的瞭解,以後在看一款產品的時候也可以從功能、互動、排版、頁面程式碼、整體效能以及URL語義化等各個方面進行全面而細緻的分析,明白它哪裡做得好,哪裡做得不好,而不是在那裡想當然地說“真酷 ”或者“狗屎”。真正瞭解什麼是好的什麼是差的,自己做東西的時候才會心中有數。
一專多能的好處
很多人可能會說:“一個人要是可以把所有事情都搞定,那還要其他人幹嘛?我更相信團隊的力量。” 沒錯,一個人就算從設計到開發都精通,如果只有他一個人做東西,開發效率也不會高。但是若你真的花心思去了解那些“與程式碼無關的事情”,你就會在寫程式碼的時候更多考慮到產品經理/設計師的想法,對產品經理/設計師疏忽的地方也可以及時提醒,讓自己真正地融入整個團隊。目標並不一定要實現,它是用來指明方向的。開發工程師提高自己的產品意識和設計能力絕對不會是白費心血,不然的話你就只是一個實現產品的工具。你只會回答別人提出的問題,而好的問題要比好的答案有價值得多。
當你各方面能力提高得差不多的時候,應該就可以出來創業了(注意,我說的是創業,不是去創業公司打工)。因為對各個領域都有一定的瞭解,平時也經常接觸到各個領域的人,那麼在創業的時候你就很清楚自己需要什麼樣的產品經理/設計師,知道具有什麼樣能力的產品經理/設計師才是最好的,這樣就可以從一開始就保證團隊的質量和氣質。很多網際網路的業界前輩都說過“要招聘最好的人”,但問題是你如何判斷一個人是不是該領域最好的呢?如果一個人對程式和設計一竅不通,滿腦子都是商業運作,你覺得他有可能找出最好的工程師和設計師嗎?有一次和一個創業公司的CEO聊天,他和我講他們“只招聘 Geek”,後來我才發現他其實根本不知道什麼是 Geek,只是不知道從那裡聽到 Geek 這個詞,他真正想要的應該是那種只知道寫程式碼,願意沒日沒夜任勞任怨給他當牛做馬的人。國內大部分的創業公司就是這樣,老大們喊著技術密集型的口號,實際上做著勞動密集型的事情,金玉其外,敗絮其中。你可以和他們不一樣。
我自己並沒有創業的經歷,也沒有創業的打算,所以對創業的理解可能很片面而且天真。但是我相信,找到最好的人永遠都是關鍵,不然即便後來成功了,也不過是多了一家靠人數取勝的血汗工廠。假如你選擇成為移動網際網路的獨立開發者,對一個產品各個環節的全域性把握也是有必要的。如果一個團隊的每個人都能獨當一面並且可以很好地理解其他人的意圖和專業技能,就算最後在商業上失敗了,那也會是一個幸福的團隊,比那些除了盈利之外找不到任何亮點的團隊好太多。
對產品經理的偏見
在“開發”這個小節的最後,我想多說一點自己對產品經理這個角色的看法。在國內絕大多數公司,開發工程師的作用就是把產品經理的想法以程式碼的方式寫出來,“程式碼民工”這個稱呼倒是很恰當。我對網際網路行業的產品經理們一直感到很奇怪:他們沒有能力把自己的想法實現出來,但是卻幾乎總是認為自己比其他人更理解產品;當工程師對產品提出自己的意見的時候,他們往往會心中不屑但儘量保持禮貌擠出微笑說一句:“呵呵,工程師不是普通使用者”。一個產品本來就是需要很多人齊心協力一起完成的,產品經理和工程師的地位也是平等的,但是由於產品經理在工作流的上游,所以情況往往演變成工程師在為產品經理工作。如果產品經理真的對產品負責也就罷了,可惜的是大公司的產品經理大部分是對KPI負責,小公司的產品經理大部分是對老闆的個人好惡負責,結果就是工程師跟在產品經理屁股後面做一些莫名其妙的事情。我接觸到的幾乎所有開發工程師都對他們的產品經理頭疼不已,據他們說,好的產品經理就像真正的愛情,是極為稀有和可遇不可求的。
按照現在大部分公司的分工方式,產品經理是產品的總負責人。根據我個人的理解,產品經理之於產品,應該相當於導演之於電影,建築師之於建築。一個導演如果對拍攝一竅不通,那麼就很難控制鏡頭的表現力;一個建築師如果對建築材料和結構一無所知,就不可能把握建築整體的感覺。那為什麼那麼多人會覺得產品經理可以不懂技術不懂視覺設計,只需要寫好文件畫個框圖然後交給別人去做就可以做出好的產品呢?本來是一個需要對各個領域融會貫通最難做得好的角色,現在反而被很多人視為清閒的差事,不愛幹活的人紛紛想要轉去做產品經理,實在是可悲至極。
我一直堅信好的工程師是不需要產品經理的。如果一個產品非要有一個什麼產品經理的話,Google 的很多產品都不會出現,DropBox 這種只招聘工程師的公司也早就完蛋了。很多偉大的產品都是幾個工程師想到一個點子然後慢慢做出來的,比如 Paypal 和 Google. 但需要說明的是,我討厭產品經理並不是說我推崇“技術導向”——無論怎樣產品都應該是讓使用者使用的,而不是用來炫耀技術的,只不過工程師不需要產品經理也可以設計好一個產品並且實現它。產品設計不是產品經理的專利。
想知道懂得設計的工程師沒有產品經理的時候可以做出什麼東西嗎?去看一下 Livid 做的 V2EX 就知道了。在國內,設計和程式碼都有品味的網站可不多,我覺得 Livid 同學真是開發工程師的典範。
原作者:zhuoqun