Credit故事之JIC升级
^^^^^^^^^^^^^^^^^^^
 - 作者:臭豆腐[trydofor.com]
 - 日期:2009-06-09
 - 授权:署名-非商业-保持一致 1.0 协议
 - 声明:拷贝、分发、呈现和表演本作品,请保留以上全部信息。

0. 文档目录
^^^^^^^^^^
[[<=$INDEX]]

1. 该斯大有来头
^^^^^^^^^^^^^^^
* http://ja.wikipedia.org/wiki/日本信用情報機構
* http://www.jicc.co.jp/

JIC即全情联,是Credit贷款业务的一道重要保障和环节.
从申请贷款的审核,到每一笔交易的报告,几乎无孔不入.

Credit的JIC系统,主要分为实时(Real)查询和批处理(batch)查询/报告.
实时功能,使用Socket走TCP/IP,可以立即得到查询结果,主要应用于Credit的审核及查询.
批处理功能,使用ftp及R-command回调,在夜间以当日交易报告给JIC并交换结果.

JIC子系统于2005年4月下旬提出原始需求,2005年6月着手开发,2005年9月初步上线,
后续不断添加新的功能,所有功能于2006年9月基本文档,至2009年6月未做过大的变动.

2007年6月,JIC子系统开始支持透明代理功能,相当于网络的NAT.即,把第三方公司的JIC报告
合并为Credit报告与JIC交互,从而被代理公司不需要申请JIC线路和开发JIC程序.
被代理的公司有2家,一个是集团内部,一个是合作公司.

2. 情报天下一统
^^^^^^^^^^^^^^^
JIC与其他信用情报机构不断合并,称为行业的龙头老大.从结果上看,应该是吞并,
因为JIC业务基本保留,电文格式没有质的变化,只是进行了扩展和优化.

法人情报(BL)部分没有变化.
个人情报(Stars)全面升级,叫做Stars2,单条电文从507变为1019字节.
电话本情报(CRDB)合并到Stars2.
破产情报(PRIS)合并到Strars2.
事故情报(CRIN)合并到Strars2.
信贩系情报(TERA),变化不详.

总体来讲,本次Stars2升级,电文结构清晰了很多,信息量也相应增加.
信用情报的统一,对于信贷公司来讲,可以更加准确地把握顾客信息,降低风险,减少不良债权.

记得活力门事件不久,Credit出现大量坏账和延滞债权.从那时起,Credit对贷款审批十分严格,
几乎一个月也见不到一两件无担保贷款,JIC信用信息的发挥了门神的重大作用.

3. 惊恐中大跃进
^^^^^^^^^^^^^^^
人有多大胆,地有多大产.
这样的事,发生在21世纪,软件生产活动密集的Credit的公元2009年5月.
2008年底,收到老头的礼物,3本厚厚的JIC蓝宝书和部分JIC的会议资料.
宝书都A4纸张,5到10厘米厚,做工精良,分类详细.
无奈日文,凭借业务知识+源代码+看图说话,勉强懂个8成.
(PS:我的确不会日文,从愤青,到日元无罪,到有人的地方就有江湖,反正没摸日文)

2009年5月26日JIC批处理报告上线,基本上半人月的功夫完成了原来15人月的工程改造,
匆忙间开了2万行代码.然而由于业务对stars2的理解有偏差,式样书bug众多,
导致数据维护进行了半个多月,哎 ...

2009年6月24日JIC实时查询上线,少于半人月.
2009年7月18日JIC批处理查询要上线,仅仅四分之一人月.

开发中数据维护及调查,骚扰不断,式样质量是摸石头过河,深一脚浅一脚,探着走.

问老头,JIC的数据维护及调查,比程序开发时间多得多,这样很危险,能否把开发时间留长点.
老头说,情况日方了解,但没有JIC的全面理解,只能根据数据错误来询问和调查.

狼来了,喊久了.
所以很长一段时间不喊"狼来了",留口气等到真的狼来了.

4. 万变不离其宗
^^^^^^^^^^^^^^^
程序最诚实,再狗扯羊皮的时,落实到程序上也会清清楚楚,一五一十.
考虑到stars1的兼容性,本次依旧使用stars1的接口(小部分接口做了修改).

Real部分,实现了一个自解析树的结构完成了电文到对象的转换.
======================== java : 树的节点对象 ========================
public abstract class Jic2AbstractAnswerPo 
       implements Jic2AnswerInterface,Serializable{

    public int accept(byte[] bytes){ ... }
    public int accept(byte[] bytes,int offset){ ... }
    public void valueOf(byte[] bytes) throws IOException{ ... }
    public void valueOf(byte[] bytes,int offset) throws IOException{ ... }
    
    public abstract int[] getSize();
    public abstract int[] getLenDefs(int size);
    public abstract FieldFixed[] getFixedFields(int size);
    public abstract void  packet2table(String[] part,int size);
    public abstract Jic2AbstractAnswerPo newInstance();
}
======================================================================
各子类完成字段定义和电文解析的细节定义,形成了类结构和电文结构的映射.
这样电文的解析水到渠成,相比于Stars1的key-val的Eql查询要有效得多.

Batch部分,要严格考虑到对Stars1的兼容,因此对原有结构改造众多.
其中,透明代理部分,全部改造成抽象类,子类只需要定义一些类似配置文件的内容.
虽然不是最优结构,但是在短时间内能力范围下能够完成的最有效的解决方式.
其中,报告做成部分,采用reporter-service-dao的传统结构,特点是与式样一一对应,
没有像stars1那样进行了人为的逻辑合并和重整.
其中,批处理查询部分,完全重写,不考虑兼容,重点依然是从电文到类的自解析.

5. 迷之数据调查
^^^^^^^^^^^^^^^
JIC的电文并不复杂,只是量大而且啰嗦.
JIC的程序并不复杂,只是状态检查和前后依赖苛刻.
JIC真正复杂的是数据维护和数据调查,基本要翻遍所有历史表和履历表才初见端倪.
谜一样的数据,谜一样的式样和谜一样的逻辑,一一划过JIC程序这块试金石.

逆境中成长很快,新一代JICer迅速地在折磨中坚韧起来.
与老一代JICer在折磨中苦笑着寻找快乐.

程序必须写好,否则是和敌人一起折磨自己.
不做是你不对,但你做可以不对.
没什么害怕的,敌人也一样害怕.
... ...

日子放久了,回顾不起JIC的细节和感觉了.