传统电子行业的毛利高于互联网,但为什么净利润却会低得多——老板赚钱少,电子工程师的工资低?
滴滴打车为什么只要一个软件就能成功,而嵌入式工程师一辈子可能开发几十个产品,也许没有一个能成功?原因是电子行业的开发成本太高,维护成本太高,所以也就没有利润。那么利润又要怎么来?
日前,在灵动微电子举办的MM32大会上,立功科技创始人、董事长兼总经理周立功发表了“嵌入式软件设计方法及其思想——从‘芯’到‘云’,工业智能物联生态系统”的主题演讲,对上面的问题做了深刻的探讨与展望。而“嵌入式软件设计方法”实际上是他写的一本书。“这本书获得了本年度国家学术基金赞助——全行业只有30本,盲评的,这是我一生中最骄傲的地方!”他激动地说。全世界软硬件启蒙于欧美,归功于伟大的软件工程,但是因为嵌入式行业是个碎片化的行业,所以没有伟大的公司进入这个领域,这就为我们开了一扇门。
需求是解决产品好卖的问题,设计是解决降低成本的问题,那怎么去降低成本?“在今天这个万物互联的时代,学习的成本太高了——有有线接口、无线接口,等等。很多公司要开发底层,就好像盖摩天大楼一样,要自己设计产品,还要把它盖出来,怎么会有利润?这样的公司里面有驱动工程师、QT工程师,还要员工懂ZigBee、WiFi…这样根本就没有时间去开发好卖的产品。”他指出问题的症结所在。
他认为,程序员现在最大的问题还是在“蛮力”开发。嵌入式行业软件开发是有问题的——分工很细,花钱的人很多,造成开发成本很高,维护成本很高。一个软件改一个功能,具有不确定性——一个bug改掉,另一个bug没改;高层软件调度中层软件,它们全都依赖和耦合在一起。“设想一下,要是全球有个第三方做个百搭的软件,买进来就能用,与CPU无关,与操作系统无关,那有多便宜?你想想,如果是你自己去维护这样巨大的软件,要花多少钱?要优秀的员工,要开很高的工资,甚至上市还要给股票,你还担心他跳槽…而如果你去买这样第三方的软件,可能只要花1万美金,它永远帮你维护。这样你设计的成本就很低,利润就高起来。”他谈道。
传统的面向过程的编程很麻烦,世界上整个软件行业都是面向对象的编程。只有面向对象的方法才能开发出独立开发、独立发布、独立维护的产品。达到这三个条件的软件叫组件。“组件”这个概念是微软发明的,但只发明了50%——微软设计的组件不可以在Linux、安卓等任何平台上通用,这就是它的弊端。如果所做的组件与CPU无关、与操作系统无关,那成本则最低。哪怕是员工跳槽了,虽然付出了高工资,但所做的软件至少终身可用。然而,现实情况却是,员工走了,留下的代码不可读、不可重用。“就像我们有25万的仪器,但没有5万的仪器。25万的仪器是用X86和Windows开发,而如果想用Arm和Linux去降成本,则Windows的代码一行都不能重用。如果要用Arm和Linux再去开发的话,可能又要花2000万,但你可能赚都赚不到2000万,怎么会有利润?”他举例说。
做组件的目的是任何一个模块都可以被替换和独立化。组件理解起来很简单,比如徕卡相机的外包装盒里有各种各样的小包装盒,分别放有电源线、USB线和相机等等。如果没有这些包装盒,可能就会弄坏模组——把电源线拿出来,可能就会把相机带出来。这就是面向过程的软件互相耦合在一起。把它们各自分离,每个软件就是一个组件,每个子盒就相当于对每个软件包进行了分离。“我们最希望看到的软件架构就是用户界面、用户逻辑和数据库全部是分离的,这就是分层的架构。”
分层架构最大的弊端是它没有对软件中很多的功能部件进行重定义。比如,要嵌入ZigBee和CAN总线,不知道将放在哪里,这多半会跟业务逻辑耦合在一起,牵一发而动全身。
嵌入式领域要解决这个问题其实很简单,不管是在什么嵌入式操作系统里,都违背不了两个原则:一、有线和无线;二、数据传输与处理。IO口或传感器接口以及ZigBee接口等都是可视的。如果能够做一个软件架构使界面与业务逻辑分离的话,这样的软件集成就变成独立的组件,相当于远程的可视化。这样,当系统中一个软件出问题,就不会影响到别的地方。这样的软件才能可测试。
他指出,“99%的工程师可能都没有兴趣做测试代码。做好以后交给测试工程师测功能,也就是黑盒测试,所以产品卖出去后就有很多bug。为什么互联网软件可以free而硬件不可以,就是因为维护成本太高。所以我们提出了组件开发规范。”
“我们的梦想是让UI像iPhone一样漂亮,软件最好不要编程,而能像LabVIEW一样可拖拽。有了组件才可以拖拽——在这方面我们对标美国的NI,但NI只能拖拽板卡,特定于X86,而我们的组织平台上与CPU无关,不仅可以支持板卡,支持模块,还可以支持任何外部器件。这就是组件的魅力。” 所以组件必须符合上述三大原则,而微软却没有提出。
这么多配件要怎么用?周立功透露,立功科技有个组件开发管理工具叫AXIO,用的打勾,不用的不打,然后点击确定就好。他指出,该公司将在2020年像微软和谷歌一样,在全国开办AXIO创新联盟活动,把软件全部free,把IoT OS AWorks(包括GUI)和云ZWS全部向用户免费开源。
AWorks支持面向接口的编程,与其他OS通用。下面的操作系统可以是华为的鸿蒙,也可以是Linux,上面做了接口,把它们抽象在一起。比方说做一个传感器接口,所有的传感器都共用一个接口,而没有第二个接口,这样学习成本就降低。用户可以用原生Linux开发,也可以用立功科技的AWorks框架。
“我们做AWTK开源GUI引擎已有15年,发现Windows工程师大量时间都是在学微软的API,离开Windows一点价值都没有。许多工程师会用到MT,但公司可能有专门做QT的人,这是浪费资源…虽然我们公司仪器在X86上跑的是Windows,但是上面的软件全是AWorks,没有调用微软一个API,因此很容易移植到Linux平台上。”他补充说。
这个GUI引擎支持所有的平台,Windows、Linux、安卓、苹果、微软等等,腾讯小程序、阿里小程序、百度小程序,还开放2D游戏软件。这个引擎在GitHub是开源的。有了AWTK,可视化拖拽编程就能变成现实。
不管设计人员用什么界面,最后都要做到业务逻辑与数据库、与界面分离,最好的方法就是MVVM。“MVC的编程方法不可以自动化测试,并且它的视图和业务逻辑没有完全分离。用MVVM进行命名绑定和数据绑定,下面可以是QT,可以是任何GUI,也可以是AWTK。MVVM的优势是用户只要熟悉这套绑定规则(XML)就行了,而不用去懂下面各种QT的API,也不用学习AWTK。这就降低了开发的难度、开发的成本,也就能做出更好卖的产品。”
按照分层思想理解,软件一般分三层:用户界面层、应用层和底层的app层,但这样的软件缺乏核心竞争力,它的业务逻辑并不清晰。国内普遍采用的建模方式叫用例建模。用例是指有输入信号与输出信息有记性特征,比如按按键就进行计算,然后通过ZigBee把数据送出去。这种建模方式最简单,但是不可重用。有竞争力的产品会分成四层,即用户界面层、应用层、领域层(核心业务逻辑)和底层。
国外提出三种方法——领域驱动设计、面向对象的分析与设计、直接用例驱动设计——最终的目的都是要分出领域层。核心领域用一句话统括就是,挖掉所有的输入与输出,余下的就是核心底层。比如温度测量,抛开所有的输入输出,就是温度测量的核心,也就是温度过高、温度过低、当前的温度,以及状态。核心业务模型包括七个函数——读写最大值、最小值、当前值以及状态,这个架构不会随着时间改变。这样,核心业务就非常清晰,建模的本质也就在此。
分层架构可以用六边形架构来实现,即:将核心业务逻辑搭出来,使其细分为子领域;制定领域模块与模块之间的接口和交互方式。比如制定数据库,可以用仓储模式来集成,而使数据库与业务逻辑分离。有些软件不开源是因为有核心价值,例如数据存储有八种方式——SPI NOR Flash、NAND Flash、eMMC、U盘、SD卡、TF卡和数据库等——每一种都要学,那成本就很高,还不一定做得好。然而,这些都是KV存储模式,如果掌握这个奥妙,那就不用去懂接口、懂存储器的坏块管理,也不用学文件管理系统,读写就好。
立功科技用一套接口(4个接口)实现了这8种业务存储模式,不要求用户去学习。“我们做产品是为了赚钱,而不是说我懂文件管理系统,我懂U盘。U盘读写的目的达到就好,用鼠标拖进拖出就实现读写。另外,要与任何品牌的U盘无关。这样的软件才有价值。”他指出,“所以用户只要去做业务逻辑就好,其他80%的工作都由我们搞定。任何的嵌入式项目都有共性——有线无线、数据传输与处理。基于这两点,就可以把软件全部标准化。这样所有软件都有地方放,也都可以替代,这就是面向框架的编程。”
另外,他提到,立功科技还有ZWS云平台,可以支持任何公司的云,而且这套软件不收费。“我们是从芯片到操作系统到软件架构到云,市场上的独一家。这个云可以使用可视化拖拽进行编程,而且下面没有用它们任何一家API,所以它们谁也绑定不了我们。”
最后,他认为,中国目前是没有工业物联网的。“可以这样讲,有都是忽悠。工厂里面设备几百种,不同的设备有不同形式的接口——各种以太网、485、现场总线。请问你的数据是怎么收上来的?如果你能收上来,那我就承认你是工业物联网。这是工业物联网的核心,而ZWS云平台里有这个技术,只要你的协议是标准的,我就可以把数据全部收集上来。不然各种场合设备怎么互通互联?”