作者:李樂
- “雷哥,我感覺我工作 2 年了,天天都是在用 PHP 寫業務邏輯,CURD,CURD,CURD,雖然很努力也很累,但是感覺自己也沒什麼成長……”
- “隔壁團隊搞基礎架構的兄弟好像很厲害,比我成長得快很多……”
- “掌握的技術感覺很不錯了,能搞定所有業務了,自我感覺良好,但是每次晉升答辯都不知道講啥……”
成長的煩惱每個人都有,有些人選擇用行動消除,有些人依然沉淪。
幸運的是,我們是前者。2016 年,我們團隊開始了每天早晨 08:50—10:30 的 100 分鐘早讀會,主要研讀工作中用到的開源軟件,比如 PHP 、 Redis(Codis)、 Nginx 和 MySQL 等。我們的規矩是團隊成員自願參加。
問題也隨之而來了,五分鐘熱度與兩天打魚三天曬網,怎麼辦?
“重在參與”: 一個人引導,大家一起討論;不是分享,是提問和探討;主動思考纔是正道。
設立階段性目標:每天沉澱 wiki,有了大量的學習筆記;設立一段時間的目標,比如未來 2 周弄懂 PHP 基本變量;長遠目標,寫一本書(2017 年我們的第一本書《PHP 7 底層設計與源碼實現》已上架)。
組織者以身作則:“以身作則”,每天按時到公司;前一天晚上用 2 個小時準備第二天要講的內容;一個人帶動三個人,三個人帶動整個團隊;團隊其他成員在成長,自己不成長就是“退步”。
21 天養成一個好習慣:4 個星期後,參加者會持續參加,養成了習慣;想偷懶,或者其他原因不參加,內心會“焦慮”。
2018 年 3 月份,我們開始了 Redis 源碼的學習。從數據結構學到命令解析,再到應用與實踐;從第一遍的抓主流程脈絡,到第二遍的扣源碼細節,到第三遍的提升實戰高度。
一些好的學習方法分享給大家
- 打破砂鍋問到底:凡事多問幾個爲什麼,任何方案、任何決策都有其背後的邏輯存在。比如,SDS 結構爲什麼這麼設計?爲什麼要採用漸進式 Rehash?過期健刪除策略怎麼決策?epoll 爲什麼這麼受歡迎?
- 總結與沉澱:積硅步以至千里,積怠惰以致深淵;記錄每天的學習筆記,多輸出優秀的博客文章;每天學一點,一年大不同。
- 舉一反三:以內存管理爲例,對比 PHP/ malloc/Redis/Nginx 內存管理各自的特點,思考 PHP Chunk 爲什麼需要 2MB 字節對齊;學習網絡編程,對比 Nginx、Redis、Swoole 網絡模型以及定時事件模型。
- 學以致用:源碼學習不是純粹的理論,設計、思維、應用都很值得我們細細品味;比如學習這些源碼後,在日常工作中,團隊夥伴的問題處理能力提升了很多——日誌切分導致 fpm 延遲上漲問題;PHP 日誌打印混亂問題;Nginx 502 和 504 問題定位;線上 fpm idle 掉底原因定位。
2018 年 8 月我們開始了《Redis5 設計與源碼分析》一書的編寫。團隊總共 9 位成員,陳雷、方波、黃桃、李樂、施洪寶、熊浩含、閆昌、張仕華、周生政。有些人是已經是第二次寫作了,有些人是第一次寫作。
第一次寫總是煎熬的,寫一行,不理想,刪了重寫,再寫還是不理想。將近一個月過去了,有些人僅僅寫了半頁。沒有目標的前行果然是緩慢的。我們再次的確立了目標,10 月初每個人完成各自第一章的編寫,11 月初完成各自第二章的編寫,11 月底到 1 月初全員參與校稿,與出版社簽訂合約 1 月底向出版社提交第一版書籍。有了目標,效率確實提升了;週末甚至是國慶假期都能看到大家來公司寫書。有小夥伴說,10 月 4 號國慶假期去公司寫書,完成了一章,一看時間都晚上 11 點多了。
寫書的過程是煎熬的,校稿的過程更是煎熬的。週末需要全體成員來公司,大屏幕投屏,每一章節、每一句話都需要一起審覈,表達是否正確、是否清楚、是否有語法錯誤。很多時候可能因爲一句話大家討論好久。
理工科學生往往是不善於寫作的,寫完書校完稿後,有夥伴都打趣說寫作能力提升了不少。
2019 年 8 月份,《Redis5 設計與源碼分析》書籍正式上架,這也是我們團隊的第二本書。在此感謝幾位兄弟在學習和研究過程中的陪伴與合作,本書是幾位兄弟共同合作的結晶。
早讀會也持續了三年時間了,時間不會虧待努力的人:
- 聽衆變成了講師,菜鳥變成了大神;
- 思否(segmentfault)上發表了 101 篇文章,收穫了 5000 聲望,4000 粉絲;
- 建立了 LNMPR 源碼交流的微信羣,從最初的二三十人的討論羣,到現在的將近 500 人的大羣;
- 早讀會從 10 個人到 20 個人,再到 50 個人;從滴滴到學而思網校;從後端到前端工程師;從雲平臺團隊到基礎架構團隊;
……
有人問我,學習源碼對平時工作有什麼幫助呢,在這裏我以團隊成員黃桃爲例。入職時只是 D5 的初級工程師,只會做模塊的開發,對於線上問題不知如何下手定位,方法論不足。堅持不到兩年的學習後成長爲 D7 的資深工程師,不僅能快速定位問題,更能從原理源碼層面解釋清楚,已經成長爲團隊的技術標杆。
我想告訴大家的是:
- 每天一點成長,積聚起來就是巨大的收穫;
- 永遠都要有學習的習慣,把成長作爲最重要的事;
- 對於技術問題,要打破沙鍋問到底,越問會發現自己不知道的越多;
- 人類對事物的認知是從無知→知道→瞭解→熟悉→掌握→精通 6 個階段,堅持學習是唯一的道路;
- 希望更多的人一起來堅持學習,一起來堅持成長。
未來的我們計劃:
- 明年出版《Swoole 5 應用與原理》;
- 明年出版《Nginx 源碼分析》;
- 培養幾位精通 PHP、Redis、Nginx 等方面的專家。
附上兩本書的照片和鏈接:
《Redis5 設計與源碼分析》https://item.jd.com/12566383....
《PHP7底層設計與源碼實現》https://item.jd.com/12355605....