京山游侠

专注技术,拒绝扯淡
posts - 50, comments - 868, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

  SpringSide是个好东西,对我来说,它的好主要体现在两个方面:一、它提供了一个敏捷开发的框架,省去了我自己整合Spring、Hibernate、Struts、ActiveMQ等等开源组件的时间,而且还是最佳实践;二、它指导了我的学习目标,在SpringSide中整合的各种组件,都是在同一类组件中最优秀的,而且要想熟练使用这些组件,都必须对它们进行深入的系统的学习。

  本来以为我会在SpringSide开发实战系列中写更多的文章,但是写到现在,我认为应该要写结局了,为什么呢?因为在使用SpringSide进行项目开发的过程中,我越来越感觉到项目绝对不是各种组件的简单堆砌,而是程序员要不断有自己的想法和创意,并能够抽象到一个高度。这也正是为什么我的文章从第一篇到第八篇越来越偏离SpringSide的核心了。在这里,我主要想谈谈程序员的境界。以下观点纯属个人看法,欢迎大家探讨。

  第一层境界:从不能到能。

  可以这么说,早在7年前我就已经熟练掌握C语言、Visual FoxPro数据库、HTML、CSS和JavaScript,C语言和Visual FoxPro是学校教的,HTML、CSS和JavaScript是自学的,同时,我还自学了Flash动画制作和Photoshop图像处理。但是,我那时候还不知道应用程序开发,学的这些东西无非就是好玩,偶尔参加一次学校主办的网页设计大赛而已。

  我开发的第一个应用是《银符英语在线》,使用的是ASP + SQL Server 2000,时间是2004年,那时我刚考过软件设计师(原高级程序员),有人找我做程序,他说想做一个英语四六级的在线考试系统,问我能不能做到,我毫不犹豫就说能。我想我确实是具有软件设计方面的天赋,用了一个星期设计出数据库,再用一个星期写了一个Demo,一下子就把他征服了,于是,他当老板,我当程序员,一起进行在线英语考试方面的开发。

  在这段时间,我觉得我不折不扣就是处于这第一层境界。JScript我早已是滚瓜乱熟,ASP教程更随处可得。在这段时间里,我用全JScript代码实现了用户认证和权限管理,用Visual C++写了个COM组件进行数据的加密和解密,还在网上到处搜索文件上传和动态图片生成方面的解决办法。当时,我觉得我的开发过程充实而满足;现在看来,我只不过是一个重复发明轮子的傻冒。

  在10个月的时间里,我把这个程序从1.0版开发到3.0版,功能上进行了不少升级。但是我认为升级最大的还是我的技术,我尽我最到的能力将代码与网页分离,尽我最到的能力减少代码的重复,甚至已经基本做到使用模式来让程序更加容易扩充和维护。我所做的一切,与现代的一些Web开发框架已经不谋而合。但是,以我当时的内力,确实没有办法将之抽象为一个框架。我的程序中依然充满了意大利面条式的代码,而且在在线人数多的时候,网页会慢得象蜗牛爬。

  第二层境界:从能做到做得漂亮

  2005年,我开始接触Java,以我的基础,自然是很快就学会了Java的语法并进军J2EE。我觉得Java开源世界给了我不少能量,在这两年里,我的进步速度是呈指数式的。以我现在的水平,仅使用JSP和Servlet,已经足以解决绝大部分的需求。然而,仅使用JSP和Servlet就是全部吗?

  这个时候,我们不仅仅要能够完成应用程序的编写,更重要的要让应用程序便于维护和便于扩充。这时候,没有足够的抽象能力是不够的。要能够理解和应用分层架构,要知道MVC、IoC、AOP、ORM,要了解声明式事务处理,还要学会最流行了AJAX。所有的这一切,不仅能够让我们的应用便于维护,合理使用各开源组件还能加快开发的速度,但是最重要的,它们能使我们的应用充满艺术的美感。

  在SpringSide社区,现在最流行的是Acegi,这也是对安全与权限功能的一种抽象。本来我也想写一篇Acegi方面的文章,但是cac写的文档是在是太完美、太经典了,我无法超越。我们应该让我们的应用尽量向Acegi靠拢,因为,它代表的就是安全与权限领域的最佳实践。

  第三层境界:从程序员到架构师

  架构师可以干什么?如何让应用在性能,伸缩性,扩展性、可靠性,容灾,可恢复性,可管理性等方面做到最好,就是架构师的职责,同时,架构师要能够把握软件开发的整个周期。由于我还只是一个程序员,也没有精力去学习架构师方面的只是,因此上面的论述可能不准确。但是,作为一个程序员,上升到一个境界之后,确实应该考虑编码之外的东西了。

  举例说明,cnblogs的博客程序算式比较完善的了,我个人对站长dudu也是充满了仰慕。cnblogs的1.0Beta2版本我也下载得有,本打算使用它建一个自己的博客网站,但是却不行,因为它在性能,伸缩性,扩展性方面都达不到我的要求。

  不信?看看现在www.cnblogs.com吧,注册用户已经2万多了,速度也是越来越慢,经过我一nslookup,发现它还只是一台主机在运行,而www.tianya.cn则是一个服务器集群。如下图:
52.JPG

  造成这个问题的原因,主要就是架构的问题。cnblogs是基于.net的,.net运行于IIS之上,而IIS又是那么的简单,更本不具备配置Cluster的功能。而cnblogs的程序在设计的时候也没有往集群方面考虑,甚至是想多配置几个数据库都是困难的。

  解决网站性能的办法有几种,一是向上扩展,也就是不断增加服务器的CPU和内存,但是这种扩展价格非常昂贵;二是向外扩展,也就是多增加几台廉价的Web服务器和数据库服务器,但是由于cnblogs在设计的时候没有考虑到集群功能,就必须得重构所有的代码,这个工作量实在是太大了;三是垂直分割,也就是目前博客园所采用的方法,就是让一台主机负责.net博客,一台主机负责java博客等等,把不同的应用分开。这样带来的负面影响是我们就没有办法在同一个博客上面同时写.net、java、c++方面的随笔了,这确实让我感觉不爽,此外,在.net领域这样访问量大的领域,一样会使服务器不堪重负。

  我不能让我的程序重蹈覆辙,因此,在架构阶段就应该考虑到Cluster,考虑到负载均衡,考虑到可扩充性,并同时使用水平分割策略。水平分割策略和垂直分割策略不同,是让每一个Web服务器都应该能够使用程序的所有功能,而让不同的用户使用不同的服务器,比如id为0-10000的用户和www1.cnblogs.com交互,10001-20000的用户和www2.cnblogs.com交互,等等,如下图所示:
53.JPG

  这个时候,服务器www.cnblogs.com作为负载均衡服务器,它根据登录用户的ID将该用户请求重定向到www1.cnblogs.com或者www2.cnblogs.com,对于匿名用户,它把用户请求随机重定向到www1.cnblogs.com或者www2.cnblogs.com。

  同时,为了能够让负载均衡服务器能够根据不同的用户来重定向到不同的Web服务器,又要让每个Web服务器上的应用都能够得到所有各个数据库服务器数据的总的索引,需要有一个索引数据库服务器,如下图:
54.JPG

  此外,我们还应该让Web服务器和数据库服务器可以动态增加,也就是当某一个服务器负载到达极限时,我们可以添加一台服务器,只需要修改配置文件即可,无需更改代码,如下图:
55.JPG

  同时配合使用动态页面静态化技术,静态化后的html页面和图片文件都保存在Web服务器上,此时Web服务器有同时担当了缓存服务器的功能。当达到IO瓶颈的限制后,又可以通过服务器加大内存或为服务器配置SAN(存储区域网络)来解决问题。


  好了,SpringSide系列的文章就写这么多吧。期待SpringSide 2.0正式版的发布。我会把它用到实际的项目开发中。


评论

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 01:19 by yeshucheng
文章写得确实不错:)

哪天我也有你的心态境遇就好,继续努力!

京山游侠,希望以后你多写点在实际项目中遇到类似这些性能问题的解决方法:)

不过我觉得你的这篇文章和SS好象很离题吧?难道是我语文没学好

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 03:17 by 山风小子
您的这篇文章要比其他技术性文章要优秀很多,也让我学到了不少东西。
对各类框架的整合,应用,我已经腻了,感觉自己像一个‘装配工’。
因此现在要么学习封装的最好的框架--Grails,设计模式等High level的东西,要么就钻研数据结构,算法,编译原理等最基础的东西。
您觉得我走这两个极端如何,希望得到您的忠告,谢谢 :)

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 07:33 by ncindy
IIS不能集群,Apache可以?而且Web服务器没有集群的必要吧,
而且天涯那更像是用DNS做LB的方式,不是集群。LB的话IIS当然可以了。
可伸缩性在应用层上用SNA才是最关键的,用这种架构别说IIS,就是用Ruby脚本写的web server都可以实现高可伸缩性。

dudu只有一台服务器是估计因为现在资金还不够充裕,想想天涯做了多少 年了啊。

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 09:10 by wangzx
作者关于集群的描述我比较感兴趣,不过我觉得从应用的角度上不妨越简单越好。比如说作者可以考虑使用Apache作为反向代理的方式,将负载均衡到多台WEB服务器上,再结合动态、静态的Cache技术,我觉得这个问题会变得简单很多。利用Apache等提供的缓存技术,我感觉会比你自己来实现“动态转静态”更有意义。

过多的在应用层次考虑一些低层次的功能,最大的缺点是把应用本身搞得很复杂,难以维护,而如果放在其下的层次来考虑,我觉得可以很好的实现这二者的平衡:既简单又高效。当然,从应用的设计上来说,不是说不需要考虑底层技术,只是,现在我们只要知道我们的应用设计是可以跟这些底层(如反向代理、Cache)等相匹配、相合作的,就可以了。

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 09:18 by L
负载均衡直接用F5做就行了,根本没必要这么复杂。

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 09:24 by Max
如果作者有看过《Expert One on one J2EE Development Without EJB》应该知道,J2EE的Cluster的性能不一定是最好的。
Microsoft同样有Load Balance的软件。

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 09:59 by 萧木
这篇文章应该有不少误导读者的地方.

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 10:04 by BeanSoft
也许作者说的是理想情况下, 不需要考虑吃饭, 出于研究/自学状态下的心态.

绝大多数程序员吧, 都是为了吃饭而工作. 很多时候用户需要的是一个 IF-ELSE 的逻辑符合他的需要, 这个时候再多的框架也只是个壳, 而且这些框架也丝毫不能减少编写 if-else 的代码. 我不觉得框架整合的越多越牛, 而是应该进行分工, 不同的人专著于自己最擅长的领域, 大家分工合作. 换句话说只要能如期完成项目或者需求, 到底是什么技术用户是不在意的.
软件业是服务业, 而国内的项目大多都是应用程序, 业务流程, 这时候这些XX开源框架很多时候都帮不了太多的忙.
至于架构的方面, 只能说做新项目之前多做些设计, 扩展等方面的工作, 能否集群也只是一部分, 采用哪些框架要根据实际情况讨论, 还得考虑万一碰到框架 Bug 的时候怎么办(记住开源项目可不是带免费技术支持的). 实际的情况往往是在维护老项目, 架构已不可再改, 推倒重做风险更大, 老板也不会同意.
个人觉得吧, 好好工作, 扎实掌握基础知识, 对于项目所需知识则是按需学习, 早日根据自己的爱好, 实际情况进行定位和规划. 毕竟精力有限, 人人都成为精通XXX流行框架又是架构师的概率实在是太低. 基础掌握牢固的话, 再看框架很多时候都会感到似曾相识.
PS: 我也不觉得 SpringSide 就是敏捷开发, 最佳实践, 说最佳之前请三思. PetStore 不也是经典嘛, 现在还不是被批判的体无完肤.

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 11:08 by 江南白衣
恭喜恭喜,告一段落,可以向更高的目标进发。

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 11:31 by adsljkfjlksda
@萧木
那你写篇来看看,说这句话之前,想想你自己能写出什么东西,如果你有,请在你这句话下面把 链接 贴出来,让大家也评评,如果确实好,那么没人会说什么,如果没有一丝对大家有帮助的话,那你这句话是不负责任的~~ ,

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 13:27 by yegucheng
作者只写了集群的一部分,我觉得架构设计应该包含更广泛的内容,我觉得架构师应该从更高的高度去理解项目需求,不是为技术而技术,当然,这一切都必须以扎实的基本功为基础

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 17:26 by 小陆
clust可以在操作系统的层次上实现,iis完全可以集群化。
你所说的集群是load balance,可以做在网关或者dns上

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界[未登录]  回复  更多评论   

2007-03-29 18:48 by cac
其实每个程序员不一定都有架构师的职位,但都需要有架构师的思想,可以说没有架构师思想的程序员不是好的程序员。
从程序员到架构师只是一个从量变到质便的过程,没有在编程阶段磨练过,尝试过各种语言,各种工具,各种方法的架构师也不会是一个好的架构师
LZ 朴实的学习精神让人敬佩

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 20:43 by 海边沫沫
@yeshucheng
就是因为越来越离题,所以决定结束这个系列

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 20:46 by 海边沫沫
@山风小子
我也喜欢数据结构、算法、编译原理
我也讨厌当装配工

看来我们两个有很多共同之处

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-29 20:52 by 海边沫沫
刚到msdn去看了下关于体系结构方面的东西,看了下MSA EDC构建指南。感觉我的确是井底之蛙。

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-30 09:01 by 山风小子
@海边沫沫 @江南白衣
以后请多多指教 :)

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-31 10:57 by 海边沫沫
@wangzx
我觉得应用层还是应该考虑一些底层的东西。myspace.com现在有1.2亿注册用户,每个月访问量达到400亿,三年时间中已经对网站进行了5次重写,最后就是在应用层采用的水平分割策略。

Apache的缓存我也应该去学习学习,谢谢你的指点。

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-03-31 17:46 by 海边沫沫
@Max

《Expert One on one J2EE Development Without EJB》中并没有说J2EE的Cluster性能不好。

在“性能和可伸缩性”这一节,作者对怎样设计具有高性能和高可伸缩性的程序进行了探讨,其大致意思基本如下:

应用于服务器集群的程序,其实现方式基本上可以分为两种,一种是基于分布式对象的,一种是基于部署的。什么是基于分布式对象呢?就是传统的EJB部署方式,不同的业务对象分布于集群中不同的服务器上,通过远程调用来分担服务器负载;这种方式是被作者所不推荐的,理由是远程调用太浪费时间,这也正是作者写Without Ejb的本意。什么是基于部署的呢?就是在集群中的每一台服务器上都部署有该程序的完整版本,所有的业务对象都在本机上可以访问。

此外,作者还探讨了状态管理,性能最高的就是作者所说的农场模式,也就是说每一台服务器都可以当作别的服务器不存在,他们之间不需要进行Session状态复制等等。如果要进行Session状态的复制,必然会对集群的性能造成影响,n台服务器的性能不可能达到1台服务器的n倍。

对于《Expert One on one J2EE Development Without EJB》这样的好书,确实应该反复阅读。

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-07-25 15:08 by 我的Java工作经历
无语了,牛。。。。

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2007-08-09 13:22 by mmwy
nslookup出来只有一个ip并不一定能说明它就没做负载均衡处理。难说你得到的这个ip是前置的负载均衡交换机的ip,realserver都躲在其内部来着。

nslookup出来多个ip,也许他只是用了最简单的dns轮循的负载均衡处理,也有可能是做了gslb。

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2008-08-13 08:23 by 笑笑笑笑笑笑笑
文章旧了,希望可以更新到springside3.0

# re: SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界  回复  更多评论   

2009-03-25 23:58 by hansen
写的不错,有同感
记得老师曾说过 “程序员像作家,写代码就像在写作”,
好的架构师就如同金庸等名家,写出的代码像是艺术品 如spring hibernate的作者。 而普通的程序员(这里指为了生计,在极短时间内copy,修改代码,来完成工作任务) 可能只是为了完成每天的工作而已,只是为那点钱。就像某些记者。 虽然我也很想写出优雅的代码,但领导不会理解你的做法,只是觉得你效率低。
未来 我一定会“写”属于我自己风格的真正好作品。

只有注册用户登录后才能发表评论。


网站导航: