我做SAP CRM One Order redesign的一些心得体会
- 框架开发和应用程序的开发完全不一样。
举个具体的最近折腾我的例子: 创建新的service order,维护header的shipping data,此时order和shipping data的mode 都是creation,然后创建line item,添加product,header的shipping data带到line item,然后在line shipping data做修改,item的mode变成了change,此时不存盘,直接删除该item,然后马上另外创建一个item,继续编辑,此时第二个item的mode是creation,前一个item的change mode变为deletion,然后再删除第二次加的line item,不存盘,再创建第三个project,维护一些数据,存盘。此时我代码里的buffer处理会出问题,存到DB确实有一条item数据,但是已经corrupt掉了。 由于我buffer 处理logic有bug, 我花了很大功夫最后发现是第二次被删除的那条数据的内容被错误存到了DB里:

我甚至花了大量的时间来找重现这个错误的办法,因为最初我是偶然的机会发现这个错误,但是没留意我的操作,最后才找到能稳定复现问题的步骤,赶紧记录下来:

这个buffer处理的bug直接导致了今天三个新bug:

这就是框架开发的难度。如果是做应用,可以和PO商量,哪个客户吃饱了做这种操作?不支持。但是这些操作从Oneorder框架的角度来看,无非就是create, update和delete三个local buffer的处理罢了,没有任何理由不支持这种sequence的操作。
反过来说,当developer经过一段时间努力之后能够自如地应对这些挑战,从这些bug中抽丝剥茧定位问题,给出correction,他的开发能力一定能得到很大提升。
Developer对于自己编程能力的提升是没有止境的,我来之前本早已对自己的编程能力非常自信,但是经过这21天的开发,我还是造了一共40个bug出来。但我最终都fix了他们,每解决一个bug就像以前Wuji老师用游戏打比方一样,获得一定经验值。bug越难经验值越高。

- 我做这个POC确实是全神贯注拿出全部精力去做,就这样都还生产了这么多bug,确实很烧脑。我每踩一个坑,都会用Jerry : timestamp这种格式写下注释. 如果用Jerry做关键字搜索,能发现34处坑:

每一处坑趟过之后都增加了我对one order的理解,我把这些bug当作我的一笔财富。比如看这个"this code is ugly"的注释,点进去看:

确实很ugly,这恰恰就是fix注1里提到那个buffer更新bug的correction的一部分,加了注释估计没接触过one order的人也看不懂。
我们拿成都现在已经完成一部分的product harmonization为例来看:7531行代码。

而这个POC,做到今天是第21天,代码量已经超过product harmonization一半了。
请看其中我highlight的这个class,是我的搭档IMS写的,他从2010年开始做One order。这个class 到现在写了921行,就为了实现一个功能:把partner的数据从新表里读出来,放到对应的buffer里去。为什么有921行?因为buffer的插入很有讲究。

我每天吃饭,骑车的时候都在想这些buffer的东西。这个redesign的关键用三个词来概括的话,就是buffer, buffer, buffer.
2017-05-15 9:45PM
Model redesign target
One order model redesign主要发生在下图我画的黑色方框内的模块,

下列是需要完全重新开发, 而非harmonization的内容
新的数据库表。每个object type一张表,比如BUS2000116是Service process,有且仅有一张header 表,BUS2000131是sales item,有且仅有一张item表
围绕这些数据库表的CRUD API.
简单的说,就是这两件事。当然和One order 框架的复杂程度相关。
Scope
其中有9个component是硬骨头,当前POC已经done了两个,我用黄色标记。

现有的POC,整体框架已经搭起来了,one order在新的model下已能正常工作,productive实现除了上述提到的7个硬骨头之外,不存在做不出来的东西和Feature. 当然,根据大家这么多年的开发经验,POC不可能100%暴露productive开发的所有问题。
概括起来说,就是我们不需要从头空想一套东西来实现,一切以现有的POC为基础,这也是Carsten现在对这个POC非常重视的原因,每个方法,每行代码,在他力所能及可以抽出时间review的时候,他都不放过。
开发这个事情并不是说工作认真负责就能deliver高质量的代码。打个不恰当的例子,我和Oliver工作都很认真,但我们还是生产了38个bug.

和Carsten一起工作一个月,我对他工作风格的体会:一方面,他review你东西的时候非常仔细,非常注重细节,包括我之前举的例子,比如某方法是在LOOP里call还是外面call好,method的参数设置等等。另一方面,对于什么才是正确的design,他往往只给出大方向,overall的思路,但不会具体到可以直接拿来实现那么细的粒度,比如他不会告诉你为了实现他的思路,需要几个class,每个class几个方法,每个方法参数如何定义。他这种工作方式make sense,因为Chief Architect不需要把事情拆分这么细。这样就造成我最近按照我自己的理解去实现他那些思路,所以经常返工,refact.

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

我做SAP CRM One Order redesign的一些心得体会的更多相关文章
- 我在德国做SAP CRM One Order redesign工作的心得
时间过得很快,今天是我到德国工作的第四周,刚好一个月.Prototype的框架已经搭起来了,现在Order能够在新的框架下正常读写,能跑一些简单的scenario,这些scenario对于end us ...
- SAP CRM One Order跟踪和日志工具CRMD_TRACE_SET
事务码CRMD_TRACE_SET激活跟踪模式: 在跟踪模式下运行One Order场景.运行完毕后,使用事务码CRMD_TRACE_EVAL: 双击参数,就能看到参数明细: 点Callstack也能 ...
- SAP CRM One order里user status和system status的mapping逻辑
Below example show: How the mapping relationship between User status and System status maintained in ...
- SAP CRM系统订单模型的设计与实现
SAP成都研究院的一个部门领导让我给他的团队做一个SAP CRM One Order框架的培训,这是我准备的培训内容. 在Jerry之前的文章 基于SAP Kyma的订单编排增强介绍,我表达了自己对S ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- SAP CRM 项目笔记(一) SOW(工作说明书)讨论
前记 前两天在搜索资料时,看到一个网友在博客里面记录下了自己参于项目中的所有笔记.我觉得这个想法很不错,所以决定开笔记录下SAP CRM整个项目的实施和开发过程. 之前参加集团的SAP ERP(FI/ ...
- SAP CRM 最新简介文字(2007年、中英文)
以下内容是SAP CRM功能的精简描述,摘自SAP官方文档,附上中英文版本,可以对SAP CRM的主要功能有大致了解. 营销 - 使用营销资源管理.客户细分及列表管理.营销活动管理.线索管理.贸易促销 ...
- SAP CRM 高效调试方法
调试,是程序开发中的基本技巧.快速定位错误消息在源代码中的位置,对发现和解决程序中的问题有着重要的意义.在SAP CRM中,错误消息通常在前台的Web Client页面中展示,应该怎样定位相关代码的位 ...
- SAP CRM 开发学习资料和教程整理【不定时更新】
本文链接:http://www.cnblogs.com/hhelibeb/p/6276929.html 首先是SAP网站上面的相关内容 SAP Customer Relationship Manage ...
随机推荐
- Docker中“TERM environment variable not set.”问题
在使用top查容器内部资源利用情况时候,发现无法使用,报“TERM environment variable not set.”错误.从网上找到了解决方案,经实验有效 root@103b5f05462 ...
- Python第三方库____jieba
jieba是优秀的中文分词第三方库 中文文本需要通过分词获得单个词语 jieba是优秀的中文分词第三方库,需要额外安装 (pip install jieba) jieba库提供三种分词模式,最简单只 ...
- Hibernate下的增删改查
概述: 关系--对象映射的中间件,属于开源ORM框架,是我们业务逻辑层中的调用数据库的中间件 演变: jdbc---hibernater---mybatis hibernate和mybatis区别? ...
- MFC数据库操作
本例采用Microsoft SQL2008建立的一个数据库表 /****链接数据库操作**/ 在stdafx.h的头文件中加入 #import "C:\Program Files\Commo ...
- EnyimMemcached(64位)使用实例
1.安装:http://www.cnblogs.com/dudu/archive/2009/07/19/1526669.html 2.使用 using Enyim.Caching.Configurat ...
- 撩课-Web大前端每天5道面试题-Day20
1.vue生命周期的作用是什么? 它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻辑. 2. Vue实现数据双向绑定的原理:Object.defineProperty( ...
- DICOM简介
背景: DICOM分为两大类(这里只是从DICOM相关从业者日常工作角度出发来分类的):1)DICOM医学图像处理,即DCM文件中具体数据的处理,说图像可能有些狭隘,广义上还包括波形(心电).视频(超 ...
- SQL NVARCHAR和VARCHAR限制
1:NVARCHAR(max)可以存储(有时甚至更多)2GB的数据(10亿个双字节字符). 2:NVARCHAR和VARCHAR连接时的截断取决于数据类型 varchar(n) + varchar(n ...
- cf623A. Graph and String(二分图 构造)
题意 题目链接 Sol 可以这样考虑,在原图中没有边相连的点的值肯定是a / c 那么直接二分图染色即可 #include<bits/stdc++.h> #define LL long l ...
- HTML5之全局属性 (声明:内容节选自《HTML 5从入门到精通》)
contentEditable ———————————————————————————————————————————————————————— 功能:允许用户编辑元素中的内容. 功能说明: ...