SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界

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则是一个服务器集群。如 下图:

造成这个问题的原因,主要就是架构的问题。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交 互,等等,如下图所示:

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

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

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

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

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

当你能飞的时候就不要放弃飞

SpringSide开发实战(八):不是结局的结局,谈谈程序员的境界

相关文章:

你感兴趣的文章:

标签云: