天天看點

我是如何完成這部30餘萬字技術書籍的

       如果把寫書,也分為類似華山劍法一樣,有 “劍宗” 和 “氣宗” 的話,這篇文章實際歸到 “氣宗” 裡面,并沒有講述如何寫作,而是談了寫書技能之外的内容。本文整理自我在研發部開年大會上的分享,為了保護隐私文章提到的人員姓名都隐去,另外成文上也略有更改。

我們先從榜樣說起,我們一定要有個榜樣,但是這個目标榜樣要努力之後可達,比如我原先把雷軍當成我的榜樣,他也是程式員出身的吧,天天夢想着要成為他們那樣的人,這個機會對于我來講非常之渺茫,不可達。甚至就連業界的技術大神比如Martin Fowler我也難以望其項背,當然除了發型。是以呢,我就以身邊優秀的人為榜樣,比如有的同僚,大家無論在大促備戰還是平時架構問題找到他的時候,你會發現他的思路非常獨到,經常會已經站到你思路的前面了,常常會給我們幫助,那我是不是可以像他那樣思考呢?在2016年底,我們部門來了一位同學,他寫了一本關于大資料的書籍,我得知之後約到他,在總部7樓休息室,我們一起聊了寫書的方法,是以我能不能也寫一本書呢?

我是如何完成這部30餘萬字技術書籍的

那麼經過了兩年的時間,我真寫了一本書,現已在京東開啟預售。

我是如何完成這部30餘萬字技術書籍的

在這裡并不是鼓舞大家都去寫書,要不然沒人寫代碼了。我想分享一下,這個過程,是怎麼過來的,在整個寫作的路程上,總結下來主要有專業、總結、自律、堅持、突破這樣幾個關鍵詞,下面跟大家逐一分享。

我是如何完成這部30餘萬字技術書籍的

首先,我們需要在一個技術方向上持續精進,達到專業。常常聽見周圍的同僚說我們是做業務的,搞技術肯定玩不過基礎技術部門的啊,比如中台,甚至還有的同僚想辦法異動到了那邊。其實完全沒有必要,要想清楚一件事情,我們一直是JSF、JMQ、JIMDB這些中間件的使用者,我們知道他們的性能和技術“脾性”,另外源代碼都在内部GIT上,都可以看的,可以跟周圍的同僚讨論,在使用的過程中還可以直接跟中間件的同僚溝通,是以要學技術這個不是問題,搞業務研發還是純技術研發,而且恐怕也麼有純技術研發吧,畢竟都要為使用者服務,為京東創造價值。另外再仔細問自己一個問題,我們經常使用的這些技術比如spring、Netty你都掌握了嗎,當問到你一個相關問題的時候你能連續說5分鐘甚至10分鐘都止不住嗎,如果沒有的話就選一個方向,一門心思鑽進去,接觸到某一事物并掌握其原理後,都能夠推知到其它技術領域的,正所謂觸類旁通了。我自己的實踐是選一個方向啃下去,學富五車,或者靈活變通并同時仍有所專長想讓自己卓爾不群,如果非要二選一的話,那麼就從專業化開始吧,然後再拓展分支。

我是如何完成這部30餘萬字技術書籍的

第二點,就是多總結,其實我們應該認識到京東是一個技術寶庫,這裡有大量優秀的同僚,目前京東是我所在的最大的一家公司,這裡有規範的流程,有公平的競争,有走在前沿的技術實踐,有詳盡的資料文檔,當然也上不了線上事故,這些都是我們學習的原材料,尤其是當發生線上事故之後,沒有辦法 “常在河邊走哪有不濕鞋”的,但是發生線上事故并不可怕,我們做好總結,分析出他的原因,避免下次再犯類似的錯誤,我們把它形成總結文檔,這樣也便積累了我們的學習資産。我自己的 實踐是,不放過任何一個線上問題,哪怕再小,不放過任何一個疑問,哪怕再小,不放過任何一個交流的機會,哪怕再小。

我是如何完成這部30餘萬字技術書籍的

第三點,我們要多看專業書籍,什麼才是算專業的呢,我們所從事的是代碼工作,那麼編碼實踐類的書籍是我們的專業書籍,程式設計思想的書籍也是我們的專業書籍,當然我們也不是其它任何書籍不看,比如常識的知識還是要掌握的,去醫院看胃病總要知道胃在哪裡,如果你買點基金理财總要知道股票型、指數型的差別。閑情雅緻的書籍也不是不能看,金庸、張愛玲隻要你還沒有厭倦都可以。但如果以醫學、文學和投資為主那就是本末倒置了。隻是我們要以專業知識為主,這是我們目前的生活技能之一。在整個寫作的過程中,我查了下一共讀了20多本技術書籍,大家想一個問題,在我們寫作文的那個年代,老師是不是鼓勵我們要多看範文,多看,然後培養自己的寫作感覺,實際上我們現在搞技術,也是一樣,技術專業書籍看多了,我們的技術靈感也就從段譽每次時而靈驗的六脈神劍,變成了喬峰白發百中的降龍十八掌。我自己的實踐是,從看書變成了“吃書”,對同一個知識點,找到類似的多本書籍,“橫看成嶺側成峰,遠近高低各不同”,從多個角度來了解往往對知識點的掌握更透徹。

我是如何完成這部30餘萬字技術書籍的

第四點,要努力讓自己往好的方面發展,比如我寫了一本書這期間的過程整個人的知識灌溉當然是輸入大于輸出,那麼我的知識體系會更健全,這是一個好的方面。再比如我們團隊搞靈活,是第一個拿到中班的,也是唯一個連續三次拿到中班的,估計以後在這個方面也沒有人能超過我們,這也是一個好的方面。但是自己寫了一本書,就是一件很了不起的事情嗎?我們連續拿到3次就是了不起了嗎?顯然不是,不會因為寫一本書,線上系統出問題就不會被批,不會因為獲得了中班,團隊以後不會有其它問題。到了一個好的層面就會更高的要求自己,寫了一本書,等書籍出版之後可能會有讀者來問我,這個時候我就要做到問一答十,這樣我就會強迫自己去接受更多的知識來處理要我面對的這樣的事情。拿到了中班,我們不能下滑,滑到小班去吧,也就迫使我們繼續對團隊深耕,争取拿到大班。是以說呢,這個就像圖中火箭升空的過程,有幾個階段的推動器,這個推動器把火箭推升到一個高度之後,就自動分離掉了,相等于清零了,從新開始,隻是這時候到了一個相對的高度。我自己的實踐是,記住取得的那點成績,其實就是一件小事,讓自己保持一個清零心态。

我是如何完成這部30餘萬字技術書籍的

第五點,再來談一下如何利用時間,我的方法是比較殘忍的,三年前我将今日頭條從手機上解除安裝掉,因為那個時候總是推一些亂七八糟的内容,微信已經占據我較大一部分時間了,再加上今日頭條就刷起來沒完。這三年内我也從不再看娛樂真人秀什麼的,你會發現這些内容跟我們實際一點關系沒有,比如一個月不關注肯定不會影響我們的工作和生活啊,甚至兩周不關注新聞對我們也影響不大,該知道的熱點你還是會知道。新聞類的我目前隻安裝了一個“彭拜新聞用戶端”,關注無關的資訊還不如關心附近菜市場的雞蛋價格變化給自己帶來的實惠大,同時還能感覺到國家CPI的升降。一直以來統治我們的兩樣東西一個是面包另外一個是馬戲,面包就算了畢竟要溫飽,馬戲不可太沉溺,自己多少還是要有點思想,說到思想,我還是建議每天能夠騰出時間來一個人獨立的思考,其實大可不必天天一群人中午一起吃飯,偶爾兩天自己吃完飯圍着辦公樓轉兩圈,多想想,我寫書的決心便是2年前這麼轉下來的。時間上我自己的實踐是,管不住的統統都删掉,不玩遊戲,不看閑雜資訊。每天都給自己空出一小段時間來思考,平時思考的内容及時記錄到錘子便簽,便于後續整理總結參考使用。

我是如何完成這部30餘萬字技術書籍的

接下來再談談擁有了上面說的這些方法之後,還需要點啥,其中一個就是自律+堅持,不能三天打魚兩天曬網,自律就是到點做該做的事,堅持就是一直做到點該做的事。是以我是每天1小時,每個周末寫1天,國慶期間在圖書館寫了5天,這麼一路走過來的。再就是身體的鍛煉,從決定寫書的那一刻也知道了未來相當一段長的時間内會對自己的身體有一個挑戰,兩年前開始走進健身房原本是打算讓自己變的健壯些,但兩年下來發現身體并沒有變化太大,但是我每天的精神狀态非常好,我覺得鍛煉的實質是鍛煉的精神,總是會想一些積極向上的事情,比如 “想飛上天,和那太陽肩并肩”,我不會有假期綜合症更不會有星期一綜合征,早上鍛煉後總是很開心的去工作,對,沒錯,是開心,現在算下來我基本能保持在每周3次以上的頻率出現在健身房裡。

我是如何完成這部30餘萬字技術書籍的

“每一件簡單的事做好就是不簡單,把每一件平凡的事做好就是不平凡。”—張瑞敏。

以上是我的分享的全部内容,這些可能并不是最優的實踐方式,但希望能幫助到大家,如果有更好的方法的話也希望告訴我,謝謝大家!

附:《架構修煉之道》書籍目錄

第1章 網關之道

1.1 認識API網關

1.1.1 API網關是什麼

1.1.2 API網關涵蓋的基本功能

1.1.3 API網關架構示例

1.2 一個API的生命周期

1.2.1 什麼是API

1.2.2 生命周期

1.2.3 生命周期的過程

1.3 API網關的基石—泛化調用

1.4 如何釋出API到網關系統

1.5 管道技術

1.5.1 管道實作

1.5.2 如何擷取管道

1.5.3 管道資訊傳遞

1.5.4 管道的優點

1.5.5 責任鍊模式

1.6 一個傳統網關系統有幾種“死”法

1.6.1 關注CPU

1.6.2 關注磁盤

1.6.3 關注網絡

1.7 Servlet 3異步原理與實踐

1.7.1 什麼是Servlet

1.7.2 什麼是Servlet規範

1.7.3 同步、異步、阻塞、非阻塞

1.7.4 Servlet 3的異步流程

1.7.5 Servlet 3的異步使用步驟

1.7.6 Servlet 3的異步使用示例

1.7.7 Tomcat NIO Connector、Servlet 3.0 Async和Spring MVC Async的關系

1.7.8 Servlet 3非阻塞I/O

1.8 全異步網關

1.9 脫庫與多級緩存

1.9.1 脫庫

1.9.2 多級緩存

1.10 熱更新

1.11 網關系統的七種武器

1.12 本章小結

第2章 開放之道

2.1 認識OAuth 2.0

2.1.1 什麼是OAuth 2.0

2.1.2 角色

2.1.3 OAuth 2.0協定流程

2.1.4 采用OAuth 2.0協定的開放平台

2.1.5 京東宙斯開放(授權碼方式場景)

2.2 開放平台

2.2.1 一名開發者的基本需求

2.2.2 完整性

2.2.3 穩定性

2.2.4 安全性

2.2.5 整體技術架構

2.2.6 意義

2.3 如何設計一套SPI應用架構

2.3.1 API和SPI差別

2.3.2 術語約定

2.3.3 業務場景

2.3.4 架構實作

2.3.5 測試

2.3.6 SPI是一種思想

2.4 講一講越權

2.4.1 什麼是越權通路

2.4.2 越權通路的種類

2.4.3 發生越權通路的根本原因

2.4.4 如何避免與解決

2.4.5 開放平台環境下的越權通路

2.5 從Facebook資料洩漏談開放安全

2.5.1 OAuth 2.0授權

2.5.2 資料加/解密

2.5.3 IP位址白名單

2.5.4 平台内環境

2.6 API治理

2.6.1 性能

2.6.2 可用率

2.6.3 文檔可讀性

2.7 API經濟

2.7.1 API盈利模式

2.7.2 API市場

2.7.3 API經濟價值鍊

2.8 沙箱環境

2.8.1 協同

2.8.2 維護

2.9 本章小結

第3章 分布式之道

3.1 認識分布式

3.2 分布式事務

3.2.1 什麼是分布式事務

3.2.2 CAP和BASE理論

3.3 分布式鎖

3.3.1 為什麼需要分布式鎖

3.3.2 分布式鎖的實作方式

3.4 分布式限流

3.4.1 計數器

3.4.2 限速器

3.4.3 限流的次元

3.4.4 流量包

3.4.5 再來談令牌桶

3.5 衡量性能的名額QPS、TPS等

3.5.1 什麼是QPS

3.5.2 什麼是TPS

3.5.3 什麼是RT

3.5.4 什麼是并發數

3.6 本章小結

第4章 MQ之道

4.1 認識JMS

4.1.1 JMS的組成

4.1.2 JMS程式設計模型

4.1.3 JMS消息結構

4.1.4 JMS消息模型

4.2 帶着思考了解MQ下的基本概念

4.2.1 生産者—消費者(Producer-Consumer)

4.2.2 空間解耦

4.2.3 時間解耦

4.2.4 觀察者模式與釋出/訂閱

4.3 消費幂等

4.3.1 什麼是幂等操作

4.3.2 是什麼引起我們關注消費幂等

4.3.3 如何處理消費幂等

4.4 詳述MQ各種功能場景

4.4.1 解耦

4.4.2 削峰填谷

4.4.3 最終一緻性

4.4.4 廣播消費

4.4.5 使用叢集消費模拟廣播

4.4.6 重試之坑

4.5 資料異構的武器—MQ+canal

4.5.1 定義

4.5.2 常見應用場景

4.5.3 資料異構方向

4.5.4 資料異構的常用方法

4.5.5 binlog和MQ方式

4.6 關于MQ再問自己幾個問題

4.6.1 我想自己控制開始消費如何做

4.6.2 為什麼需要消息過濾

4.6.3 過期消息是怎麼處理的

4.6.4 消息重試的注意點

4.6.5 為什麼需要事務消息

4.6.6 消息為什麼沒有了順序

4.7 本章小結

第5章 消息推送之道

5.1 認識消息推送

5.2 建構長連接配接推送系統之HTTP實踐

5.2.1 Web網絡結構及配置

5.2.2 基本配置

5.2.3 Transfer-Encoding: chunked

5.2.4 HTTP長連接配接系統組成結構

5.2.5 Session管理

5.2.6 心跳

5.2.7 消息接收的概念

5.2.8 消息推送的概念

5.2.9 消息追蹤

5.2.10 HTTP長連接配接系統時序調用

5.2.11 建立會話(連接配接)

5.2.12 心跳邏輯

5.2.13 消息接收執行個體

5.2.14 消息推送執行個體

5.2.15 半推半拉

5.2.16 系統優化

5.2.17 測試

5.3 建構消息推送系統之Netty實踐

5.3.1 啟動

5.3.2 建立會話

5.3.3 心跳

5.3.4 發送消息

5.3.5 登出會話

5.3.6 黏包

5.4 一台伺服器可以“跑”多少個連接配接

5.5 一台伺服器可以“跑”多少個線程

5.6 弱網絡環境

5.7 發送APNs

5.7.1 認識APNs

5.7.2 HTTP/2

5.7.3 Pushy的使用

5.8 本章小結

第6章 RPC之道

6.1 認識RPC

6.2 RPC是如何實作通信的

6.2.1 動态代理

6.2.2 反射

6.2.3 序列化

6.2.4 網絡程式設計

6.3 一次RPC調用時間都去哪兒了

6.4 異步RPC

6.4.1 異步調用

6.4.2 異步監聽

6.4.3 callback調用

6.5 本章小結

第7章 I/O之道

7.1 認識I/O

7.2 解讀I/O多路複用技術

7.2.1 I/O多路複用概述

7.2.2 使用者程序和核心

7.2.3 select和recvfrom

7.2.4 阻塞、非阻塞

7.2.5 适用場景

7.3 解讀Tomcat中的NIO模型

7.3.1 Tomcat對I/O模型的支援

7.3.2 Tomcat中NIO的配置與使用

7.3.3 NioEndpoint元件關系圖解讀

7.3.4 NioEndpoint執行序列圖

7.3.5 關于性能

7.4 本章小結

第8章 微服務之道

8.1 認識微服務

8.2 微服務後如何做一次系統梳理

8.2.1 系統分類與演進

8.2.2 梳理目的要搞清楚

8.2.3 如何做

8.2.4 核心功能的核心流程梳理

8.3 朝着微服務的方向去做一次資料庫拆分

8.3.1 現狀

8.3.2 方法

8.3.3 拆庫的步驟(MySQL)

8.4 本章小結

第9章 容錯之道

9.1 認識容錯

9.2 降級與限流

9.3 線程池隔離

9.3.1 為什麼要做線程池隔離

9.3.2 實作一個線程池隔離

9.3.3 線程池隔離的優點

9.3.4 線程池隔離的缺點

9.4 快速失敗

9.5 熔斷

9.5.1 熔斷器介紹

9.5.2 熔斷使用注意

9.6 Hystrix的使用

9.6.1 認識Hystrix

9.6.2 線程池隔離

9.6.3 信号量隔離

9.6.4 熔斷

9.6.5 回退降級

9.7 大促備戰都“備”什麼

9.7.1 分離技術

9.7.2 緩存技術

9.7.3 SQL優化

9.7.4 快速失敗

9.7.5 降級限流

9.7.6 性能壓測

9.8 本章小結

第10章 程式之外

10.1 程式與健身

10.2 程式員的硬體裝備

10.3 程式員應該看的四本技術書籍

10.4 程式員應該熟悉的常用定律法則

10.5 知識、資料、工具

參考文獻