固件工程师可以从软件工程师那里学到什么?很多!
我很惊讶今天的固件开发与 25 年前我们第一次开始使用 C 进行嵌入式开发时的情况相似。C 是从汇编程序向前迈出的一大步,但固件工程师可以而且应该学习更多的经验教训。是的,有些工具更好,但很多做法都停留在 70 年代和 80 年代。
在非嵌入式开发人员面临的挑战之上,嵌入式软件开发确实增加了一些额外的挑战。但是熟练的软件开发人员使用的所有原则和实践都适用于嵌入式开发。顺便说一句:不仅仅是嵌入式软件开发人员不了解这些最先进的实践,许多非嵌入式软件开发人员也是如此。
我认识和遇到的做固件的人总的来说是一个非常熟练的团队,致力于解决难题。不幸的是,无论出于何种原因,许多人都没有跟上软件世界的发展。我认为这与固件工程师建立的想象障碍有关。
嵌入式和非嵌入式开发人员讲不同的语言,但解决类似的问题。保持嵌入式代码独立于硬件设备本质上与保持应用程序代码独立于 UI 或数据库相同。基本原理是一样的。
以下是我认为嵌入式开发人员应该更加关注的几件事。其中一些原则和实践可以直接使用,而其他原则和实践可能需要稍作调整才能应对嵌入的挑战。如果您想用下面的固件一词代替软件,请继续,我并没有真正区分两者。
依赖管理
必须管理模块之间的依赖关系。从软件到硬件的依赖是一种特殊情况,必须由嵌入式软件开发人员主动管理。如果您不管理依赖项,它将管理您。
在实践中,这意味着只有有限的软件模块子集应该了解底层硬件(和操作系统)。随着硬件的发展,并且总是如此,可以保留对硬件独立代码的投资。看我的啊哈!片刻。
Robert Martin 撰写了大量关于 SOLID 设计原则的文章。嵌入式开发人员应该了解它们并将它们应用到他们的设计中。
- S-单一责任原则
- O-开放封闭原则
- L-Liskov 替换原则
- I-Interface隔离原则
- D-依赖倒置原则
这些原则导致设计更能经受时间的考验。SOLID 原则鼓励创建有凝聚力和独立的模块。它们建立在面向对象的思想之上,但可以应用于 C。我们必须停止在嵌入式 C 代码中太常见的函数调用数据结构免费。
C++ 和 OO 语言
为什么不能使用 C++ 和 OO?因为它们太慢或太大。事实是什么?C++ 是一种庞大而神秘的语言,但您不必全部使用它。看看你为什么还在用C?
C++ 弥补了一些 C 没有太大帮助的问题,例如:
C++ 可以有效地用于嵌入式开发。好吧,您确实需要一个 C++ 编译器和余量。也许这在你的世界是不可能的,或者是做生意的成本。从学习开始:
- 类 - 这些是具有成员函数和成员数据的结构。
- 构造函数——这些使得初始化正确成为可能,一直都是。
- 析构函数——如果你学习构造函数,你还必须学习析构函数以保持宇宙的平衡。
- 继承 - 主要用于定义仅包含纯虚函数的接口。接口提供了重要的依赖中断和灵活性点。这些通常在嵌入式中被不公正地劝阻。这里不应该有任何神秘或偏见;虚函数是底层的函数指针。有效使用接口的替代方法是复杂的条件逻辑,嵌入式 C 程序通常有太多的东西。
如果嵌入式开发人员使用 C++ 的这些部分,他们可以构建更灵活的设计并且不会产生高昂的成本。
测试驱动开发
这可能是最大的游戏规则改变者。我很高兴看到其他帖子也提到它。TDD 可以帮助预防现在和将来的缺陷。要了解为什么 TDD 可能有助于查看 TDD物理学。
嵌入式确实给 TDD 带来了一些独特的挑战。例如,TDD 需要极快的增量编辑/编译/链接/运行周期。对于许多嵌入式开发人员来说,这意味着仔细的依赖管理并首先在目标上运行单元测试。查看更多关于 为 Embedded 调整 TDD 的信息。
使用 TDD,您正在创建经过彻底测试的代码。全面的自动化测试覆盖率充当安全网,允许随着需求的变化安全地更改代码。意想不到的后果立即被发现。
此外,拥有几乎免费获得的测试,让您可以无所畏惧地重构您的代码......
持续重构
代码只写一次,但要读很多次。然后它被改变和调整,导致设计随着时间的推移而退化。如果开发人员不不断地重构以保持代码干净,就会变得一团糟。也许你们中的一些人正在处理这个烂摊子。TDD 的自动化测试支持低成本和低风险的重构。
持续集成
自动化您的构建过程。让它在每个工作区签入时运行。对于将编译后的代码导入目标所需的异构工具集来说,这是一个挑战,但它仍然是正确的目标。
嵌入式开发人员越早知道某个更改在某种程度上与其他工作不兼容,修复它的速度就越快,花费在痛苦合并上的时间就越少。
增量交付
寻找拆分工作的方法,这样就可以避免大量痛苦的集成,并且可以及早尝试设计理念。避免沿着架构线分裂,专注于提供可见功能的切片。
合作
嵌入式开发者!离开那里的立方体并一起工作。当您只看到自己的代码时,如何才能变得更好?当您是技术 XXX 方面的专家,已经掌握了它并且没有机会在不同的领域工作时,您将如何改进。
那里有很多东西要学。你有责任尽你所能