从WPS到Wps on Web
大型应用软件架构的变迁
WPS V6项目介绍
• www.wps.cn• 项目介绍
– 2002年至今, 100-200人– Windows平台, C++,界面采用 Delphi
• 特点– 规模大、周期长、耦合度高– 完全自有整体架构– 几乎不用第三方框架、库
Wps on Web项目介绍
• 开发中• 项目介绍
– 2009年立项,现处于开发期,目前 50多人– 前端: Flex平台– 后端:核心 C++,服务总线 Java,整合应用 Python
• 特点– 从客户端到服务端计算的变迁– 从桌面应用到浏览器( RIA)的变迁– 从完全自有架构到混合( Hybrid)架构的变迁
WPS架构团队的演化
• 核心程序员• 个体架构师• 架构组• 多架构组
关于本报告
• 不适合做理论性讲解– 大型工程的规模效应使得问题复杂化– 任何一个实践的推行都需要大量时间和辅助工作– 没有一个实践能完美解决大型工程问题
• 不适合面面俱到– 整个工程管理体系比较复杂,涉及的点非常多– 以后会在个人博客中与大家探讨
• 选择几个有趣的点与大家分享– 不多,就三个
关于开发语言
C++语言
• WPS使用最多语言– 具有最大的底层控制能力– 具有最大的优化潜力– 具备用于构建大型系统的能力– 大型复杂应用系统需要
• 缺陷– 语言体系复杂,难以精通– 容易犯错,底层错误难以调试– 开发效率低
多语言开发
• WPS V6方案– C++与 Delphi
• 使用效果– 接口语义复杂– 交互频率高– 有效率要求– 紧耦合边界不适用跨语言方案
C--工程
• 使用于Wps on Web项目• 提供 RAD语言的代码风格
– Java/C#风格支持–类库–部分动态语言特性
• 完全使用标准 C++构建– 无需更换开发工具– 原生 C++代码,和普通 C++无缝交互– 获得开发效率和执行效率的平衡
• 准备作为开源项目发展
Sample: C#和 C++
void DeleteFiles(string dir){ string[] files = Directory.Get
Files(dir); foreach (string s in files) File.Delete(s); string[] dirs = Directory.Get
Directories(dir); foreach (string s in files) DeleteFiles(s);}
void DeleteFiles(stringx dir){ Array<stringx> files = Direc
tory::GetFiles(dir); foreach (stringx, s, files) File::Delete(s); Array<stringx> dirs = Direc
tory::GetDirectories(dir); foreach (stringx, s, dirs) DeleteFiles(s);}
关于整体框架
WPS V6整体框架
平台封装
优化支持
错误诊断与处理
事务管理
存储管理
基础库
文档读写基础服务 绘制系统 国际化支持
表格核心
计算模型 表格应用模型
公式与计算
表格数据
数据交换模块
应用层
高级API集合
兼容API集合
Shell
Office应用
Office中间件
安全与权限模块
Addon平台
Addon社区
用户交互框架
数据分析功能
表格功能
表格交互
排版服务 绘制服务
对象数据
图表数据
对象数据交换
图表数据交换
对象绘制
对象交互
图表绘制
图表交互
对象与图表
VBA
Wps on Web设计框架在线表格
服务组件调度
Agent调度器
Service Bus
协调度器
表格服务端组件
服务组件
Agent
IO服务组件
Client Proxy
表格前端文档查看功能
外部水平拆分方案(可选)
在线表格部分细化
服务部件框架*
表格核心
RPC Stub
Socket
Channel
SC Provider
独立客户端框架*
RPC Proxy
Socket
Channel
SC Consumer
表格功能
表格应用
框架设计的变化
• 部署模型– 不再是整体一块– 即使在服务端,也可能分布在不同的环境(设备)上
• 通信模式– 直接函数调用转变为基于网络协议的调用: REST、
SOAP、基于 Socket的 RPC框架等– 根据通信需求,以及双方的构建技术决定
• 耦合度降低– 尽可能可插接– 不能依赖另一个模块总是正确工作
关于质量保证
与质量保证相关的开发实践
• 单元测试– TDD与单元测试
• 面向契约– C++ / AS中的契约框架– 内核扫描
• 持续集成系统– 代码覆盖率工具
内核扫描技术
• 内核扫描是广义的 DbC– 一个经过规划的时刻触发,对更大范围数据进行检查的诊断过程
– 更大尺度的目标数据集,更复杂的规则集合– 扫描时机受控
• 内核扫描在WPS电子表格开发中的应用– 细节设计不完善问题– 不符合设计的隐患(对于测试有很大的辅助作用)
• 在在线表格中引用内核扫描– 服务端– 客户端
代码覆盖率工具
• 语言支持– C/C++, Python, Flex(AS3)
• 覆盖统计– 代码行、函数、类
• 动态覆盖统计– 运行时统计覆盖率
• 代码高亮– 代码有效和无效高亮
• 执行频率统计– 代码执行频率计算
谢谢大家
www.gridbear.com
blog.wps.cn