综述
在我的一个回答如何看待王欣王铁匠的新产品灵鸽?指出平台+个人已经进入下半场,即生产力工具的平台化。
笔者同样相信,业务系统的开发也同样如此,而jxTMS即是针对个人开发全能力、通用业务系统的开箱即用的业务系统个性化定制开发平台。其提供了:
-
web服务,jxTMS提供了快速的web界面文本化定义能力,以及端到端的封装能力,开发者可以快速定义web界面,系统自动完成从web控件显示、输入、到程序映射的全过程,开发者只需要用文本定义一下,然后拿来就用
-
数据服务,jxTMS提供了文本化的数据对象定义,其可以直接在代码中读写,然后一个update即保存到数据库中,开发者同样只需要用文本定义一下,拿来就用,而且这个自定义的数据对象还具备类表同步的继承能力,即用户可以直接继承一个现存的数据类,进行各种扩展,而jxTMS会自动实现扩展出来的类在数据库中的同名数据表和所继承的数据表的自动关联
-
热机升级,当用户业务有调整,对代码进行修改与测试后,轻巧一点,不需重启生产服务器或系统,修改后的代码即更新到生产环境中,即时生效
-
简单而强大的工具箱,简易流程、业务规则、兴趣点、统计,通通文本定义而简单易用,不需一行代码,即具有现场数据保存、快照、日志、任务分发等功能
-
脚本化的测试工具,根据用户编写的脚本对系统自动进行全面的测试
从本文开始,笔者逐步介绍jxTMS,本文主要是jxTMS的综述,以便大家更容易理解jxTMS。
信息系统的本质
信息系统的本质就是:硬编码的形式自动机。
硬编码决定了:
-
信息系统必须预编程,也就是说信息系统就是一台傻机器,完全遵循程序员编写的程序来执行的
-
在环境发生了变化之后必须由程序员进行修改才能随动环境变化
形式自动机则决定了:
-
其编码必须形式良好,也就是必须经过精心设计、开发、测试,来确保编码的正确
-
一令一动,未考虑到、未正确编码的:computer can’t
一个企业是否有竞争力,不在于其使用没使用信息系统,在于其所拥有的核心能力与关键资源及其有效运用。而信息系统只是这个有效运用中一个较为有效的手段。所以必然是信息系统围绕业务运行进行个性化定制才有价值。但在人工成本越来越高、发展快、变化猛的当下,定制一个合用的信息系统并能随动业务变化的成本越来越高。
低成本快速定制
有鉴于此,低成本快速定制,就成为笔者的一个梦想。
低成本,要求两个:
-
开发人员要求低,最好能由业务人员自己开发【中期目标】,目前的专业门槛定位到高职信息类专业,然后有一两年工作经验即可,当然对于业务的理解需要时间和经验的积淀,这不是任何工具能解决的
-
开发工作量小,通过大幅度简化编程模型,一个业务流程要让一个人能在一天甚至半天内就完成整个初始开发,然后就是不断的测试、优化、迭代来进化
快速自然就是工作量小、难度低、工具多而简单好用。
定制自然就是不通过各种开关进行配置,就是针对需求直接编程。
简要的说,jxTMS所想定的业务开发场景是对现有某个业务过程简单梳理,然后快速编码上线试运行,然后哪里不妥帖立刻就改,改完立刻热机升级再来试。通过购买现场定制的月租服务,让业务从当前出发一点点的自行进化:反正是按月付费的服务,一次改一点,先用用看。真正实现系统为业务服务而不是限制业务。
笔者始终认为:有用的业务系统是匠人打铁,而不是磨具冲压。要让业务系统从集中开发转变为现场定制的月租服务,唯一的出路就是大幅度的降低定制成本。
也就是说,jxTMS所想定的开发过程是波浪式+迭代式的。
-
随着用户的年度战略的逐步清晰,汇总需求后对业务系统进行一次整体升级
-
日常针对各种操作点的不妥帖进行定制改进
解决思路
-
平台化编程:jxTMS底层用java来开发一个稳定的、提供各种基础设施的平台。然后基于这个平台提供一个可以大幅度简化编程工作量的编程模型,让开发者使用python进行业务的编程
-
端到端的无缝集成,即用户在web界面上的输入输出自动绑定为python代码中的数据项,开发者直接用getInput/setOutput就完成了对web界面的操作
-
高度简化的数据库操作,开发者所操作的数据对象自动映射为数据库中的同名表,对象属性就是数据表中的列,而对象和数据表的关联不需开发者关心,只需要在操作完毕后,记得update一下就可以了
-
全文本化定制:界面,文本定义;数据库的数据表,文本定义;数据查询,文本定义;操作入口,文本定义【和业务代码一样,都是特定格式的python函数】
-
文本定义的工具:流程、以及针对审批类的简易流程、业务规则、统计、web端数据校验、web端数据格式化显示、web端自动计算,全部都可使用文本进行简单的定义即可实现
-
全面基于角色的权限控制,所有权限控制只看用户所映射的所有角色中是否有相应的入口。也就是在入口定义时,是否用role给了某角色,而其也恰好映射了该角色
注1:笔者信奉的是:好的系统是定义出来的。因为形式化的文本定义,可以通过自动化工具进行静态检查,只要我们持续在工具上进行投入,最终一定能实现绝大多数的功能在第一次运行前就确保是正确无误的,这就极大的降低了开发成本
注2:目前,已经开发了脚本化的测试工具,开发者可通过编写测试case脚本实现端到端的自动测试。下一步就是继续开发验证类工具
编程模型
业务系统是面向功能的,即人在业务中。人所处理的就是一个业务链条中被拆出来一个一个的功能点。所以呢,最简单也就是最容易理解的、最直接有效的编程模型就是:用户点一个按钮,后台执行一段指定的代码。系统要做的就是围绕这个模型:
-
为开发者准备上下文环境,包括数据库访问接口、操作用户信息、所在组织信息等等
-
为开发者完成端到端的数据集成:getInput就是从web控件读,setOutpu就是向web控件写
-
根据定义,执行权限检查、业务规则审查、业务现场保存、日志、快照、流程流转驱动等等,而所有这些都不需要开发者关注,他只需要知道有这些东东存在,在需要的时候,点开给用户看就好了
而开发者要做的就是:
-
和用户谈,搞清楚业务是如何流转、如何运作、如何控制、如何审查的,然后通过画业务流程图,将其分解为一个个具体到每个人的功能点
-
根据和客户谈的结果【谈不明白也没啥,反正我们是低成本快速定制,先拿一个能运行的demo出来让客户提意见好了,毕竟大多数用户都不知道该和我们怎么说,所以让他们看着demo提意见是最好的沟通方式】,画出界面图,然后给输入输出控件起名字
-
用文本定义好这个界面,然后对其中的每个操作按钮编写业务代码【涉及到需要保存到数据库中的数据的就先起一个临时的名字】
-
将所有业务代码中出现的数据名进行归置、合并、拆解,然后整理出实体表和关系表,然后用文本定义好,再用这个定义好的数据结构中的实际数据名更新前一步中业务代码所使用的那些临时的数据名
-
根据业务代码中如何使用数据,用文本定义数据查询命令,增改则直接使用预定义的create和update
注:不提供删除功能
-
然后对所有功能点编写一个访问入口的定义,并指定可以访问该入口的role
-
最后,将编写好的文件同步到服务器上,然后刷新一下,ok,让客户提意见吧:)
注1:不需要重启,就是管理员点一下按钮,系统会重新加载这些文本定义和python代码,实现热机更新、即时生效
注2:更新不影响用户正在进行的操作,即如果用户已经打开了某个界面则这个页面是不受影响的,直到其关闭该界面。当然,为了避免新老功能点的歧义,最好是选个大家都不用的时间
安全性
jxTMS自带一个笔者自行开发的web服务,只提供文件上传、下载和rest接口三种功能。而所有这些功能都需要登录后才能使用,jxTMS会在接收到http请求后执行权限检查,拒绝未登录用户的访问。所以开发者不需要担心web服务的安全性问题。
考虑到使用https还需购买配置证书等的相关开销,所以目前jxTMS只使用http,但内置了RSA加密,在用户登录的时候会对用户名密码加密,由于增加了时间戳,所以也不需要担心重放攻击。
jxTMS已经实现了全部的传输加密算法,但由于jxTMS采用的是异步轮询的前后台数据交互模式,所以加密会极大的增加服务器负荷,从而增加开发者的初始成本,因此为了降低服务器开销,笔者权衡再三最终取消了登录后的数据传输采用会话级的对称加密方案。这主要是考虑到目前jxTMS暂时还不会涉及到太多的关键业务,为了最大化降低开发者尝试成本的临时性措施,在未来的版本中会作为可选配置提供此功能,并增加https的支持。
jxTMS镜像利用ufw命令启用了linux的防火墙,目前开通了如下端口:
-
22,提供ssh访问通道
-
10018,jxTMS的提供给一般用户使用的动态web端口,即一般用户访问jxTMS使用:http://你的服务器地址或DNS名:10018/tms.html,jxTMS所创建的用户的初始密码都是123456
-
10028,目前未使用,但保留用于静态web端口
-
10119,jxTMS的提供给系统使用的动态web端口,即admin用户访问jxTMS使用:http://你的服务器地址或DNS名:10119/tms.html,该端口只能给admin用户使用,也只提供系统管理功能,所以开发者在启动jxTMS镜像后第一件事就应该是登录此端口,然后修改admin用户的登录密码
-
873,rsync的端口,jxTMS用其来同步各组织自有空间的源文件。笔者在镜像的home目录下的bin目录中提供了两个rsync脚本,如果开发者使用的是linux的开发机,则可下载这两个脚本到自己的开发机上,修改为自己存放源文件的位置和自己的服务器ip地址后,即可用这两个脚本来同步源文件
注1:开发者在正式使用前,必须反复测试这些自己修改的脚本,确保不会影响正式组织的源文件
注2:所有源文件是各个组织彼此隔离的
注3:源文件是在开发者用manager用户执行热机刷新功能才会被加载到组织中生效的,只是拷到服务器上是不会生效的
其它端口,包括mysql和rabbitMQ的端口都是无法从外部访问的,所以mysql的默认密码为123456开发者是不需要修改的。
注:如果开发者使用了云服务商的各种安全策略,请务必放行这5个端口
所有用户在jxTMS界面中的操作访问【对应菜单、快捷栏、工具条、按钮等的点击】称为一个入口,入口的访问都是和角色绑定的,只有映射了相应的角色,才被许可访问该入口。
jxTMS采取了分库的设计,不同组织有自己独立的数据库,其它组织不可能访问。
jxTMS提供了完全的日志,包括系统级的所有用户的操作日志,业务级的用户自定义日志接口,详细的错误日志,流程流转日志、流程快照等能力,可以实现对用户行为的完整记录、追溯与审计。
扩展性
jxTMS用户代码的组织是层次化的:codeDefine目录–用户组织全名–空间名–模块名–定义文件【一个模块最多包括五种文件:web、data、sql、op.py、capa.py】。开发者只要将源码按这个结构拷贝到相应的组织目录下,然后刷新一下即自动升级或卸载【删除相应的目录】。
jxTMS系统已经嵌入了一个基于消息系统的微服务的用户端,专业软件服务供应商可以以微服务的形式来提供专业软件的能力,供开发者使用此用户端即可将任何遵循该接口的微服务嵌入到其开发的个性化系统中实现集成。
同样,针对智能硬件,笔者曾使用jxTMS整合树莓派开发过智能控制系统,所以支持通过微服务来控制类似的智能硬件。