聊一聊大型嵌入式软件开发的高效管理模式

 

一、按规模大小对嵌入式系统开发进行分类

  嵌入式系统的开发,一般会分为大中小3种规模:

  • 小型的工程,代码量在1万行以下,硬件不涉及高频信号和严苛工作环境的,诸如在学校期间做的项目、一些小家电小发明等,用的是51、AVR、CORTEX-M等单片机作为CPU,软件硬件可以由1~2个人包办。
  • 中型的工程,代码量在10万行左右,硬件信号频率在1GHz一下,开发人数需要4~5人,开发周期要1年以上。
  • 大型的工程,代码量在50万行左右,硬件涉及5GHz以上的高速频率,以及工规车规等严苛工作环境,开发人数需要10~30人,开发周期1年~2年,维护周期1年以上。

  小型工程的开发模式十分灵活,有时候需求方只提出idea和提供资金,找到个人、工作室或在校导师等技术开发团队,大家谈拢了就可以开干了。中等规模的工程,一般软件硬件要有明确分工,而且要有技术负责人来作为牵头,开发模式从小型工程的依靠个人综合单干能力,逐步变成依靠团队的共同协助和技术负责人的高瞻远瞩,需要使用一些管理工具,例如GIT/SVN来做代码的分支和合并管理、需要每周例会来向上汇报项目进度等,但还不需要用到太多庞大复杂的技术管理手段。对于大型规模下的工程开发,由于参与到的人员众多,开发周期紧张,还涉及到多个部门之间的交流,以及随时可能发生的需求变更等等,此时如果没有一套健全高效的开发模式进行管理,则项目会举步维艰甚至直接腰斩。

 

二、大型工程开发所需的角色定义

  一个公司要开发一款复杂的技术产品,从前端到后端,从评估、立项、开发、测试、生产、出货,一般会涉及BU、RD、TD、ED、QA等多个部门。涉及到的角色包括产品经理、项目管理、系统工程师、软件工程师、硬件工程师、测试、工程、品质等人员。这些环节网上或者一些书籍都有介绍,我这里简单说下我的理解:

  • 产品经理:英文缩写PM。是研发的甲方。会对要开发的产品有明确的定义,给研发、测试等其他后端的部门提需求和要求。以及要负责对接业务和客户等。产品经理这个角色十分重要,需要有十分准确敏锐的对市场的判断和对公司研发能力的把握。有时候PM的一个错误决定,会导致整个研发团队白干一年,颗粒无收。
  • 项目管理:英文缩写PL。负责串联起整个产品开发的各个部门人员和各个环节。百事通,各个环节都得懂一些,然后要按照立项时的规划,定时定候来跟踪各个人员。如果出现了delay需要了解上升反馈解决,如果各部门合作间之间矛盾需要协调。PL给人的感觉就是事事都在,每天都在开会和会议记录。好的PL同样也十分重要,能带动整个团队的开发节奏。
  • 系统工程师:英文缩写SE。有些公司会称做结构师。SE需要有很高的技术水平。要对软件、硬件、生产等各个环节都十分熟悉,要对产品未来几年的竞争力和技术含量做有效评估。如果在开发过程中遇到重大技术瓶颈,需要SE提供解决思路。PM在制定产品的时间点和需要实现的功能时,主要是会听取SE的意见。能成为SE应该是很多工程师的终极目标。
  • 软件工程师:负责完成产品的软件部分的开发。一般会占整个开发团队的70%以上的人力。会有SW TL作为一个产品的软件开发负责人。TL在管理上需要和其他各个部门进行开会沟通,实时更新开发进度、接受需求变更以及了解测试情况、在技术上需要对软件的架构进行分解和分工,分配每个软件工程师的工作任务,跟踪各位人员的完成情况,以及解决开发过程中遇到的技术难点。由于软件开发占了整体开发的大部分工作, 而且在技术上也需要串联测试硬件等部门,因此嵌入式系统开发的软件工程师在技术上往往是要求最全面(软件,硬件,测试,产品通吃)的角色,也是最忙的角色。其中TL又是软件工程师里最典型的代码。一个技术和管理技能优秀的TL,对整个嵌入式产品开发的技术部分起到核心的作用
  • 硬件工程师:负责完成产品的硬件部分的开发。和在学校做的项目不同,一般公司都有要求硬件投板必须在1~2次内成功,重复修改硬件会对公司产生重大的金额损失。硬件在需要在完成当代产品的基础上,评估未来近代产品的硬件设计是否通用或者可沿用。另外,由于合作关系,价格以及供求关系等因素,硬件工程师并不是想用什么器件就用什么器件的,需要和供应商谈,和采购谈。例如最近全球缺芯的大环境下,很多原本用于生产的元器件都买不到了需要更换替代料。经验丰富的硬件工程师对产品进度的保证也起到重要的作用。
  • 测试工程师:负责完成产品的测试部分。测试环节我个人认为是除了软件开发外第二忙碌和重要的角色了。测试要提供数据证明产品的软件、硬件、结构等等各个环节是否达到立项时的要求,同时还要挖掘开发过程中潜在的各种各样的bug。传统的测试环节主要是基于系统测试,也就是俗称的黑盒测试。随着这几年的测试技术的理论和技术的提高。也逐渐诞生了集成测试、用例开发测试、灰盒测试等更自动化,和深入源码的测试种类。个人认为,测试是一门两级分化很极端的技能。一方面跑一些基本的测试项目确实是一些重复机械的动作,比较枯燥。另一方面,能根据产品的需求和技术的原理,设计出高效的测试用例,成功打出潜在问题,又是一项要求很高而且价值巨大的事情。

  其他品质,工程,业务等角色就不继续介绍了。那部分已经走到产品开发的后期,后需要再在后续的文章中做介绍。

 

三、大型嵌入式软件工程的开发模式

  这里主要想跟他们讲一下大型的嵌入式软件开发的流程。本人之前对小型、中型、大型的软件工程开发都做过。作为软件部分的TL,随着代码规模的变大,我越来越发现,如果没有相应的开发管理手段的话,那软件开发的流程将会变得进退维谷。会面临前端随时变更需求、当前在走的开发有delay、代码质量不佳、软件工程师的任务目标不明确或不饱和等诸多问题。因此一些好的管理方法和工具,会对大型的软件开发,有着事半功倍的效果。部分经验来源于敏捷开发的思想,部分经验也是结合自己的工作经历和嵌入式软件开发的特点来展开。虽然敏捷开发的模式最早是应用于快速迭代、需求变更频繁的互联网产品开发。但是其中有很多先进的思想和方法,也同样可以在大型的嵌入式软件开发中借鉴。

  百度百科对于敏捷开发的定义:敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。

 

(1)人员的分层管理

  根据我的前任领导的经验分享,当要向你汇报的人员超过5个人时,你对他们的工作跟进的精度就会大幅下降。说白了其实就是人太多你管不过来了。因此,当一个软件工程开发的人员超过15人后,建议需要分层级管理:

  • 第一层级,TL作为软件工程的总负责人;
  • 第二层级,由3~5个资深的工程师来分别负责相应的技术模块,负责和TL讨论指派任务的技术细节、负责指导下一级的工程师完成任务、对负责模块的代码进行review等;
  • 第三层则是其余的软件工程师组成,负责动手完成各种实验和最终的codding。

  一个健康、稳定、高效的层级团队,是软件开发的管理起到至关重要的作用。软件工程无论是速度还是质量,很大程度都是取决于技术人员的能力和创造力。如果团队的协作关系高效,那后续的开发攻关则会畅通很多。因此,在项目的一开始阶段,就需要把团队人员的协作模式确立清楚。然而我个人认为,这个开头的环节,往往也是最困难的环节。中间层人员的指派是一件需要多方面权衡的事情。例如有些人年纪偏大但能力一般,这种可能无法胜任中间层的岗位但又会对其他人员作为他的上级对他指派任务十分不爽、又或者是可能多个项目组之间的人员调配,可能会突然空降一些人员来打破原本的人员安排等等。这个要根据大家的实际工作环境来做调整。总言之,一个良性的团队协作氛围,是一个十分难得的事情,而且一旦定下来对后续1到2年的开发过程有着深远的影响。所以需要TL及其上司仔细斟酌清楚,否则等着你的将是一堆焦头烂额而冗余低效的沟通成本。

 

(2)软件协作开发管理平台

  首先我认为需要要高效地跟踪每位软件开发工程师的进度,就必须使用一些软件协作开发管理工具。付费的有JIRA系统,免费的可以使用PingCode系统。软件协议系统可以根据story,bug fix,feature等目标创建任务,可以设置优先级,设置目标完成时间、设置负责人,可以设置报告人,设置对应的关注人员等等。将软件开发的分阶段细分成各个任务,能让工程师在开发时目标明确,而TL也方便对各位工程师的进度进行跟踪和评估。使用协议开发工具有如下好处(以下以JIRA为例):

  1. 评估组员的工作进度和压力。JIRA可以通过筛选器和饼图的方式,快速统计出当前个人组员的任务开发数量。如果有出现部分人员任务太多,则需要及时调整权重,如果某些任务pending了太久或者是逾期了则需要TL及时深入了解原因。

                  

 

  2. 工作流。一般对于一个软件功能的开发,都会有一些固定的步骤,如assign, design, coding, review, merge, hang up, finish等环节。对于一些个人开发或者小型开发可能不会有这么讲究,上来就可以coding,完了就push代码。这在企业开发、大型项目开发时是不允许的,是容易产生严重问题的。因此需要团队成员都保持固定的工程流程来完成任务。不能够一段code没有经过review,也没有经过test,就直接merge到主干上。而JIRA是可以针对不同的任务设置不同的工作流的。所有JIRA成员必须按照工作流的规定进行,例如任务没有经过review,那工作流就不能走到merge那一步。

  3. 信息交互。采用WEB形式的协作工具,可以支持多人在线操作。对于一些数据整合和分享、设计思路描述、评论和备注等功能,都能快速在上面完成。这样方式比双方通过传输word文档,excel文档或者是放在共享文件夹要高效、整洁得多。

  4. 自定义数据处理。对于这些协助工作,其原理都是后台在管理和整合一些csv表格数据。我们通过人工地导出这些数据,再结合PYTHON等工具写一些数据分析的脚步,可以实现更进阶的数据图表,例如burn-down chart,time span等。

                  

  此外,不同的软件协作管理工具可能还有一些特色功能。例如PINGCODE自带知识库功能,JIRA可以强大的筛选器功能、可以支持BUG跟踪等。选择一款高效好用的协议管理工具,能对大型的软件开发管理起到重要的管理、规划和总结作用。

 

(2)多人协作的写作和知识库系统

(3)会议(每日立会,每周例会)

(4)工作流

(5)文档(每天看RD JIRA,看测试部JIRA,和PL对项目进度)

(6)测试(Merge测试,回归测试,集成测试)

(7)激励

 

posted @ 2022-02-19 18:30  冷剑白狐77  阅读(1514)  评论(0)    收藏  举报