汽车实时监控系统项目濒临失败和延期的经验分析



背景,需求不很明确,工作量大,开发人员有限。
项目为在线汽车实时监控系统,采用在线google Map

1. 架构和选型
  1) 基础架构:
业务上分为几个子系统,各个子系统是相互独立的Java webapp可以单独部署,也可以一起部署到tomcat,并通过一个ROOT webapp, portal来访问,并通过一个简单的SSO来登录;每一个子系统可以单独部署在自己的数据库schema;各个子系统之间通过Camel数据集成,
实时数据通过Router(socket前置机,通过互联网/GPRS/3G/4G等网络将汽车GPS及其汽车总线信息数据传送过来)发送到Camal再通过一个Java app将接受到的数据写入Hbase。
  2) 技术选型:
      a) web: HTML5, Jquery/kendo, Spring MVC/Restful
      b) 后端:Spring, Spring-data, JPA
      c) 数据储存:SQL Server/Oracle(基础数据),Hadoop/Hbase(实时数据)
      d) 系统集成:Camel/Spring,Active MQ
3)架构3宗罪:
        本身的架构没什么问题,但是问题在于放错了坑,一个萝卜一个坑,但胡萝卜和红萝卜是有区别的,把红萝卜往胡萝卜坑里放就不合适了,总体总结:
   a )  Camel 滥用:camel本来很好用,其Camel架构也本身也没有问题,在系统集成也很简单,问题在于把Camel用烂了,其主要问题是滥用导致了代码调试和维护的难度增加,从而使工作量成倍增加。
        很多camel接口为了做到所谓的通用,而很刻意的通用,接口的定义和开发很自私,只考虑了接口本身,并未考虑接口调用方的便捷和可靠。接口定义简单,接口定义的返回结果太过结构化的。虽说结构化的数据很明了,但就是这样太结构化的数据导致了跟多的工作量。同样的事情使用JPQL或者SQL 2个小时即可完成,而使用结构化的数据等于在重复数据库select语句所要完成的工作,跟为可悲的是这些功能用结构化的数据来过滤很容易出错,且调试困难,从而导致开发时间数10倍增加,甚至几十倍,有些查询功能甚至前后超过2周的时间(2*5*8=80个小时,40倍)。
结构化数据和扁平化的数据:   这里的结构化数据指类似JSON/XML式的数据,扁平化数据指类似关系数据库的行数据。
结构化的数据的好处是对开发人员友好,不需要文档说明或者只需要程序doc,做一般的过滤和输出很不错,但做复杂的过滤和查询就比较费时,如果是多层数组或list数据就要嵌套N层循环,比较考验开发人员的细心和耐心了,所以这种情况不可取,而该项目中却用了这样的方式。
扁平化的数据简单明了,很多时候需要文档说明各个字段或offset所代表的意义,但做复杂的过滤和查询比较容易,一般一次loop就可以。

i)  为用二用,而不是为需二用。
ii) ESB接口的定义和实现不太科学,重复和交叉(笛卡尔积)查询太多,能自定义的查询条件很有限。
iii) 查询结果多为结构化数据,不易处理,并且没充分发挥数据库的威力,这种结构化数据造成了80%的无用数据,也浪费了80%的性能,通过一项日志观察,数据库查询占了整个应用性能的80%,导致慢的原因也是这种太多无用查询,而这些直接是Hibernate导致的。其中一项功能单体查询竟然需要1~2s,同样的需求使用SQL语句只需要几十MS。

b) 第二个败笔就是拿Hbase来做实时数据的监控,Hbase需要运维的支持,并且在大请求下性能很差,内存暴涨而溢出,从而Hbase集群奔溃无法使用,还有Hbase没有关系数据库那么友好的SQL查询语言和性能,hive实际上不好用且性能差。

 c) kendo 框架的错误使用,kendo提供了很丰富友好漂亮的UI组件,并且基于jQuery,本来是好的,但却非要拿把BS的程序搞成C/S就无语了,这就造成了在使用kendo中遇到了该遇到的不该遇到的问题,而且界面死慢不够流畅,多窗口多文档的方式并没有在该项目体现优势,事实上每次只能操作一个窗口,其他窗口被屏蔽,这个和传统的web页面方式没有什么区别,但它却需要更多地JS工程师时间和更多地经验,从而开发时间增加:
      i) 需要专门的JS工程师,而且要熟悉HTML5,CSS3。
      ii) 从事过传统B/S项目的 Java工程师( 前端 )无法胜任,或者需要花较多的时间学习才可以做前端开发。
      iii)出现的BUG几率比较高,复杂页面需要花费更多时间。


4)架构师几宗罪:

 a)架构师经验不足,架构没有很好的评估,看了quick start 觉得好就敢拿来用。
 b ) 架构师太追求新事物,不考虑健壮性。
 c)架构师追求自己学习新鲜流行技术,不考虑项目实际情况。
 d ) 架构师不考虑项目组对技术的熟悉度,以及新技术的学习曲线,导致没有系统的学习就来用,从而使使用中bug超多,修复bug花费了大量时间。
 e ) 架构师不够nice,把握自认为是核心的技术,不予共享。
 f ) 架构师太自负,写代码不自己测试,导致其他人调试程序花费更多时间,事实上架构师所写代码问题多多。
 h) 架构师太面向对象化,对于SQL/JPQL/HQL等的拼接和使用很是不看好,也看不起这种做法,这就导致了解决一个需要几分钟能修改的查询问题,需要花很长时间来解决,另一个问题就是架构师在选型JPA时,并未事先考虑这种查询的通用组件来支持这种缺陷。
g) 架构师书本主义,看本o'reilly,然后就本本主义大干一番,匹配式应用,不考虑需求和业务,中国式教条主义。

5) 程序员几宗罪:
   a. 做外包项目培养的懒惰性: 以完成工作而做事,而不是以自己想法而做事。
   b. 对架构师的抵触心理:软件设计经验差距、软件思想的差距较大。
   c. 对项目管理者的抵触心理:工作安排不合理,评估差异太大。
   d. 程序员责任心不强。
   e. 程序员太自负。
   f.  程序员编程技术兴趣不同。

6)项目管理几宗罪:
a. 工作安排不合理
b. 工作量评估差异太大

3. 需求、需求承诺几宗罪:
1) 需求不明确
2)需求管理不同步,需求参考不一致
3) 需求没有确认时间,项目结尾时还在提需求。
4)无意义的需求。

你可能感兴趣的:(JAVA,HIBERNATE,CSS,web,SPRING)