草庐IT

DevOps:定义汽车软件新开发模式

zoeking001 2023-03-28 原文

当前,全球汽车产业正在经历从传统工业向数字化转型的大变革,智能化、数字化、信息化正在成为汽车电子行业转型发展的必由之路。“软件定义汽车”(Software Defined Vehicles,SDV)概念的提出,说明软件在汽车产品中承担的角色越来越重要。随着汽车软件的量级和复杂度不断提高,汽车厂商对嵌入式系统开发需求越来越高。汽车的系统开发以模型驱动开发为主(Model-based systems engineering,MBSE),快速迭代、持续集成、可靠性代码自动生成、测试自动化等改善开发流程的需求逐渐受到重视。 

DevOps结合了软件开发(Develoment)和IT运营(Operations),旨在缩短系统开发生命周期,并提供更高质量的连续交付。本文将从软件开发模式的类别入手,结合当下汽车软件开发过程中面临的各类问题,通过分析DevOps和CI/CD的整合工作流在软件开发中的优势,探索汽车软件开发新模式。

 

01.软件开发模式

软件开发是一项包括需求定义与分析、设计、编程、测试、交付和维护的系统工程。目前常见的软件开发模式有以下四种:

瀑布模式(Waterfall model):将软件开发过程分解成线性顺序的不同阶段,每个阶段依赖于前一个阶段的交付成果。瀑布模式的软件开发过程灵活性较小,因其开发过程基本单向进行。其最大风险在于,该模式只有在产品研发完成后才能确定结果与预期是否相符,如有差错,工程师就需要重新开发,甚至重新设计规划。

▲瀑布模式

迭代增量式开发(Iterative and incremental development):整个开发流程被划分和整合为一系列固定周期的短小项目,即一系列的迭代。每一次迭代都包含需求分析、设计、实现与测试。此模式下,开发工作可以在需求被完整确定之前启动,并在一次迭代中完成系统的一部分功能或业务逻辑的开发工作,再通过客户的反馈来细化需求,开始新一轮的迭代。迭代增量式开发弥补了传统瀑布式开发模式的一些弱点,提高了效率和开发成功率。

▲迭代增量式开发模式

 

螺旋模式(Spiral Model):是一种风险驱动的软件开发模式。基于给定项目的独特风险模式,螺旋模式指导开发团队往往采用不止一个的流程模型,如增量式、瀑布式或原型式。它提倡适应性规划、演化开发、尽早交付和持续改进。

 

▲螺旋模式

 

敏捷软件开发(Agile software development):包括需求发现和解决方案改进。该模式通过自组织和跨职能团队与用户协作,制定适应性计划,进行渐进开发、早期交付、持续改进,灵活应对需求、能力的变化以及对需要解决问题的理解的变化。这是一种以用户需求进化为核心的迭代、循序渐进的开发方法。工程师先将用户最关注的软件原型做出来进行交付,根据用户在实际场景中反馈的问题,快速修改弥补需求中的不足。上述过程不断迭代,直至用户满意。

▲敏捷软件开发

 

02.DevOps&CI/CD

随着汽车软件复杂度和代码数量的不断提高,软件系统开发周期越来越快,传统的开发方式需要耗费大量人力和时间成本,无法紧跟市场越来越快的节奏。这就促使开发团队采用优于传统开发模式、更敏捷的方式——DevOps。 

DevOps是一组过程、方法和系统的统称,集文化理念、实践、工具于一身,重视开发(Dev)和运维(Ops)和质量(QA)部门之间的沟通合作。 

与传统软件开发模式系相比,DevOps打破了开发和运维之间的壁垒,通过自动化“软件交付”和“架构变更”的流程,使得软件的构建、测试和发布能更加快捷、频繁和可靠,从而帮助团队更快地发展和改进产品、服务客户、高效参与市场竞争。

 

▲DevOps

 在汽车软件领域,敏捷开发为嵌入式DevOps提供了合适的路径,以便团队更快发布新版软件代码。随着软件快速迭代,DevOps方法的迭代也在快速演进。在每次迭代中采用卸载/重新安装的方式已变得不切实际,CI(Continuous Integration,持续集成)/CD(Continuous Deployment,持续部署)方法可以使软件系统在不停止运行的情况下进行迭代。

DevOps的核心是持续集成(点击此处查看“持续集成”相关文章)。团队只需通过每天一次或多次的集成,进行嵌入式软件的自动化构建和验证,就可实现持续集成,尽早发现集成错误。

 

 

03.DevOps在汽车嵌入式软件领域推行的解决方案

面临的挑战

目前,阻碍DevOps在汽车嵌入式领域推行的挑战主要有两方面:

1)车载软件大多数为嵌入式软件,难以脱离真实目标系统单独运行。然而绝大部分汽车厂商采用“研发驱动测试”的模式,软件测试部门没有独立的硬件目标系统用于软件测试;

2)在自动化测试实践中,硬件难以支持软件进行不同环境的设置。要想达成完全测试自动化,工程师需要对目标系统进行定制。

 

通用解决方案

一般来说,实现持续集成需要满足以下三点:

1)充分借鉴软件测试经验,引入优秀的开源工具,发挥开源工具灵活、可配置强的特点;

2)整合企业已有的软件测试工具,使测试技术保持集成性;

3)结合全数字仿真平台部署仿真环境,保证测试过程的稳定可靠。

▲DevOps&持续集成

 

SkyEye天目全数字实时仿真软件

SkyEye天目全数字实时仿真软件,是一款国产的基于可视化建模的硬件行为级仿真平台,支持国内外主流架构、处理器和多机同步仿真,具备自动测试框架与灵活的可定制性,在汽车、防务、航空航天、电子、船舶等各种嵌入式领域应用广泛。

▲SkyEye界面图

 

SkyEye具有硬件平台所不具备的灵活性。通过对模型和平台的定制,客户可以得到跟自己的目标系统完全一致的仿真平台。利用SkyEye,软件开发团队可以开展并发式的功能测试和快速回归测试,加快问题定位和排查故障的效率。SkyEye为汽车嵌入式软件的设计、开发、集成与测试,直至后续部署、维护的全生命周期提供了一个功能强大、高效、易用的平台。

 

原文链接:https://mp.weixin.qq.com/s/wPbnh5NVmUt_fFTkbYHFaw

 

有关DevOps:定义汽车软件新开发模式的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  5. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  6. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  7. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  8. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  9. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  10. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

随机推荐