一个保险领域通用计算引擎的设计
尼克徐我近期正在做的一个东西,是维护和扩展一个保险方面的计算引擎。
根据被保险人的年龄,性别,所选产品等的情况,来计算保费,以及保单利益等,最后产生报表(报表在几页到十几页之间)。
这个引擎采用c语言,部署到ios平台和windows平台。
几十种产品,上百个数据表,中间的计算也很复杂。
以前的计算引擎代码,有十几年历史,除了一些数据表外,各种全是硬编码。
近三十万行代码,一旦出错或改动,只能debug。多么痛苦的事情。
而且最近还要改成为另一个国家用的。于是我要做一个重构(除了重用数据以外,其实是推倒重来...)。
目前已经完成主要部分,还有一些正在编程中。
在这里分享一下基本思路。(待续)
期待更新...
重构引擎的目的
1, 尽量把计算保费和各种数据的步骤和输入输出等,都放在配置文件里。减小开发新保险产品时的代码量(最终减小到零代码量)。
2, 提高开发效率和维护效率100%-200%
3,最终目标:非专业人士在短期培训后,就可以用ipad所见即所得配置计算引擎,配置好后,把配置文件email给开发人员。一个新的保险产品的计算引擎部分就完成了。
以下是设计框图,解释待续。
alt text
赞,虽然这个行业我不懂,但是我觉得你做的事情很有意思,也有挑战,加油
相当于自己实现一个公式分析器?最早之前在做电信产品的时候,我们的PM设计过类似的一个东西。设计师用IBM的rose设计业务流程图,然后用code去分析Rose的文件(某个旧版本的rose生成的文件好像是普通文本,可以用code直接分析,高版本的就不行了),生成我们自己的业务规则,然后用自己的引擎去跑这一条条的规则。
最后实现的效果就是业务设计人员50%+的改动不需要程序员的参与就可以完成了,而且无需等待部署:)
感觉各种测试可能是关键。
一,Engine Calculation (引擎计算部分)
这一部分是这个引擎的核心部分。
因为所有的保费和报表计算部分,都可以用excel来模拟(在我们这里叫做mock up),所以我就做了一个excel的解释执行器。
先把excel转成xml,然后用c语言解释执行。
一段excel转的xml:
<tr>
<td type="double" index="A16"><![CDATA[1.0]]></td>
<td type="string" index="B16"><![CDATA[Accidental Death & Dismemberment]]></td>
<td type="expression" index="C16"><![CDATA[IF($C7ドル="Y","PP","PW")&"I"&K16]]></td>
<td type="expression" index="D16"><![CDATA[VLOOKUP($C5ドル&"I"&$D7ドル&C16&$C6,ドルsc_premium!A3:E546,4,0)]]></td>
<td type="expression" index="E16"><![CDATA[VLOOKUP($C5ドル&"I"&$D7ドル&C16&$C6,ドルsc_premium!A3:F546,5,0)]]></td>
<td type="expression" index="F16"><![CDATA[VLOOKUP($C5ドル&"I"&$D7ドル&C16&$C6,ドルsc_premium!A3:F546,6,0)]]></td>
<td type="expression" index="G16"><![CDATA[TRUNC(E16*F16/$F14,4ドル)]]></td>
<td type="expression" index="H16"><![CDATA[ROUND($G16*H13,2ドル)]]></td>
<td type="expression" index="I16"><![CDATA[ROUND($G16*I13,2ドル)]]></td>
<td type="expression" index="J16"><![CDATA[ROUND($G16*J13,2ドル)]]></td>
<td type="string" index="K16"><![CDATA[A]]></td>
<td type="string" index="L16"><![CDATA[]]></td>
<td type="string" index="M16"><![CDATA[]]></td>
<td type="string" index="N16"><![CDATA[]]></td>
<td type="string" index="O16"><![CDATA[]]></td>
<td type="string" index="P16"><![CDATA[]]></td>
<td type="string" index="Q16"><![CDATA[]]></td>
</tr>
为了方便开发者查看excel在ios上的执行情况,我在ipad上做了一个excel的ui编辑界面。
alt text
最麻烦的地方就是查错(我不希望用debugger),尤其是excel的公式执行时出错。所以我在公式的错误检查上下了不少功夫:
alt text
以及公式的单步执行:
alt text
这个计算模块已经重构了两次,比较成熟了,经历了10多个保险产品的考验,性能和结果准确性满足要求。
做这个模块时所遇见的问题及其解决方案。
1, 多平台部署时的内存问题。
这个引擎部署在ios上使用时效果很好,但转成dll后部署到windows平台,就会crash.其主要问题在于对string的内存释放时出错。目前虽已经稳定,总觉得string的alloc和释放还有些不规矩。正在考虑用stringtable来整体解决string的alloc和释放。
2, 性能问题
最开始时,这个计算引擎只能把excel表格从头到尾计算一遍来获得结果。
当excel表格很大时(700-1000行以上),整个计算一遍速度就太慢了。可以很明显看到延迟。
现在这个引擎已经能做到局部计算,不用计算全表,只计算所需要的量。根据所求的量的公式,来追溯公式里所需的其他变量(跨表),而其他变量又追溯另外的变量,引起连锁反应而获得此数值。经过这方面的加强,性能有了很大提高。
有些数据的计算,需要大量的相关表格,此时,可以把相关表格的计算结果做成一个表格来使用,就不需要引用那么多表格了。
目前的计算引擎是解释执行的,最近学了一些编译原理,有想法把excel转成汇编语言执行,性能想必又会有提高...
听这就头晕。。。。