编著往来
蒋金楠先生的处女作《WCF技术剖析(卷1)》即将出版,本书的策划兼责任编辑Lisa和他以聊天的形式交流了一些话题,从这些交流中能看到一本优秀的原创著作的问世,包含了作者多少殚精竭虑的思考。
博文Lisa
蒋先生:《WCF技术剖析(卷1)》马上就要面市了,恭喜您!
蒋金楠
谢谢!Lisa,真的应该好好地感谢你!《WCF技术剖析(卷1)》能够顺利出版,很大程度上得益于你的有力推动。
博文Lisa
您太客气了,作为编辑,这些都是我们应该做的。有读者问,您在博客园里已经积累了 100多篇原创技术博客,其中关于WCF的博客就有30多篇,他们想知道您关注和研究WCF技术多长时间了?当时的WCF技术与现在有哪些不同呢?
蒋金楠
我应该属于国内较早一批接触WCF的人吧。我们知道,WCF是随着.NET Framework 3.0一起发布的。.NET Framework 3.0在前一个版本的基础上引入了三大基础框架:Windows Communication Foundation(WCF)、Windows Presentation Foundation、Windows Workflow Foundation (WF)和Card Space。微软正式发布.NET Framework 3.0是在2006年11月份,而我第一次接触WCF的时间还要向前推一年。
我第一次接触WCF是参加微软举办的一场关于Windows Vista的技术推广的培训,时间大概是2005年10月份。从WCF整个结构体系来讲,经过了这么多年,基本上没有什么大变动。不知道大家是否注意到这一点:虽然很多人埋怨微软推出新技术的频率过快,导致大家跟不上节奏,但是一些根本性的东西却很少变化。比如.NET Framework先后推出了V1.0、V1.1、V2.0、V3.0、V3.5和V4.0,其实对于最根本的运行时(CLR)来说,却只有3个版本V1.0、V2.0和V4.0。再比如说,ASP.NET从诞生到现在,所有的版本都采用最初的基于管道的设计。
如何在软件设计之初就充分考虑软件的可扩展性,我觉得这是很值得我们学习的地方。软件版本演进的过程应该是对现有设计进行扩展的过程,而不是不断对现有设计进行否定与革新的过程。WCF就是这样一个极具可扩展性的通信框架,在我看来,WCF吸引人的地方不在于WCF本身能够提供多么强大的功能,而在于任何人可以通过扩展让WCF实现自己所需的功能。如果有人问我WCF到底具有多大的可扩展性,我会说WCF的扩展无处不在。
如果要比较当初的WCF和现在的不同之处,以及WCF今后的发展。我觉得有两点值得一谈,那就是对REST和WS-*的支持。REST是近年来非常火的一种通信方式,在基于SOAP消息通信大行其道的时候,又回到完全基于HTTP和POX(Plain Old XML)的方式上面,有点返璞归真的感觉,在WCF.NET 3.5中,为REST提供原生的支持。另一个方面,WCF是基于SOA的通信框架,而SOA的一个重要的目标就是促进不同厂商的应用能够进行互操作,所以必须依赖于一系列开放的标准,这些标准通过WS-*规范的形式体现。WCF完全建立在WS-*之上,随着WS-*的不断完善,WCF势必与之同步。比如在即将推出的WCF 4.0中,就将会对WS-Discovery提供支持。此外,WCF与WF直接的集成将是WCF 4.0又一个较大的改进。
博文Lisa
那您后来坚持学习 WCF 是工作之需还是因为个人兴趣呢?深入学习这项技术在您以后的工作中有着怎样的价值和意义?
蒋金楠
应该说我很幸运,从事了一项我感兴趣的工作,能够把工作当成一种乐趣。由于公司的特殊背景,接的项目规模都非常大,所以分布式架构对于每一个项目开发都是必需的。在WCF正式发布之前,公司所有的.NET项目采用的都是基于.NET Remoting和XML Web Service+WSE的分布式架构。所以我对微软之前的通信技术,包括上面提到的.NET Remoting和XML Web Service+WSE,以及MSMQ等都比较熟悉。
但是,你知道吗?由于微软推出的这一系列的分布式通信技术对所解决的问题和适用的场景各有侧重,导致它们之间的API具有非常大的差异。一个对XML Web Service非常精通的人,可能对.NET Remoting一窍不通。如果能够将这一切都统一起来,提供一个统一的编程接口,这可真是一项造福所有Windows平台下分布式开发人员的工程。而WCF就是这么一项工程,所以当我第一次接触WCF的时候就对它“一见钟情”了。
博文Lisa
嗯,能工作和兴趣能统一起来真是一件幸福的事情。有些羡慕您☺
蒋金楠
软件开发是一件很有趣的事情,它是一项不断抽象的过程。从微观上看,所有的程序都在用0和1表示的机器语言运行。从宏观上看,相隔万里的应用之间能够互联。所以,我常说做软件的人应该具有两双不同眼睛,一双着眼于微观,洞察每一句代码的执行;另一双着眼于宏观,高屋建瓴地分析整个互联系统之间的协调,而WCF属于宏观的范畴。余世维曾经说过,成大事者从小就具有大的格局。对于软件来说,SOA和WCF就是培养你的大局观,使你具备大格局。
博文Lisa
不少人对于学习新知识还是很积极的,但能随时把学习的感悟有条理地记录下来,而且持续不断,这样的人目前尚属少数,我自己就常常做不到这一点,所以很想知道您为什么能坚持这么长时间,乃至于这些记录下来的思考最终能成为一本书?
蒋金楠
Lisa,不知道你是否具有这样的体会:当你从一个朋友那里听了一个故事,可能对方讲得太引人入胜,使你听完后会觉得对这个故事的每一个细节都了然于心。但是,当你向另一个朋友转述这个故事时,结果会发现很多情节都不记得了。
其实我们对知识的掌握也是这样,我们听了很多讲座,看了很多书,自以为精通了获取的知识。但是,当要将掌握的东西写成文档,或者直接通过口述的方式向第三者传授的时候,就会发现对于那些自认为很精通的知识其实掌握得还很不够。所以,不要把写博客文章看成是单纯的知识传授过程,实际上,作者通过对文字的组织在梳理自己掌握的杂乱无章的知识结构,是对掌握知识的巩固过程。在这个过程中,可以发现很多欠缺和模糊。此外,知识也只有通过传播才能体现其价值,分享知识是一件快乐的事情。
在这两年多里,有很多网友在我的博客上给我留言或直接写信给我,建议我写一本全面介绍WCF的书,很多出版商也向我发出合作出版WCF相关书籍的邀请。本着不误人子弟的信条,我都婉言谢绝了。直到去年收到周筠老师的邀约时,觉得经过了这些年对WCF的学习和实践,已有了一些积淀,才真正萌发了写书的念头。
可能对于一般人来说,写书和写博客都是通过文字表达自己对某些问题的想法与感受,两者并不会有本质的区别。有的读者或许会觉得我写《WCF技术剖析》就是将本人的博客文章拼凑而成。我要说的是,《WCF技术剖析》具有全新的内容,与我博客上WCF文章的相似度不会超过10%。
对于我来说,写书和写博客具有本质的不同。很多人把读书当成一种爱好,对于我来说读书已不再属于爱好的范畴,它已经成为我生命中的一部分。虽然,现在出书也不是件什么稀罕事,但是我依然对写书充满敬畏,我始终觉得通过正式渠道出版的白纸黑字是很神圣的。
而写博客则不同,博客文章属于随笔。在写作的时候,笔随心动,心到笔到;笔之所触,心之所至。虽然博客上的大部分文章也很长,但是每篇文章并不会花我太多的时间。很多情况下,都是对某些东西先有一些大概的想法,在写作的时候依靠“临场发挥”来充实相关的内容。每一篇博客文章基本上都是一气呵成,而且,对于完成的随笔,我一般不会读第二遍。这也是为什么文中具有很多错别字的原因。
写书要考虑的问题太多,比如整体结构、详略安排、措辞与表达等。所以在写每一章之前,我都会花上一周以上的时间来想这些问题:本章需要包含哪些内容,哪些应该详细介绍,哪些可以一笔带过,哪些内容需要提前,哪些内容则应该置后,哪些内容需要加一点事例代码,哪些地方应该插入一幅插图,诸如此类均须思虑再三。所以,一段具有相同字数的内容,写书花的时间比写博客长很多。
博文Lisa
读书已成为您生命中的一部分,这句话让我深受触动。有读者对您后续的写作很好奇,他们注意到您的WCF技术博客分为“WCF之旅”和“WCF后续之旅”,他们想了解您后续的写作计划。可否吐露一二?
蒋金楠
当初我在博客园上发表第一篇关于WCF的文章的时候,了解WCF的人还属凤毛麟角,网上除了MSDN,相关的学习资料很少。所以我的第一个WCF系列主要介绍WCF一些基础的东西。后来,接触WCF的人越来越多,介绍WCF的博客、书籍已累见不鲜,但是深入介绍WCF底层实现原理和扩展的文字却仍不多见。在这种情况下,我推出了第二个系列,专门介绍WCF实现原理和扩展方面的内容。随着《WCF技术剖析》的出版,我打算推出第三个系列,内容是写书过程中获得的,但由于篇幅的原因并没有在书中呈现的一些体会和心得,希望与大家一起分享。
《WCF技术剖析》的卷册划分则与此不尽相同。卷1包含WCF的基本框架,是构架WCF分布式应用所必需的知识,是每一个WCF开发设计人员都须要面对的问题;而卷2则囊括了一些所谓的“高级”主题,可能在一个团队中,相关的工作仅仅由少数几个人,甚至某一个人去完成。不论是卷1,还是卷2,都会涉及与该主题相关所有内容,比如基本的概念、编程模型、实现原理和最佳实践等。
博文Lisa
博文视点会全力配合您后续的写作,继续提供优良的出版服务。感谢您的交流,最后,您能为WCF的初学者提一些建议,帮助他们少走一点弯路吗?谢谢。
蒋金楠
WCF是基于SOA的通信框架,正确、灵活地使用WCF的根本前提是思想观念的转变。你要将你自己从传统的面向对象和面向组件的观念转到面向服务上来,否则无论你对WCF本身具有多么深厚的了解,你都不可能将WCF用好。不要认为实现了跨机器调用就是分布式,也不要觉得通过消息进行服务调用就是面向服务。面向服务具有一整套设计的原则,在你真要进入WCF的世界的时候,我建议好好学习一下SOA。