天天看点

如何才能提高Java Web性能?

http://www.csdn.net/article/2014-04-28/2819531/1

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

孔德芳,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),目前就职于一家公司的云产品部门,负责视频流服务产品的研发;项目开源,把不牵涉到公司业务方面的项目开源出来,不做保留。

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

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技术发展有哪些影响?

孔德芳:

利:

免费;

稳定、安全(相对)、容易找到各种层次的技术人员;

技术人员上手快;

可以在需要时候深入了解架构设计实现原理,可根据自己的需求进行定制,也可借鉴其设计思想并引入到自己的应用中;

用的人多,出了问题很容易找到解决方案,而且与人技术沟通也方便;

使用开源框架的成功案例多,性能等各方面有保障。

弊:

没有商业支持;

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

CSDN:如何提高Java Web项目的性能?都是从哪些方面来改进?

孔德芳:关于Java Web项目的性能,每个人所面临的情况都是不一样的,多跟踪,多思考,多尝试。以下是我总结的一些思路,仅供参考吧:

1.使用Nginx作为前端接入

用Nginx进行动静分离。这个不用多讲,新浪、网易、淘宝、腾讯等巨头的使用已经说明了一切。

2.保持最简单的架构

遵守KISS原则(Keepitsimpleandstupid)。尽量不要考虑项目外的重用,过多的考虑项目外的重用,必然会增加项目的复杂度。避免过度集成,让每个模块只做自己的事,这对于日后的维护和模块复用都有好处。

3.精心设计缓存处理、毫不吝啬代码(对象、列表、片段)

对于门户网站的首页来说,往往可能会有近百个SQL。用户并发上去以后,光首页就足以让服务器down掉。缓存不但有利于降低负载,而且还能提高响应速度。

4.调整使用聚集索引

对于每个表来讲,聚集索引只有一个,利用好了,查询速度会有意想不到的提升效果。

以MySql为例,InnoDB选取聚集索引参照列的顺序是

1)如果声声明了主键(primarykey),则这个列会被做为聚集索引;

2)如果没有声明主键,则会用一个唯一且不为空的索引列做为主键,成为此表的聚集索引;

3)上面二个条件都不满足,InnoDB会自己产生一个虚拟的聚集索引。

[java]view plaincopy

CREATETABLE`timeline_raw`(  

`rawId`bigint(20)NOTNULLAUTO_INCREMENT,  

`uid`bigint(20)DEFAULTNULL,  

`did`bigint(20)DEFAULTNULL,  

`channelId`char(1)NOTNULLDEFAULT'1'COMMENT'1:qvga;2:720p',  

`fileId`bigint(20)DEFAULTNULL,  

`sectionId`bigint(20)DEFAULTNULL,  

`headerFilePath`varchar(120)DEFAULTNULL,  

`startTime`bigint(20)DEFAULTNULL,  

`endTime`bigint(20)DEFAULTNULL,  

`updateTime`datetimeDEFAULTNULL,  

`createTime`datetimeDEFAULTNULL,  

PRIMARYKEY(`rawId`),  

KEY`index_uid_did_startTime`(`uid`,`did`,`startTime`)USINGBTREE,  

KEY`index_uid_did_endTime`(`uid`,`did`,`endTime`)USINGBTREE,  

KEY`index_time`(`startTime`)USINGBTREE,  

KEY`index_uid_did_fileId`(`uid`,`did`,`sectionId`)USINGBTREE,  

KEY`index_sectionId`(`sectionId`)  

)ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8  

这个表有四个索引:主键rawId、sectionId、`uid`,`did`、startTime。

项目的iBatis2中有这样一条查询语句:

<selectid="getRawFileList"parameterClass="java.util.HashMap"resultClass="com.defonds.mysql.raw.entity.TimelineRaw">  

SELECT*FROMtimeline_raw_  

WHEREuid=#uid#  

ANDdid=#did#  

ANDchannelId=#channelId#  

<isNotNullproperty="sectionId">ANDsectionId=#sectionId#</isNotNull>  

AND  

(  

(startTimeBETWEEN#startTime#and#endTime#)  

OR  

(endTimeBETWEEN#startTime#and#endTime#)  

<![CDATA[  

startTime<=#startTime#  

]]>  

endTime>=#endTime#  

)  

ORDERBYstartTime;  

</select>  

根据实际业务向timeline_raw表注入一千万条数据,进行模拟测试,发现getRawFileList的执行平均时间为160ms以上。这是不能接受的。

考虑到实际业务中对于主键rawId查询条件甚少,我们把rawId主键索引取消掉,改为唯一约束,却把sectionId+startTime+endTime作为主键(业务上能够保证其唯一性,根据InnoDB索引规则,这个索引将成为我们新表的聚集索引)。然后把sectionId、startTime两个索引也取消掉,仅保留`uid`,`did`索引。

这样子,我们新表的索引实际上只有两个了:一个聚集索引(sectionId+startTime+endTime)一个非聚集索引(`uid`,`did`)。

再次进行模拟测试,同样的数据、数据量,同样的查询结果集,getRawFileList执行平均时间已经降到了11ms。结果是令人振奋的,不是么?

5.使用/dev/shm来存储缓存的磁盘文件

在网站运维中,利用好了这一点,往往有意想不到的收获。以tomcat为例,可以通过修改catalina.sh中的CATALINA_TMPDIR值的路径来将缓存设置为/dev/shm。

以OSC为例,他们就是纯Java写的,部署在tomcat下。在长时间的在线运行之后,管理员发现网站响应速度奇慢,服务器负载正常,又找不出是哪里的问题。后来df一下,发现tomcat临时目录下的文件足足有8G之多,原来是CPU等待磁盘操作造成响应速度加长。于是他们将临时目录映射到/dev/shm,网站响应速度从此奇快。

6.分析系统中每一个SQL的执行效率

以MySql为例,对于每个SQL最好都explain一下。对于有明显效率问题的,通过sql优化、调索引等方法进行改进。

7.健康慢查询日志,检查所有执行超过100毫秒的SQL

对于上线了的项目,健康慢查询日志,检查所有执行超过100毫秒的SQL,看看有没有优化余地。对于没有上线的项目,可以进行场景模拟对嫌疑SQL,或者对频繁使用的SQL进行性能测试,统计它们执行时间,得出平均值,画出曲线分析图,对于单表千万数据,执行时间超过50ms的SQL要重点关注。

CSDN:对于一些规模较大的Java Web项目,都是如何处理的?比如分工等等?另外,在开发效率上有没有什么心得?

孔德芳:对于一些规模较大的Java Web项目,要完成工作任务,仅仅靠努力工作是远远不够的。首先要明确作战目标:做一个立项报告,让团队明白项目的目标,否则大家都是无头的苍蝇;然后是分工明确:和大家在一起分析各个人的工作情况,明确各个人的职能和职责;之后是预算:我喜欢让每个人按照自己的任务先进行自己预算,如果和自己给他估算的相差很大再去仔细分析;最后就是跟踪或者敦促执行情况了。具体项目分工我推荐阿朱的四套马车。

在提高开发效率上,我的做法是这样的:指导并直接参与核心模块研发、跟踪组员任务进度:监督组员完成情况和质量,定期组织团队codereview、对完成情况不太好的组员,或者所在任务技术难度比较大的组员提供技术支持和帮助。

CSDN:在Java Web项目架构设计上有没有什么经验可以分享?

拆分(软件部署方式(业务、架构(展现层、业务逻辑层、持久层)))软件包括自己的、第三方的(DB、MQ...);

抽取通用服务,形成自己应用的中间线;

负载均衡(LVS、HProxy、读写分离、切片);

高可用\故障转移(heartbeat、keepalive、MasterSlave);

共享存储(nfs、iscsi);

在业务和技术之间做出最佳的选择。

CSDN:如今云计算应用非常广泛,Java Web能否适应云计算发展需要?在开发上,Java Web如何与云计算相结合?

孔德芳:云计算按照服务类型大致可以分为三类:基础设施即服务IaaS、平台即服务PaaS、软件即服务SaaS。

IaaS:AmazonEC2/S3、Openstack、Cloudstack;

PaaS:GoogleAppEngine、MicrosoftWindowsAzure、Openshift;

SaaS:AmazonDevPay。

云计算另一种划分方式:桌面云、公有云、私有云和混合云。

支持云计算的几种关键技术:(google三论文)

分布式文件系统:GFS(google)、HDFS(hadoop)、GridFS(MongoDB);

分布式并行计算框架:MapReduce(google)、MapReduce(Hadoop)、MapReduce(MongoDB)、EMR(Amazon);

NoSQL:BigTable(google)、Hbase(hadoop)、MongoDB。

(虚拟化)

Xen;

KVM;

VirtualBox;

VMWareExsi。

传统应用按照数据处理分为OLTP、OLAP两种,按照部署方式分为CS、BS(Java Web...),BS架构的应用可以在合适的时候引入云计算的各种技术,以获得更高的可靠性(failover)、性能(horizontalshard、verticalshard)、扩展性(scalein、scaleout)。

CSDN:你就职于某云产品部门,在视频流服务领域有没有什么心得分享?

孔德芳:目前能够提供视频流服务的服务器有很多,比如AdobeFMS、haXeVideo、RealNetworks的HelixUniversalServer、Red5MediaServer、Erlyvideo、UnrealMediaServer、WowzaMediaServer、WebORBIntegrationServer以及NginxwithRTMPModule等等。选择一款适合自己的流媒体服务器很重要,比如,AdobeFMS服务性能都很稳定,但不开源而且收费昂贵;Wowza服务性能也很好,可扩展性很高,技术支持不错,但不开源,价格相对实惠,性价比高;Red5服务性能也都不错,而且开源,但自2012年下半年起官方停止任何技术支持,而且不再有新版本发布;NginxwithRTMPModule开源,而且技术支持也不错,但有很多bug,而且并发性也不太好。

CSDN:有人说,初学Java Web开发的人,要远离各种框架,对此,你怎么看?

孔德芳:我支持这种说法。框架把程序员要做的很多事情封装起来,让我们能够专注于企业业务开发,能显著提高开发效率。但是一开始应该注重基础和原理,初学Java Web开发,一开始就上手框架,很容易忽略掉那些基础知识。很多人认为Java Web开发就是SSH,一系列的配置文件拷来拷去;很多程序员做了几年Java Web,你问他定义的一个对象的生命周期描述一下,以及为什么要用spring管理,他都答不出来;还有少数一部分人更是连js、jsp哪个是在服务器端执行哪个是在客户端执行都分不清楚,弄出来很多本来期望在客户端弹出的窗口却在服务器端弹出来的笑话…这些都是一开始学习上手框架,没有注重基础学习的后果。可以说成也框架,败也框架。

CSDN:你觉得该如何系统学习Java Web?有没有什么学习窍门?

孔德芳:我觉得要系统学习Java Web开发,一定要抓住这两样,JavaServlet规范和HTTP协议。Servlet规范去官方看文档,HTTP协议推荐图灵的那本《HTTP权威指南》。这些没问题了,再去学框架。框架只是工具,这些是基础,不要本末倒置。

CSDN:在Java Web学习上,有没有什么学习难点?如何解决这些难点?

孔德芳:难点是Web的MVC实现、项目的测试和调试。项目的测试和调试是学习难点,这个没得说,这是每个程序员的基本功底,从某种意义上来讲能够代表一个程序员水平的高低,需要我们在项目实践中多动手、多思考,不断自我积累和提高。那么MVC这种大家耳熟能详的东东,怎么也成了难点了?事实上,我经常在Java Web版看到网友把SSH进行MVC的三层对号入座。这就暴露出来他根本就没有理解MVC。事实上,MVC的三层和所谓SSH不是一个概念,不要硬性按号入座。SSH体系的分工是为纵向分工是线性分布,而MVC是面性的三者之间都能互相合作,虽然ssh目的和MVC一样,都是支持可维护性可扩展性为目的。

CSDN:Java Web程序员在熟练使用一些框架之后,如何进一步提高技术?

孔德芳:Java Web程序员在熟练使用一些框架之后,要想避免成为熟练工,突破现有瓶颈,应该多关注以下这些问题:

海量数据的处理

数据并发的处理

文件存贮

数据关系的处理

数据索引

分布式处理

安全防御

数据同步和集群的处理

结束语:我的程序员之路是从CSDN开始

孔德芳在最后聊到,他的程序员之路就是从CSDN开始的。

“大学那会,一个偶然的机会,接触到了CSDN,CSDN的人气的活跃度、各种技术讨论的广度和深度深深吸引了我,从此我开始频繁关注这个程序员聚集的大本营。当然,一开始大部分时候只是潜水,看别人的讨论、分享,还有查阅一些资料,因为自己所知道的不多,好像根本就参与不进各位的技术热点的讨论中去,最多也就是用早期申请的几个账号提问几个问题而已。直到2007年,注册了现在的这个账号,自己也参与论坛讨论、博客分享中去,竟然一发不可收拾。”

就此,孔德芳无比感慨地称,感谢CSDN的那些帮助过他的人,虽然有些问题似乎是微不足道的问题,但正是你们的帮助,让自己一次次从没有头绪中豁然开朗起来,也正是由于你们貌似很不经意的一次次指引,让他不至于迷失,一步步走过那开始时的懵懂。

=================================

LINUSTD36分钟前

我认识很多40多岁的同事,在CSDN上也有一些40多岁的程序员,他们在各自所在领域是当之无愧的专家。通过跟他们的沟通,我发现他们都有一个共同特点...========哈哈,谈到40多岁的工程师,据我了解,40岁的工程师,几乎没有一个人谈论设计模式,喜欢高谈阔论谈论设计模式的,大都是20多岁的小青年。40多岁工程师写代码,特点就是,重视基础,讲究使用,写得健壮,大事化简。而喜欢鼓吹设计模式的人的特点是,把简单的事弄复杂了。

支持你的观点。设计模式是现在初级码农必修!是经验总结,不要当金科玉律,要做大神还是不要开阔眼界,不断学习。

程序员得不断学习是软件行业的弊端。——我可不认为知识更新速度太快是软件行业的弊端,能够不断学习是好事。=我问问你,厨师的技艺经常更新了吗? 医生的知识经常更新了吗?软件行业要说知识更新太快,那只能说明你所在层次太低,只是处于生物链最底层,整天让人家上层开发个新包装,新玩意来套牢你。都这么多年了,还鼓吹设计模式,本文的标题是提高Java性能,而你却说设计模式,设计模式对性能没有任何作用,反而让性能降低。代码追求的目标不是设计模式,而是健壮、最佳实践。健壮和设计模式是没有任何关系的。 搞汇编,搞C语言,没有什么设计模式,因为根本没有继承和OO,但是汇编代码和C代码,照样可以写得非常健壮,懂吗?设计模式不用学,代码写的多了,写得熟练了,自然而然就会总结出一些规矩,而这些规矩才是最宝贵的,这些规矩也许有设计模式的影子,但是却不是设计模式。喜欢鼓吹设计模式的人,一般都是刚刚脱离了菜鸟水平,开始转向中手的人,也就是,处于把书读厚了的人喜欢鼓吹各种封装和设计模式。比如某些框架,yii php框架的开发者薛强等,喜欢吸取各种框架的特点,集成在一起,好显得自己多牛逼。当你有本事把书读薄的时候,设计模式就一无是处了。