Shinn
唯天下之至诚能胜天下之至伪;唯天下之至拙能胜天下之至巧.
posts - 19,comments - 125,trackbacks - 3

  公司有个系统A,最近忙着验收测试,但测了个把月,由于性能和稳定性不够理想,客户不同意验收。

  前些天从我们Team去支援该项目的一个兄弟和我谈到这个系统很难整,我恰好也对这个神秘系统比较感兴趣。于是大致浏览一下,不得不佩服该系统的UI;
  1. 清爽,漂亮,看起来非常大气
  2. 全程Ajax,几乎不刷新界面
  3. 最神奇的是功能似乎比客户端软件还强,可以拖拽数据到树,可以右键处理一些事务,可编辑表格那些"基本功能"当然都有

   [第一个问题浮出水面]
   我迫不及待的想知道该系统的瑕疵。在兄弟输入的指定产品Id后,问题暴露了,获取该产品的MBOM(Manufacturing BOM)详细清单的时候非常慢,一问原因,原来该产品的所有子孙节点一共有200多个,因为BOM是成树状分布的,比如说散热器是由小风扇*1,散热片*1,小螺钉*2,主板卡*2四个子物料组成的,如果散热片也是自产的话,那么就多了铝制散热鳍片*1,铜芯*1两个孙节点,..... ;

   [第一个问题的分析]

   一看随着数量增多,速度成比例变慢,我心中忽然有了想法,应该是和数据库交互过多.开启http请求监控工具,果然是这个原因,我一点击查看详情,浏览器就不停的请求服务器.于是我猜想,目前的处理方式是通过BLL.BOM查找物料信息并添加到界面,界面添加后顺便检查是否有次级物料,如果有子物料的话,继续查找子节点(Lazy Initialization).次数一多,自然就慢了.因此我们只要减少浏览器到服务器,和服务器到数据库的交互次数即可大幅提高速度.

  [试图解决问题一]

 从问题看我以为只要为BLL.BOM添加Early initialization方法,其DAL实现是一个递归查询语句 .ORACLE 语句如下

SELECT level, m.*FROM materiel m
START 
WITH materiel_id=:materielId
CONNECT 
BY prior materiel_id=materiel_p_id

   随后在我本机的技术可行性测试(为测试某一技术是否可行模拟需求进行的小测试)中,效果非常理想,复杂产品(200子孙)时间和原先只有10条以下子孙料号的简单产品耗时相当。从解决方案上来看,似乎非常简单,应该改问题能立马见效.乐呵呵的将解决思路,sql语句发过去,自我陶醉自己是不是太厉害了;难住一个Team的难题唰一下就让我给解决了.

   那兄弟看到我的Mail很高兴,说虽然他只负责另外一个模块,但这个Bug困扰很久了云云,有空帮他看看我.乐呵呵的想,"困扰"不过如此.  

 [问题一变复杂了]

   我还顺便从vss上拷一份代码到本地,来测试下自己的成果 ,一看代码,我糊了,此程序没有BLL,没有DAL,就只有界面,所有的后台代码都在'*.aspx.cs'下面,前台引用的js文件有5,6个之外,前台还有上千行的js函数.调试半天,总算把流程弄清楚了,

从流程上分析,该流程主要做两件事

1.从数据库查询资料

2.将物料插入到一个tree里面

经仔细研究,还是可以做Early initialization的,只不过这次初始化的对象为一个Dom元素tree而已.但对这一方案最终如何执行,能否执行我心中已经没底了.

随后,我参加了一次该team关于此问题的一次技术讨论,

讨论的结果如下

1,代码尽量不能变动太大

2,尝试采用 Early initialization方式解决该问题,(解决的思路大致是通过将递归查找出来的数据集在后台生成html代码添加到界面上去(改动量相对较大),或将数据集格式化成Js插件能载入的格式,一次性在前台载入)

3,在1不能满足的前提下,砍掉一次性展开所有子孙节点的功能.(尽管此功能在客户需求文档中已经明确提出) 


[问题2,问题3,问题N都出现了]

随着对该项目的继续了解,一些问题又陆陆续续的冒了出来

如:

1)该软件非常吃客户端内存,没错,就是客户端,256/甚至512内存的机子跑这程式很吃力。

2)在将界面修改值保存到数据库时,经常失败;

3)在只有几个用户测试的情况下,服务器已经跑不动了

 

【该项目的简单介绍】

   该项目是我们的重点项目之一,它是一个以BOM为核心的一个工程系统.涉及工程设计、工艺制造设计、生产制造,采购,销售.设计用户500人,公司,客户都很看重该系统.在资源分配上也优先处理

  它关系公司产品线的未来UI走向,如果效果很好,将会运用到其它产品上去.

  目前该项目延期快一年了,目前任处于漫长的验收测试过程中.项目组压力很大,但目前还无法给出交付的具体时间,项目组成员对该项目已经开始厌烦.客户也开始不感冒...

  

【关于该项目的感触:】

在这个案例中,一个表面光鲜的软件,内部可以说是相当丑陋,最终导致项目的失败.(注:本文赞同项目延期或预算超出为项目失败的观点) 。

 从案例中我们可以看到,该软件在尚未交付的情况下,已经"腐烂",成了"全新的遗留代码"[1] 。

产生这种状况的原因也许有许多,比如使用了其它公司的Js代码,团队中途换人了,客户需求老变。但这些原因在所有中几乎都是无可避免的.

-----------------------------------------------------------------------------------------------------------

本文在前几天发过,但内容已大幅修改,故重发一次.另外,由于问题的逐渐深入,这个话题可能会写成一个系列.

只是可能,因为发贴真的很累,我又真的很懒.

有网友提到,我提出的解决方案很简单,确实简单,而且根本不能说已经解决该问题.其实本文的主要观点也并不在于如何解决问题,而是试图找出为何会出现这些问题,如何避免这些看似小问题的大问题

注:
[1]遗留代码:无法理解的,难以修改的代码.《修改代码的艺术》,Machael C. Feathers


posted on 2008-11-23 23:55 Shinn 阅读(3712) 评论(31)  编辑 收藏

FeedBack:
2008-11-20 22:30 | aaaaa[未注册用户]
说了半天,就是connect by啊~~不过也确实也是一种解决办法!!
  回复  引用    
2008-11-20 22:46 | Boler Guo      
加内存呀~
  回复  引用  查看    
2008-11-20 23:03 | ccooooo[未注册用户]
可以试试从js的内存泄露着手
  回复  引用    
2008-11-21 09:10 | Kevin-moon      
真晕 还以为有什么创意性的做法呢........
更想看到 "js的内存泄露着手"

  回复  引用  查看    
2008-11-21 09:24 | 到最后[未注册用户]
@aaaaa
--引用--------------------------------------------------
ccooooo: 可以试试从js的内存泄露着手
--------------------------------------------------------

  回复  引用    
2008-11-21 09:41 | 犇牛牛      
我个人觉得性能问题一般从两方面解决:
1. 首先保证系统底层数据库架构的健壮性 能够以比较快的速度处理数据并
返回
2. 在展现层以合理的逻辑处理返回过来的数据 保证响应的迅速性

  回复  引用  查看    
2008-11-21 09:41 | old_sleet[未注册用户]
我参与开发过的一个系统,其是基于jQuery开发的,除了必要的文件上传,还有中心区域有用到IFRAME外,其它的都是无刷的,在这种情况下,JS运行久了就吃很多内存,一般可以吃到200多M,这时候IE运行就很慢,FF倒是很流畅。哎,我也在找这方面的解决方案


我认为的JS高手,并不是只是会开发,或实现一些复杂效果,而是要能做到性能上的调优,及对JS在各个浏览器上的内在泄露问题

  回复  引用    
2008-11-21 10:18 | Tony Zhou      
客户端不开javascript呢?我一般是用着no script上网。 我不觉得一个企业应用要ajax全站有什么好处。
  回复  引用  查看    
2008-11-21 10:41 | 个人知识管理      
肯定用了国外的控件!DEV值得研究 --------- 清爽,漂亮,看起来非常大气 全程Ajax,几乎不刷新界面 最神奇的是功能似乎比客户端软件还强,可以拖拽数据到树,可以右键处理一些事务,可编辑表格那是基本功能
  回复  引用  查看    
2008-11-21 10:43 | cloudgamer      
内存泄露这个问题确实比较麻烦
因为很多时候问题都出在浏览器(ie)
很难从代码找出泄露的地方
这里有篇关于内存泄露的写的很好
http://blog.csdn.net/dead_of_winter/archive/2008/04/10/2277673.aspx" target="_new">http://blog.csdn.net/dead_of_winter/archive/2008/04/10/2277673.aspx

  回复  引用  查看    
2008-11-21 10:55 | 痴情客      
--引用--------------------------------------------------
个人知识管理: 肯定用了国外的控件!DEV值得研究
---------
清爽,漂亮,看起来非常大气
全程Ajax,几乎不刷新界面
最神奇的是功能似乎比客户端软件还强,可以拖拽数据到树,可以右键处理一些事务,可编辑表格那是基本功能

--------------------------------------------------------
你还上网,没有javascript你还上网?

  回复  引用  查看    
2008-11-21 11:34 | 木野狐(Neil Chen)      
“泄露”和“泄漏”可是不同的意思哦,现在老看到很多人混着用,这样的话还不如直接说 Memory Leak 来的准确呢。
  回复  引用  查看    
2008-11-21 11:45 | xjb      
也许很细节的问题,但造成的影响却是巨大的
  回复  引用  查看    
2008-11-21 12:09 | LZ[未注册用户]
我觉得既然一开始lazy-load了,为何一次性还要取200子孙。
可以只显示下一级,展开下一级时再获取下下级。就如Ext的treeNode.

  回复  引用    
2008-11-21 13:11 | 小龙3      
--引用--------------------------------------------------
old_sleet: 我参与开发过的一个系统,其是基于jQuery开发的,除了必要的文件上传,还有中心区域有用到IFRAME外,其它的都是无刷的,在这种情况下,JS运行久了就吃很多内存,一般可以吃到200多M,这时候IE运行就很慢,FF倒是很流畅。哎,我也在找这方面的解决方案


我认为的JS高手,并不是只是会开发,或实现一些复杂效果,而是要能做到性能上的调优,及对JS在各个浏览器上的内在泄露问题
--------------------------------------------------------

Firefox 3.1 JavaScript性能比IE7强好几倍啦。

  回复  引用  查看    
2008-11-21 14:10 | 刘守照      
没看出来有什么
优化这个就话题多了

  回复  引用  查看    
2008-11-21 15:01 | winter-cn,我也不能总是不登录是吧      
@cloudgamer
现在IE左一个patch右一个patch我也有点晕
唯一可以肯定的是 泄漏归根结底还是存在的

@小龙3
google的V8现在才是最快的 不过Gecko和webkit泄漏还是存在的 不比IE强多少

  回复  引用  查看    
#18楼[楼主]
2008-11-21 20:43 | Shinn      
--引用--------------------------------------------------
aaaaa: 说了半天,就是connect by啊~~不过也确实也是一种解决办法!!
--------------------------------------------------------
解决的重点不在connect by,而在于大对象的初始化方案,

  回复  引用  查看    
#19楼[楼主]
2008-11-21 20:52 | Shinn      
--引用--------------------------------------------------
痴情客: --引用--------------------------------------------------
个人知识管理: 肯定用了国外的控件!DEV值得研究
---------
清爽,漂亮,看起来非常大气
全程Ajax,几乎不刷新界面
最神奇的是功能似乎比客户端软件还强,可以拖拽数据到树,可以右键处理一些事务,可编辑表格那是基本功能
--------------------------------------------------------
2008-11-21 10:18 | Tony Zhou
客户端不开javascript呢?我一般是用着no script上网。我不觉得一个企业应用要ajax全站有什么好处。


-********************************************
确实买了国外的js插件.

不管是何种应用,更好的界面,更便捷的操作都是有必要的
MS office 2000 到2003 到如今的2007 在UI上都有很大的变化

另外,公司产品线需要一个新的UI模板,就拿此项目探索,成功的话会推广到其它所有产品上去。




  回复  引用  查看    
2008-11-21 23:23 | 火星人.NET      
我自己觉得,什么东西都不能用过度~
ajax大量的应用,滥用,不说性能,说感觉上就有喧宾夺主的意思....
反正让人看了说不出的感觉 再说了,你用的是国外的控件,怎么调优性能~~复杂的很,有些东西研究起来很吃力~~

  回复  引用  查看    
2008-11-22 16:03 | 吾爱乐乐      
楼主可否说一下买的是什么JS插件,效果那么好?
值得研究。

  回复  引用  查看    
2008-11-23 11:26 | sunnychen[未注册用户]
你解决问题的方法没有什么新意,也没多少技术含量。不要动辄搞个标题来吸引眼球。
  回复  引用    
2008-11-23 14:51 | canbeing      
呵呵,是啊,挺吸引人
现在新浪、网易、qq首页不都也是非常吃内存

  回复  引用  查看    
2008-11-24 01:17 | 上不了岸的鱼{ttzhang}      
如果AJAX效果的控件可以使用Telerik,然后搭配JQuery。
javascript这玩意,搞不好就会有Memory Leak出现,倒不如出点Money,使用现成的。

  回复  引用  查看    
2008-11-24 09:00 | 81      
觉得现在Web程序有点变样了,以前只是为了部署方便而舍弃Win程序的开发方便,现在搞出了个无刷Web,要依靠其他技术来弥补http协议的不足,然而却造成了性能的低下。

我在想:如果无刷很重要,为何不直接用WinForm来实现,可以一了百了!

  回复  引用  查看    
2008-11-24 09:35 | Jason Cui      
是Extjs的吧?
  回复  引用  查看    
2008-11-24 14:55 | A.Z      
--引用--------------------------------------------------
Tony Zhou: 客户端不开javascript呢?我一般是用着no script上网。
我不觉得一个企业应用要ajax全站有什么好处。
--------------------------------------------------------

我是No ActiveX,no script太极端了...不过不得说有些js溢出漏洞我还是有些担心。

web这个东西,我觉得初期的界面设计太重要了,行数成规模的表格,或者DIV都会成为谋杀浏览器的杀手。必须要用户妥协某些操作和视图,该细分的步骤决不能放在一个页面,非关键功能菜单这种很难把握的功能点用户不提就不要去实现,还有关于AJAX,除非有非常非常非常精通JS的高手存在,否则最好用MS自己的AJAX框架,这个框架的特点在于非常强势的服务端代码集成,设计的规格决定了它的可伸缩性很高。

  回复  引用  查看    
2008-11-26 12:52 | winter-cn未登录[未注册用户]
--引用--------------------------------------------------
A.Z: --引用--------------------------------------------------
Tony Zhou: 客户端不开javascript呢?我一般是用着no script上网。
我不觉得一个企业应用要ajax全站有什么好处。
--------------------------------------------------------

我是No ActiveX,no script太极端了...不过不得说有些js溢出漏洞我还是有些担心。

web这个东西,我觉得初期的界面设计太重要了,行数成规模的表格,或者DIV都会成为谋杀浏览器的杀手。必须要用户妥协某些操作和视图,该细分的步骤决不能放在一个页面,非关键功能菜单这种很难把握的功能点用户不提就不要去实现,还有关于AJAX,除非有非常非常非常精通JS的高手存在,否则最好用MS自己的AJAX框架,这个框架的特点在于非常强势的服务端代码集成,设计的规格决定了它的可伸缩性很高。
--------------------------------------------------------
这么多年 终于看到一个说MSF好的 我真感动......

  回复  引用    
2008-12-01 10:44 | 丁丁      
又一个过于重视界面,格式,美观的项目,和找老婆一样,都要好看的,然后发现除了好看没其他优点了……
  回复  引用  查看    
2008-12-02 11:21 | 极地雪狼      
顶29楼的。



  回复  引用  查看    
2009-01-08 15:54 | fangboxiaoliang[未注册用户]
技术是强的,架构时没有考虑到技术瓶颈。

客户端的交互性是上去了,用户端会耗费更多内存,性能肯定要下降。正交表中是-

一味的答应客户的要求,想做到最好,没有考虑到综合成本,包括原有系统的功能约束和非功能约束。导致项目失败。从细节来说,中途走人,客户需求总变,这个好像是中国所有软件公司都有的问题吧,软件人员流动性大。前期需求分析不够彻底,用户看到葡萄说想吃葡萄,看到西瓜想吃西瓜。这个我觉得没有办法避免的。

非功能约束占主要的一部分。这个系统涉及到一整套公司业务流程。是不是应该从大局出发,然后再考虑到用户的体验。这个系统好像是要先把用户的体验做到最好。

有人说架构,设计是艺术,从公司的利益来谈,其实对于用户来说实用就可以了,能在不影响原有性能加一些客户体验当然更好,系统提高了公司的效率就是一种进步,在不影响全局的情况下添加一些好的体验,有些中型的软件公司做出来的东西,客户觉得够用提高工作效率了,就应该是成功的软件吧。

做技术的我们是不是也该权衡这些问题呢。


  回复  引用    
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1338001




相关文章:

相关链接: