瀑布和敏捷模式是软件开发的两种方式,十多年前软件工程的书上介绍软件生命周期总是描述成“需求,分析,设计,编码,测试和维护几个不同的阶段。这就是瀑布模式(Waterfall Model),主张在动手编码之前,将所有的事情搞明白,编写详细的文档,很多开发人员好象是在开发文档,而不是开发软件,因为要到开发的后期,才可以看到软件的“模样”。
瀑布模式能够保证软件的质量。它适合目标确定的软件开发,比如军事软件,汽车电子产品,仿制一个现有的产品。而且需要一位能力非常强大的系统分析员,编写出各种文档。
但是当你开始设计一个创新的产品,或者为客户设计一个全新的产品,使用 瀑布模式就不适合了,比较再高明的系统分析师也不可能将事情完全想明白,况且客户对自己想要的产品也是模糊不清的。在提需求的时候往往像一个小男孩进入了玩具店,什么都想要。但是一旦产品出来后,又发现这些功能又不是它想要的。
于是,人们又提出了所谓敏捷模式(Agile Model)。这里,我们谈谈在嵌入式系统开发中如何推行敏捷模式。
我们关心敏捷模式的另一个原因是 小团队本来就缺乏系统分析员这样的大牛。不如转向敏捷模式吧!
网络上有大量关于软件敏捷开发的内容,好像都只是说一些概念。维基百科上讲的比较全面了,核心大约下面几点。
敏捷开发的理念
敏捷开发的概念
嵌入式系统涉及了软件和硬件。而且硬件是不那么容易不断迭代的活。 在嵌入式系统设计过程中采纳敏捷开发方式呢?我们觉得的可行,下面谈谈我们的做法和体会。
为了尽快地向客户呈现产品的性能,采取自顶向下的设计方式是最有效的。在桌面系统,移动App和web 应用程序开发中,首先是完成前端用户界面设计。让客户第一时间看到产品的样子,以便和客户确定需求中偏差。然后再开发后端系统。
同样地,在代码开发中,为了和团队其它成员之间的交流,明确API 定义。最好的方式是采用面向对象程序设计语言。第一步首先定义各种类(class),程序主要数据和成员函数。必要的时候,可以使用仿真的方法,在类成员函数中生成仿真数据。团队其它成员可以在第一时间首先调用和测试这些类,是否符合需求。
对于基于网络的产品而言,在设计的初期,首先定义协议的方式,消息的数据结构和语义。使前后端尽早实现通信。
团队成员之间通过类定义和消息定义实现沟通和交流。
嵌入式软件工程师痛苦的事情是长时间等待硬件的完成,而且由于硬件设计的拖延,往往留给软件工程师软硬件调试的时间十分有限。为了不被硬件开发拖后腿,影响敏捷设计的实施,比较好的方式是使用软件来仿真硬件。虽然增加了代码的工作量,但是完全是值得的。千万不要等待硬件板子来了才开工,那往往就免不了加班了。
为了尽快地实现硬件底层驱动的开发,使用模块化电脑板是一个好的方法,在实践中,软件工程师已经大量地使用类似arduino这样的开发板以及各种接口扩展板来搭试硬件平台,调试底层驱动程序,一旦完成之后,移植到目标硬件系统上轻松多了。
Mbed OS 是Arm 公司为其Cortex-M 处理器开发的一个开源操作系统。我觉得它是更适合作为嵌入式设备敏捷开发的OS。
使用C++ 程序设计语言的RTOS
Mbed OS 的程序库,硬件接口驱动都使用了类来定义。学习和使用起来十分方便,使应用程序的开发者摆脱了硬件细节。事实上,我们在开发应用程序的过程中,也采取了类似Mbed OS API 的方式,使用类定义软硬模块,将实现细节封闭了起来,使团队的其它人员很块可以重复调用这些类。这一做的另一个好处是我们团队中原来编写JavaScript/HTML5 前端的工程师和NodeJS 的软件工程师也毫无障碍地编写起嵌入式设备的软件了。使全栈工程师延申到了嵌入式设备。他们可以一气呵成实现设备到云端的架构实现。
生态和社区已经建立
尽管Mbed OS 在国内还不普及,但是它在国外已经有了大量的开发者,社区中可以找到大量可以直接使用的程序库和应用程序的实例。
比arduino 更强大
Mbed OS 毕竟是在32位 cortex-M 系列处理器上运行的OS,cortex-M 比起8位 CPU 性能更高,外围电路更好丰富。另一方面,Mbed OS 对于网络和安全的支持也非常强大,能够轻松实现HTTP RestFull API,MQTT,SSL等。Arm 公司也提供了 pelion 云端服务。
嵌入式系统开发过程中,硬件永远是拖后腿的角色,我常常开玩笑说,等它等到我把写的代码都忘了。如何提高硬件的研发速度,是必须解决的瓶颈问题。
解决这些问题的好方法就是采取模块化设计方式。实际上,模块化是敏捷架构的重要组成部分。前面提到:改变是敏捷开发的重要部分,甚至宣称”欢迎改变“,其实硬件是最难改变的,而模块化设计使的改变更加容易。
事实上,大量的嵌入式设备的硬件都是大同小异的,无非需要一些串口,Ethernet,wifi,以及数字IO,ADC 等等。真正不同的是其中的软件。硬件工程师不断地从事重复性的设计工作。当产品不是大批量生产的,完全可以使用模块电脑来作为嵌入式设备的硬件平台。modular-2 就是这样的一台模块化嵌入式电脑。我们为软件开发者提供了大量常用的IO接口模块和网络通信模块。如果遇到特别的接口电路,硬件工程师也只要设计一块IO模块就完成了,大大减少了硬件开发的工作量。
modular-2 不仅提高了嵌入式设备的研发效率,使敏捷开发的方法能够在嵌入式设备研发中得到有效地应用。同时,它可以作为产品快速部署到应用现场。快速地呈现给客户一个完整的软硬件结合的产品。这是modular-2 模块化设计带来的好处。
使用了modular-2 之后,我们原先需要开发数个月的项目压缩到了一到两周就完成了。实际上,有的项目我们一个晚上就完成了,使得客户非常吃惊。
另一方面, 面对客户项目,许多工程师一个人就可以独立地完成。减少了大量协调,沟通的麻烦。降低了嵌入式系统研发的入门门槛,大学毕业生经过短期培训,阅读一些前辈的代码,就能够独立工作。公司的研发力量大大加强。