我是如何完成这部30余万字技术书籍的

如果把写书,也分为类似华山剑法一样,有 “剑宗” 和 “气宗” 的话,这篇文章实际归到 “气宗” 里面,并没有讲述如何写作,而是谈了写书技能之外的内容。本文整理自我在研发部开年大会上的分享,为了保护隐私文章提到的人员姓名都隐去,另外成文上也略有更改。

我们先从榜样说起,我们一定要有个榜样,但是这个目标榜样要努力之后可达,比如我原先把雷军当成我的榜样,他也是程序员出身的吧,天天梦想着要成为他们那样的人,这个机会对于我来讲非常之渺茫,不可达。甚至就连业界的技术大神比如Martin Fowler我也难以望其项背,当然除了发型。所以呢,我就以身边优秀的人为榜样,比如有的同事,大家无论在大促备战还是平时架构问题找到他的时候,你会发现他的思路非常独到,经常会已经站到你思路的前面了,常常会给我们帮助,那我是不是可以像他那样思考呢?在2016年底,我们部门来了一位同学,他写了一本关于大数据的书籍,我得知之后约到他,在总部7楼休息室,我们一起聊了写书的方法,所以我能不能也写一本书呢?

image

那么经过了两年的时间,我真写了一本书,现已开启预售(点击文末阅读原文可直接购买),这里是一个广告。

image

在这里并不是鼓舞大家都去写书,要不然没人写代码了。我想分享一下,这个过程,是怎么过来的,在整个写作的路程上,总结下来主要有专业、总结、自律、坚持、突破这样几个关键词,下面跟大家逐一分享。

image

首先,我们需要在一个技术方向上持续精进,达到专业。常常听见周围的同事说我们是做业务的,搞技术肯定玩不过基础技术部门的啊,比如中台,甚至还有的同事想办法异动到了那边。其实完全没有必要,要想清楚一件事情,我们一直是JSF、JMQ、JIMDB这些中间件的用户,我们知道他们的性能和技术“脾性”,另外源代码都在内部GIT上,都可以看的,可以跟周围的同事讨论,在使用的过程中还可以直接跟中间件的同事沟通,所以要学技术这个不是问题,搞业务研发还是纯技术研发,而且恐怕也么有纯技术研发吧,毕竟都要为用户服务,为京东创造价值。另外再仔细问自己一个问题,我们经常使用的这些技术比如spring、Netty你都掌握了吗,当问到你一个相关问题的时候你能连续说5分钟甚至10分钟都止不住吗,如果没有的话就选一个方向,一门心思钻进去,接触到某一事物并掌握其原理后,都能够推知到其它技术领域的,正所谓触类旁通了。我自己的实践是选一个方向啃下去,学富五车,或者灵活变通并同时仍有所专长想让自己卓尔不群,如果非要二选一的话,那么就从专业化开始吧,然后再拓展分支。

image

第二点,就是多总结,其实我们应该认识到京东是一个技术宝库,这里有大量优秀的同事,目前京东是我所在的最大的一家公司,这里有规范的流程,有公平的竞争,有走在前沿的技术实践,有详尽的资料文档,当然也少不了线上事故,这些都是我们学习的原材料,尤其是当发生线上事故之后,没有办法 “常在河边走哪有不湿鞋”的,但是发生线上事故并不可怕,我们做好总结,分析出他的原因,避免下次再犯类似的错误,我们把它形成总结文档,这样也便积累了我们的学习资产。我自己的 实践是,不放过任何一个线上问题,哪怕再小,不放过任何一个疑问,哪怕再小,不放过任何一个交流的机会,哪怕再小。

image

第三点,我们要多看专业书籍,什么才是算专业的呢,我们所从事的是代码工作,那么编码实践类的书籍是我们的专业书籍,编程思想的书籍也是我们的专业书籍,当然我们也不是其它任何书籍不看,比如常识的知识还是要掌握的,去医院看胃病总要知道胃在哪里,如果你买点基金理财总要知道股票型、指数型的区别。闲情雅致的书籍也不是不能看,金庸、张爱玲只要你还没有厌倦都可以。但如果以医学、文学和投资为主那就是本末倒置了。只是我们要以专业知识为主,这是我们目前的生活技能之一。在整个写作的过程中,我查了下一共读了20多本技术书籍,大家想一个问题,在我们写作文的那个年代,老师是不是鼓励我们要多看范文,多看,然后培养自己的写作感觉,实际上我们现在搞技术,也是一样,技术专业书籍看多了,我们的技术灵感也就从段誉每次时而灵验的凌波微步,变成了乔峰白发百中的降龙十八掌。我自己的实践是,从看书变成了“吃书”,对同一个知识点,找到类似的多本书籍,“横看成岭侧成峰,远近高低各不同”,从多个角度来理解往往对知识点的掌握更透彻。

image

第四点,要努力让自己往好的方面发展,比如我写了一本书这期间的过程整个人的知识灌溉当然是输入大于输出,那么我的知识体系会更健全,这是一个好的方面。再比如我们团队搞敏捷,是第一个拿到中班的,也是唯一个连续三次拿到中班的,估计以后在这个方面也没有人能超过我们,这也是一个好的方面。但是自己写了一本书,就是一件很了不起的事情吗?我们连续拿到3次就是了不起了吗?显然不是,不会因为写一本书,线上系统出问题就不会被批,不会因为获得了中班,团队以后不会有其它问题。到了一个好的层面就会更高的要求自己,写了一本书,等书籍出版之后可能会有读者来问我,这个时候我就要做到问一答十,这样我就会强迫自己去接受更多的知识来处理要我面对的这样的事情。拿到了中班,我们不能下滑,滑到小班去吧,也就迫使我们继续对团队深耕,争取拿到大班。所以说呢,这个就像图中火箭升空的过程,有几个阶段的推动器,这个推动器把火箭推升到一个高度之后,就自动分离掉了,相等于清零了,从新开始,只是这时候到了一个相对的高度。我自己的实践是,记住取得的那点成绩,其实就是一件小事,让自己保持一个清零心态。

image

第五点,再来谈一下如何利用时间,我的方法是比较残忍的,三年前我将今日头条从手机上卸载掉,因为那个时候总是推一些乱七八糟的内容,微信已经占据我较大一部分时间了,再加上今日头条就刷起来没完。这三年内我也从不再看娱乐真人秀什么的,你会发现这些内容跟我们实际一点关系没有,比如一个月不关注肯定不会影响我们的工作和生活啊,甚至两周不关注新闻对我们也影响不大,该知道的热点你还是会知道。新闻类的我目前只安装了一个“彭拜新闻客户端”,关注无关的信息还不如关心附近菜市场的鸡蛋价格变化给自己带来的实惠大,同时还能感知到国家CPI的升降一直以来统治我们的两样东西一个是面包另外一个是马戏,面包就算了毕竟要温饱,马戏不可太沉溺,自己多少还是要有点思想,说到思想,我还是建议每天能够腾出时间来一个人独立的思考,其实大可不必天天一群人中午一起吃饭,偶尔两天自己吃完饭围着办公楼转两圈,多想想,我写书的决心便是2年前这么转下来的。时间上我自己的实践是,管不住的统统都删掉,不玩游戏,不看闲杂信息。每天都给自己空出一小段时间来思考,平时思考的内容及时记录到锤子便签,便于后续整理总结参考使用。

image

接下来再谈谈拥有了上面说的这些方法之后,还需要点啥,其中一个就是自律+坚持,不能三天打鱼两天晒网,自律就是到点做该做的事,坚持就是一直做到点该做的事。所以我是每天1小时,每个周末写1天,国庆期间在图书馆写了5天,这么一路走过来的。再就是身体的锻炼,从决定写书的那一刻也知道了未来相当一段长的时间内会对自己的身体有一个挑战,两年前开始走进健身房原本是打算让自己变的健壮些,但两年下来发现身体并没有变化太大,但是我每天的精神状态非常好,我觉得锻炼的实质是锻炼的精神,总是会想一些积极向上的事情,比如 “想飞上天,和那太阳肩并肩”,我不会有假期综合症更不会有星期一综合征,早上锻炼后总是很开心的去工作,对,没错,是开心,现在算下来我基本能保持在每周3次以上的频率出现在健身房里。

image

“每一件简单的事做好就是不简单,把每一件平凡的事做好就是不平凡。”—张瑞敏。

以上是我的分享的全部内容,这些可能并不是最优的实践方式,但希望能帮助到大家,如果有更好的方法的话也希望告诉我,谢谢大家!

image

附:《架构修炼之道》书籍目录

第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 知识、数据、工具

参考文献

推荐阅读更多精彩内容