天天看點

在位元組跳動幹了 2 年後端開發,太真實…

在位元組跳動幹了 2 年後端開發,太真實…

先簡單交代一下背景吧,某不知名 985 的本碩,17 年畢業加入滴滴,之後跳槽到了頭條,一直從事後端研發相關的工作。之前沒有實習經曆,算是兩年半的工作經驗吧。

這兩年半之間完成了一次晉升,換了一家公司,有過開心滿足的時光,也有過迷茫掙紮的日子,不過還算順利地從一隻職場小菜鳥轉變為了一名資深劃水員。

在這個過程中,總結出了一些還算實用的劃水經驗,有些是自己領悟到的,有些是跟别人交流學到的,在這裡跟大家分享一下。

限于文章篇幅原因,隻能以截圖的形式展示出來,👇🏻👇🏻有需要的小夥伴可以文末擷取👇🏻👇🏻

學會深入思考,總結沉澱

我想說的第一條就是要學會深入思考,總結沉澱,這是我覺得最重要也是最有意義的一件事。

先來說深入思考。在程式員這個圈子裡,常能聽到一些言論:我這個工作一點技術含量都沒有,每天就 CRUD,再寫寫 if-else,這 TM 能讓我學到什麼東西?抛開一部分調侃和戲谑的論調不談,這可能确實是一部分同學的真實想法,至少曾經的我,就這麼認為過。後來随着工作經驗的積累,加上和一些高 level 的同學交流探讨之後,我發現這個想法其實是非常錯誤的。

之是以出現沒什麼可學的這樣的看法,基本上是思維懶惰的結果。任何一件看起來很不起眼的小事,隻要進行深入思考,稍微縱向挖深或者橫向拓寬一下,都是足以讓人沉溺的知識海洋。

舉一個例子。

某次有個同學跟我說,這周有個服務 OOM 了,查了一周發現有個地方 defer 寫的有問題,改了幾行代碼上線修複了,周報都沒法寫。可能大家也遇到過這樣的場景,還算是有一定的代表性。

其實就查 bug 這件事來說,是一個發現問題,排查問題,解決問題的過程,包含了觸發、定位、複現、根因、修複、複盤等諸多步驟,花了一周來做這件事,一定有不斷嘗試與糾錯的過程,這裡面其實就有很多思考的空間。比如說定位,如何縮小範圍的?走了哪些彎路?用了哪些分析工具?

比如說根因,可以研究的點起碼有 linux 的 OOM,k8s 的 OOM,go 的記憶體管理,defer 機制,函數閉包的原理等等。如果這些真的都不涉及,仍然花了一周時間做這件事,那複盤應該會有很多思考,提出來幾十個 WHY 沒問題吧...

再來說下總結沉澱。這個我覺得也是大多數程式員比較欠缺的地方,隻顧埋頭幹活,可以把一件事做的很好。但是幾乎從來不做抽象總結,以至于工作好幾年了,所掌握的知識還是零星的幾點,不成體系,不僅容易遺忘,而且造成自己視野比較窄,看問題比較局限。

适時地做一些總結沉澱是很重要的,這是一個從術到道的過程,會讓自己看問題的角度更廣,層次更高。遇到同類型的問題,可以按照總結好的方法論,系統化、階層化地推進和解決。

還是舉一個例子。做背景服務,今天優化了 1G 記憶體,明天優化了 50%的讀寫耗時,是不是可以做一下性能優化的總結?

比如說在應用層,可以管理服務對接的應用方,梳理他們通路的合理性;在架構層,可以做緩存、預處理、讀寫分離、異步、并行等等;在代碼層,可以做的事情更多了,資源池化、對象複用、無鎖化設計、大 key 拆分、延遲處理、編碼壓縮、gc 調優還有各種語言相關的高性能實踐...等下次再遇到需要性能優化的場景,一整套思路立馬就能套用過來了,剩下的就是工具和實操的事兒了。

還有的同學說了,我就每天跟 PM 撕撕逼,做做需求,也不做性能優化啊。先不讨論是否可以搞性能優化,單就做業務需求來講,也有可以總結的地方。比如說,如何做系統建設?系統核心能力,系統邊界,系統瓶頸,服務分層拆分,服務治理這些問題有思考過嗎?每天跟 PM 讨論需求,那作為技術同學該如何培養産品思維,引導産品走向,如何做到架構先行于業務,這些問題也是可以思考和總結的吧

就想一下,連接配接手維護别人爛代碼這種蛋疼的事情,都能讓 Martin Fowler 整出來一套重構理論,還顯得那麼高大上,我們确實也沒啥必要對自己的工作妄自菲薄...

是以說學習和成長是一個自驅的過程,如果覺得沒什麼可學的,大機率并不是真的沒什麼可學的,而是因為自己太懶了,不僅是行動上太懶了,思維上也太懶了。

可以多寫技術文章,多分享,強迫自己去思考和總結,畢竟如果文章深度不夠,大家也不好意思公開分享。

積極學習,保持技術熱情

最近兩年在網際網路圈裡廣泛傳播的一種焦慮論叫做 35 歲程式員現象,大意是說程式員這個行業幹到 35 歲就基本等着被裁員了.

不可否認,網際網路行業在這一點上确實不如公務員等體制内職業。但是這個問題裡 35 歲程式員并不是絕對生理意義上的 35 歲,應該是指那些工作十幾年和工作兩三年沒什麼太大差別的程式員。後面的工作基本是在吃老本,沒有主動學習與充電,35 歲和 25 歲差不多,而且沒有了 25 歲時對學習成長的渴望,反而添了家庭生活的諸多瑣事,薪資要求往往也較高,在企業看來這确實是沒什麼競争力。

而如果我們積極學習,保持技術能力、知識儲備與工作年限成正比,這到了 35 歲哪還有什麼焦慮呢,這樣的大牛我覺得應該也是各大公司搶着要吧?但是學習這件事,其實是一個反人類的過程,這就需要我們強迫自己跳出自己的安逸區,主動學習,保持技術熱情。在滴滴時有一句話大概是,主動跳出自己的舒适區,感到掙紮與壓力的時候,往往是黎明前的黑暗,那才是成長最快的時候。相反如果感覺自己每天都過得很安逸,工作隻是在混時長,那可能真的是溫水煮青蛙了。

剛畢業的這段時間,往往空閑時間還比較多,正是努力學習技術的好時候。借助這段時間夯實基礎,培養出良好的學習習慣,保持積極的學習态度,應該是受益終身的。至于如何高效率學習,網上有很多大牛寫這樣的文章,到了公司後内網也能找到很多這樣的分享,我就不多談了。

可以加入學習小組和技術社群,公司内和公司外的都可以,關注前沿技術。

主動承擔,及時交流回報

前兩條還是從個人的角度出發來說的,希望大家可以提升個人能力,保持核心競争力,但從公司角度來講,公司招聘員工入職,最重要的是讓員工創造出業務價值,為公司服務。

雖然對于校招生一般都會有一定的培養體系,但實際上公司确實沒有幫助我們成長的義務。而在能為公司辦成事,創造價值這一點上,我覺得最重要的兩個字就是主動,主動承擔任務,主動溝通交流,主動推動項目進展,主動協調資源,主動向上回報,主動創造影響力等等。

我當初剛入職的時候,基本就是 leader 給配置設定什麼任務就把本職工作做好,然後就幹自己的事了,幾乎從來不主動去跟别人交流或者主動去思考些能幫助項目發展的點子。自以為把本職工作保質保量完成就行了,後來發現這麼做其實是非常不夠的,這隻是最基本的要求。

而有些同學的做法則是 leader 隻需要同步一下最近要做什麼方向,下面的一系列事情基本不需要 leader 操心了 ,這樣的同學我是 leader 我也喜歡啊。入職後經常會聽到的一個詞叫 owner 意識,大概就是這個意思吧。

在這個過程中,另外很重要的一點就是及時向上溝通回報。項目進展不順利,遇到什麼問題,及時跟 leader 同步,技術方案拿捏不準可以跟 leader 探讨,一些資源協調不了可以找 leader 幫忙,不要有太多顧忌,認為這些會太麻煩,leader 其實就是幹這個事的。

如果項目進展比較順利,确實也不需要 leader 介入,那也需要及時把項目的進度,取得的收益及時回報,自己有什麼想法也提出來探讨,問問 leader 對目前進展的建議,還有哪些地方需要改進,消除資訊誤差。做這些事一方面是合理利用 leader 的各種資源,另一方面也可以讓 leader 了解到自己的工作量,對項目整體有所把控,畢竟 leader 也有 leader,也是要彙報的。

可能算是大家比較反感的向上管理吧,有内味了,這個其實我也做得不好。但是最基本的一點,不要接了一個任務悶着頭幹活甚至與世隔絕了,一個月了也沒跟 leader 同步過,想着憋個大招之類的,那基本涼涼。

一定要主動,可以先從強迫自己在各種公開場合發言開始,有問題或想法及時 one-one。

除了以上幾點,還有一些小點我覺得也是比較重要的,列在下面:

第一件事建立信任

無論是校招還是社招,剛入職的第一件事是非常重要的,直接決定了 leader 和同僚對自己的第一印象。入職後要做的第一件事一定要做好,最起碼的要順利完成而且不能出線上事故。

這件事的目的就是為了建立信任,讓團隊覺得自己起碼是靠譜的。如果這件事做得比較好,後面一路都會比較順利。如果這件事就搞雜了,可能有的 leader 還會給第二次機會,再搞不好,後面就很難了,這一條對于社招來說更為重要。

而剛入職,公司技術棧不熟練,業務繁雜很難理清什麼頭緒,壓力确實比較大。這時候一方面需要自己投入更多的精力,另一方面要多跟組内的同學交流,不懂就問。最有效率的學習方式,我覺得不是什麼看書啊學習視訊啊,而是直接去找對應的人聊,讓别人講一遍自己基本就全懂了,這效率比看文檔看代碼快多了,不僅省去了過濾無用資訊的過程,還了解到了業務的演變曆史。當然,這需要一定的溝通技巧,畢竟同僚們也都很忙。

臉皮要厚一點,多找人聊,快速融入,最忌諱有問題也不說,自己把自己孤立起來。

超出預期

超出預期這個詞的外延範圍很廣,比如 leader 讓去做個值周,解答使用者群裡大家的問題,結果不僅解答了大家的問題,還收集了這些問題進行分類,進而做了一個智能問答機器人解放了值周的人力,這可以算超出預期。

比如 leader 讓給營運做一個小工具,結果建設了一系列的工具甚至發展成了一個平台,成為了一個完整的項目,這也算超出預期。超出預期要求我們有把事情做大的能力,也就是想到了 leader 沒想到的地方,并且創造了實際價值,拿到了業務收益。

這個能力其實也比較重要,在工作中發現,有的人能把一個小盤子越做越大,而有的人恰好反之,那麼那些有創新能力,經常超出預期的同學發展空間顯然就更大一點。

這塊其實比較看個人能力,暫時沒想到什麼太好的捷徑,多想一步吧。

體系化思考,系統化建設

這句話是晉升時候總結出來的,大意就是做系統建設要有全局視野,不要局限于某一個小點,應該有良好的規劃能力和清晰的演進藍圖。比如,今天加了一個監控,明天加一個報警,這些事不應該成為一個個孤島,而是屬于穩定性建設一期其中的一小步。

這一期穩定性建設要做的工作是報警配置和監控梳理,包括機器監控、系統監控、業務監控、資料監控等,預期能拿到 XXX 的收益。這個工作還有後續的 roadmap,穩定性建設二期要做容量規劃,接入壓測,三期要做降級演練,多活容災,四期要做...給人的感覺就是這個人思考非常全面,辦事有體系有規劃。

平時積極總結沉澱,多跟别人交流,形成方法論。

提升自己的軟素質能力

這裡的軟素質能力其實想說的就是 PPT、溝通、表達、時間管理、設計、文檔等方面的能力。

說實話,我覺得我當時能晉升就是因為 PPT 做的好了一點...可能大家平時對這些能力都不怎麼關注,以前我也不重視,覺得比較簡單,用時候直接上就行了,但事實可能并不像想象得那樣簡單。比如晉升時候 PPT+演講+答辯這個工作,其實有很多細節的思考在裡面,内容如何選取,排版怎麼設計,怎樣引導聽衆的情緒,如何回答評委的問題等等。

晉升時候我見過很多同學 PPT 内容編排雜亂無章,演講過程也不流暢自然,雖然确實做了很多實際工作,但在表達上欠缺了很多,屬于會做不會說,如果再遇到不了解實際情況的外部門評委,吃虧是可以預見的。

公司内網一般都會有一些軟素質教育訓練課程,可以找一些場合刻意訓練。

以上都是這些分享還都算比較偉光正,但是社會吧也不全是那麼美好的。下面這些内容有負能量傾向,三觀特别正的同學以及觀感不适者建議跳過。

拍馬屁是真的香

拍馬屁這東西入職前我是很反感的,我最初想加入網際網路公司的原因就是覺得網際網路公司的人情世故沒那麼多,事實證明,我錯了...入職前幾天,部門群裡大 leader 發了一條消息,後面幾十條帶着大拇指的消息立馬跟上,學習了,點贊,真不錯,優秀,那場面,說是紅旗招展鑼鼓喧天鞭炮齊鳴一點也不過分。

除了驚歎大家超強的資訊接收能力和處理速度外,更進一步我還發現,連拍馬屁都是有隊形的,一級部門 leader 發消息,幾個二級部門 leader 跟上,後面各組長跟上,最後是大家的狂歡,讓我一度懷疑拍馬屁的速度就決定了職業生涯的發展前景(沒錯,現在我已經不懷疑了)。

坦誠地說,我到現在也沒習慣在群裡拍馬屁,但也不反感了,可以說把這個事當成一樂了。倒不是說我沒有那個口才和能力(事實上也不需要什麼口才,大家都簡單直接),在某些場合,為活躍氣氛的需要,我也能小嘴兒抹了蜜,甚至能把古詩文彩虹屁給 leader 安排上。而是我發現我的直屬 leader 也不怎麼在群裡拍馬屁,是以我表面上不公開拍馬屁其實屬于暗地裡事實上迎合了 leader 的喜好...

但是拍馬屁這個事隻要掌握好度,整體來說還是香的,最多是沒用,至少不會有什麼壞處嘛。大家能力都差不多,每一次在群裡拍馬屁的機會就是一次露臉的機會,按某個同僚的說法,這就叫打造個人技術影響力...

想舔就舔,不想舔也沒必要酸别人,Respect Greatness。

永不缺席的撕逼甩鍋實戰

有人的地方,就有江湖。雖然搞技術的大多城府也不深,但撕逼甩鍋邀功搶活這些鬧心的事兒基本也不會缺席,甚至我還見到過公開群發郵件撕逼的...這部分話題涉及到一些敏感資訊就不多說了,而且我們低職級的遇到這些事兒的機會也不會太多。隻是給大家提個醒,在工作的時候遲早都會吃到這方面的瓜,到時候留個心眼。

稍微注意一下,咱不會去欺負别人,但也不能輕易讓别人給欺負了。

不要被畫餅蒙蔽了雙眼

說實話,我個人是比較反感灌雞湯、打雞血、談夢想、講奮鬥這一類行為的,9102 年都快過完了,這一套***治還在大行其道,真不知道是該可笑還是可悲。當然,這些詞本身并沒有什麼問題,但是這些東西應該是自驅的,而不應該成為外界的一種強 push。

『我必須努力奮鬥』這個句式我覺得是正常的,但是『你必須努力奮鬥』這種話多少感覺有點詭異,努力奮鬥是以讓公司的股東們發家緻富?尤其在錢沒給夠的情況下,這些行為無異于耍流氓。我們需要對 leader 的這些畫餅操作保持清醒的認知,理性分析,作出決策。比如感覺錢沒給夠(或者職級太低,同理)的時候,可能有以下幾種情況:

leader 并沒有注意到你薪資較低這一事實

leader 知道這個事實,但是不知道你有多強烈的漲薪需求

leader 知道你有漲薪的需求,但他覺得你能力還不夠

leader 知道你有漲薪的需求,能力也夠,但是他不想給你漲

leader 想給你漲,也向上回報和争取了,但是沒有資源

這時候我們需要做的是向上回報,跟 leader 溝通确認。如果是 1 和 2,那麼通過溝通可以消除資訊誤差。如果是 3,需要分情況讨論。如果是 4 和 5,已經可以考慮撤退了。對于這些事兒,也沒必要抱怨,抱怨解決不了任何問題。我們要做的就是努力提升好個人能力,保持個人競争力,等一個合适的時機,跳槽就完事了。

時刻準備着,技術在手就沒什麼可怕的,哪天幹得不爽了直接跳槽。

學會包裝

這一條說白了就是,要會吹。忘了從哪兒看到的了,能說、會寫、善做是對職場人的三大要求。能說是很重要的,能說才能要來項目,拉來資源,招來人。同樣一件事,不同的人能說出來完全不一樣的效果。比如我做了個小工具上線了,我就隻能說出來基本事實,而讓 leader 描述一下,這就成了,打造了 XXX 的工具抓手,改進了 XXX 的完整生态,形成了 XXX 的業務閉環。老哥,我服了,硬币全給你還不行嘛。據我的觀察,每個網際網路公司都有這麼幾個詞,抓手、生态、閉環、拉齊、梳理、疊代、owner 意識等等等等,我們需要做的就是熟讀并背誦全文,啊不,是牢記并熟練使用。

這是對事情的包裝,對人的包裝也是一樣的,尤其是在晉升和面試這樣的應試型場合,特點是流程短一錘子買賣,包裝顯得尤為重要。晉升和面試這裡就不展開說了,這裡面的道和術太多了。。下面的場景提煉自面試過程中和某公司面試官的談話,大家可以感受一下:

我們背後是一個四五百億美金的市場...

我負責過每天千億級别通路量的系統...

工作兩年能達到這個程度挺不錯的...

貴司技術氛圍挺好的,業務發展前景也很廣闊...

啊,彼此彼此...

嗯,久仰久仰...

人生如戲,全靠演技。

可以多看 leader 的 PPT,多聽老闆的向上彙報和宣講會。

選擇和努力哪個更重要?

這還用問麼,當然是選擇。在完美的選擇面前,努力顯得一文不值,我有個多年沒聯系的高中同學今年已經在時代廣場敲鐘了...但是這樣的案例太少了,做出完美選擇的随機成本太高,不确定性太大。對于大多數剛畢業的同學,對行業的判斷力還不夠成熟,對自身能力和創業難度把握得也不夠精準,此時拉幾個人去創業,顯得風險太高。我覺得更為穩妥的一條路是,先加入規模稍大一點的公司,找一個好 leader,抱好大腿,提升自己的個人能力。好平台加上大腿,再加上個人努力,這個起飛速度已經可以了。等後面積累了一定人脈和資金,深刻了解了市場和需求,對自己有信心了,可以再去考慮創業的事。

一套系統提升學習的好資料

最後就是需要一套系統提升的好資料來提升自己的綜合技術能力了!比如下面分享的這套學習體系總結包含了 14 個技術棧:包括各大廠最新面試題以及面經,還有涉及JVM,Mysql,并發,Spring,Mybatis,Redis,MQ,Zookeeper,Netty,Dubbo,Spring Boot,Spring Cloud,資料結構與算法,設計模式,網絡與作業系統等相關技術領域的大廠面試題及詳解,還有相關面試突擊系列視訊以及學習路線。

第一部分 Java

(一). 基礎

1. Java 基本功

  • Java 入門(基礎概念與常識)
  • Java 文法
  • 基本資料類型
  • 方法(函數)
在位元組跳動幹了 2 年後端開發,太真實…

2. Java 面向對象

  • 類和對象
  • 面向對象三大特征
  • 修飾符
  • 接口和抽象類
  • 其它重要知識點
在位元組跳動幹了 2 年後端開發,太真實…

3. Java 核心技術

  • 集合
  • 異常
  • 多線程
  • 檔案與 I\O 流
在位元組跳動幹了 2 年後端開發,太真實…
注:含答案 ! 篇幅有限,已整理到網盤 ,文末可以領取

(二). 并發

1. 并發容器

  • JDK 提供的并發容器總結
  • ConcurrentHashMap
  • CopyOnWriteArrayList
  • ConcurrentLinkedQueue
  • BlockingQueue
  • ConcurrentSkipListMap
在位元組跳動幹了 2 年後端開發,太真實…

2. 線程池

  • 使用線程池的好處
  • Executor 架構
  • (重要)ThreadPoolExecutor 類簡單介紹
  • (重要)ThreadPoolExecutor 使用示例
  • 幾種常見的線程池詳解
  • ScheduledThreadPoolExecutor 詳解
  • 線程池大小确定
在位元組跳動幹了 2 年後端開發,太真實…

3. 樂觀鎖與悲觀鎖

  • 何謂悲觀鎖與樂觀鎖
  • 樂觀鎖常見的兩種實作方式
  • 樂觀鎖的缺點
  • CAS與synchronized的使用情景
在位元組跳動幹了 2 年後端開發,太真實…

(三). JVM

1. Java記憶體區域

  • 概述
  • 運作時資料區域
  • HotSpot 虛拟機對象探秘
  • 重點補充内容
在位元組跳動幹了 2 年後端開發,太真實…

2. JVM垃圾回收

  • 揭開 JVM 記憶體配置設定與回收的神秘面紗
  • 對象已經死亡?
  • 垃圾收集算法
  • 垃圾收集器
在位元組跳動幹了 2 年後端開發,太真實…

3. JDK 監控和故障處理工具

  • JDK 指令行工具
  • JDK 可視化分析工具
在位元組跳動幹了 2 年後端開發,太真實…

面試指南

(一). 程式員履歷該怎麼寫

  • 為什麼說履歷很重要?
  • 下面這幾點你必須知道
  • 必須了解的兩大法則
  • 項目經曆怎麼寫?
  • 專業技能該怎麼寫?
  • 排版注意事項
  • 其他的一些小tips
在位元組跳動幹了 2 年後端開發,太真實…

(二). 如何準備面試

  • 如何擷取大廠面試機會?
  • 面試前的準備
  • 面試之後複盤
  • 如何學習?學會各種架構有必要嗎?
在位元組跳動幹了 2 年後端開發,太真實…

(三). Java學習路線和方法推薦

  • Java 基礎
  • 作業系統與計算機網絡
  • 資料結構與算法
  • 前端知識
  • MySQL
  • 常用工具
  • 常用架構
  • 多線程的簡單使用
  • 分布式
  • 深入學習
  • 微服務
  • 總結
在位元組跳動幹了 2 年後端開發,太真實…