# 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的世界里翱翔。——归根到底我在想办法找到“神兵利器”的正确打开方式，仅此而已。

## 关于引用

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lang-yu.gitbook.io/vert.x/00-index.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
