ERP程序员的困境和出路

工作以来一直从事.NET技术方向的开发工作,工作6年,接触到三个有影响力的产品

  • 预约挂号系统  面对医院的挂号难,排号难,在2003年就有老板想出做这一块业务内容,于是与几家医院合作,开通热线电话,做医院的预约挂号服务。在大城市,生病了需要看医生,但不知道医院是否有医生可以看病。生活在深圳,去过北大医院的朋友可能有所体会,大清早坐车过去,整个上午,可能就能排个号,到下午才有医生给你看病,也有可能会排到第二天。大医院的医生一上来问问状态,就让你去做化验检查,1-2天后化验结果出来了,再去找医生看,又要挂号排队,整个看病过程可能不到5分钟,可是在排号排队,等待医生上所花费的时间是看病时间的几十倍。于是,门户网站跑起来,挂号业务开发起来,热线电话一开通,一部分客户服务小姐天天打电话,向潜在客户推销预约挂号服务,另一部分客户服务小姐接受热线电话,给客户找到合适的时间,合适的医院,帮忙排上号,到病人要看病的那天,直接去预约的医院找指定的医生即可看病。
  • 车间数据追踪  ShopFloor Data Tracking  企业解决方案的一部分。 在服装行业,生产款式款号颜色,车间生产任务的追踪相对难以控制和管理。从购买布匹,裁减,然后给裁减后的布局,每一捆(bundle)打上一个RFID卡片(RFID卡相当于我们去超市购物,进去之前要把自己的随身行李物品积存到服务台,服务台小姐给你一个带橡皮筋的手扣,扣在自己手上,离开超市前,用这个手扣换取自己当时寄存在服务台的行李物品),在生产的每个工序过程中(缝袖子,缝衣领,烫) 都要求将捆绑在RFID卡上的小卡片在机器上刷一下(好比坐车时刷深圳通一样),这些放置在车间的每个工序上的机器,会实时的将生产的工序进度传回到数据库服务器上,以追踪当前的生产进度,然后配合大量的报表来满足生产管理的需求。
  • ERP  Enterprise Resource Planning 企业资源计划 MIS类型程序的大集合,什么功能都有,生产,采购,销售,库存,应收,应付。只要是做与工厂生产管理软件相关的程序,就不可避免的要接触ERP类型的产品。如果你有机会接触排在金字塔顶端的ERP产品,SAP,Baan,Oracle,还有微软自己的ERP产品,尽管这些产品的设计思路先进,但是很少有机会直接参与它的开发或二次开发。我们中的大部分要面对的是中小企业管理软件,思路理解上要容易一些,然后要用熟悉的语言和编译工具把它实现出来。比如要做一个生产排班系统,要设计工厂日历,工序作业流程,生产的主生产计划,每天的机器产能和负荷,作出合理的排班建议。我所要表达的主要意思是,我们需要理解这个流程,同时要用熟悉的工具和语言把它实现出来,从设计数据表,到编写业务对象,再到界面设计,做出功能,这才是我们看得见,摸得着的ERP。别一种情形时,专做二次开发,以插件的形式,对现有的ERP进行定做。我的工作内容属于前者。

 

ERP程序员的主要工作有以下几个要点

  • Bug Fix  修复现有的系统问题
  • Enhancement 改善改进系统现有做法
  • Data Fix 修复因功能缺陷导致的系统数据错误
  • Technical Support  技术支持 协助TS(Support Team)追踪问题,解决客户遇到的问题

 

我学习ERP经历了以下几个阶段,供参考

第一阶段  对业务不熟悉

一开始不熟悉ERP业务流程,要重复客户的错误都不容易。ERP类型的程序所设计的界面,是具备相当的迷惑性的。界面大堆大堆的控件,数据值从这个表单带到另一个表单,对于ERP生手,很难操作。至今我接触陌生的ERP界面,都有一种恐惧症,界面隐藏了太多的业务逻辑信息。随着工作时增长,各种问题遇到过,请TS同事多演示几次,各种操作流程就会了,也就学会了如何产生数据,测试问题。

我以生产作业流程举例,ERP中可以从销售单产生工作单。企业销售产成品,成品由几个原材料,经过几道工序完成。由销售单产生工作单,也就是经过生产过程,从下工作单,仓库发料,生产完工,产成品入库。

这里面,需要掌握如何设计物料清单,组合工序和原材料,仓库如何出仓到生产车间,最后是生产完工,进仓,完成产品的生产流程。

 

第二阶段  对关键数据流的不熟悉

学会如何产生ERP数据之后,接着需要掌握ERP中关键的数据和关键流程。举例说明

  • 库存的实时信息  生产发料时,提示没有库存出仓。需要查库存余额帐,增加原材料入库。
  • 物料需求计划  企业实际生产过程中,会做季度计划,在季度初期制订生产大纲(主生产计划),根据现有的库存量,做出物料需求的预测,产生计划订单。一手抓需求,一手抓供应。生产产品的原材料确少,没有库存,需要产生计划采购单以保证产生继续进行。客户对产品有需求,要在客户需求日期前(Due Date) 生产出销售订单中的产品数量,销售给客户。
  • 生产的任何流程都与经济活动有关,与钱有关,产生货币进出记录。ERP财务模块记录企业每笔业务产生的经济活动,用于管理分析。

这些流程操作相对要复杂一点。产生的数据关联因条件的不同,会有些差异。比如销售送货后,要给供应商开具发票,产生应收帐,要考虑汇率差异,货币可能不是本位币,客户有预先支付定金,客户多付款或少付款,客户多次付款的情况。

客户的多付款,在冲销掉订单金额后,可用于下一次客户订单的支付。下订单时的兑换率和客户付款时的兑换率可能不一样,因而客户实际付款和客户应该付款的金额也有差异。用美元下订单,但是用欧圆付款,要能准确计算汇率差异,对于有进位误差的,要拨入进位误差。

进位误差举例, 假设本位币是USD

客户订单,HKD,兑换率=6.4

物料编号   单价      数量  金额

RM01      1.223     10   12.23

RM02      1.4567   5   7.2835

客户应付款(本位币)=12.23+7.2835=19.5135 USD
客户应付款(外币)=12.23+7.2835=19.5135 * 6.4= 124.8864 HKD
在客户付款日期时,假设为2015-5-13日,兑换率=6.2,付款货币HKD,则客户需要付款金额
客户应付款=12.23+7.2835=19.5135 * 6.2 =120.9837 HKD
产生汇率差异=120.9837  -  124.8864 = -3.9027 
这一阶段会遇到相当多的困惑,坚持不泄的努力调试,努力找到问题,做一名合格的ERP工程师。 

 

第三阶段 系统问题阶段

 客户的数据经常会出现不可追踪的错误。最近的一次印象深刻的是.NET的partial commit。 .NET的事务,依照这个模式,是可以在遇到异常时产生回滚
try {
// logic here , throw exception if error occurs
}
 catch ()
{ throw }

但是在客户服务器上,会产生有些业务逻辑在遇到异常时没有回滚,产生一些错误数据。比如总帐与明细帐对不 上,物料余额帐与物料每日进出对不上,数据有差异。
另一种经常遇到的情况是,客户应收帐和供应商应付帐有数据不同。这种情况发生于手工在SQL Server中执行 SQL语句,比如在SQL Server执行脚本删除已经过帐的应收发票,SQL只是简单的执行删除逻辑,没有执行业务 逻辑流程,扣除应收帐数量,产生总帐与明细帐不符合。
 
这个阶段遇到的问题不多,但是个个都相当麻烦,只有对系统开发与设计的每个角落的细节都非常熟悉,才对这个 错误产生的原因,如何修复有把握能力。因为基于这个理解,所以我觉得,工作几年后,从.NET转到Java,或是 JAVA转.NET开发,都是不明智的选择。每个平台上都有大量的细节内容,需要在日常工作中接触,熟悉和理解。 Web Services跨平台,但是没有.NET Remoting用的机会多,Xml跨平台,但是常常还是用一种API来实现对它 读写。大部分的情况下,我们都是在一个平台下,和许多技术细节在搏斗,在较量。 
 
第四个阶段 做有意义的事情

当熟悉公司的日常工作后,上班下班,朝九晚五的生活,日子一下子就过去了。常常思考,在深圳这样的大城市, 对于绝大部分人而言,不可能会待的很长久。不断攀升的房价和物价,生活成本上升,很多人都在思考出路,思考 自己的人生该如何走。能爬到金字塔的顶端是少数社会精英,但是我们只是个普通和程序员,科班出身,甚至有的 都不是科班出身,也走进了这一行,做一分工作,拿一分薪水,养活一个家庭。台湾技术作家候捷曾说,他最佩服 的是那些能突破自身局限的人,突破自己环境的限制,做一些有意义事情。

有时候公司2个多月都没有发现问题,于是安排我们把系统现有的文档整理一下,用最新的版本,更新下界面截 图;有时,我们都是在查找SQL语句为什么会产生这样的数据,而不是我们预想的数据,根本没有机会敲代码,写 C#;有时公司接了个外包项目,要修改ASP.NET的html代码,大部分时间又在改网页布局,把控件放到表格中, 和Html共舞,与JavaScript搏斗,.NET代码反而不重要,简单的INSERT和UPDATE就可以处理绝大部分情况。

这些日常的工作,看是是技术活,但又没有什么难度的活,把我们对技术的追求,一点点的磨平。做这些事的时 候,很难有时间可以看看代码,看看技术文章。似乎从事IT技术开发,看不到什么出路。

以我的理解和思考,下面三个例子,可以用这种方式来完成:

 

1 公司安排我们整理系统现有的文档 这是个绝佳的机会,好好练习一下文档处理能力。记得做完大学毕业论文, 连自己都被自己感动,能排出这么漂亮格式的文档,一丝不苟,有模有样。灵活的应用样式,各章分节分页,前后 交叉引用,以表格数据辅助说明,做出质量高的文档。我举例说明,我看到很大一部分产品PDF文档,没有书签, 感觉上不太专业。

举例说明,我以.NET中的并行为例

Parallel.For(1, 100, (count) => { Operation(); }); void Operation() { Thread.SpinWait(int.MaxValue); }

虽然我知道Word格式可以很方便的生成PDF,但是能把生成的PDF加个书签,会让你的文档看起来更优秀。

2  查找SQL  这是个查找系统问题的好时机  SQL语句用的是否洽当,可以在这个看到很多细节。比如该SELECT 一个字段的地方,可不能用SELECT *  来代替;能写一句完成的查询,不应该用二句或是多句来完成,减少往返 服务器的次数,提高性能;代码中如果非要用SQL语句,可以考虑把SQL语句提取到指定的地方,所有的SQL语句 都来自于这里,以增加可维护性;业务逻辑只考虑用C#代码完成,而不用存储过程,增加可维护性,便于跟踪, 千万不能出现,一部分逻辑在SQL存储过程里面,一部分逻辑在C#代码里面,还有一部分逻辑在游标里面,这样 跟踪问题相当麻烦。

3  页面Html排版 这是个锻炼接私活能力的舞台。网页布局排的漂亮,价格合理,很容易接到网站建设方面的私 活。

与此情况,最好也研究一下Photoshop,做一些漂亮的图片,以后可以独立承担网页开发,网站建设,这样不用 每次为找美工伤神。从Logo设计,到网页布局,再到程序开发调试成功,我已经独立完成过多个小网站的建设, 赚一点私活钱,在炎热的夏天,喝点冰冻啤酒,那真是舒服惬意。

我选择的路是做MIS框架,灵感来源于博客园里面的很多专家。他们大部分都有自己的产品,把技术的用途发挥的 很好。技术天生是拿来用的,除了为公司所用,还可以拿来做自己感兴趣的事情。每次看到有专家发表技术文章, 然后再看到有专家把这个技术运用到自己的产品中,写出一点心得分享,我更佩服后者。把每一项技术都努力思考 它的价值所在,运用到自己的产品研究中,学有所用,终有所成就。

确实,就这简单的一句Parallel.For可以让程序的性得得到改善,为此我专门抽一个下午的时间,把可以看到的能 改善的地方,都换成了这种模式来操作,比如删除系统运行后的临时文件。

另一个例子的地方是SqlBulkCopy,批量的插入数据到SQL中,而不是一笔笔记录的插入数据。

 

第五阶段  做感兴趣的事情

对文档,对页面设计,对产品功能感兴趣,任何一个方面的深入研究,都可以获取一技专长。

 随着时间的积累,对产品的改善越来越多,信心越强,学有所用,是我从事ERP开发以来,找到的一条程序员的出路,著文章分享,共勉励。

 

posted @ 2013-05-14 10:09  信息化建设  阅读(8616)  评论(26编辑  收藏  举报