公司ERP系统重构那些事
记一次会议,我提出插件化的想法,有支持也有反对,其中“系统架构师”表示插件化后的项目没什么意义,今天来讨论项目是否需要插件化的一些观点。
项目背景
公司内部“ERP”系统,其职责以远远超出ERP,更像公司内部信息管理系统,以下简称公司ERP或公司ERP系统。公司ERP系统是C/S架构,除了用户控件之外系统内部实现没有分层,以文件夹的形式维护着一个个业务模块的功能。
这个系统除了包含了ERP系统的基本功能外,还需要维护公司内部电商网站的数据(网站后台的一些功能被搬到C/S上),客服管理等等的功能。
值得一提的是,公司ERP系统为了安全考虑将数据访问以Web Services向外部公开,Web Services内部实现安全认证(IP认证、MAC认证等),这样做的优缺点或者说有用没用我们先不考虑,只是让大家了解下有这么一出事情。
由于项目日渐庞大,维护成本极高,编译时间>3分钟(不能确保一定能编译过),导致了开发和测试过程中严重的时间消耗,公司决定重构该项目。
一提插件化想法
大约在2个月前,我首次提出了插件化的想法,“系统架构师”以我们的项目没必要弄的这么复杂抛弃了插件化开发模式,当时手上没有完善的Demo和文档再加上本人的口才也不是很好,就暂时的没有卷入与其讨论。
二提插件化想法
距离上一次提插件化已过去了一个多月,这段时间,我努力完善Koala Framework,以尽早的展现出完善的插件机制一次,这一次我做足了工作,画了当前情况的 开发 - 测试 - 发布流程图和插件化之后的 开发 - 测试 - 发布的流程图,写了一份“插件式开发模式讨论会”的PPT,花了一个下午的时间写了一个ERP Demo。Demo的截图可以看:Koala Framework是什么?我为什么要写这个框架?中的Koala Framework Demo一节。
现状发布流程图

红色为最耗时部分,黄色为插件化后可以省去的部分。
插件化后的发布流程图

从图中可以看出,插件化之后与其测试、客户端交互的是插件服务器(实质为DLL文件),而不需再去依赖代码,也就是说只有在开发阶段才会依赖代码,依赖编译工具,其他阶段用来交互的只是DLL文件,测试无需再去关心,编译环境,编译配置,他们所需要做的只是更新来自开发人员的插件,用来进行功能测试,有问题通知开发人员这一过程,个人认为大大的降低了交流的次数。
提议未果
插件化后的项目结截图:

在这一次交流过程中发现自己已不想再去争论插件化与平常开发的一些优劣了,或许是对现在的“系统架构师”不再抱有什么可以沟通的期望,也不想再与他争论些什么了吧,这一次现在的“系统架构师”还是觉得插件化没有必要,当实现有变更的时候把变更的实现类Copy - Paste - 编译一下发布就好了。想起以往讨论的种种实在觉得悲催,一个要跟他去解释在系统构建中实体优于DataSet、DataTable,同类型不同实例的对象的GetHashCode()方法返回的值是不一致、服务端到客户端经过WCF之后实例是不一致的(省略N件事情)“系统架构师”实在是没有在沟通下去的必要。
心里的那杆秤
是否所有的项目都合适去插件化?
这边不绕弯子,给出个人的一些想法:如果一个项目需要长期的维护那么这个项目就应该被插件化。
上面主要讲述了一些插件化的优势,物极必反,任何东西都有好的一面和坏的一面,插件化也不是完美的他也有不好的那一面,如果项目比较小,可能做完以后就不再需要维护那么就完全不需要插件化。
支持插件化不代表全部插件化
举个例子(可能不太恰当但天资聪慧的你们肯定可以理解,哈哈)
支持插件化:Windows操作系统,你可以选择是否去安装软件,它本身支持软件(插件)安装。
全部插件化:系统自带的计算器算是Windows操作系统里面的一个软件(插件),但里面的+、-、*、/等算法不一定是插件化方式实现的。
提到的那些文档
文件:插件式开发模式讨论会、发布流程图
https://skydrive.live.com/redir?resid=4536D446A0E85208!2338&authkey=!AL-Eafwz09-bZMs
PS.这两个链接链向的是同一个地址,第二个为简短的Url,在实际使用过程中可能会被墙。
公司ERP系统重构那些事的更多相关文章
- 解析大型.NET ERP系统 权限模块设计与实现
权限模块是ERP系统的核心模块之一,完善的权限控制机制给系统增色不少.总结我接触过的权限模块,以享读者. 1 权限的简明定义 ERP权限管理用一句简单的话来说就是:谁 能否 做 那些 事. 文句 含义 ...
- 解析大型.NET ERP系统 业务逻辑设计与实现
根据近几年的制造业软件开发经验,以我开发人员的理解角度,简要说明功能(Feature)是如何设计与实现的,供参考. 因架构的不同,技术实现上会有所差异,我的经验仅限定于Windows Form程序. ...
- 解析大型.NET ERP系统核心组件 查询设计器 报表设计器 窗体设计器 工作流设计器 任务计划设计器
企业管理软件包含一些公共的组件,这些基础的组件在每个新项目立项阶段就必须考虑.核心的稳定不变功能,方便系统开发与维护,也为系统二次开发提供了诸多便利.比如通用权限管理系统,通用附件管理,通用查询等组件 ...
- 解析大型.NET ERP系统架构设计 Framework+ Application 设计模式
我对大型系统的理解,从数量上面来讲,源代码超过百万行以上,系统有超过300个以上的功能,从质量上来讲系统应该具备良好的可扩展性和可维护性,系统中的功能紧密关联.除去业务上的复杂性,如何设计这样的一个协 ...
- 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?
为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...
- 基于AgileEAS.NET SOA 平台SAAS架构技术的开源分销ERP系统-SmartERP.NET下载配置说明
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- 解析大型.NET ERP系统 20条数据库设计规范
数据库设计规范是个技术含量相对低的话题,只需要对标准和规范的坚持即可做到.当系统越来越庞大,严格控制数据库的设计人员,并且有一份规范书供执行参考.在程序框架中,也有一份强制性的约定,当不遵守规范时报错 ...
- 解析大型.NET ERP系统 企业信息化实施人员工具箱
1 第一次实施会议 当签订合同之后,软件公司与客户约定好会议时间,双方召开第一次实施会议,确定实施的小组人员名单,项目实施周期,培训计划表,实施主计划,系统预备主文件数据准备,软件公司技术支持联系方式 ...
- 上海SAP代理商 服装行业ERP系统 达策SAP金牌代理商
上海SAP代理商 服装行业ERP系统 达策SAP金牌代理商上海达策公司的前身是上海InfoPower技术有限公司,该公司在中国ERP软件的销售和服务长达20年.在2005年4月上海达策正式成立,致成立 ...
随机推荐
- MyEclipse中SVN的常见的使用方法
本次主要内容: 一 .导入项目 (Checkout).从svn资源库检出 二 .更新 (Update) 三.锁(对要修改的文件加锁,防止文件冲突) 四.提交(项目修改后的提交) 五.解锁 六.查看历史 ...
- CSS中的 backgroundPosition 属性
body { background-image:url('bgimage.gif'); background-repeat:no-repeat; background-attachment:fixed ...
- PHP水印类
<?php /** * 水印类 * @author zhaoyingnan 2015/07/16 **/ include_once('extend.php'); class Watermark_ ...
- C++中对象初始化
在C++中对象要在使用前初始化,永远在使用对象之前先将它初始化. 1.对于无任何成员的内置类型,必须手工完成此事. 例如: int x=0; double d; std::cin>>d; ...
- 实习小记-python中可哈希对象是个啥?what is hashable object in python?
废话不多说直接祭上python3.3x的文档:(原文链接) object.__hash__(self) Called by built-in function hash() and for opera ...
- URAL 1416 Confidential --最小生成树与次小生成树
题意:求一幅无向图的最小生成树与最小生成树,不存在输出-1 解法:用Kruskal求最小生成树,标记用过的边.求次小生成树时,依次枚举用过的边,将其去除后再求最小生成树,得出所有情况下的最小的生成树就 ...
- Android数据存储(二)----PreferenceFragment详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 第23章 SEH结构化异常处理(3)_终止处理程序
23.3 终止处理程序 23.3.1 程序的结构 (1)框架 __try{ //被保护的代码块 …… } __finally{ //终止处理 } (2)__try/__finally的特点 ①fina ...
- 反序列化存入数据库里面的session数据
session数据存取的方法可通过session.serialize_handler方法来判断,反序列化可通过下面的unserialize方法,参考http://stackoverflow.com/q ...
- Watir、Selenium2、QTP区别
1.支持的语言 Watir:ruby Selenium2:支持多种语言,如:python,ruby,java,c#,php,perl,javascript QTP:vbscript 2.支持的浏览器 ...