技術人員在大公司能學到什麼

juvenxu發表於2015-07-27

  我在小公司待過、也在大公司待過、還作為小公司的諮詢顧問在大公司待過很長一段時間,目前還在大公司待。對於個人成長,大公司能給你哪些小公司很難給的機會?這是本文想討論的主題。

 技術人員在大公司要面對的問題

  個人成長,方法大致是兩種,第一是主動學,現在網際網路這麼開放,IT行業中的知識,只要你想學,幾乎沒有找不到的資料。基本上,稍微靠譜點的技 術人才,都具備主動學習的素質,然而這種學習方式,無論是看書、讀部落格、上線上課程…… 都有個非常明顯的缺點,就是缺乏對問題的直觀體驗,幾年前我看《Java Concurrency In Practice》,囫圇吞棗,表面上懂了,實際上壓根沒理解。近期當我面對一個比較典型的併發問題的時候,再翻出那本書,忍不住一口氣讀了幾十頁,因為 實在是太對胃口了!所以第二種學習方法往往更為重要,那就是:面對問題,解決問題,這是一種基於體驗的成長,比基於純理性的記憶理解,深刻得多。

  所以, 有哪些問題,大公司需要面對?小公司不需要面對? 我總結下基本是三個問題:

  1. 大公司服務的使用者數量級相比小公司不在一個層次。
  2. 大公司需要考慮如何保持數百數千程式設計師高效工作。
  3. 大公司處理的業務往往非常之複雜。

  當然上述幾點並不總是正確的,比如現在會有一些小公司服務千萬級別的使用者,也需要面臨類似的技術問題。但大體上就是這些問題,大公司必要面對,小公司在早期是不需要面對的。

  上述三個問題實際上是 Scalability 的問題,具體我推薦大家看 《The Art of Scalability》 的詳細闡述。解決上述三個問題,需要技術人員具備怎樣的能力?

 三個問題要求你學什麼?

  第一個問題,如果面對百萬級、千萬級的使用者,是被大家討論最多的,具體的技術會涉及到:無狀態應用、負載均衡、分散式快取、分散式佇列、高效能 Web伺服器、資料分庫分表…… 在大公司,也許根本輪不到你去開發分散式快取,但只要你留點心,就能很快理解在什麼情況下該用分散式快取,它能帶來多少效能提升,命中率還有多少提升空 間,等等。這一塊,是大家面試的時候比較喜歡問題的,沒做過的,都覺得很酷很牛逼的樣子,經歷過了,感覺其實也就那樣,關鍵是你遇到問題了,並且用這些技 術解決了。

  第二個問題,如何管理數百人的研發部門,更多的是被很多純管理職位的經理在討論。普通程式設計師,面對由於跨團隊跨部門溝通所帶來的消耗,10個程 序員估計會有11個罵娘;然而問題始終是客觀存在的,我現在的日常工作一直遇到類似的問題,我也問過 Facebook 的工程師,人家也坦然承認,較之與 Facebook 早期,他們現在研發的效率也的確慢了很多。

  保持自己工作高效,並不是個特別困難的問題;保持2-3人小團隊工作高效,也不難,只要大家志趣相投、目標一致基本就可以了;10人左右的團 隊,就需要聰明的管理者花許多時間去理解大家的想法並協調。當然,愚蠢的管理者只會開一大堆無意義的會,刷點存在感,傳達點上面給的壓力。團隊規模再擴 大,帶領上百人團隊的中層管理者,他就需要去幫助一線管理者了,這個超出我的經驗了。我想說的是,管理也是技術,不比程式設計更難,但也不見得比程式設計簡單。

  除了管理能力外,保持大規模團隊的研發效率,還需要規範和工具支撐。使用一致的基礎設施(如版本控制、測試環境、釋出流程、溝通協議),規範化 大家的程式碼組織結構,抽取共有的技術服務,防止重複造輪子…… 這些都是非常具體、非常現實的技術問題。小公司幾萬行的程式碼做整體技術升級,找個牛逼的程式設計師就能搞定了,大公司幾十萬、幾百萬的程式碼做技術升級,沒有任 何一個英雄主義程式設計師能搞定,解決這類問題需要有前瞻性的架構,需要有善於溝通的架構師。雖然過程中難免會需要和人扯皮開會,但做好了也是極富有成就感的 事情。

  第三個問題,在大公司要面對更大的業務複雜度。也許是大公司產品經理太多了,大家都想折騰點東西出來,所以各種功能特性不停加不停變。這時候技術人員就不 得不去理解各種業務的含義,我們都知道,如果實現和業務意義不吻合,最終的程式碼就會變成一個無人可維護的怪胎,因此優秀的技術人員就能很好識別業務邊界, 把小怪獸關在各自的籠子裡,防止他們聚在一起搞得天翻地覆。再優秀的技術人員,就能說服產品經理,“這麼幹是不對的”。這方面我推薦 《Domain Driven Design》

 大公司的普遍弊端

  我並不是說任何一個大公司的程式設計師都會去面對上面三個問題,事實上剛入職的新人程式設計師一般只會處理很小業務範圍內的沒有太大挑戰的任務。不過只 要你有興趣並持續提高自己能力,還是有很大機會去面對並處理這些問題的,因為公司的管理者終究是期望有人站出來幫他們排憂解難的。不過大公司或多或少都有 一些普遍的問題。

  首先是 人浮於事、文山會海 。有很多人不停開會、不停寫郵件,就是不幹活,搞的你也沒好心情幹活。吐槽歸吐槽,我還是會仔細想想為什麼這樣。首先,溝通是必要的,兩三個人幹活打個招 呼就行了,十多人幹活就需要開會,事情多了,會也自然多,再加上很多人其實沒有基本的主持會議技能,那很容易搞成垃圾會議。其次,公司大了自然會有一些兵 油子,每句話說出來都大方得體,但就沒見他把事情落地,更別提自己挽起袖子幹了,比較麻煩的是這些人普遍層級還相對高點。我能做的,就是離他們遠點。

  其次是 目光狹隘 。如果一個程式設計師剛畢業就來到大公司,而且恰好這幾年這家大公司業務和技術突飛猛進,那他的眼光就容易受限,覺得自己的公司全國甚至全世界最牛逼,再加上 我們中國人普遍存在的報喜不報憂文化,他的這種盲目就更容易被環境所固化了。於是一不小心,一些人的技術視野就變得很窄,我在內部推廣Git的時候,持疑 惑最大的也就是一些工作年限較長的資深工程師。

  還有,我個人比較頭大的是, 目標不一致 。跨團隊、跨部門溝通的時候,你很容易發現自己在雞同鴨講。可能團隊A關心技術架構,團隊B關心業務指標,然後你上升一層,在部門層面做個決策先做什麼後 做什麼。一會你又發現,部門A關心業務指標、部門B關心基礎建設,你又得上升一層,可那一層離你好遠…… 所以你會發現很多大公司很多人做事很大程度上是在靠個人影響力,而不是正規的流程。如果我曾經做過些成功的事情,我平時對大家也比較熱心,那我做一些事情 的時候,一些人會把自己的目標暫時放一邊,來幫你一把,這就是俗稱的“刷臉”。

 總結

  總結之前,有一點我要額外提一下,大公司畢竟是藏龍臥虎的地方,各個領域都有比較資深的人存在,如果公司文化鼓勵分享,那你就很容易找機會請人家喝杯咖啡,聊聊。

  做任何選擇,如果你不考慮失去什麼,只考慮得到什麼,那就是典型的幼稚。因此選擇大公司還是小公司,你不僅得明白你期望收穫什麼,還得坦然面對要失去的東西。

  我說這麼多,基本就是告訴你,有些東西你肯定會失去,還有一些東西,如果你努力,你可能會得到。

相關文章