在Java世界里解决企业集成开发的痛点
录制于:
- 下载
- MP3
- |
- Android app
个人简介 郑晔,一个有十多年工作经验的程序员,现在在ThoughtWorks工作,名头是首席咨询师。这些年做过很多事情,包括开发和咨询,除此之外,做过演讲,也写过文章,翻译过书,也贡献过开源,愿意与人畅聊技术,也愿意分享自己的经验。个人一直热衷于探索各种程序设计语言在真实软件开发中所能发挥的威力,致力于探寻合理的软件开发方式。
QCon是由InfoQ主办的全球顶级技术盛会,每年在伦敦、北京、东京、纽约、圣保罗、杭州、旧金山召开。自2007年3月份首次举办以来,已经有包括传统制造、金融、电信、互联网、航空航天等领域的近万名架构师、项目经理、团队领导者和高级开发人员参加过QCon大会
1. 欢迎大家来到QCon全球软件开发大会上海站2013,坐在我身边的是来自ThoughtWorks的郑晔先生,您好。
郑晔:你好。
程显峰:简单介绍一下自己吧?
郑晔:我叫郑晔,现在是一个ThoughtWorker,在ThoughtWorks工作,已工作了十几年,也算是一个老程序员了,很庆幸的是我至今仍然奋斗在写代码的第一线。
3. 一谈到企业集成呢,可能是很多人的痛点。就是说这个事情本身来讲,由于既有的系统非常多,然后各种各样的关系,各种各样的协议,然后它是个很复杂的事情,那您的这个项目对于解决这样的问题有什么样的帮助呢?
郑晔:因为我在这个职业生涯这个差不多这个十几年的时间里边,一直在做的这种企业级开发这种项目。
郑晔:差不多,就基本上是遇到了这种每次遇到这种企业集成,你首先要做的就是,为了开发你的系统,你要去模拟周边的很多其他系统。从最早的这种很年轻,生猛时候的这种手写各种HTTP服务的,从最底层开始一层层写起,到后来说我自己写一个WAP包部署到一个Server上,有很多这样的经历,但是每次这么做都是非常非常的麻烦。
郑晔:因为如果你在你的开发的时候,你的要集成的那个服务器是不存在的,或者是说你没法去集成真正的这种服务,因为它可能是一个别的厂商提供的,或者他不给你在你在开发这时候提供,所以你在开发的时候你为了测你的服务是不是开发的正确,你能做得唯一的选择就是你要模拟一个这种假的服务,所以我们在做了很多这种集成的工作之后,你会发现这个过程非常非常的痛苦。
6. 是不是会出现这种情况,我们为了做一个服务要模拟一堆假的服务?
郑晔:是,即便是只有一个服务,你每次去把这个服务去改点什么东西,把这服务跑起来,到整个你要,你真正的目的其实只是测你的代码对不对,但是你要做周边的太多的事情。
8. 是洗澡的时候吗,大部分灵光闪现的时候都是洗澡的时候发现的什么各种数学的定理?
郑晔:好吧,我当时还是穿着衣服的。
程显峰:不是一个naked的想法。
郑晔:因为当时也做了很多的这个这种工作,比如说之前在翻译这个Martin Fowler那本DSL,就是《Domain Specific Language》那本书,有一些对于怎么样去,我想一直想去构建一个这个属于自己这种DSL。后来又研究了一些其它的这个框架,等把这些知识都放到一起,脑子里突然有了这么样的一个想法是,我看能不能去解决,用这种方式去解决一下这个问题,所以有了Moco最初最初的那个版本。
9. 那我可以这么说吗,Moco现在是它是一种静态声明式的呢,还是可以有逻辑在里面呢?
郑晔:其实它就是一个Java的程序,你既可以把它当成一个Java的一个普通的一个Java库,和其他的任何的Java库,比如像Spring、Struts这些库没有任何区别,可以当成任何一个Java的库来写你自己需要的一种代码。在你的程序里把它写好,这样你可以自己去控制它到底按什么样的方式去配置。
10. 就是可以把我们自己定制化的这种交互都融入在里面,满足各种各样的。
郑晔:但是个人来说,我是倾向于说,把这个Moco这种声明式这种代码写得尽可能简单。因为我们,既然我能是用很方便的在单元测试里边去写这种代码的话,那我是鼓励大家把这个测试写得简单,可能只要你针对你这个测试的这个场景,写你自己的相应的配制就可以了。
郑晔:其实Moco是可以在单元,就是在单元测试级别去来用的,就是你可以在JUnit这个框架里边去写这些代码,这样的话,原来的这个测试,所谓的一谈到集成测试,你基本上是放到整个全系统的这个范围之内,这个是运这个整个这个周期是非常长的。现在是你可以在单元测试这个级别来去解决这个问题,你至少可以测,把你的模块集成起来,这几个块集成起来发一个请求出去什么样的,回来应答是什么样的,你就把这些东西就放在一个单元测试里边。那对于你写代码来说,一切就变得很容易了。你可以用你最熟悉的这种方式,比如说Debug的方式,就看我如果出错了,到底哪出错了。你可以很容易的确定这个问题究竟出在哪,把原来的这种重型的过程,变成了一个轻量级的这种瑞士军刀级解决方案。
12. 那在您做这个项目的时候,就是业界真的一个类似的方案都没有吗,就是说有没有一些其他的,你也当时考虑过,但是最后又放弃的方案呢?
郑晔:有,有很多这种比较现成的这种解决方案,比如说这个像Ruby里边有这种Sinatra,但是他们这种所有的这些代码,所有的这些东西我研究过几个东西,所有的东西都是说你要搭起个应用,把它单独提起来在那跑的。
13. Racktest是这样的吗?
郑晔:因为我自己当时面对的这个问题都是Java世界的问题,可能用Ruby的这种解决方案去解决它不合适,其实Ruby世界里边也有类似的这种解决方案,他可能是把这个整个HTTP层的那种代码给替换掉。但是,因为我做的所谓的很多大型的项目,都是这种Java遗留项目,所以我需要一个更好的Java上的解决方案。其实包括Java层上的,我也看到过一些现成的一些解决方案,类似的东西。但是Rack还需要搭起一个单独的Server。不能像你把这个问题只是说我,由于简化了一个Server的搭建一个过程,但是我期望的能看到的是一个更简单的一个过程,所以我在写Moco的时候,最开始实现的并不是说可能是把它独立的运行起来,作为一个独立的Server。而是把它写成一个API,让我们可以在单元测试框架里边去调它,这样的话,就刚才我说的,我把原来一个集成及测试的这么样一个级别的一个东西变成了一个单元测试级别的一个东西,把这整个问题的这个整个复杂度向着极致又推了一步。
16. 那是有什么渊源吗?
郑晔:其实这个名字最开始是,我确实是想做一个叫,我称之为叫Mock Server这样一个东西,我最开始是把Mock这几个单词,这几个字母输入到一个搜索框,看看那个最开始出来的单词是什么。然后很幸运,第一个出来的单词就是Moco,然后这个名字足够简单,而且还没有,我至少当时还没有搜到这个重名的这种项目,所以我就选了它,这个名字本身是一个叫一种小动物叫什么岩豚鼠。
郑晔:其实我对Moco这个项目一开始真的没有太多的预期,我去年10月份开始写,我去年12月份认为我已经做完了,我认为所有的东西都已经搞定了,我已经不需要再为这个项目做任何添砖加瓦的活了,但是你知道我现在一直在写。
19. 为什么呢?
郑晔:因为当我把这个Moco做完的时候,我是把这个分享给其他人,我也不是介绍,我说,我做了这么个东西。然后大家看一看,这个东西你们可以能在什么样的项目上用一下,大家尝试一下。然后当你知道一旦有人开始用,一旦有人开始尝试,就开始有反馈回来。有人说我需要这样的一个特性,你看你能不能支持,我需要那样一个特性能不能支持。
20. 这有没有有趣的故事?
郑晔:我的一个同事,熊节,就是可能在网上很多人都知道,一个叫gigix的一个人,然后他最开始是他觉得这个项目很有意思,然后他就把它用在了他的这个项目里边,然后这个当时遇到了很多我想都没有想过的问题,然后他帮我动手把这个问题都一个一个解决好,然后把这个写好的patch发给我,我再合并到Moco这种代码里边,然后把这个,这个Moco最开始得到了这种最早的有其他人的贡献,然后。
21. 第二个contributor?
郑晔:不是第二个。我这个同事很好的一点是,它不仅仅是帮我贡献了代码,还在那个项目上总结了一些关于集成测试的一些模式方法,写了一篇文章,发在了这个InfoQ上,最早的有一批人开始知道这个Moco的代码。而且在他还把这篇文章翻译成了英文,发表在InfoQ的一个英文站上,这样的话,不仅仅让中国人知道说有这么样的一个项目,可能很多老外通过阅读InfoQ英文站的文章,知道了原来有这么样的一个项目。
22. 这个对后来评奖有帮助吗?
郑晔:我不知道有没有帮助,但是确实就是慢慢越来越多的人,认识到有Moco这样的一个项目,我也是在一些社区演讲上,把这Moco介绍给其他人,也得到了更多的这种反馈。因为有了这种反馈,所以我别无选择,我就只能继续做下去,而且你做得越多,别人了解的越多,他们想要的东西越多,他们的反馈就越多,你要做的东西也就越多。
郑晔:是的,因为尤其这个是一个作用反作用的关系,因为今年这个得到了这个Duke选择奖,所以更多的人知道了这个Moco的项目,我也得到了更多的这种反馈,所以就是其实是我昨天晚上刚刚发布了最新的版本,其实其中里边包含了很多新特性,就是Moco得到了这个Duke选择奖以后,很多的反馈进来的,然后我才改的东西。
24. 这些反馈都来自于哪呢?
郑晔:就是他们日常的使用,比如说有人是通过邮件直接发给我说,我觉得挺好的,但是我需要这样的一个特性,有的人就通过这种pull request的这种方式,去给我提交的时候,我能不能做这样的修改,如果好的话我就直接把它merge进来。
25. 你有这个到其他地方去宣传Moco的这个打算吗,除了上海这一站以外?
郑晔:看机会,因为这个最近一段时间可能人在,人是待在成都,所以可能在成都做过几次的这种像Open Party这样的活动里边介绍过Moco。如果有更多的这样的机会,其实我是愿意去做这种分享的,所以希望更多的人来了解你的东西,更多的人来使用你的东西,这是会让人感到有很,作为程序员本身来说是很有成就感的一件事。
郑晔:即便你从这个软件本身,你没有得到很多直接的,比如说这种经济上的回报,但是作为程序员可能你很多时候,不仅仅是追求的这个,你还追求的一种所谓的这种在社区里边的这种声誉,或者是别人用你的东西给你带来的这种成就感,这种东西我觉得本身是鼓励着你不断的往前走的一个很重要的原因。
27. 那现在这个Moco本身就是,主要的维护者是您一个人,那还有其他的这个常规的又有些什么人打开地图Patch吗?
郑晔:会有人去给你贡献一些代码,但是可能主要的这种开发是我一个人,因为其实Moco代码量不大,Moco的代码量可能现在也不过几千行的规模,没到一万行的规模。
程显峰:用什么写的?
郑晔:用Java。
28. 我看你还涉猎好多其它语言,Scala、CoffeeScript什么的。那个书是要出版了吗?Clojure那本?
郑晔:去年翻译的那本书叫《The Joy of Clojure》这本书,据说马上就要出版了,马上就要面世了。
29. 我已经预定了,还没有收到。
郑晔:我还没有收到书。我个人对语言是有一些偏好的,就是我喜欢研究各种各样的程序设计语言,所以国内最早的一本那种Scala的书是我翻译的,然后这本Clojure里边比较经典的这本《The Joy of Clojure>是我翻译的。我是想通过这种方式学习不同的这种程序设计语言,了解到不同的这种程序设计思想来运用到你日常的这种编程的这种生活里边。然后其实现在Moco的代码,其实我刚才说的Moco的代码量不大,一个很重要的原因是Moco采用了像类似于函数式编程的思想,把这种代码是组合到一起的,而不像原生的代码API直接写到一起,所以你可以看到Moco借鉴了,就借鉴的这种函数式编程的思想。而这种思想就是我从其他的这种程序设计语言里边学来的。
30. 那按照Eric这个标准,每个程序员都会一打语言,这个您对此有什么评论呢?您自己会做多少种语言,可以数的清吗?
郑晔:如果按Hello World的级别来写的话,我估计一打是有的,日常最熟悉的可能是Java,其次算是Ruby和C、C++这些程序设计语言,我都能写。但是可能最近的一段时间的这个关注点是在Java上。对于程序员来说,我是觉得是多会几门不同类型的程序设计语言是有必要的。如果你只会一门程序设计语言,就是你那句话,手里有了锤子眼里都是钉子,你只会一种解决方法。但是你会不同的程序设计语言的时候,你就可以把不同程序设计语言的这个思想去贯穿到你日常的开发里边。
郑晔:是的。这是几个问题,其实原来的这个互联网是相对来说是不那么发达的,所以人们学习的途径相对来说是很有限的,所以这个比如说很多我们出版社愿意出的书,它可能就是那几类,就是可能比如,想当年C和C++,或者是很早以前的那种Delphi那种书,可能这些书出了这些东西,有了这些书,所以程序员学的相对来说是有限的,而且对于大多数程序员来说,他学的东西都是所谓的这种普及级的这种东西。而只有这种很少数的这种对于程序设计更有追求的人来说,他会学更多的这种程序设计语言。但是这些东西对于很多人来说,它是小众的,比如说Lisp,比如说Haskell,这些很多程序设计,很多人是听说过,但是你让他去学,他可能90%他不会去学,因为他可能工作用不上。但是现在可能情形发生了一个很大的一个转变就是互联网很发达,就是越来越多的这种知识上的获取变得比以前容易多了,就是我可能没有去真正意义上的去买一本比如说Lisp的书,但是我可能看了一篇Lisp文档,我知道原来Lisp是这个样子的。
32. 这个可能也是国内和国外大学教育传统上的不一样,我知道像美国有很多大学,就是有教Lisp的传统。是传统课程,必修课,学Computer Science,就得学这个,没的选。
郑晔:我自己跟一些朋友聊天的时候,关于这个像Lisp语言,或者函数式编程语言,为什么最近这些年是会火起来,一个很好的原因是,最近这些年这种硬件的发展非常好,就原来实现同样的功能,用这种程序设计语言你跑起来,你写代码没问题,但是你跑起来会非常慢。
33. 这是解释器的水平不行是吗?
郑晔:不是,也很大程度上决定了,现在尤其硬件本身决定的,你现在硬件能跑多快,所以现在越来越多的,像那种Python,像Ruby越来越多的用到了生产环境下,而原来这种东西对我们来说可能只是写一些日常的,简单的不需要这种大规模访问的这种情况的这种简单脚本,但是现在我们可以在很多产品环境下用这种所谓的当年看没法,不可能用在产品环境下这种程序语言。
郑晔:是的,我这些年,前几年有一个观察就是为什么函数式编程现在越来越火?就是很重要的一个原因是因为多核的一个发展,因为以前CPU只有一个核,但现在CPU有很多核,那怎么样把多核运用的更好,这是很多人研究的话题,而找这个解决方案的过程中,人们就找到了这种函数式编程,比如说我并行的去执行很多的运算。
35. 对,各种各样的模型。
郑晔:用Map Reduce这种概念的这种兴起,然后人们通过这个时候意识到原来函数式编程可以在,原来在很大程度上去解决一些,一定程度上去解决一些问题,所以很多函数式编程原来的这种技法、这种方式,就重新被人找了回来,所以现在的很多,现在反过来,这些概念又开始影响到这个我们的日常开发,比如说C++最新的这个版本,C++11里面引入了Lambda,马上Java 8里面也引入Lambda,就是原来函数式编程是属于高级货,很快这种东西会变成日常消费品。
36. 是不是现在所有的语言都有引入这些趋势,包括C#也引入了Continuation这种这样的。
郑晔:Lambda这些东西。所以你会看到这个东西慢慢的就会在融合。前几年就是C#的那个设计师Anders Hejlsberg讲,程序设计语言的发展的一个趋势,其中很强调的一点就是有函数式编程。
程显峰:微软自己也有F#,就是OCaml系的,这个实际上他们在这方面还是做了很多研究的。我记得是不是微软的剑桥研究院,是那个Haskell作者就在那工作吧,也是一个重要的例子。好吧,那我们今天非常感谢郑晔来到InfoQ的现场,然后给我们分享了这么多有趣的事情。谢谢。
您好,朋友!
您需要 注册一个InfoQ账号 或者 登录 才能进行评论。在您完成注册后还需要进行一些设置。获得来自InfoQ的更多体验。
告诉我们您的想法