专访孔德芳:如何才能提高Java Web性能

孔德芳认为,设计模式不会随着各种语言或开发框架的没落而没落,它犹如老酒,愈久愈醇香


孔德芳,Arcsoft云服务部门视频流服务产品技术经理。多年一线Java Web开发经历,专注高性能Web服务、Web项目架构设计。熟悉权限设计、服务集群、安全防御、设计模式、多线程并发编程、JVM内存管理、项目管理等Web开发所涉及领域以及各种开源Web开源框架,还做过一年JavaMobile开发,熟悉多个J2ME开源框架。


CSDN:你对开源非常推崇,能说说其中原因吗?


孔德芳:中医领先西医上千年,到如今反而濒临一个被西医替代的尴尬境地,为什么?并不是中医无用,而是中医缺乏开源精神。中医讲究“祖传”、“独门”、“秘方”。中医一脉相承,西医却能集合全世界开源人士之力,大步向前迈进。开源!这样我们才能走得更快、更远。


当然,目前个人分享出来的只是一些小项目(见我上传的CSDN资源),有的只是跟随博客写一些小的示例性源码。如果社区有Java Web相关开源项目要开发的话,个人很乐意贡献自己的一点力量。


技术交流让我更优秀


CSDN:你在CSDN论坛担任Java Web版主已有一段时间,能不能谈谈这段时间都有什么收获?除了收获之外,有没有给你带来什么烦恼?


孔德芳:记得大学毕业时,有位老师对我们说,你在大学里学到的知识,工作以后能用上20%就很不错了。客观来讲,每一个人所做的工作所限,加上公司对员工的KPI是以结果为导向,我们不可能接触到我们所在领域的方方面面。这样对于我们大部分人来讲,我们积累到的东西,或许永远只是那么一小块,尤其是在一家公司呆的时间很长的同学,往往是深度有余而宽度不足。


通过在同一领域的技术论坛交流,我不仅能够了解并学习到我们工作中根本接触不到的知识,而且还能够认识到各种做法的优势和不足,进而和我们手头的方案进行对比。也就是说,通过对别人所遇到问题的分析和解答,我额外积累到了别人的一些工作经验,而且通过各位回复者的意见,我还能总结到找到某种情况下的最佳解决方案。再者通过参与大家的交流,也能随时把握当前应用最广泛的最主流框架技术,避免自己的团队与别人脱节,甚至闭门造车。


还有一些是自己工作中所遇到过的问题,有人提问,可以直接给出解答。随着参与进来的网友增加,我还能借鉴到其他朋友的做法,进而对我们工作中的一些做法进行改进。比如有一次,有网友问到了关于Maven的两个问题:一个是选择性拷贝另一个是jar依赖管理。我们的项目管理用的刚好是Maven,我给楼主提供了我们的解决方案。楼主表示感谢的同时又提了一个配置文件分离的问题,由于我们在项目中也是手工分离的,所以没有办法帮楼主解决这个问题。后来,另一个网友也参与了进来,他提供了他们的做法,而这正是这个问题的解决办法。这下好了,我们以后的各个测试环境和生产环境的部署中再也不用手工去调整配置文件了(此帖请见:点此进入)。


另外一些是分享自己面试或者工作经历。这些都是网友们自己在工作学习中所总结出来的心得体会,具有一手的参考价值,甚至有的可以直接拿来为我所用。这些信息都具有极大的实战性和保险性,是我们去看参考书和API所找不到的资料,对于我来讲都是很宝贵的。


还有这段时间我也认识了很多CSDN的网友,包括Java版的另外几位版主,大家在论坛里进行技术讨论,有很大的技术互补作用。另外我们还通过QQ交流,在个人工作经验甚至生活上进行一些沟通,有的甚至有一些私活介绍给对方的团队……这些都是同一个领域内的人脉积累,是除了同事、同学、朋友之外的一个积累,扩大了我的圈子。


烦恼嘛,还真有一些。比如很多网友在提问之前不知道先在坛子里搜索一把,其实他提问的问题早不知道别人提过了多少遍,造成很多“月经帖”甚至“日经帖”。面对这种帖子,时间久了,总有一些做重复无谓劳动的感觉。另外一些网友只管问,不管结帖,这是对回答者付出的不尊重,某种意义上打击了回答者的积极性。还有一些网友缺乏分享精神,发了个问题,问题解决了就结帖,说一声问题解决了,却不公布解决办法,很多遇到同样问题搜索到这个页面的朋友是带着希望而来,而又抱着失望而去。


不断学习是软件行业弊端?


CSDN:有人讨厌软件行业,他们觉得这个行业知识更新速度太快,得不断学习才能跟上时代步伐,对于这种心态你怎么看?


孔德芳:从我开始写程序,就在各个论坛见到一种热点讨论,大概就是程序员到底是不是终身职业,35岁是不是程序员的退休年龄。还有一些行业外的朋友,碰到我就很关心地问,听说软件开发是吃青春饭的,等你以后年纪大了怎么办?一时间弄的人心惶惶,人人自危,很多人抱怨入错了行。


其实每个行业都有各自的弊端。刚才还有个体制内的朋友给我抱怨:“上周末我在办公室写战略报告就觉得好委屈,就那点死工资,还要这么努力工作,好不甘心”。我安慰他,我们想进去,还找不到门路呢。其实这是大家的习惯性思维,很容易把周围的人的缺点,或者自己所从事行业的弊端进行无限放大。我们来做一个实验:请给我一张大的白纸。我在白纸的中央画一个黑点,然后展示给大家看,问大家看到了什么?大部分人的答案应该是黑点。我那么大一张清清白白的白纸,你没有看到,就中间那么一个小小的污点,就成了你的标准答案。我们不要对周围的人过分要求,把我们所从事行业的弊端无限放大。


软件行业的弊端是什么?在我看来,这个行业的真正的弊端就是,它现在还是一个新兴行业,很多事情没有一个量化的标准。这样带来的害处就是,没完没了的加班,工作强度的加大,这对程序员的身体是一种摧残。这种现象很普遍,事实情况是,很多程序员正是受不了这种摧残而离开这个行业。无限的加班,有些软件公司还是单周末,好容易歇个周末,过度疲惫的程序员选择在家里睡一天。这样玩法,铁打的身子也扛不住啊。真心期望,也许有一天,软件开发能够像其他传统行业一样,有一个量化标准,程序员们不再加班。在这一天到来之前,我忠告各位程序员同行:除非你真的做好了35岁就退休的打算,否则的话,珍爱身体,远离加班。


这里,有的同学要说了,你跑题了,问的问题是程序员得不断学习是软件行业的弊端。——我可不认为知识更新速度太快是软件行业的弊端,能够不断学习是好事。如果一个岗位,经过短短数月的培训就可以一辈子不用学习,假以时日,他站在整天需要学习的其他岗位的工作者面前,就是一个懵懂的小孩站在一个白发苍苍的老者面前,是愚者与智者的比较了,也是打酱油与专业的比较。在职场上真正经得起风雨的人,是那些有真才实学的人,有“空杯心态”的人。人们有的时候认为自己在某个行业里做了很多年,就认为是这个行业里的行家里手,没有我不懂的东西。于是别人在自己眼里都是外行,别人讲的东西都听不进去,要知道“天外有天,人外有人!”。在知识经济时代,科技飞速发展,知识更新加快,如果不虚心学习新的知识和方法,即使你原来的专业知识很扎实,也一样会被社会的进步潮流所淘汰,所以要活到老,学到老。只有定期给自己复位归零,清除心灵的污染,才能更好地享受工作与生活。我认识很多40多岁的同事,在CSDN上也有一些40多岁的程序员,他们在各自所在领域是当之无愧的专家。通过跟他们的沟通,我发现他们都有一个共同特点:每当实现了一个近期目标,决不自满,而去迎接新的挑战,把原来的成功当成是新成功的起点,树立新的目标。正是他们都勇于打破瓶颈,不断实现自我突破,才使得他们走在了时代的前列。


设计模式犹如老酒,愈久愈醇香


CSDN:你对设计模式也有所研究,能不能谈下如何在实际项目中应用设计模式?


孔德芳:编程语言都在编程思想上是相通的,设计模式是软件工程的基石。伟大的Java缔造者们将设计模式的应用发挥到了极致,作为解释型语言的Java从诞生到今天,始终能够作为最主流与应用最广泛的语言力压其他众多的开发语言,与缔造者们不遗余力地提高其健壮性、高性能是分不开的,而设计模式在其中无疑起了举足轻重的作用。如果你已经疲惫于层出不穷的开发语言,如果你已经眼花缭乱于日新月异的开发框架,那么就学设计模式吧,设计模式不会随着各种语言或者开发框架的没落而随之没落,甚至愈如浓醇的老酒,愈发散发出迷人的醇香。设计模式是前辈们的一种经验共享的方式,或者说是一套内功心法。前人在修炼内功的时候就已经考虑到我们这些后来人了,总结了这么一套内功心法,避免了我们重复走他们走过的错路、弯路。


首先是要学习,工作再忙,也要坚持学习设计模式,不然就真的成了只会搬砖的码奴了。


然后是注意观察。学习了一种设计模式,要时时刻刻心里都有一个魂,看看我们接触到的软件里,哪里应用了这种设计模式?比如我学习观察者模式之后,再去学习 MINA框架,发现MINA的事件处理机制就是运用了观察者模式;还有我在Wowza插件开发的时候,发现Wowza的插件模块扩展开发整个就是一个观察者模式的典型,用户通过自定义模块对比如com.wowza.wms.stream.IMediaStreamActionNotify等接口的实现,可以捕 捉到自己所关心流的一系列事件,进而就可以对特定直播/点播频道进行监控了。


接下来就是模仿。学习概念不是目的,我们应该在实际项目中切实感受设计模式带来的好处,领略设计模式的真正的威力,而不只是用来玩理论、侃大山。我们在实际项目的设计中应该时时考虑对比,设计模式能否给我们提供更优方案?一定要多用,不用的话,我们永远不能把这些内功心法和自己的主修功法融为一体。一开始可能只是模仿,但别怕,多思考多用,同一个模式用上几次之后,我们就能够对其适用场景以及优缺点有个自己的评判。下次再遇到类似问题,我们可能就已经能够利用设计模式归结出数个解决方案,并最终有所取舍得出最佳方案。


比如我在经过学习过观察者模式,并模仿前人软件中的应用之后,在一个类似上海抢拍车牌号的场景下,一下子就想到了观察者模式。这种情况下一条线程不断地对当前价格进行刷新,同时几十条线程(几百个对象)对当前价格进行读取监控。用观察者模式效率比较好,可以解决由于线程竞争、加锁而带来的效率问题。把读数据的线程归为观察者,主题是缓冲区数据。一旦数据有更新,主题向观察者推送更新数据,这样推数据的做法效率很高。缓冲区做成主题,每个观察者都有一份自己关心的主题数据本地备份,如果主题没有推数据过来,本地备份就是最新数据。当然,这么干消耗空间,但是却换得多线程环境中效率上的大幅度提升,这就是所谓的用空间换时间。显然,这个时候,空间不是瓶颈,而程序的执行效率,客户能够拿到最新报价的时间才是我们最关心的。


CSDN:从你CSDN博客上获知,平时你翻译了不少技术文档,为什么翻译这些文档?另外,你平时还有些什么好的学习习惯?


孔德芳:其实这些文档也是我正在学习的内容。比如那个MINA2.0用户指南,其时我们在做一个视频服务项目,刚好用了MINA,API没有中文版的,而且关于MINA的中文资料和文档也很少,能够系统介绍这一块的更是难以查找。所以,我在查阅官方资料的同时,顺手也翻译了一把,并整理成一本电子书,以便自己查阅,也希望可以方便到其他对MINA感兴趣的同学。


一些好习惯有:技术学习,就是积极参与同行业技术讨论,积极参与各种社区组织的技术分享交流大会,多结交一些同一领域的朋友。好记忆不如烂笔头,一定要把各种要点记录下来,坚持写日记,几年下来,我的日记本写满了5、6本;技术积累,坚持写博客,记录自己技术心得;技术实践,多年一线Java Web开发经验,主要是企业管理、企业办公、网站、电子商务等方面的项目,也做过一年javamobile开发经历,主要是通用低端手机平台移植性高的项目(J2ME),目前就职于一家公司的云产品部门,负责视频流服务产品的研发;项目开源,把不牵涉到公司业务方面的项目开源出来,不做保留。


你说对了,学习+积累+实践+开源,这就是我这些年积累到的技术之路心得体会。


Java是应用于大型网络应用的最好语言


CSDN:在众多领域中,为什么选择Java Web开发之路?


孔德芳:现在是互联网时代,国内外信息化建设已经进入基于Web应用为核心的阶段。Java作为应用于网络的最好语言,前景无限看好。最重要的是,Java开源,前面提到了,开源的环境之下我们才能走得更快、更远。


CSDN:做Java Web项目需要掌握哪些技术?其中,哪些技术是最基础、最重要的?


孔德芳:要做Java Web项目,需要掌握的技术有:Java语言、面向对象分析设计思想、设计模式和框架结构、XML语言、网页脚本语言、数据库、应用服务器和集成开发环境。


最基础最重要的就是Java语言、面向对象分析设计思想、设计模式和框架结构。Java语言体系比较庞大,包括多个模块。从WEB项目应用角度讲有JSP、Servlet、JDBC、JavaBean(Application)四部分技术;Java语言是完全面向对象的语言,在分析项目业务关系的时候应用一些UML图能尽快找出业务逻辑主要面对的对象,然后对每个对象进行行为划分,最后再实现对象之间的集成和通信;设计模式主要在与两层的设计模式、三层的设计模式和N层的设计模式,很多的Web项目采用的是MVC的三层开发结构,也就是JSP+Servlet+JavaBean。


CSDN:Java Web优势有哪些?主要适用于哪些类型项目?


孔德芳:Java Web的优势体现在:


Java语言是一门不会“死掉”的语言。全球有成千上万的Java开发者,据CSDN软件开发者2013年的调查显示,Java背后的开发者比例占有高达45.39%;
众多的开发者,意味着要找到一个程序员来对现有系统进行维护是相当容易的一件事情(这对公司来讲是个好消息);
JAVA/J2EE体系的强大和优雅使得我们可以精心去构建一个良好的系统;
众多的免费工具,比如Apache/Tomcat/JBoss,这些都是构建一个网络程序的坚实基础;
为开发人员提供的优秀的支持。比如Eclipse,Ant,Maven;
众多的JAVA/J2EE核心库以外的第三方库使得我们开发附加功能轻而易举;
巨头商业供应商提供的工具支持,比如Oracle,IBM/Rational等等;
语言结构更新版的持续研发。
对于比较简单的小型应用,Java Web并没有多大优势,比如对于只有一个数据库、简单几个表结构的博客网站,完全可以用其他更简单的方案搞定。Java Web适用于需要和其他一些系统进行交互的大型Web应用,比如银行或者保险公司的项目。


CSDN:能不能和大家分享下常用的Java Web框架?其中哪些是你常用的?为什么?


孔德芳:目前比较流行的Java Web框架有:Struts1/2、hibernate、spring、iBatis、MyBatis等等。我用的比较多的是spring和ibatis,它们功能丰富,漏洞少,扩展性好,相当灵活,上线项目性能也不错,而且团队人员都比较熟悉,用的都很顺手。


CSDN:使用开源框架有哪些利和弊?开源框架对Java Web技术发展有哪些影响?


孔德芳:


利:


免费;
稳定、安全(相对)、容易找到各种层次的技术人员;
技术人员上手快;
可以在需要时候深入了解架构设计实现原理,可根据自己的需求进行定制,也可借鉴其设计思想并引入到自己的应用中;
用的人多,出了问题很容易找到解决方案,而且与人技术沟通也方便;
使用开源框架的成功案例多,性能等各方面有保障。
弊:


没有商业支持;
随处可见的框架屏蔽了各种技术细节,多数技术人员知其然不知其所以然,使得其很职业发展路线中很容易遇到瓶颈。

你可能感兴趣的:(专访孔德芳:如何才能提高Java Web性能)