上篇文章,我们谈到了软件研发的需求和设计,确保软件研发“做正确的事”,并“把事情做正确”,本篇我们将继续软件的编码,发布及测试章节的内容。最后,我们谈一谈关于研发管理的软实力:技术研发与产品研发的双轮驱动以及组织文化与人才的基石建设。
软件编码是将设计转化为可执行代码的过程,需要遵循相应的编程语言规范和组织内部编码标准(例如,谷歌C++代码规范:Google_Cpp_Style_guide_CN.pdf (sosohu.github.io)),辅以静态代码扫描和动态测试,代码评审等工作,确保代码质量。
伴随着AIGC的泛化,AI 辅助编码和代码评审也逐步成为现实,比如Github Copilot X,可以协助程序员实现结对编程。同样,类似ChatGPT,也可以帮助我们实现代码评审的工作。例如,我们把下面这段冒泡算法的C代码(图12)输送给ChatGPT,GPT会给出非常中肯的评审建议以及重构后的代码,大大减少了代码评审的工作量。
图13是ChatGPT重构后的代码。GPT的反馈如下。他不仅仅反馈了代码的逻辑错误,对程序的性能也给出了建议(第2条反馈)
-
冒泡排序算法的内层循环条件for (j = 0; j < len – 1 – i; j++)中的len – 1 – i可能会导致数组越界。应该将内层循环条件修改为for (j = 0; j < len – 1; j++)。
-
在冒泡排序算法中,如果数组已经是有序的,仍会执行完所有的比较和交换操作,造成了性能上的浪费。可以在内层循环中增加一个判断条件,如果没有发生交换,即可提前退出循环。
需要注意的是目前GPT仍然是概率算法,他的反馈需要一定的人工复核,确保剔除AI给出的噪音反馈。
测试则是软件质量的守护神,涵盖单元测试、集成测试、功能测试、系统测试及验收测试等不同层次,目的是尽早发现问题、减少后期修复成本、确保软件符合客户需求与期望。无论是在V模型或者敏捷开发模型中,软件测试活动的目的是一致的,而测试活动贯穿整个开发周期(图14所示的V模型)。早期集成测试能有效缩短交付周期,提高客户满意度。
测试执行过程从时间顺序上可以分为三大部分:单元测试,集成与功能测试和系统验证与验收测试(图15)。
单元测试聚焦单个代码单元的功能正确性;集成与功能测试检查模块间交互与整体功能完整性;系统与验收测试则验证软件系统在真实环境下的表现是否满足需求。通过及早发现问题,测试不仅能节约成本,还能提升软件的稳定性和可靠性,为市场成功奠定坚实基础。
在实际操作过程中,无论是敏捷或是V模型,测试过程并没有这么严格的顺序区分,往往是循环迭代的反复过程。对于如何确保已经验证功能仍然是可信的,往往是需要经验和智慧的积累。关于软件测试,我们必须清晰地认识到“测试不是银弹。穷尽测试是不可能也不现实”。所以,端到端的软件质量保障,从需求到设计,从编码到测试,全链路的保障才是我们需要竭尽全力的目标。
伴随着AGI及数字化技术的发展,测试技术手段也在日益改进,新的测试技术开始逐步开始向RPA,AI赋能的测试手段方向发展(见图16)。而对汽车行业软件开发而言,自动化测试技术,RPA,AI,新的应用场景的测试也慢慢开始渗透,成为测试团队的新挑战。
四、软件发布:舞动的韵律
进入开发阶段后,采用CI/CD(持续集成/持续部署)的实践,包括代码提交、规则检查、代码评审、预编译、软件包构建、内部发布、测试验证以及对外发布等一整套流程,确保软件质量的持续性和稳定性。在这一过程中,构建Sanity、自动化测试以及各类环境下的验证是必不可少的环节(见图17)。
CICD在软件开发全生命周期中体现的核心思想是快速反馈、频繁交付和可靠质量。通过自动化构建和部署流水线,让开发团队能够迅速响应变化,减少人工干预带来的延误和错误,确保软件在各个阶段都能高效地完成集成、测试和部署,最终达到高质量、高效率的产品交付目标。
在软件的维护阶段,针对存在的问题和错误进行及时修复,根据用户反馈和市场需求持续进行功能改进与性能优化。对于汽车行业的嵌入式软件而言,还涉及到与硬件结合的复杂集成测试,以及类似FOTA,SOTA(空中下载技术)更新等特殊的软件升级场景。
此外,汽车行业软件发布遵循项目生命周期的各个阶段,如工程样车(EP)、产品及过程验证(PPV)、预试生产(PP)、试生产(P),直至正式投产(SOP)。在整个过程中,项目质量管理扮演着关键角色,不仅要保证软件产品的质量和性能,还要确保软件开发与发布过程符合既定的质量标准和国标,企标。
-
技术研发着眼于长远,追求技术先进性与知识积累,目标是开发出具有竞争优势的技术成果,为未来的市场化产品提供技术支持(TPF过程)。
-
产品研发更直接面向市场,关注产品创新与商业化进程,旨在快速推出符合用户需求的新产品,创造价值与利润(PMF过程)。
如图18所示,技术研发和产品研发在生命周期、市场定位、技术难度、管理手段等方面存在显著差异,但均需紧密围绕用户需求展开。技术研发往往领先数年,承担探索未知、孵化前沿技术的角色;产品研发则紧跟市场脉搏,力求在短期内实现产品的更新换代。二者相互依赖,共同推动企业技术创新与产品迭代的良性循环。当然,因为技术研发与产品研发的定位不同,企业在实际管理过程中,不能把产品研发的管理手段,比如某款车型研发,简单地套用到技术研发管理中(比如,某款新材料或者新动力电池,平台架构等)。
软件开发的成功离不开强大的组织支撑与人才队伍建设。研发组织应注重能力建设,涵盖组织架构设计、业务流程梳理、数字化工具链集成(如禅道管理软件,CICD工具链,云端软件DevOPS工具链等)、知识管理、信息安全等多个维度。同时,建立健全绩效考核与激励机制,确保人才的成长与发展与组织战略目标相一致。
人才发展方面,提供管理与专业技术两条晋升通道,满足不同类型人才的职业发展需求。管理路线涵盖研发主管、经理、总监等。专业技术路线包括了高级项目经理、产品经理、质量经理等专业角色;专业技术路线还包括了技术专家、高级专家、资深专家等技术精英。通过明确的职业发展路径,激发人才潜能,形成稳定且富有活力的人才梯队,避免“重技术,轻职业化”的问题。
根据PRTM的产品开发能力成熟度评估模型(图19),软件研发组织的成熟度可以分为5级。建议优秀的车企应该向成熟度4级(Stage 3)努力,提升组织的核心竞争力,确保打赢汽车智能化和汽车产业数字化这一仗!
本文为我们勾勒出一幅从理论到实践、从模型选择到组织构建的全景图。无论是初涉软件行业的新人,还是寻求优化研发流程的企业管理者,都可以从中汲取宝贵的知识与经验,助力在瞬息万变的科技浪潮中稳操胜券。软件开发并非孤立的编程活动,而是涵盖了需求分析、架构设计、编码实践、测试保障、技术研发、产品研发、组织管理与人才培育等多元要素的系统工程。唯有深入理解并妥善驾驭这些要素,方能在激烈的市场竞争中立于不败之地。
原文始发于微信公众号(ARVO INSIGHT 价值洞察):软件研发全攻略(二)