研發職位到底應該怎麼設定?
研發的英文是R&D,即研究(Research)與開發(Development)。軟體研發這個詞包含了兩個意思,第一是架構設計,即決定一個系統採用什麼樣的架構,怎麼做,通常這是系統分析師或者架構師的責任,系統分析師是比較傳統的叫法,現代網際網路公司往往喜歡用架構師來替代;第二是程式碼實施,也就是通過編寫程式碼把系統實施出來,一般這是程式設計師的工作。
現在我國網際網路行業的軟體研發人員的職業生涯往往從寫程式碼開始,然後逐步積累經驗向系統設計的方向發展,例如模組設計,系統設計等,等到積累了足夠的經驗並在思維能力提升之後,程式設計師可能逐漸成長為專門從事系統設計的架構師。所以程式設計師與架構師之間有一段很長的路,而且這是一條漸進的灰色地帶,有時候兩者之間在職位分工方面很難區別。不知道從哪朝哪代開始,行業裡用軟體研發人員籠統地涵蓋相關的職位。
實際上,不同的企業在職位設計上有不同的做法,中國的網際網路企業多數參考矽谷的做法,就是以軟體研發工程師覆蓋寫程式碼的程式設計師,負責系統設計的系統分析師,以及專門負責架構設計的架構師等不同職位。
R(研究)/架構師
D(開發)/程式設計師
春節前在一個網際網路CTO的微信群裡,大家聊起了對程式設計師落實系統架構設計的擔憂。有的時候架構設計得很優秀,但是真正落地的系統一塌糊塗,也有的時候沒有架構設計,程式設計師自發完成設計和程式設計。 近期觀察到一個支付公司的研發團隊,儘管研發工程師們非常努力,但是該團隊所負責的應用系統,在架構設計和程式碼實施上卻是 坑坑窪窪乏善可 陳。
架構設計是這樣的
程式碼實施是這樣的
流量不大時是這樣的
洪水來了是這樣的
這些現象讓我回想起了自己在新加坡、日本、美國和中國的四段職業生涯。反思這四段職業經歷,對比目前所面臨的困局,我感覺有必要對比分析四個國家的網際網路公司在軟體研發職位方面的設計,希望能從中提煉出有價值的經驗,或許對網際網路企業的CTO有一定的啟發意義。
新加坡曾經是英國的殖民地,不論是法律體系、政治制度還是職場文化都繼承了不少英國的傳統,其主要特點是階層和分工明確。公司研發團隊的系統分析師和程式設計師之間的分工非常明確,系統分析師主要負責系統設計,程式設計師根據系統分析員的設計來實現程式碼。90年代公司對這些程式設計師的要求並不高,可以是高中畢業生,學習財務專業的大專畢業生,而現在更多的是計算機軟體專業的畢業生。系統分析師一般是經過訓練有經驗的計算機專業的工程師。有些人能夠從程式設計師逐步提升到系統分析師,有些人則在程式設計師的崗位上長期工作。
日本公司對職位的區分更加清楚,系統分析師經常用Excel定義好系統要實現的具體功能,然後由程式設計師嚴格按照Excel的描述把定義好的功能逐一實現。日本企業有兩個特點,第一是員工的忠誠度比較高,他們往往會在同一個企業裡工作一輩子,所謂終身僱傭制。
而網際網路技術的發展很快,員工跳槽去不同的企業可以學習到很多新的知識,積累更多的經驗。忠誠於企業這個優良傳統在網際網路時代可能具有負面效果。第二是新老員工之間的隔閡,員工越老在企業裡越有地位,發言權越大,新員工必須無條件地尊重和服從老員工,簡而言之就是有論資排輩的現象。但是網際網路是個快速變化的行業,新知識新技術往往更加重要。比如老員工只會用C語言寫程式碼,對Java和Go語言等不清楚,他們往往憑經驗選擇自己熟悉的C語言,這對企業的技術發展是個障礙。
美國矽谷的情況則非常不一樣,因為大多數的矽谷網際網路公司都是從創業公司發展而來的,這些創業公司的研發人員從公司成立開始就什麼都做,產品設計、程式碼實現、應用測試,缺什麼就做什麼。 我曾經在同一個時間擔任Oracle DBA、系統管理員和Java 程式設計師。所以矽谷公司對研發人員的職位分得沒有那麼清楚,籠統地稱為軟體工程師。
這種安排與美國的文化有極大的關係,美國是一個比較開放、包容和平等的社會,只要能完成企業的創新,年紀大小、學歷高低、面板黑白都不是問題。經常會在企業裡看到掌握新技術的年輕人挑大樑,也常見到50歲,甚至60歲的程式設計師大叔在編寫程式碼。
中國的互連網公司與美國矽谷的情況比較接近,就是企業大多數都是從無到有,從小到大,公司對負責架構設計的工程師和負責程式碼實施的程式設計師的區別不嚴格。不同的地方在於中國的網際網路技術人員,受“學而優則仕”傳統觀念的影響,一旦做到30多歲就開始考慮向管理崗位轉,停止寫程式碼和做設計,很難找到50多歲還在一線寫程式碼的情況。還有一個不同點是中國大學計算機相關專業的畢業生,他們選擇專業往往是以能否容易就業為考慮的基礎,對程式碼實施和架構設計的深入研究和長期堅持有限,換句話說真正熱愛寫程式碼的人少,而以寫程式碼養家餬口的人多。
比較和反思這四段經歷,可以得出以下兩個結論:
第一、社會文化傳統對公司研發職位的設計有直接的影響。等級森嚴的社會文化自然要求架構師、系統分析師和程式設計師分工明確,各司其職。比較包容和平等的社會文化可以模糊定義這些職位。
第二、在不同的發展階段,公司應該採用不同的職位安排。初創性公司的員工人數很少,不必明確區分架構師與程式設計師,可以採用軟體研發工程師來做模糊處理。有一定基礎的成熟型公司,則可以明確地區分架構師和程式設計師。
中國的文化既不同於美國矽谷,也與日本和新加坡差異很大。我們的文化在平等和包容方面與矽谷差不多,在開放和技術素養方面,強於日本和新加坡,但比矽谷稍差,所以職位不能完全照搬矽谷的做法,以研發工程師的職位模糊所有其他的軟體研發職位,而應該在編寫程式碼和架構設計的分工上稍有不同。
在實際工作中,經常有初級的軟體研發人員不僅編寫程式碼,而且還負責設計架構。受到僅具備程式設計師水平的軟體研發人員專業水平的侷限,所以研發出來的應用系統的架構設計水平低下,程式碼實現也雜亂無章,這是很多CTO經常擔心和苦悶的地方。
解決這個問題的主要方法是 ,根據中國社會的文化傳統,網際網路企業的不同文化以及公司的不同發展階段,因地制宜地確定軟體研發人員職位定義的模糊度。
在公司的初創階段,在平等、開放、包容和技術人員素質較好(精英團隊)的情況下,可以在一定程度上模糊程式設計師和架構師之間的職位差別,充分發揮工程師的主動性和創新精神。
但是對創業超過10年的老牌網際網路公司而言,或者團隊的精英含量較低的情況下,我們就不能簡單地只設置軟體研發工程師的崗位,而應該清楚地區分出架構師和程式設計師至少兩種不同級別的職位。 明確架構師對架構負責,程式設計師對程式碼質量負責。避免小鬼當家,讓程式設計師做架構師的設計工作,或者浪費架構師的時間寫程式碼等類似的奇怪現象,以確保金融科技公司的架構能夠有效地落地實施。
---------- END ----------
本公眾號編輯部維護讀者群之架構群,邀請了坐館老司機曲健、偉山、安曉輝、史海峰嘉賓等參與交流。加群請在公眾號回覆:架構群。
往期推薦: