當前位置: 華文問答 > 數碼

在微軟工作十年升到Senior Software Engineer是怎樣一個水平?

2020-03-10數碼

熟悉我的朋友都知道我最近升職了,我前段時間在我們的群聊中也提到了這個話題

大家可以加助教的微信MSBZ1019進群

升職後的年包是四十多萬美刀,其中股票的占比約為年包的三分之一。雖然本職的收入不如我開班授課以及出書的收入,但是能接觸到最前沿的科技和把人類的認知向上突破一個層級,這樣的成就感是無法用金錢來衡量的。

當然最近我也一直在思考我的職業規劃,這個貼文應該也會長期更新,我有什麽不一樣的想法就會上來更一下。畢竟在這個快節奏的時代,錯過機會真的代價很高。有時候,你的同學、朋友、前同事今天可能創業成功了,而明天可能又被裁員了。這種變化無常的情況,讓我不得不思考自己的職業生涯。基於我的經歷,我想分享一些個人的感悟,希望引發一些討論。

首先,讓我先介紹一下自己的背景。我的第一份工作是在谷歌,做搜尋和NLP演算法相關的研究,當時還是AI的蠻荒時代,LSTM和Spark還是很新潮的概念,後來被微軟的Eric(也是我後來的Manager,是對我影響很深的人)挖到了微軟。Eric和矽谷其他的Manager不同,我一直以為他聯系上我之後就開始正常的走面試流程,考演算法、系統設計,但是並沒有。他在讓我過來面試之前先讓我參加了他們組的團建活動,也很用心的給我講解了微軟的一些理念和Philosophy。

當時微軟的Satya新官上任,Satya算是對AI和大數據技術理解非常深刻的一位大佬,只是聽Eric轉述他的思想就已經覺得很震撼,確實從高層到基層都帶來了很不一樣的感覺,當然我加入之後微軟的股價也是水漲船高,讓我挖到了第一桶金,並且一路晉升到了管理層。

當然Eric對我的很多方面影響都非常大,他現在在搞幼兒教育,他對教育的執著和熱愛也非常感染我,也是我決心投入教育事業的動力之一。我也透過組織求職群幫在過去的五年中幫助了三千多位同學成功進入FLAG等頂尖科技公司。即便在Hiring Freeze的去年,我訓練的同學大部份也進入了大廠。

從Tech Lead開始算起,現在我已經擔任管理職位兩年多了,負責管理一個近二十人的團隊。雖然我是一個互聯網從業者,但是我的觀點並不能代表北美華人職場的現狀。但我希望我的經驗能夠給大家帶來一些啟示。當然,我也在適應和熟悉當前的職位中,如果我有說錯的地方,請大家見諒。

技術篇

升職加薪的第一步是深耕自己的領域, 不論是前端、後端、AI、演算法還是安全,你一定要在一定範圍內有自己的品牌效應:在周圍的同事中,一提到某個領域,別人想到的都是你,那麽你就成功了。

舉我自己專精的深度學習的領域而言:很多人滿足於使用別人準備好的數據,訓練一個復雜的(深度學習)模型,檢視表現數據還不錯,然後就讓工程師去部署上線,自己則四處演講寫文章。這樣的系統實際上線效果往往不盡如人意,我們看到的很多垃圾推薦資訊、無關廣告、AI系統各種犯傻很多就是源於這樣的模型。

要做好AI模型和系統,需要做大量的工作,而且很多工作都是繁瑣、瑣碎和千頭萬緒的。這些工作既無法寫在文章裏發表,也無法給領導匯報。因此,即使你去讀他人的書、文章,甚至當面請教他人,也不一定能知道所有的細節。比如,模型是否最佳化到位?有沒有根本性錯誤?能不能簡化?各種依賴關系是否清晰?上下遊進度是否可控?

升職加薪的第二步,要了解真實的問題,知道自己需要解決什麽問題 。這就要求我們要熟悉業務和數據。數據不會自己找上門來。從剛入職開始,我就盡量多地了解數據的種類、如何獲取和分析,最好都在文件上寫下來。很多公司都有wiki文件系統。平時打基礎或使用前,要多探索數據的各種分布特點,比如銷售數據在各國、各商店、各種人群的數值都要了解,可以提前寫些分析文件。這個數據基礎對於理解真實問題、尋找改進機會、建立合適的模型都會有幫助。

很多人錯誤地認為 ,現在深度學習的建模使人們不再需要了解數據的特點,簡單的把所有數據fit進模型就行了。我們的分析表明,garbage-in, garbage-out的原理還是適用的。我曾經見過一個簡單的數據操作,比如把同一個樣本上互相矛盾的label去掉,就提高了深度學習模型的表現。也見過數據標定過程混亂造成模型混亂的情況。很多人認為數據標定和數據清洗是臟活累活,幹的都是和「民工」打交道的工作,遠不如訓練fancy的模型聽上去高大上。可事實就是萬丈高樓平地起,沙灘上蓋不起高台,一定要重視標定數據的質素。

要重視處理第一手數據。如果不親自處理原始數據,只看報告或聽取他人的匯報,漸漸地就會失去對實際情況的掌握,從而導致決策失誤。因為在數據處理過程中,可能會存在選擇、粉飾和失真的情況。我曾經因為對第一手數據失去感覺,而不理性地設定了一個無法完成的目標,最終給我的團隊帶來了慘痛的教訓。此外,很多時候,制定發展方向和想出新點子也是透過處理實際數據的過程中得出的。

升職加薪的第三步,要做完整的專案,從頭到尾地完成,這樣才能得到全方位的鍛煉。 如果只是東做一個任務,西做一個任務,那麽無法系統地提高一個人的水平。我發現,對自己成長幫助最大的經歷就是把幾個實際專案從頭到尾完整執行,從構思、分析、建模、最佳化、工程實作、實驗設計到上線、維護。只有經歷了幾次完整的過程,才能掌握一整套工具和技能,才能知道什麽重要什麽不重要,才能知道哪裏會有陷阱和風險,才會制定合理的計劃(對自己或者對團隊)。

我到現在還記得第一次從一個想法,鏖戰許多日夜,歷經千辛萬苦,最後開啟A/B實驗,然後看到系統指標提高的感覺,和航天人發射火箭差不多。當然,曾經有的專案失敗的教訓也刻骨銘心,擁有「踩地雷」的經驗也很重要。 怎麽正確的失敗?最好是fail fast ,一個想法不對,能夠迅速用數據驗證「此路不通」是最好的。當然萬一論證不周,已經投入很多,最後失敗了,也不能「逃跑主義」,能在逆境中行動也是一種重要能力。我認為,打過敗仗但沒倒下,還能總結經驗教訓的幹部最寶貴。後來在自己帶新人的時候,也會有意識給他們創造能完整執行專案的機會,但是自己同時也不能失去了對細節的把握。

升職加薪的第四步,我們要重視專案前期調研 。很多人在接到一個任務或專案後就開始忙碌起來,這是不正確的。我們必須從大局出發,思考這個任務是否有必要,是否有成功的可能性。 如果我們認為這個任務沒有必要,或者無法成功(透過最大機會的估算) ,我們就要果斷地否定它。對於一個大型專案,在啟動之前,我們一定要進行盡可能多的科學論證,不僅要考慮機會的大小,還要考慮隱藏的風險,比如合作夥伴不可靠、對外依賴太多、人手不足或不穩定、客戶需求來源不穩定等等。我們絕不能冒進,做沒有把握的事情。之前提到的設定目標過於武斷的原因就在於前期論證不充分。有時候由於事情太多,我們會因為趕進度而忽略論證,最終會發現我們做了無用功。

升職加薪的第五步,要叠代,叠代,再叠代,而且要快 。很多人在開始一個專案時,會花費很多時間去研究最優的方法,卻忽視了很多更關鍵的問題。例如,你可能會在方法上有很大的創新(例如最新的深度模型),但是無法獲得高質素的數據,或者工程成本過高導致上線推遲。 我建議在第一個版本中使用基於規則的模型或啟發式演算法來實作一個可用版本,並確保每個環節都能夠順利進行。在第一版上線時,要立即組織數據采集、數據標註和模型升級等工作

公司內外環境也變化萬千,為了避免「做了一半專案卻沒了」的窘境,我們需要快速行動,同時留下後續最佳化和提高的空間。我個人觀察發現,很多學術界的大教授在公司裏掛個虛銜還好,但是如果真的要做產品,很多人並不能成功,原因可能是因為他們做事太過於學院派,無法適應商業環境。

升職加薪的第六步,要簡化,Less is More。 隨著深度學習的飛速發展,AI模型也越來越復雜。雖然大型深度學習模型確實可以學習到更多的隱含關系,從而提高系統效能,但是很多人只是為了追求花哨的方法,或者為了發表文章而使用復雜模型,結果適得其反。例如,當數據量很小或問題本身並不復雜時,我們應該使用簡單模型來解決問題,而不是使用復雜模型。有時候,為了簡化系統,我們需要在犧牲一些效能方面做出妥協,以考慮工程難度或成本。因此,在有條件的情況下,我們應該盡量考慮簡化系統,因為簡單的系統更易於偵錯和維護。

升職加薪的第七步,我們需要提高自己的理論修養。作為一名優秀的機器學習科學家,我們需要了解模型的實作機理,比如Transformer模型中的註意力機制,而不是僅僅當一個「調包俠」或「調參俠」。 隨著人工智能的發展,它一定會變得越來越易用,變得越來越普及。這就好比修電視的大師傅和設計電視芯片的工程師的區別。因此,作為機器學習科學家,我們也需要開啟各種模型的「蓋子」,學習它們的理論和程式碼。在面試中,我通常會問一些細節問題,來判斷面試者是只知道模型的名字來堆砌->還是實際使用過(調包)->還是更牛的了解內部實作的細節。

升職加薪的第八步,我們需要關註AI領域的最新發展。 AI領域的發展速度非常快,很多新技術一出現就會顛覆老技術,導致很多人積累多年的經驗效果大打折扣。例如,舉我之前在谷歌的第一份工作的例子,在深度學習套用於自然語言處理(NLP)領域之前(2013年之前),和之後完全是兩個時代。之前是「冷兵器」時代,需要手動制造各種特征,之後是「熱兵器」時代,可以讓模型自動學習特征。到了2018年底,Transformer模型推出之後,也顛覆了很多之前基於RNN的方法。後來,各種基於大數據預訓練的Transformer模型(如BERT)也出現了,使用者只需要使用少量數據微調後就能使用,相比之前,就好像坦克加入了實戰一樣。如果我們不及時提高理論修養,我們就會像拿著冷兵器對抗熱兵器,或者像用步槍對付坦克一樣,在實際問題中無法勝任。但是,我們也不能沈迷於理論,必須根據實際問題適時解決問題,Less Is More這一點在上文中已經提到。

軟實力篇

向上管理層面要經常主動和你的老板提出你的想法,你未來的職業規劃,並且不斷向他們展示你在這方面的努力和成果,從而讓他們確信你是真心有這個想法,這樣也更容易得到他們的幫助。同時,要多思考如何能為你的老板,甚至你老板的老板「解憂」。如果你的工作能讓他們的工作變得更簡單,那麽他們就更有可能相信你有當管理者的潛力。

不要等待老板分配任務,而是要主動地「來事」。當然,這需要具備敏銳的洞察力和解決問題的實際能力,只有透過我上述文章中提到的,透過專案不斷思考和實踐才能積累經驗。如果你的目標是成為更高級的工程師,那麽除了在技術領域做到不可替代(一定程度上),你還需要明白除了技術以外,你還需要具備很多必要的能力。在初級階段,寫好程式碼和文件、做好設計可能已經達到了硬指標。越高級的技術職位,越需要具備宏觀的系統思考能力,比如:

  1. 這個技術可以在哪些方面起到促進作用?
  2. 可以為使用者帶來什麽更好的體驗?
  3. 作為技術專家,如何說服產品/管理層來投資這個技術?
  4. 又如何實施這個解決方案?

技術只是解決實際問題中的一個環節,遠遠不是全部。不要只看重技術。能夠真正從頭到尾實作一個解決方案,才是最具有競爭力的。

我們需要發揮個人的積極作用,但是不要太過於強調個人英雄主義,也不要做無原則的好人。即使是新人,也需要積極思考事情是否應該這樣做,而不是單純地被專案經理或者經理的要求所左右。因為很多提需求的人並不一定懂得技術實作的可行性,如果我們盲目地按照他們的要求去做,很可能會白白浪費時間和精力。因此,我們需要因勢利導,盡量調動各方的積極性,避免單打獨鬥。

如果我們所處的環境是一個註重實際行動的環境,我們就需要堅定地表達自己的觀點,不要退縮;如果我們所處的環境是一個辦公室政治盛行的地方,那麽說明這裏沒有發展的機會,我們就需要離開去尋找更好的發展機會。

在工作環境中,我們要多與靠譜的人合作,向能幹的人學習,幫助那些努力但是未掌握方法的人,遠離那些不靠譜的人。


要有所為有所不為,這是一個非常重要的原則。只有放棄一些不必要的事情,才能更好地專註於做重要的事情。比如,作為一名從事IC工作的人,我曾經花費很多時間參加各種會議,包括討論計劃的sprint planning、討論技術的review meeting、分享知識的knowledge sharing、向上匯報的demo,以及團隊活動happy hour等等。這些會議占據了我大量的時間,導致我無法專註於工作。

為了解決這個問題,我向領導反映並希望能夠最佳化會議設定。同時,我也學會了放下面子,不去那些對自己無益或對別人也無益的會議。這樣,我節省了很多時間,提高了效率,也取得了更好的工作成績。

總結

在職業生涯的長期管理方面,我認為現在的年輕人關註的問題主要是戰術層面,比如比較不同的offer。另一方面,也有越來越多的人擔心職場天花板,35歲以後的職業發展。回顧前幾年的經歷,我認為問題的根源在於對職業生涯的理解不到位。我們步入職場後,面對的是40年左右的時間,這是一個非常長的跨度。即使到了40多歲,還有差不多20年的時間才能退休。因此,職業規劃應該是一場長跑,而不是短跑。許多人一開始就卯足全力沖刺,認為只有十年時間來經營,如果35歲不能財務自由,之後就會墮入黑洞。

盡管我們現在處於一個加速內卷的時代,但其實並不需要過度擔心。首先,我們需要調整我們的期望。職業發展和其他任何事情一樣,都不可能一帆風順。如果我們能夠進入這個行業,相對於我們的同齡人來說,我們已經很幸運了。我們擁有相對容易的移民機會、高薪金和高福利等優勢,這些優勢會讓我們產生一種之後的人生應該一路向上的錯覺。但是,現實往往會給我們帶來挑戰。就像今年的疫情,許多人的職業生涯被迫倒退,這是無法預測和準備的。因此,作為普通人,我們需要做的最基本的事情是調整我們對職業規劃的認知和期望,留好自己的底牌,保證自己有能力應對任何黑天鵝事件。其次,我們需要調整我們的投資策略。就像巴菲特一直強調的投資長期有價值的公司,而不是投機短期有利可圖的股票一樣,我們也可以將這個道理套用在個人職業規劃中。

常見的情況是,我們需要能夠看到長期的機會,不要因為短期的薪金得失而放棄長期的機會。我一開始跳槽的間隔比較短,只呆了一年多就走了,因為覺得跳槽可以直接加薪,還有簽字費,很劃算。但後來我發現,一旦跳槽,所有在前公司積累的人脈、名聲和資歷,在新公司歷奇本上沒有任何幫助,一切都要從頭開始。然後我也觀察到,為什麽印度人占據了非白人管理職位的大多數。我發現這些人都在本公司呆了很長時間,以保證一旦出現職位空缺,他們是最有力的競爭者。懂得這一層後,對我自己轉為Manager的規劃起到了很大的幫助。我潛心呆在現在的公司,即使期間有想離開的時候,也還是堅持了下來。其實說起來,選擇留下也並不容易。畢竟這裏的機會很多,獵頭也隔三岔五地找上門來,薪資也很誘人。更重要的是,前同事的薪金提升會很大程度上刺激你的跳槽欲望,畢竟都是凡夫俗子嘛。我在現在的公司呆了超過五年,兩年多前遇到一個好機會,成功轉到一直向往的Manager職位,之後至今的發展也算不錯,團隊人數一直在穩步上升。

但是,這一切都建立在我選擇留下的基礎上。我很難想象,如果我跳槽了,我是否能在同樣規模的公司中在同樣的時間內擔任管理職位。當然,這一切都是有機會成本的。也許如果我之前答應去螞蟻,現在我可能正在等待上市並數錢;但同樣,現在我也可能已經被解雇,無家可歸。這些不確定性隨時都可能左右著我們的生活,所以我們需要調整好自己的期望和心態。與其為沒有得到的後悔,不如珍惜已經得到的機會。

在這裏,我想再說一句,不要因為一時的失意就開啟leetcode準備刷題離開。在我升為經理之前,我還有另一個機會,但遺憾的是我沒有得到它,被一個印度人搶先升為經理。當時的我很生氣,一度認真準備去另一家FLAG公司投靠朋友。但後來我還是決定冷靜下來,撇開偏見,認真找找原因。最後,我確實從那個印度人身上學到了一些有用的戰術細節和戰略思考能力。現在回想起來,我從這個失敗中學到了很多東西。當然,這裏並不是在勸大家不要跳槽。如果遇到極品老板或惡心的公司,還是要盡早跳出火坑。同時,leetcode也需要常備常新。

總的來說,不要太在意小小的得失,不要因勝利而驕傲,也不要因失敗而氣餒。把職業規劃看作是一場長跑,一步一個腳印地走,才能取得全域最佳化的效果。就像之前所說,職業生涯跨度很長,沒有人能預測自己未來的方向。但是,只要掌握最基本的方法,就能增強我們在職場上抵禦風險的能力,增加成功的機會。