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

关于引用

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

最后更新于