BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

在Java世界里解决企业集成开发的痛点
录制于:

| 受访者 郑晔 关注 1 他的粉丝 作者 程显峰 关注 0 他的粉丝 发布于 2013年12月23日 | QCon北京2018全面起航:开启与Netflix、微软、ThoughtWorks等公司的技术创新之路!
22:55

个人简介 郑晔,一个有十多年工作经验的程序员,现在在ThoughtWorks工作,名头是首席咨询师。这些年做过很多事情,包括开发和咨询,除此之外,做过演讲,也写过文章,翻译过书,也贡献过开源,愿意与人畅聊技术,也愿意分享自己的经验。个人一直热衷于探索各种程序设计语言在真实软件开发中所能发挥的威力,致力于探寻合理的软件开发方式。

QCon是由InfoQ主办的全球顶级技术盛会,每年在伦敦、北京、东京、纽约、圣保罗、杭州、旧金山召开。自2007年3月份首次举办以来,已经有包括传统制造、金融、电信、互联网、航空航天等领域的近万名架构师、项目经理、团队领导者和高级开发人员参加过QCon大会

   

1. 欢迎大家来到QCon全球软件开发大会上海站2013,坐在我身边的是来自ThoughtWorks的郑晔先生,您好。

郑晔:你好。

程显峰:简单介绍一下自己吧?

郑晔:我叫郑晔,现在是一个ThoughtWorker,在ThoughtWorks工作,已工作了十几年,也算是一个老程序员了,很庆幸的是我至今仍然奋斗在写代码的第一线。

   

2. 听说您最近有个新的项目是吗?

郑晔:对,去年开始写了一个开源的项目叫Moco,是一个用来帮助这种做企业集成来简化企业集成的这么样一个开源的项目,可以让你很容易的去搭建一个模拟的这种服务器。

   

4. 那好吧,就是您把青春都献给企业集成了是吧?

郑晔:差不多,就基本上是遇到了这种每次遇到这种企业集成,你首先要做的就是,为了开发你的系统,你要去模拟周边的很多其他系统。从最早的这种很年轻,生猛时候的这种手写各种HTTP服务的,从最底层开始一层层写起,到后来说我自己写一个WAP包部署到一个Server上,有很多这样的经历,但是每次这么做都是非常非常的麻烦。

   

5. 我们为什么要模拟一个呢?为什么呢?

郑晔:因为如果你在你的开发的时候,你的要集成的那个服务器是不存在的,或者是说你没法去集成真正的这种服务,因为它可能是一个别的厂商提供的,或者他不给你在你在开发这时候提供,所以你在开发的时候你为了测你的服务是不是开发的正确,你能做得唯一的选择就是你要模拟一个这种假的服务,所以我们在做了很多这种集成的工作之后,你会发现这个过程非常非常的痛苦。

   

6. 是不是会出现这种情况,我们为了做一个服务要模拟一堆假的服务?

郑晔:是,即便是只有一个服务,你每次去把这个服务去改点什么东西,把这服务跑起来,到整个你要,你真正的目的其实只是测你的代码对不对,但是你要做周边的太多的事情。

   

7. 所以说我们的工作就转移成了去……

郑晔:配各种各样的服务,所以这个非常非常的麻烦,所以我一直在想这个有没有可能把这个问题再简化一下,有没有可能把这个问题再简化一下,直到突然有一天属于这种灵光闪现。

   

8. 是洗澡的时候吗,大部分灵光闪现的时候都是洗澡的时候发现的什么各种数学的定理?

郑晔:好吧,我当时还是穿着衣服的。

程显峰:不是一个naked的想法。

郑晔:因为当时也做了很多的这个这种工作,比如说之前在翻译这个Martin Fowler那本DSL,就是《Domain Specific Language》那本书,有一些对于怎么样去,我想一直想去构建一个这个属于自己这种DSL。后来又研究了一些其它的这个框架,等把这些知识都放到一起,脑子里突然有了这么样的一个想法是,我看能不能去解决,用这种方式去解决一下这个问题,所以有了Moco最初最初的那个版本。

   

9. 那我可以这么说吗,Moco现在是它是一种静态声明式的呢,还是可以有逻辑在里面呢?

郑晔:其实它就是一个Java的程序,你既可以把它当成一个Java的一个普通的一个Java库,和其他的任何的Java库,比如像Spring、Struts这些库没有任何区别,可以当成任何一个Java的库来写你自己需要的一种代码。在你的程序里把它写好,这样你可以自己去控制它到底按什么样的方式去配置。

   

10. 就是可以把我们自己定制化的这种交互都融入在里面,满足各种各样的。

郑晔:但是个人来说,我是倾向于说,把这个Moco这种声明式这种代码写得尽可能简单。因为我们,既然我能是用很方便的在单元测试里边去写这种代码的话,那我是鼓励大家把这个测试写得简单,可能只要你针对你这个测试的这个场景,写你自己的相应的配制就可以了。

   

11. 那说到测试这个事情可能又是很多人的伤心事。就是说因为我们做这样的事情跟其他的集成,那可能就是一个模块这样的级别的一个测试。那在这个,你做这个的过程中,为什么会选择在这个级别给大家提供一个这样的工具,然后而不是在其他的更细的级别,比如单元或者?

郑晔:其实Moco是可以在单元,就是在单元测试级别去来用的,就是你可以在JUnit这个框架里边去写这些代码,这样的话,原来的这个测试,所谓的一谈到集成测试,你基本上是放到整个全系统的这个范围之内,这个是运这个整个这个周期是非常长的。现在是你可以在单元测试这个级别来去解决这个问题,你至少可以测,把你的模块集成起来,这几个块集成起来发一个请求出去什么样的,回来应答是什么样的,你就把这些东西就放在一个单元测试里边。那对于你写代码来说,一切就变得很容易了。你可以用你最熟悉的这种方式,比如说Debug的方式,就看我如果出错了,到底哪出错了。你可以很容易的确定这个问题究竟出在哪,把原来的这种重型的过程,变成了一个轻量级的这种瑞士军刀级解决方案。

   

12. 那在您做这个项目的时候,就是业界真的一个类似的方案都没有吗,就是说有没有一些其他的,你也当时考虑过,但是最后又放弃的方案呢?

郑晔:有,有很多这种比较现成的这种解决方案,比如说这个像Ruby里边有这种Sinatra,但是他们这种所有的这些代码,所有的这些东西我研究过几个东西,所有的东西都是说你要搭起个应用,把它单独提起来在那跑的。

   

13. Racktest是这样的吗?

郑晔:因为我自己当时面对的这个问题都是Java世界的问题,可能用Ruby的这种解决方案去解决它不合适,其实Ruby世界里边也有类似的这种解决方案,他可能是把这个整个HTTP层的那种代码给替换掉。但是,因为我做的所谓的很多大型的项目,都是这种Java遗留项目,所以我需要一个更好的Java上的解决方案。其实包括Java层上的,我也看到过一些现成的一些解决方案,类似的东西。但是Rack还需要搭起一个单独的Server。不能像你把这个问题只是说我,由于简化了一个Server的搭建一个过程,但是我期望的能看到的是一个更简单的一个过程,所以我在写Moco的时候,最开始实现的并不是说可能是把它独立的运行起来,作为一个独立的Server。而是把它写成一个API,让我们可以在单元测试框架里边去调它,这样的话,就刚才我说的,我把原来一个集成及测试的这么样一个级别的一个东西变成了一个单元测试级别的一个东西,把这整个问题的这个整个复杂度向着极致又推了一步。

   

14. 这就是跟其他的项目最大的一个不同点是吗?

郑晔:在我看来是这样的,就是我可以很容易的在单元测试级别来做这些东西。

   

16. 那是有什么渊源吗?

郑晔:其实这个名字最开始是,我确实是想做一个叫,我称之为叫Mock Server这样一个东西,我最开始是把Mock这几个单词,这几个字母输入到一个搜索框,看看那个最开始出来的单词是什么。然后很幸运,第一个出来的单词就是Moco,然后这个名字足够简单,而且还没有,我至少当时还没有搜到这个重名的这种项目,所以我就选了它,这个名字本身是一个叫一种小动物叫什么岩豚鼠。

   

18. 项目到底能不能搏斗过小动物,是不是。我希望这个对这个可能还是有很足的信心,今年是Moco也获得了这个Duke的奖项,应该说发展的这个势头也非常好,那你对这个现在这个项目有什么样的预期?有什么Roadmap?

郑晔:其实我对Moco这个项目一开始真的没有太多的预期,我去年10月份开始写,我去年12月份认为我已经做完了,我认为所有的东西都已经搞定了,我已经不需要再为这个项目做任何添砖加瓦的活了,但是你知道我现在一直在写。

   

19. 为什么呢?

郑晔:因为当我把这个Moco做完的时候,我是把这个分享给其他人,我也不是介绍,我说,我做了这么个东西。然后大家看一看,这个东西你们可以能在什么样的项目上用一下,大家尝试一下。然后当你知道一旦有人开始用,一旦有人开始尝试,就开始有反馈回来。有人说我需要这样的一个特性,你看你能不能支持,我需要那样一个特性能不能支持。

   

20. 这有没有有趣的故事?

郑晔:我的一个同事,熊节,就是可能在网上很多人都知道,一个叫gigix的一个人,然后他最开始是他觉得这个项目很有意思,然后他就把它用在了他的这个项目里边,然后这个当时遇到了很多我想都没有想过的问题,然后他帮我动手把这个问题都一个一个解决好,然后把这个写好的patch发给我,我再合并到Moco这种代码里边,然后把这个,这个Moco最开始得到了这种最早的有其他人的贡献,然后。

   

21. 第二个contributor?

郑晔:不是第二个。我这个同事很好的一点是,它不仅仅是帮我贡献了代码,还在那个项目上总结了一些关于集成测试的一些模式方法,写了一篇文章,发在了这个InfoQ上,最早的有一批人开始知道这个Moco的代码。而且在他还把这篇文章翻译成了英文,发表在InfoQ的一个英文站上,这样的话,不仅仅让中国人知道说有这么样的一个项目,可能很多老外通过阅读InfoQ英文站的文章,知道了原来有这么样的一个项目。

   

22. 这个对后来评奖有帮助吗?

郑晔:我不知道有没有帮助,但是确实就是慢慢越来越多的人,认识到有Moco这样的一个项目,我也是在一些社区演讲上,把这Moco介绍给其他人,也得到了更多的这种反馈。因为有了这种反馈,所以我别无选择,我就只能继续做下去,而且你做得越多,别人了解的越多,他们想要的东西越多,他们的反馈就越多,你要做的东西也就越多。

   

23. 至少从我的角度来讲,如果这个项目是有人维护的话,我还是可以考虑用一用的,如果就说如果是像你刚才说就是去年就不维护了,可能我就觉得这个项目是一个不太活跃的项目,就可能有问题也不会找到有人回答,就不会去用,可能对于维护这个社区的活跃度还是很有帮助的。

郑晔:是的,因为尤其这个是一个作用反作用的关系,因为今年这个得到了这个Duke选择奖,所以更多的人知道了这个Moco的项目,我也得到了更多的这种反馈,所以就是其实是我昨天晚上刚刚发布了最新的版本,其实其中里边包含了很多新特性,就是Moco得到了这个Duke选择奖以后,很多的反馈进来的,然后我才改的东西。

   

24. 这些反馈都来自于哪呢?

郑晔:就是他们日常的使用,比如说有人是通过邮件直接发给我说,我觉得挺好的,但是我需要这样的一个特性,有的人就通过这种pull request的这种方式,去给我提交的时候,我能不能做这样的修改,如果好的话我就直接把它merge进来。

   

25. 你有这个到其他地方去宣传Moco的这个打算吗,除了上海这一站以外?

郑晔:看机会,因为这个最近一段时间可能人在,人是待在成都,所以可能在成都做过几次的这种像Open Party这样的活动里边介绍过Moco。如果有更多的这样的机会,其实我是愿意去做这种分享的,所以希望更多的人来了解你的东西,更多的人来使用你的东西,这是会让人感到有很,作为程序员本身来说是很有成就感的一件事。

   

26. 有很多人都知道你用的东西创造了很多的价值?

郑晔:即便你从这个软件本身,你没有得到很多直接的,比如说这种经济上的回报,但是作为程序员可能你很多时候,不仅仅是追求的这个,你还追求的一种所谓的这种在社区里边的这种声誉,或者是别人用你的东西给你带来的这种成就感,这种东西我觉得本身是鼓励着你不断的往前走的一个很重要的原因。

   

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上。对于程序员来说,我是觉得是多会几门不同类型的程序设计语言是有必要的。如果你只会一门程序设计语言,就是你那句话,手里有了锤子眼里都是钉子,你只会一种解决方法。但是你会不同的程序设计语言的时候,你就可以把不同程序设计语言的这个思想去贯穿到你日常的开发里边。

   

31. 每种语言带来一种新的思维方式?那现在看来程序设计语言有一个趋势,就是各种语言的这种活跃度有点趋同,前几年其实差的不太多,不像以前有一家独大的,90年代的时候这个语言可能是长期占领在这个语言排行榜上,就是很长时间的一个情形,现在你感觉这个上去了,那个下来了,但是差别也已经不大了,是不是现在这个语言都非常成熟了,没有太多新的东西,只是把一些特性在不同的语言里组合组合,就是仅此而已呢?

郑晔:是的。这是几个问题,其实原来的这个互联网是相对来说是不那么发达的,所以人们学习的途径相对来说是很有限的,所以这个比如说很多我们出版社愿意出的书,它可能就是那几类,就是可能比如,想当年C和C++,或者是很早以前的那种Delphi那种书,可能这些书出了这些东西,有了这些书,所以程序员学的相对来说是有限的,而且对于大多数程序员来说,他学的东西都是所谓的这种普及级的这种东西。而只有这种很少数的这种对于程序设计更有追求的人来说,他会学更多的这种程序设计语言。但是这些东西对于很多人来说,它是小众的,比如说Lisp,比如说Haskell,这些很多程序设计,很多人是听说过,但是你让他去学,他可能90%他不会去学,因为他可能工作用不上。但是现在可能情形发生了一个很大的一个转变就是互联网很发达,就是越来越多的这种知识上的获取变得比以前容易多了,就是我可能没有去真正意义上的去买一本比如说Lisp的书,但是我可能看了一篇Lisp文档,我知道原来Lisp是这个样子的。

   

32. 这个可能也是国内和国外大学教育传统上的不一样,我知道像美国有很多大学,就是有教Lisp的传统。是传统课程,必修课,学Computer Science,就得学这个,没的选。

郑晔:我自己跟一些朋友聊天的时候,关于这个像Lisp语言,或者函数式编程语言,为什么最近这些年是会火起来,一个很好的原因是,最近这些年这种硬件的发展非常好,就原来实现同样的功能,用这种程序设计语言你跑起来,你写代码没问题,但是你跑起来会非常慢。

   

33. 这是解释器的水平不行是吗?

郑晔:不是,也很大程度上决定了,现在尤其硬件本身决定的,你现在硬件能跑多快,所以现在越来越多的,像那种Python,像Ruby越来越多的用到了生产环境下,而原来这种东西对我们来说可能只是写一些日常的,简单的不需要这种大规模访问的这种情况的这种简单脚本,但是现在我们可以在很多产品环境下用这种所谓的当年看没法,不可能用在产品环境下这种程序语言。

   

34. 实际上就是说硬件的改变也对编程语言有了一个逆转?

郑晔:是的,我这些年,前几年有一个观察就是为什么函数式编程现在越来越火?就是很重要的一个原因是因为多核的一个发展,因为以前CPU只有一个核,但现在CPU有很多核,那怎么样把多核运用的更好,这是很多人研究的话题,而找这个解决方案的过程中,人们就找到了这种函数式编程,比如说我并行的去执行很多的运算。

   

35. 对,各种各样的模型。

郑晔:用Map Reduce这种概念的这种兴起,然后人们通过这个时候意识到原来函数式编程可以在,原来在很大程度上去解决一些,一定程度上去解决一些问题,所以很多函数式编程原来的这种技法、这种方式,就重新被人找了回来,所以现在的很多,现在反过来,这些概念又开始影响到这个我们的日常开发,比如说C++最新的这个版本,C++11里面引入了Lambda,马上Java 8里面也引入Lambda,就是原来函数式编程是属于高级货,很快这种东西会变成日常消费品。

   

36. 是不是现在所有的语言都有引入这些趋势,包括C#也引入了Continuation这种这样的。

郑晔:Lambda这些东西。所以你会看到这个东西慢慢的就会在融合。前几年就是C#的那个设计师Anders Hejlsberg讲,程序设计语言的发展的一个趋势,其中很强调的一点就是有函数式编程。

程显峰:微软自己也有F#,就是OCaml系的,这个实际上他们在这方面还是做了很多研究的。我记得是不是微软的剑桥研究院,是那个Haskell作者就在那工作吧,也是一个重要的例子。好吧,那我们今天非常感谢郑晔来到InfoQ的现场,然后给我们分享了这么多有趣的事情。谢谢。

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT