业务规则的通用模型 —— DMN简介


背景

在业务代码的开发中,经常会遇到根据多个输入共同决定一个业务规则的结果的情况,比如一个订单的卖家服务费的费率,需要看这个订单的

  1. 出口方式,走阿里出口服务的,不收取服务费(在出口服务那边会有收),
  2. 卖家是否头部卖家,头部卖家服务费6折优惠,
  3. 是否大促优惠订单,优惠订单200美金封顶。 这些规则之间有交叉组合,并且要考虑规则之间的优先级顺序。

类似于这样的需求,在业务代码的开发中非常常见。这样的业务逻辑,可以抽象成多索引列的Lookup Table。类似下图(数据为示意,非实际费率):

对于复杂的业务逻辑,一个Lookup Table无法表达的,

阅读全文


Kotlin Coroutine 释疑 —— 从外在到本质


背景

异步和并发,作为现在编程的核心问题之一,已经成为编程语言各显神通的地方。Kotlin提供了Coroutine这个有力的武器(基本介绍参看这里),来解决这方面的问题。

不同语言在异步和并发方面的解决方案,可以从两个重要的方面来看:

  1. 外在表现形式(语法关键字,API)
  2. 内在的实现(用线程,还是其他)

Kotlin Coroutine在这两方面都有创新,在借鉴其他语言的经验的基础上,取其优点,加上独特的改进,形成了自己的Coroutine实现和相应的suspend关键字及coroutine API。深入了解了Kotlin coroutine之后

阅读全文


Java程序员的惊喜之旅——Kotlin游览攻略


Kotlin是啥

Kotlin是一门语言,一门JVM上的,以完美Java互操作,简洁,易读,安全,通用为设计目标的,同时支持面向对象和函数式两种编程范式的,高质量的现代静态类型语言;或者换一句话说,是集成了Java(面向对象,强大生态),C#(美妙的扩展方法),Ruby(魔法般的Code Block),Scala(函数式编程,克制的运算符重载,易用版Trait)等众多语言优点的高性能的美妙语言。*

同时它也是一个小岛,气候宜人,景色优美,对于程序员有特别的吸引力,尤其适合Java程序员放松身心,享受编程的快乐。

我看到了你怀疑的眼神,没错,

阅读全文


[招聘]你所期待的加入阿里巴巴最牛技术团队的机会来了


阿里杭州在招人,你或者你周围的朋友有意向吗?我们是国际技术事业部,做alibaba.com的跨境交的跨境交易平台,业务年增长率200%,是很有前途的业务。目前处于快速扩张中,需要Java后端方面的技术人才。欢迎自荐或推荐朋友。有兴趣的可以把简历发给我。扫码加我微信,请注明应聘。

阅读全文


利用Spring Cache API和Guava Cache实现来提升应用性能


在应用内enable本地缓存,就三步:

1. 在Application Config上enable caching

@Configuration
@EnableCaching
open class BizConfig {
}

2. 在需要cache的方法上,添加@Cacheable注解

public class DummyBookService implements BookService {

 @Override
 @Cacheable("book")
 public Book loadBook(String

阅读全文


业务代码的救星——Java对象转换框架MapStruct


介绍

在业务项目的开发中,我们经常需要将Java对象进行转换,比如从外部HSF服务得到的对象转换为本域的业务对象domain object,将Domain Object转为数据持久层的data Object,将domain object 转给dto以便返回给外部调用方等。在转换时大部分属性都是相同的,只有少部分的不同,如果手工编写转换代码,会很繁琐。这时我们可以通过一些对象转换框架来更方便的做这件事情。

这样的对象转换框架有不少,比较有名的有ModelMapper和MapStruct。它们所使用的实现技术不同,ModelMapper是

阅读全文


解构反应式编程——Java 8, RxJava, Reactor之比较


如果你熟悉Java 8,同时又了解反应式编程(Reactive Programming)框架,例如RxJava和Reactor等,你可能会问:

“如果我可以用Java 8 的Stream, CompletableFuture, 以及Optional完成同样的事情,为什么还要用RxJava 或者 Reactor呢?”

问题在于,大多数时候你在处理的是简单的任务,这个时候你确实不需要那些反应式编程的库。但是,当系统越来越复杂,或者你处理的本身就是个复杂的任务,你恐怕就得写一些让自己头皮发麻的代码。随着时间的推移,这些代码会变得越来越复

阅读全文


Vitalik Buterin Speech In Deconomy 2018


区块链因为要做到去中心化,付出了性能的代价。区块链比传统的中心化解决方案慢1百万倍。巨大的性能损失限制了使用场景。计划中的扩容方案(分片,子链,状态通道等)的目标是将1百万的差距缩小到1千倍,虽然依旧有很大的性能差距,但是已经可以大大扩展应用场景,不再是不可接受的。(举个例子,Python也差不多比C慢1000倍,但因为其他好处,依然得到广泛使用)

阅读全文


我所推荐的比特币和区块链学习路径


比特币以及区块链,是2017大热的技术名词,同时2018势头只增不减。为什么?不就一个类似Q币的东西吗?为什么传得这么神?什么颠覆主权货币啦,什么新一代互联网啦。真的有这么神吗?背后的原因是什么。本文将尝试给出答案,并简述其原因。然后,推荐一条比特币和区块链的学习路径。

什么是比特币

比特币是中本聪2009年提出的一个点对点的数字加密货币系统。但是,这个定义背后的内涵和外延非常丰富。远不是这一句话能够概括的。我们可以从多种不同的视角,不同的方面,不同的层次去看它,看到不一样的东西。打个比方,就像一个建筑物,可以从物理,力学,建筑学,文

阅读全文


利用函数式编程增加代码可读性一例


一般我们写代码,是按照顺序写的,也就是直接按照顺序把要执行的语句一条条写下来。我们要表达的意思隐藏在语句中。这样的坏处是语句的语义,或者要意图,表达得不是很明确。为了解决这个问题,常见的做法是应用重构的手段,把一段代码抽取出来变成一个方法,方法名表示了这段代码的意图。举个例子,对于下面的这段原始代码:

代码0

重构之后,可能变成这样的代码

可以看到,我们将原先放在大方法里的一段代码抽取出来,变成一个独立的小方法,然后在大方法里调用小方法。这样的好处是大方法里的代码更加简单,代码的意图也更加清晰。但是,这样做也有坏处,就是这个代码变

阅读全文


我所推荐的深度学习学习路径


深度学习最近为什么这么火

外行所见的是2016年AlphaGo 4比1 战胜李世石,掀起了一波AI热潮,DeepMind背后所用的深度学习一时间火得不得了。其实在内行看来,AlphaGo对阵李世石的结果是毫无悬念的,真正的突破在几年前就发生了。2012年,Gefferey Hinton的学生Alex使用一个特别构造的深度神经网络(后来就叫AlexNet),在图像识别的专业比赛ImageNet中,得到了远超之前最好成绩的结果,那个时候,整个人工智能领域就已经明白,深度学习的革命已经到来了。果然,之后深度学习在包括语音识别,图像理解,机器

阅读全文


Jürgen Schmidhuber - 人工智能将彻底改变世界


20世纪是有史以来科技发展最大的世纪,21世纪将在数量级上极大超越20世纪,其标志是超级人工智能的出现。人工智能将改变每件事。这个论断是由LSTM神经网络的提出者之一,Jürgen Schmidhuber教授给出。他的演讲深刻又不乏幽默感。值得一看。

阅读全文


未来已来——量子计算机及其意义


D-Wave创始人Geordie Rose 相信量子计算机的真正力量在于能够“(在某种意义上)探索平行宇宙”进而利用这种能力解决我们用其他手段所不能解决的问题。AI将是量子计算机的这种能力最好的发挥场所。他并作出了三个大胆的预言。我们值得听听他说了什么。下面是他的演讲视频。

阅读全文


使用Docker和Confluence构建个人知识库


侯捷曾经说他见过的牛人都有一套很好的收藏整理的方法。我也曾经尝试过各种方法来管理自己看到的资料,学到的知识,但是一直没有特别满意的办法。直到几年前,发现了Confluence,就一直用Confluence做知识管理,觉得非常好用。Confluence是一个面向企业用户的软件,但是其良好的设计使得我们完全可以拿它来做个人知识管理平台。具体的运行实例,可以看我的知识库(wiki.wuyijun.cn)

用Confluence搭建个人知识库,有如下好处:

  1. 随时随地访问
    可以通过PC,手机,平板访问,只要有网络,就可以访问
  2. 方便的编辑操作

阅读全文


反模式的经典 - Mockito设计解析


背景

测试驱动的开发(Test Driven Development, TDD)要求我们先写单元测试,再写实现代码。在写单元测试的过程中,一个很普遍的问题是,要测试的类会有很多依赖,这些依赖的类/对象/资源又会有别的依赖,从而形成一个大的依赖树,要在单元测试的环境中完整地构建这样的依赖,是一件很困难的事情。

所幸,我们有一个应对这个问题的办法:Mock。简单地说就是对测试的类所依赖的其他类和对象,进行mock—— 构建它们的一个假的对象,定义这些假对象上的行为,然后提供给被测试对象使用。被测试对象像使用真的对象一样使用它们。用这种方式

阅读全文


用Docker Compose方式安装Gitlab服务


Gitlab是一个开源的Git hosting服务软件,使用广泛。我们知道用Docker方式来安装服务端软件,是非常方便的。但Gitlab需要三个服务:Gitlab,PostgreSQL数据库,以及Redis缓存。如果用命令行直接运行container,需要三条命令,还要指定很多的配置项。与之前用Docker方式运行Ghost和Phabricator不同的是,这次我们用**docker-compose**工具来一次运行多个container。只需要两个简单的命令行就可以完成Gitlab服务的安装和启动。可以说是前所未有的便捷。

Ima

阅读全文


程序员快速学习的方法


曾经看到一片文章:如何在3年的时间内成为顶级的Coder。这篇文章无疑有标题党的嫌疑。但是,在3年时间内成为顶级的Coder并非不可能,实际上,我认为努力加上方法得当的话,是很有可能的。这其中非常重要的一点,是要有快速高效的学习方法。下面说说我对这方面的思考和总结。

路线图

要想成为顶级的Coder,先要问什么样的人才能称为顶级的Coder?我对这个问题的回答如下:

  1. 基础要扎实
    基础扎实的程序员,对于新的技术有更好的理解力。因为很多时候,新技术的挑战在于其所要求的背景知识。比如举个例子,有两样貌似不相关的技术:MapReduce,

阅读全文


异步代码的重构实践(一)


Play! framework是一个异步的Web应用/服务开发框架。其主要的特点有三个,一是它是用Scala语言写的,但提供了Java语言的API;二是类似Ruby on Rails的MVC框架;三是支持Promise形式的异步处理。前两点不是我们这次要讨论的重点。我们这次的重点是第三点:异步处理。异步处理的代码,写起来跟平常的代码有一些不同,如果没有深入理解异步处理的本质,只是照葫芦画瓢的话,很容易导致写出来的代码异常的复杂。其标志是多重的嵌套,难以理解和修改。

下面我们以一个典型的类和方法为示例,讲述异步处理的本质,展示容易出现的

阅读全文