# 0. 楔子

>     东海中有流波山，入海七千里。其上有兽，状如牛，苍身而无角，一足，出入水则必风雨，其光如日月，其声如雷，其名曰夔。黄帝得之，以其皮为鼓，橛以雷兽之骨，声闻五百里，以威天下。——《山海经 · 大荒经》

## 楔子

    软件世界瞬息万变，技术日新月异，宛如历史中的名将，随着时代潮流的涌进，慢慢步入历史的舞台，然后又慢慢消逝，而“大道”却并不会因为某种技术的成败而消失，总会在每种技术的前仆后继过程中遇到一些想要进入这个“魔幻世界”的执行者，想要在这个舞台用自己的双手去创造价值。有时候想想，能不能换一种思路来写和这个世界相关的东西，理清它的因果，让一切变得通俗易懂，同样的能不能换一种方式来诠释这个世界的一切，并不是冷冰冰的机器世界，而是一个热血沸腾的刀剑场？

    在历史的舞台中，总有像庄子一样的人，其理注入于文墨，给人以安慰——“举世誉之而不加劝，举世非之而不加沮。”正是这样的一种心境，才能让他们在乱世中求得一席之地，在此可厮杀、可博弈、可冥想、可静思。如果要为这本书找到一个始源之地，应该说一切都源于Java 8中诱人的lambda（虽然不够完美），或者说一切都源于一次邂逅，认识了Vert.x，那么这样两个似乎听起来不相干的东西，在这里将会产生何等的共鸣呢？

    也许对于一些初学者，更需要的不是官方提供的如“法典”一样的文档，也不需要冗长而难以理解的道理，他们更希望的是找到一把普通的刀剑，这些刀剑可以解决他自身所面临的问题，在功勋和大战之后，回过头来从战争中升华，从实际经验中吸收教训。所以，这是一本面向初学者的书，同样的，作者本人也只是一个Vert.x的初学者，本书不能成为大牛手中的弯刀，也不能成为战争中的枪炮，充其量这只是一份手稿，记录了芸芸众生中，某个角落里，一个人在Vert.x这个世界的心路历程，可能有其精华，也会有其糟粕，不论哪种，如人饮水，冷暖自知。而本书也是在开发Vert.x Zero（<http://www.vertxup.cn>）过程中体会到的深刻教训，甚至踩过坑的历史，可以体会到任何世界都有最基本的规则，这些规则，对于那些初学者而言，也许就是规避蚕食自己时间的契机。

## 不要走太远？

    软件工程师总是追求一种完美，希望自己的作品是白玉无瑕的，而实际上他们忘了有一种产品其实可以到达瑕不掩瑜的效果，那就是最容易被忽略的一种特性——可用性。往往在项目开发过程中，很多人都会去关注百万访问量的性能，而忽略了在项目之初，您拿什么作为基石去思考您的性能？不可否认，大部分开发者都是因为想要寻找高性能的框架才找到了Vert.x，但这是一把“魔剑”，它有着天生的性能优势，但它并不是“银弹”，不可能让您立即手执倚天而倾荡天下，所以回归到最终，一切要从眼前开始。坐下来扪心自问，您是不是在每个项目中都会遇到下边这些看似遥远的魔怔：

* 产品设计之初，一直在关注、期望自己的产品有百万、千万的并发性能，而最初一直停留在如何优化如何优化，到最后陷入讨论的死循环，既没有实际的场景来验证手中的内容是否拥有更好的性能，又让产品本身在功能层面陷入四面楚歌的境地，连客户最基本的需求都满足不了。
* 每次去招人，总是期望这个人处理过百万、千万并发的系统，然后来判断这个人是否有足够的水准和能力，却忘记了解决问题和软件工程是两个概念，真正需要的是如战士一般可持续作战的能力，而不是一些“昙花一现”的功勋。
* 软件发布的时间一而再地拖延或者跳票，却忘记了除了编码以外，这个工程化的怪物还有其他需要您去深钻的东西，比如说部署、比如说规范、比如说运维、比如说服务，软件工程可不仅仅只有编码这一层面的东西。
* 我们总是抱怨客户的需求一变再变，似乎这是人的天性，也是软件的天性：世界上唯一不变的是变化，却忘记了真正花时间去研究“交互”，也忽略了交互工程师的地位，除了给用户提供良好的体验以外，更多的时候需要真正让你的软件产品给用户带去价值，这才是限制需求的第一要素，而不是去向用户证明您用了什么新技术、您在系统中加了什么用户无法看见的东西，您要知道用户永远是软件中的外行人，他不关心也不应该关心这些东西。
* 最后就是人文，工程师也是人，不是机器，他的思绪不应该被淹没在技术的蓝海中，在技术领域，他可以凭借自己的兴趣去做自己想做的事、学自己想要学习的东西，专注于某个领域；但面对工程，不是每个工程师都需要去思考某个特定的问题，大部分工程师都是平凡人，他们需要做的是像添砖加瓦一样将这个系统推到“可用”和“稳定”的地步，最终为甲方产生价值。

    *本书无意引起争端，只是这么多年发现一个比较典型的现象，很多学习Vert.x的人，最初关注的都是它的性能，其实我个人而言可能最初更关注Vert.x的上手程度、包含的理论以及我个人驾驭它的水平差异，实话实说——异步很优秀，但并不是有了异步就完美，函数式编程很优秀，但不是轻而易举能驾驭得住（至少作者在FP中痛苦过），响应式编程很流畅，但不是所有的问题都能让您依赖它去完成，这些东西都不是一蹴而就的。*

    好吧，本书不是一本讲大道理的书，我想对于记录Vert.x能扯成这样，我也是一个啰嗦的巫师，言归正传，我们就从这里出发，不走太远，真正去Vert.x的世界看看，它究竟给我们带来了什么，分享一下个人在开发Vert.x Zero过程中的各种心得，也许这个项目是作者本人对Vert.x的大面积探索，也算是一段宝贵的心路历程。

## 平行世界？

    以前一个朋友说过，Vert.x的写法有四种：`Callback、Future、ReactiveX、Coroutine`，在Java语言的世界中，通常会使用前三种——至少`Coroutine`在没有Agent引入的情况下是无法执行的（`-javaagent`参数），而官方教程中的示例代码使用`Callback`的方式居多，zero中使用得最多的是`Future`模式（又称为Promise模式），也推荐使用这种模式。“平行世界”就是一种翻译，将本书教程中的`Callback、Future`模式的核心代码改写成`Reactive`的模式，然后通过对比分析让读者对前三种模式有更深入的理解。为什么不考虑`Coroutine`？Java本身就不是一种针对协程支持的语言，而开启协程如`vertx-sync`项目依赖于第三方的一些配置，这样的情况下，不是所有人都可以接受这样的方式，更多的时候希望的是开箱即用，所以本教程也不打算在`vertx-sync`中太花功夫。但是后边有机会可能还是会讲到一些相关用法，毕竟对有兴趣的读者做一个抛砖引玉的效果，至于平行世界的内容只能当做参考阅读，并不是本书的主题。

## 复杂的支线？

    除开主线剧本的内容以外，教程后边附带了很多散点知识，放在《后记》中，为什么引入？写一本书就像是开发一个剧本完整的RPG游戏，支线可以让这个剧情变得更丰富，《后记》的作用就在这里，让读者在读了正章之余，花一点点时间去了解和“正本”息息相关的支线剧情，丰富自己的知识体系，这是不得不完成的事情。软件知识原本就是一种网状结构，并没有头和尾，只有侧重点，所以开出这么复杂的支线剧本就是让读者感觉Vert.x的“逐陆”过程并不乏味，并且可以从这个过程中学习到更多的新知识，正所谓知其然并且知其所以然，这样才可以在Vert.x的世界里翱翔。——归根到底我在想办法找到“神兵利器”的正确打开方式，仅此而已。

## 关于引用

    对知识的尊重是传授知识的人的基本“三观”，本书的内容中有我个人的心得，但基础知识部分很多东西包含了不同的前人留下的财富，所以在本书最后有一份全书引用章节，里面枚举了本教程所有引用的点，我尽可能找到这篇文章的原作者（即使没有留下真名，在这样的一个社会时代，网名和博客地址也是他的标识），以表达对作者本人的敬意，也感谢这些人的付出。
