|
本次博客我断断续续思考了半年多时间,但是仍然不系统、并没有思考出最终的答案。只能先写下来,后面再完善。因此是比较散乱的,所以叫做“杂谈”。
本文所说的“工业软件”,指的是工业领域仿真、运筹优化、设计等较高层次的复杂功能(叫工业软件A)。另外有部分工业软件是工业生产的调度、实时监控(SCADA)、生产管理等,这部分软件难度小一些,而且已经基本实现了国产化(叫工业软件B)。工业软件B不在本文讨论的范围。
MATLAB是典型的工业软件,下面重点探讨MATLAB的发展过程。其最早是对Fortran编写的矩阵计算库(BLAS)进行封装起家的。后来逐渐向各个领域扩展,实现完善的仿真功能。近年来MATLAB在自动代码生成、嵌入式等方向进展很大,由原型验证逐渐向生产控制发展。
网上关于MATLAB资料和讨论可以用“汗牛充栋”来形容,但似乎没有人讨论:为什么中国没有类似MATLAB这样的工业软件?毕竟,在MATLAB基础上进行技术研究和开发,相当于在别人的地基上盖房子。我们并不知道模型运算结果的内部机制,很难做出深层次的创新或真正前沿的工业设计。
MATLAB早期的功能是很弱的,也就是矩阵的封装而已,只有几十个函数:
比如下面的绘图函数:
之后,MATLAB逐渐向各个行业扩展。由于早期扩展的时候较少有竞争对手,因此获得大量利润。然后这些利润又逐渐投资新的研发,扩展到新的行业领域,从而像滚雪球似的越来越壮大。比如说SIMULINK中的电力系统仿真功能,是与加拿大魁北克水电局合作开发的。
如果想和MATLAB竞争,那就要投入大量的资金,但是Mathworks的开发资金是之前的产品受到用户欢迎,是由用户支付的。但竞争对手要从头赶上,从用户那里显然拿不到资金,只能以科技项目、吸引投资等方式筹措。这些钱与Mathworks的投资相比,简直是杯水车薪。
另外,工业领域可靠性要求非常高,用户不会轻易转换产品。如果不是某个竞争产品大幅度优越于现有产品,用户是不可能更换产品的。
但是,我们不是完全没有机会的。MATLAB追求的是通用性的解决方案。对于细分的某个领域,有可能有一些比较特殊的需求。比如说,MATLAB的优化性能不如Gurobi这样的专业优化求解器。在细分领域做深、做细,特别是贴近国内用户的特有需求,可能是发展国内工业软件唯一的路径了。
工业软件需要开发人员,然而中国目前基本上没有成功的工业软件研发团队。大部分软件开发人才都集中在互联网。工业软件研发和互联网软件研发一定是很不同的。下面初步总结一下:
1)互联网追求高并发问题的处理,因为互联网的用户是个人和家庭,数量真的非常庞大。而工业软件的用户相对较少,比如说电网能有多少个呢?直接就能数过来(当然工业物联网也是高并发的,但是属于工业软件B,不在本文讨论范围)。互联网大量的技术是处理高并发问题,例如分布式框架、分布式数据管理、基于redis的缓存、流式计算、Kafka消息中间件等等。工业软件更关注单次服务的深入、精益求精,偏向于高性能数值计算,虽然也用到并行计算技术,但与互联网行业的并发机制完全不同。例如,工业仿真考虑几百个核的超级计算机,互联网则倾向于分布式机群。
2)互联网行业的需求是多变的,毕竟直接与人们的生活息息相关。因此在技术上,采用微服务架构、中台的技术与管理方式,界面技术也以更新换代快而著称。工业软件的需求相对稳定,更看重硬指标、是否达到核心目的,界面不一定非常重要(当然有的设计软件对可视化要求还是高的)。
3)互联网行业的业务代码是相对简单的,复杂的是底层技术支撑。毕竟服务生活,能复杂到哪去呢?因此,互联网行业有这样的倾向:瞧不起业务代码,认为业务代码无非是增删查改。工业软件则完全反过来,真正有技术含量的是具体业务的细节,这些东西甚至是不传之谜,连论文都不发表的。而软件研发、系统架构,对于工业软件,完全是工具(或者外壳)。
目前有一种不好的倾向,工业软件企业觉得互联网行业更高大上,互联网行业流行什么,就都想用到工业软件上,也不管是否真的能解决问题。也希望高薪从互联网行业挖一些“专家”过来。但是,互联网行业的高薪,与社会大环境、历史进程、社会分工有关,并不意味着互联网行业从业者的平均水平高于传统行业从业者的平均水平,更何况技术领域不同,水土不服必然存在。
举一个简单的例子,一个我熟悉的工业软件公司,言必称“微服务”、“数据中台、业务中台”,仿佛这些概念都是灵丹妙药了。真的是这样吗?这个公司某些核心应用功能十多年没有进步了,应用研发人员大部分精力都在于把以前的代码改造移植到新的平台上,新的平台则完全追着互联网行业的潮流走,几年就更换一次,大家不关心真实用户的需求。
考虑到目前国内没什么很成功的工业软件企业,怎样建设工业软件团队,确实缺少成功案例。下面是我的一些思考。
将工业与软件结合起来,无非是两种路径,一个是计算机专业的工程师去学习工业技术,这样的团队以计算机专业工程师为主,外加少数工业领域专家。还有种思路是工业的工程师去学习计算机软件开发的知识,这样的团队以工业界为主,外加少数计算机专业工程师进行框架设计和界面开发。
哪种方法更好些呢?有人可能会说一半对一半,取个折中。实际上,工业技术和软件开发的交流成本是非常大的,是完全不同的行业和思维模式。如果一半对一半,交流成本会大到不可承受的地步,总要有所侧重的。
我本人倾向于后一种方案,是以工业专业的人去学习计算机软件开发的知识为主。一个重要原因是工业需求的复杂性,这导致开发团队的大部分人都必须理解需求,否则开发的软件是很难实用的。这一点跟互联网行业不同,因为互联网行业用户虽然是各行各业,但是需求相对简单,就算是计算机专业的人也都可以理解(比如开发外卖软件的程序员,自己也需要点外卖)。但工业软件就不同了,有的需求、算法连本行业的专家都未必能透彻理解,让计算机专业的工程师去开发就更难了。
那么,传统工业的从业者怎么去提高计算机软件开发的能力呢?我的推荐就是:认真阅读学习《深入理解计算机系统》。这是卡内基-梅隆大学的镇校之课。这本书并不好读,至少需要仔细读两遍。因为存在一个悖论:你不对计算机系统有整体的认识,很难真正学懂具体的组件(如虚拟内存、CPU指令、进程调度等)。但是,你不学懂具体的组件,对计算机系统有整体的认识是不可能的。
参考文献
两张图片来自Mathworks官网ppt:《MATLAB编程技巧及常见问题》
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-21 22:56
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社