家装工业软件的云挑战
作者:陈江豪 三维家技术研究院基础平台负责人
《“十四五”智能制造发展规划》四项重点任务中写到,加强自主供给,壮大产业体系新优势,将工业软件作为一项重点任务进行单独部署。规划明确了工业软件在智能制造中的中枢地位和核心支撑作用,也对国内工业软件的“管理软件强,⼯程软件弱;低端软件多,⾼端软件少”的现状,提出针对性引导。规划中反映,随着工业互联网、物联网、5G、千兆光网等新型网络基础设施规模化部署,工业数据中心、智能计算中心等算力基础设施不断完善,工业软件的云化部署、集成化服务已成为新趋势。
研发设计类工业软件范围较广,我想从我从事的家装设计行业来阐述下,家装设计工业软件要如何响应“十四五”智能制造发展规划。
家装设计行业的工业软件主要有两类:研发设计类和生产控制类。研发设计类主要是底层的 CAD 和相对上层的前后端一体化工业软件,如 Autodesk、达索、三维家 3D 云设计等;而生产控制类有如三维家的 DMS、MCS、MPM 和拆单宝、圆方、商川、造易等。
CAD 是目前“卡脖子”的核心工业软件之一。三维家作为最早将家装工业软件云化的先行者,我将从三维家的经验里,给大家讲述如何应对研发设计类工业软件的挑战。
三维家早期实施“云化”时,主要遇到的挑战有几方面:
1. 如何快速将工业软件云化部署
2. 如何继承原工业软件积累的资产,最大程度减少开发量
3. 如何保证云化后的协同开发
4. 如何与不断开发的老框架业务代码做同步
5. 如何保证云化后的性能内存
挑战一:如何快速将工业软件云化部署
十四五规划中明确提出,加快推进工业软件的云化部署和引导集成化服务。当前不断完善提升的网络基础设施和算力基础设施,都为软件云化提供良好的环境和支持。反观原来的工业软件基本都是本地运行或嵌入式,各种业务功能没有形成平台化服务,各自为战,难以形成集成化优势。所以工业软件云化部署不仅是国家规划的呼唤,也是企业产品更新换代的迫切需求。如何快速将工业软件云化,我们团队认为需要做到以下几点:
1. 了解现状,梳理目前产品涉及的技术和卡点
2. 根据对行业的理解,确定未来 5-10 年的方向和技术核心
3. 做顶层设计,如 DevOps 和代码框架(云原生和微服务框架、前端业务框架等)
4. 先做最小闭环 MVP,再不断迭代优化
三维家早期拓荒的家装工业软件属于在“重前端、轻后端”的技术框架中的前端软件,后端有相对成熟的微服务、PaaS 开发工作流及运维机制,前端属于 flash 网页前端,从宽泛意义来讲,属于云化产品。当时前端 DevOps 效率需要提升,且 flash 已属于一个需要更新换代的技术。因此,我们团队需要以最新的云化方案重构原来的方案,重塑三维家的家装工业软件。
事实证明,我们对现状的分析及产品技术的梳理,为三维家最新的云化部署成功提高企业的产品矩阵合力和集成化程度,打下了坚实的基础。
对于第二点,三维家有自己的理解,且在自研 CAD、极速 8k 渲染、智能设计上有着长期的技术积累,因此我们团队在此基础上根据对行业发展方向的理解,确定了渲染、AI、CAD 作为三大基础技术方向,并使用云化部署,使用云原生和微服务结合的云化方案。这三大方向既包含了三维家对家装设计行业未来技术的理解,更确定了技术团队未来 5-10 年的技术栈。有了这些,我们做技术选型和决策时,就很容易做出选择,形成较为统一的技术栈便于技术积累。
我们团队强调顶层设计,因为单一的云原生和微服务框架实际上无法满足复杂的业务需求,落后的运转机制导致开发迭代效率不高。做顶层设计,首先要确立自己的设计理念,解决原来业务开发的痛点。团队在做顶层设计理念时,一是框架需要满足敏捷开发的要求,这包含了 DevOps 系统和框架上极度解耦,完全支持快速二次开发;二是框架需要满足以后的技术方向和业务需求。对此我们引入 git flow 工作流,开发自己的项目管理和代码编译脚手架,建立 PaaS 和运维监控,形成完整的质量效能体系。
框架上采用云原生和微服务框架混搭,以渲染、AI、CAD 引擎作为后台服务框架基座,将公司的业务服务化,集成到统一平台,让后续业务快速共享这些服务,从而保证数据和算法共享及用户体验的延续性,形成平台化优势。
为何先做最小闭环或 MVP。这有利于我们快速踩坑和填坑,快速打通整个流程。用户也可及时使用并给予反馈,产品迭代的速度也会得到提升。
挑战二:如何继承原工业软件积累的资产,最大程度减少开发量
工业软件的强工业属性,意味着工业软件需要与相关行业的工业知识、工艺工法有着紧密的关联,且有着对行业工业知识和用户需求认知的积累。三维家的 3D 云设计软件,有着深耕多年的庞大模型库、工艺库、参数化生产和用户体验的积累,如果为了云化而丢弃或重写对企业来说是性价比极低、风险偏高的方案。
对此,团队同样做了以下几点:
1.寻求原技术(as3)语言到目标语言(ts/C++)的转换工具
2.寻求将原 C++库转 WebAssembly,直接提供给前端使用。这里主要是低运算密度高聚合的 C++库
3.寻求将部分高密度计算库转为服务,使用阿里云的 serverless 型的函数计算 FC
4.将大多数 C++库按业务性,做一次 RPC 封装,部署到后端的 GRPC 中
5.将少量核心库使用 java 重写,此点秉着必要性的原则
对于第一点的转换工具,是我们当时遇到的核心挑战之一。毕竟语言的转换,除了语法的转换,还要符合语义。我的建议是尽量寻找相对成熟的开源转换库,在开源库的基础上修改。团队找到了 falcon,基于 falcon 的语法树,我们做了目标语言的输出。
C/C++是很多工业软件的开发语言,很多企业在上面积累了大量的技术壁垒。同样,C++的高效率和高精度等优点,使得有志于前后端一体化的三维家的很多算法,特别 CAD,都是基于 C++的。因此,能够将 C++代码前端化的 WebAssembly,对于当时的三维家来说是场及时雨。
三维家早在 2016 年就开始布局 WebAssembly,并有着百万级代码的 wasm 库,属于 WebAssembly 的先行者。三维家在 C++库转 WebAssembly 时首先遇到的是包体过大问题。对于这个问题,我们优先的方案是调参,调整 emscripten 的编译参数,提高优化等级等。
其次,我们需要对包进行裁剪和分步加载,分步加载可以使用 WebAssembly 的 MainModule 和 sideModule 的方式。其次转成 wasm 库还存在内存问题。我们需要对内存进行精准管理,毕竟目前 wasm 最多支持 4G 的内存。最后是 wasm 的效率优化问题,也是团队重点关注的。wasm 的多线程和 SIMD 等可以开启使用。
三维家的自研 CAD 有很多高密度计算,如何在后台高效提供计算服务,也是云化部署的核心。阿里云的 serverless 型的函数计算 FC 可以很好地完成这点。
第四点比较关键——相比于 java 的 jni 调用,我们更倾向于使用 GRPC 提供远程服务,方便治理和迭代开发及问题追踪。团队将三维家的大多数 C++库做了一次梳理,按业务需求和功能进行 RPC 封装和划分,这里解决了大部分工业软件云化部署时如何集成原来 C++库资产的问题。如果需要提供给 Web 前端使用,则使用 java 做一层桥接,但性能相对会差点。
挑战三:如何保证云化后的协同开发
工业软件在云化部署,集成服务后,对用户的需求反应需要更加迅速,开发形态也不同于以前按部就班和单一团队完成需求,呈现多团队的协同开发。如何协同各个团队间的开发工作,是我们云化后需要面对的一个关键问题。
三维家推行的是敏捷开发。但无论是 TDD 还是 BDD 都有各自的缺点,与企业的实际无法契合落地。所以我们对敏捷开发进行了“变种”。
我们推行敏捷开发有几点关键点:
1. 使用统一的项目管理平台,条件不足的可以使用禅道或其他 devops 工具,三维家使用自研的项目管理平台,充分契合企业现状和需求;
2. 梳理公司技术栈,统一公司大的技术服务框架(分为若干个技术框架,如后端云原生和微服务框架,前端的 vue 和 ui 及代码管理,AI 服务的 pyWeb 服务框架等),终止百家齐放,各自为政的局面。这有利于技术积累和减少重复造轮子,提升效率;
3. 规范开发流程和完善监控体系,每个开发环节的相配套工具、测试及监控平台都需要跟上,这样才能更好落地。
使用统一的项目管理平台,对敏捷改造非常重要。我们可以使用平台把团队的行为逐步规范起来。按敏捷的说法,就是逐步把团队向敏捷开发迭代。因此,如果能够自研项目管理平台就能够很好做到这点,否则可以考虑采用一些敏捷开发的商业平台。
挑战四:如何与不断开发的老框架业务代码做同步
工业软件云化部署是一个循序渐进的过程,而这期间企业业务不可能停滞不前。故此,如何适应不断开发的老框架业务,又是个头痛的问题。这里我引用同行的一个比喻:这就像城市里建新城,找一块地方按最新的规划建设,后面属于新城规划的产业都在新城发展,而老城区按固有模式发展,新城区和老城区间建立相应的交通设施等,等到新城区完全成熟时,就是老城区拆迁再改造的时候。根据我们团队的经验,我再补充个比喻:当旧城区和新城区无法协调时,应该壮士断腕,果断弃城,直接在新城区干。
简单理解就是:按新框架搭好业务的开发框架,做一层桥接层与旧框架融合,将一部分业务迁移到新框架开发,后面逐步迁移。当因各种原因,新框架的开发节奏赶不上旧框架的迭代速度时,应果断停止旧框架的迭代,全力迁移业务代码。
那么什么时候可以在新框架上开发呢?我们团队在完成最小闭环和性能内存测试后,就开始业务迁移了。
挑战五:如何保证云化后的性能内存
工业软件对性能和内存有着苛刻的要求,性能内存也是我们关注的重点。代码层面的性能内存优化千姿百态,我来说说非代码层面的:
1. 做好性能埋点和运维监控;
2. 做好代码质量检查和测试:sonar、代码复杂度、性能测试、内存测试。这里主要是利用客观工具和制度来抵抗人性,保证每次代码提交的性能内存符合要求,不会出现突然发现性能内存不行了而不知道是什么时候发生的;
3. 懂得利用成熟的性能工具,如 chrome 就自带了性能分析工具;
4. 关键一点是责任分配:开发责任和测试责任。厘清责任,给相关人员赋能赋责。这样遇到棘手的性能和内存问题,相互推诿的情况就会变少。
结语:
家装工业软件云化的路还很长,会遇到各种挑战,但工业软件云化的趋势不可遏制。随着 WebAssembly、渲染技术、AI 及云原生等前沿技术的快速发展,云化家装工业软件将会在实时性,精确度,智能化和渲染效果上将会有极大的提高。未来的云化工业软件,能够快速应用这些前沿技术,必将大放异彩。
版权声明: 本文为 InfoQ 作者【三维家】的原创文章。
原文链接:【http://xie.infoq.cn/article/cff096bea5d7b026c1d54c7c7】。文章转载请联系作者。
评论