先聲明一下,封面圖是開發者內功修煉的飛哥,不是我啊!這篇文章也是轉自他公眾號。

很多同學都和我說過一個問題,有心想紮實地提高技術能力,但無奈工作太忙沒有時間,該怎麼破?
的確,現在很多公司都是 996,早9晚9,12小時的高強度工作導致下班後根本不想再動腦子。
日常工作也不像工作前想象的那麼美好,並不是時時刻刻都是在做高技術含量的事情。你的大部分時間將被的各種瑣碎的會議、業務需求評審會、線上維護、bug處理所占據。
每天做的都是各種雜事,不單單技術感覺難以成長,就連年底的績效考評成績可能也是平平淡淡,沒有亮點可言。你的自信也在一點一點的被磨沒。
如何在繁忙的工作中來保證自己的技術能力能夠持續進步,工作績效能夠突出?我覺得這是一個共性的問題。
我個人 2010 年碩士畢業,有在騰訊、搜狗十多年的工作經驗。我今天就結合我的工作經驗,來談談對這個問題的看法。
一、高效成長方法
我覺得辦法總比困難多。怎麼破局,關鍵點是在於要協調好工作績效和技術成長這二者的關係,爭取讓它們能夠達成一種互相促進的狀態。
我分享的方法可以分成如下幾步。
我覺得第一點應該要保持一顆好奇心,多多去項目中發現問題。我舉兩個我個人剛工作前兩年時間裡的兩件事情。
第一件事情是在 2010 年的時候,我在第一家公司還是一個新人,我發現我們所開發的客戶端啟動一次特別的慢。
於是我開始思考 Windows 進程啟動的過程中都幹了啥,有哪些地方可以優化一下。後來進行過系統的研究後我用了兩個手段進行改進,將啟動速度提升了 15% 左右。並總結成文反饋給了我的領導。
鑑於此類的工作輸出比較多,剛工作一年多的時候,我的 leader 就準備提升我為副組長了。不過我還是更熱愛互聯網,於是婉拒了領導的挽留,我在 2011 年跳槽到了騰訊。
第二件事情是在騰訊內部我同樣在工作中進行了深度的知識整理。當時老大給我分配到了一個模塊,所有合作方數據源的圖片下載模塊。
這個模塊的需求描述起來也很簡單,就是把合作方數據中的圖片 url 摘出來,然後下載並存儲到騰訊的服務器上。
在這個過程中,引發了我很多的思考。比如新建一個空文件的話消耗磁盤空間嗎?一個文件夾下最多能存多少個文件?文件名太長了的話會影響系統性能嗎?
基於這些深度的思考我進行研究和學習,後來的技術方案就是為了提高性能,我們將文件通過 hash 的方式散列到三級目錄結構下。保證每一次獲取文件都很快完成。基於此我還整理出了一篇熱文,該文章在騰訊內部KM年度熱文榜上登頂,而且在外網也是廣為流傳,參見《Linux文件系統十文》。
2.帶着問題去深度思考、查各種資料在我思考的過程中,我需要回頭去翻各種經典書籍、看 Linux 的內核源代碼,以及其它各種網上的資料。曾經有一次為了把一個內存的工作原理的問題弄明白,我嫌家裡的書少,網上的資料不夠,直接跑到國家圖書館待了半天。
下圖是我日常工作思考中參考的一部分書籍。值得強調的是,我更多地是把它們當成工具書。在遇到疑惑的時候來查。而不是像在學校里那樣,逐本逐頁的硬啃。
3. 別偷懶,加上動手驗證實測
在看完書,查完各種資料後,理論上你可能得到初步解釋了。但其實這個時候你的理解深度還遠遠不夠。而且還有可能是你查到的資料是片面的,甚至有可能都是錯的。
這時候的動手實際測試顯得尤為重要,用各種性能測試工具也可以,自己直接親手寫一段代碼也ok。反正就要用實踐檢驗理論是否正確。不正確的時候,再去別的地方搜其它的解釋。如此往復迭代,直到把疑惑徹底消滅掉為止~
舉個例子,我曾經為了搞懂一條 TCP 連接消耗多大的內存,一台機器到底能不能突破 65535 條連接而進行了大量的實驗,參見:
漫畫 | 一台Linux服務器最多能支撐多少個TCP連接
漫畫 | 理解了TCP連接的實現以後,客戶端的並發也爆發了!
百看不如一練,動手測試單機百萬連接的保姆級教程!
漫畫 | 花了七天時間測試,我徹底搞明白了 TCP 的這些內存開銷!
最後這一步是點睛之筆。只有對實際工作提升的技術才是有價值的技術。把你的深度思考的結論應用到項目中,將項目的效果進行提升。
舉個我幾年前的小栗子,當時接手了前任開發留下來的一個推送模塊,推送一次要跑將近 12 個小時。經過我剖析業務邏輯後發現主要耗時都花在了用幾百萬的 imei 到一個幾千萬條記錄的數據庫里查詢了,大量的網絡 IO 加隨機磁盤 IO。
我把業務邏輯進行了改造,而是一次性將表中數據全查下來。然後在本地機器上在執行順序讀取遍歷查詢。這樣大量的網絡 IO 、大量的遠程 MySQL Server 的隨機磁盤 IO 全被我幹掉了。在 MySQL上和本地服務器上全部都是磁盤順序 IO。整體耗時直接從 12 小時下降到了 20 分鐘左右。
再比如在近兩年裡,我們接手了一個新的業務。在該業務中,由於各種歷史原因,存在大量的本地網絡 IO(每天幾十億量級)。這些網絡 IO 其實都可以通過其它方式優化掉的。說到這裡,可能很多同學也會隱隱約約地覺得本機網絡 IO 沒有多大的開銷,這個認知其實是非常有問題的。
本機網絡 IO 和跨機 IO 比較起來,確實開銷會低一些。比如發送數據不需要進 RingBuffer 隊列,直接把 skb 傳給接收協議棧(經過軟中斷)。但是在內核其它組件上,開銷可是一點都沒少,系統調用、協議棧(傳輸層、網絡層等)、網絡設備子系統、鄰居子系統整個走了一個遍。連「驅動」程序都走了(雖然對於迴環設備來說只是一個純軟件的虛擬出來的東東。對細節感興趣的同學參見《127.0.0.1 之本機網絡通信過程知多少 ?!》
所以我們接手該項目以後,花了一些人力把所有的本地網絡 IO 都優化掉了。優化邏輯上線後,該服務線上的總 CPU 核數就得以節約掉了 30%,一個非常不錯的效果。
二、時間管理
最後一點,但是也非常重要,那就是時間管理。我分兩個角度來說,一是專注度、二是時間分配。
在時間管理中,首先我覺得最最重要的一點就是要精力高度專注。
現在的各種手機應用已經成為了人們深度思考的最大障礙。各個 App 都希望能瓜分你的時間,讓你在它的各種碎片,低價值甚至是垃圾的信息里逗留。吸取你的注意力,為他們創造廣告價值。你一定要學會控制住自己刷手機的欲望。
當然現在生活中你完全脫離手機也不可能。至少工作中還有很多事情需要你通過手機處理。累了也需要需要打開某個 app 消遣一會兒。
所以我推薦的時間管理方法是番茄工作法。某段時間內,比如半個或者一個小時,集中精力只對某一件事的高專注度的學習或工作。在這段時間內,王者榮耀、抖音、微博、朋友圈等會分散你注意力的東西統統丟開,甚至連整個手機扔到手摸不到的地方都可以。中間間隔比如 5 - 10 分鐘,可以掏出手機來刷一會兒,稍事休息,然後再進入下一個半小時。
平時我都是儘量保持這種方式來進行學習和工作的。我把手頭的事情按照輕重緩急排個序,然後就一個時間段,一個時間段地進行安排。
在我專注處理某個問題的時候,周圍的很多干擾我都會自動屏蔽(倘若這段時間內有人膽敢打擾我,哼,我就生氣!😂)
2. 規律時間投入在前面高效成長方法提到的四點中,很多事情是你無法在工作時間完成的,比如。因為你的日常工作中可能存在着大量的會議、溝通、bug 處理等等雜事。不太可能讓你有大塊的不被打擾的時間去專注深入研究某個技術點。
所以你需要一個固定的時間段來做以上的事情。如下建議中,你可以根據自己的工作生活習慣進行參考。
工作日固定時間段。每天抽固定的時間段。拿我自己舉例,我之前是每天早上的 7 點 30 到 9 點 這段時間固定用來深挖技術(這段時間內高度專注,我幾乎連手機都不碰)。至於你個人,可以根據自己的生活習慣來。比如你喜歡晚睡,就安排在睡覺前。能早起,就安排在早上起床後,上班前。即使是 996,我覺得每天至少抽出一個小時來是完全沒問題的。
周末大塊時間。周末是一個很好的可以擠出更大塊時間的地方。有些事情是一小時左右無法完成的,這些工作都可以放在周末完成。周末兩天可以固定抽出比如四個小時來。
通勤時間利用。很多一線城市的同學可能上班都比較遠。這段路上的時間也可以考慮利用起來,聽一些極客時間課程或者是隨身帶本書。不過這種時間也只適合淺度了解性的學習,想深挖某個技術點這種時間裡不太可能能挖好。所以我建議還是儘量離公司近一些,無論是租房還是買房都離公司近一些,達到職住平衡的狀態。我建議大家別貪圖郊區房子的新,面積大而住的賊遠。你要知道,你路上浪費的時間可能是很值錢的。
不過這些時間都應該是在你發現了有技術點需要深挖,有性能測試需要去壓、或者有技術點需要整理成文的時候才需要的。如果某段時間內沒有這些事情做,那也不要硬逼自己頭懸樑錐刺股,沒必要。好好去休息休息,享受享受生活也是很好的。
最後
總結一下重點,工作以後的學習方式和方法已經不能完全照搬你學校里的習慣了。你必須要學會要把深度的技術學習和提升你手頭工作效率結合起來。
當你每次都能用你深厚的技術能力把工作效果提升一大截時候,你其實就進入了一種技術和工作互相促進的良性循環。
這種良性循環持續下去,你的技術能力在穩步增長,你的績效也絕對會很不錯。達到這種狀態豈不是美哉!
最後我想補充說一點,其實你也不用把整個成長過程想的多麼的雞血。你的工作中的這種提升並不需要太多。假如你工作了三年,你在項目中有過三次大一點的效果提升,其實就足夠你拿到好的績效,或者是在面試中拿 offer 用了。
這些就是我總結出來的個人技術能力提升方法,希望對你也有用!
(完)
點擊下方圖片,查看更多精彩