如何破解一个“屎山”项目?

文摘   2024-10-25 07:01   江苏  
不知有谁遇到过“屎山”项目?遇到的是怎么破解的?最终结局又是怎样的?最近投入到一个“屎山”项目不能自拔,每天精力被耗得剩不了多少,公众号文章都快写不动了。
1 什么是“屎山”

“屎山”这一术语在软件开发领域是一个非正式的比喻,用来形容那些结构混乱、难以维护、代码质量低下的大型代码库。这个比喻形象地表达了这样的代码积累就像不断堆积的粪便,既不美观也不易于处理。

它通常形成于以下几个原因:

  • 历史遗留:随着时间的推移,项目初期可能因为时间紧迫或资源有限,代码没有遵循最佳实践编写,之后由于各种原因(如需求变更、人员流动)而未能得到适当的重构。
  • 持续堆砌:面对新需求,开发人员选择在现有代码基础上快速添加功能,而不是彻底重构,因为这样做短期内看似更高效,但长期导致代码复杂度和耦合度增加。
  • 技术债务:为了快速交付,团队可能会积累技术债务,即选择了短期利益而牺牲了代码的长期可维护性,这种累积最终形成难以逾越的“屎山”。
  • 知识传递不足:团队成员变动频繁,新成员对旧代码的理解不足,导致难以做出恰当的修改,只能在不了解整体架构的情况下进行局部调整。
  • 重构成本:全面重构需要大量时间和资源,且存在风险,可能导致新问题出现,影响业务稳定性,因此往往被推迟或避免。
source: WordPress › Error (crondose.com)

2 “屎山”项目的特点

故事是这样的,曾经有个团队发现项目干不下去了,就找到了接锅侠,而我不幸被选中。为什么干不下去?无非就是项目的三大要素:成本、时间和质量。
  • 成本问题:原来以为一个软件工程师的投入就行,结果发现最少要5个起步;以为不需要开发工具和测试设备的投入,结果发现需要天文数字的投入,光AUTOSAR工具链的投入就是上百个w。
  • 时间问题:人员投入的严重不足,伴随着客户的需求越来越多,交付节点不可能满足;同时因为人员和工具的投入不足,开发产生的bug数量巨多,解bug的时间投入惊人。自然地,软件交付的节点一而再再而三地延期。
  • 质量问题:从软件开发来说,需求、开发、验证和项目管理都有问题。
- 未与客户进行需求的沟通,没有需求管理,也没有软件的需求文档;
- 软件乱改,在不懂原base的功能逻辑的前提下,为了弄出基本功能,在已有base上大量屏蔽现有的逻辑;收发的信号传输也不一致,将原来用于功能A的信号接口当作功能BCD的信号接口;而原来Base的无关功能但又会影响基本功能的逻辑却被保留。
- 未进行软件测试,让客户验证和调试软件,一个问题可以发几版软件给客户。
- 项目内容均在各自的本地电脑管理,未进行统一的数据管理。
总的特点就是:该有的没有,还要无中生有。

3 如何破解 “屎山”项目

如果只是普普通通工程师一枚,记住,在没人没资源的情况下,别想着自己一人能干起来。
首先,要学会报警,困难风险要让所有人知道;然后,可以自己先分析分析哪些可以做,但是不要着急做,因为在投入进来之前,你其实也做不好,就算做起来也是低效的。
期间,我尝试去修复其中一个bug,虽然只是简简单单地修改了一个逻辑,结果却将原有的基本功能给干没了。这时,客户暴躁了.......
source: 错误代码 – ProgrammerHumor.io
会哭的孩子有奶吃,这个道理好像什么时候都成立,哭到老板愿意投人投资源来解决问题安抚客户才行,到这时,就可以开始干点真的东西了。
下面我们就从ECU软件开发角度,聊聊如何去破解“屎山”项目。
记住,尽可能先做好软件项目管理工作,然后再去干软件开发工作,越“屎山”的项目越应如此。
因为越不容易解决的问题,越需要让大家先认可你的解决思路,然后才能细究别人看不到的细节。如果一开始埋头讲细节,别人不了解,信息又对不齐,贸然动手,会导致更多的问题。

3.1 关于软件项目管理。

当问题很多,在解决一个问题的过程中或者想同时解决几个问题时,本能地会进行频繁的软件修改和释放,而没有软件交付管理、软件数据管理和软件问题管理,这会造成非常混乱的局面。因此,当我意识到软件有多“屎山”之后,一方面为了梳理出现状,另一方面确保后续我所做的每一步变更都可追溯,可以从以下几个方面来展开:
  • 首先,所有软件项目相关的内容都采用Git之类的SCM工具进行管理,确保软件版本能够及时上传,有迹可循,当然也包括软件交付记录和软件问题管理等文件。

source: git 版本管理工具 学习笔记
  • 然后,一次软件交付或释放不做多个问题的修复,尽量只做一个问题的修复,这样的好处就是客户很容易了解修复了什么,同时解决几个问题,碰到问题没解决,还引起了其他问题,反而给自己带来了更多的坑。因此,我们采用的软件交付管理策略就是一版软件只针对一个问题释放给客户,同时让客户清晰地了解每版软件的变更点。(编者语:此种方法要考虑适用性,一次只修复一个问题在很多项目里都不太适用,原则是清晰定义变更点)
  • 再是软件问题管理,在我接手之前,所有的软件问题都是邮件内容的简单回复或会议上的口述。但随着邮件频率越来越高,一下子就变得无法跟踪问题状态了。因此,整一个文件来管理这些软件问题就十分必要(编者语:稍微大一点的项目,几乎都离不开ALM工具,除了JIRA/RTC等,还有很多低成本的国内自研产品),如下示意:

通过对上述三点的梳理和管理,那么基本可以做到内外部对于软件问题信息(原因分析、解决方案、软件版本、释放计划)的对齐,以及双方清晰了解实时的进展。接下来就是去解决具体的技术问题:

3.2 关于软件开发。

对于ECU软件开发,无非三个点:需求、设计和验证。

  • 需求。了解需求的实现状态,即便得不到完整的答案,但是至少要了解哪些需求不是客户要求的,而是“屎山”软件祖传的,做到对与软件无关的东西心中有数。然后去了解出问题的功能,该功能对应需求实现的状态。
  • 设计。首先是接口,梳理接口的状态和注重接口的影响分析。当你去分析数据时,明明条件都满足,但是结果却不对,不可能现象就是出现了,这时候必须接收现象的正确性,质疑信号的真实性。首先,要梳理接口,确保你所看到的信号都是正确有效的。追本溯源,信号的源头要么来自CAN和传感器,要么是逻辑运算生成的。另外,当变更一个信号的逻辑时,注意信号被使用的情况,或者说是影响分析,有时一个信号逻辑的变化,很可能影响很多逻辑的变化,此时要慎之又慎。然后是逻辑,做最少的逻辑变动去修复问题,且要相当明确为什么要做这样的逻辑变动。当然,当一个模型的接口规模达到一定的数量,要去梳理信号将是极其艰巨而耗时的任务,这时会更真切地体会到何为“屎山”。
  • 验证。让客户进行调试软件测试是件很奇葩的事情,这个没啥多说的,举手要资源,尽快建立软件测试能力,确保验证OK再释放软件给客户。

4 一些“屎山”项目的案例

以上介绍了”屎山“项目的整体情况以及如何破解这个屎山“项目的一些思路,为了让大家有更痛彻心扉的体会,后面再分享一些深入细节后的一些发现。首先,这个“屎山”项目软件开发的实际状态经常是这样的
  • 无软件变更文档,模型和代码中都没有变更记录的注释;
  • 软件变更分配采用拼凑大法,屏蔽大法和写成定值大法;
  • 模型生成的代码被手动修改,甚至直接修改生成代码的逻辑,有为了编译通过,也有纯粹图省事。
下面看这些操作的具体体现。

4.1 接口信号

我踩的第一个坑是CAN通讯的接口信号
原来修改者以为只是CAN报文ID有过手动修改,在这样的认知下,以为的正常情况应该像下图左侧这样子。因此,以为CAN信号3_温度1和CAN信号4_温度2是没有被使用的。
当使用了CAN信号3_温度1和CAN信号4_温度2接收温度1和温度2信号后,问题出现了。后来查了好久才发现:信号1_电压和信号2_电流的输入源是CAN信号3_温度1和CAN信号4_温度2,因此,当使用了以为正确的用法后,把原来的信号1_电压和信号2_电流的输入源干没了

后面我彻底梳理之后,发现为什么会这样做,主要问题点在于:修改者对于功能不了解,未考虑温度1和温度2对后续功能的重要影响,以及对接口的处理逻辑了解不够深入,不知道如果新增这两个信号,应该要做哪些软件变更,索性使用了拼凑大法去解决当时面临的眼前问题,把问题风险留给了后来的接锅侠。
4.2 逻辑修改

这里用一个例子来说明问题,假设有这样一个逻辑判断,如下所示:

当修改者发现这个逻辑表现不及预期,一番查看下来,发现这个条件1确实重要,无论如何都要考虑,这个条件234的逻辑实在太复杂,使用屏蔽大法倒腾倒腾,最后发现如果屏蔽了条件2和条件4,这个逻辑的结果就很好控制,效果也就达成了。
那这样的话:这个条件4逻辑实在太复杂,没法分析,看起来好像也没啥用,直接屏蔽干掉得了。然后,这个条件2看起来确实很重要,直接屏蔽可能太不合理,那暂时写成定值,待日后好好查清楚了,再恢复原先的使用方式。
也许这样处理解决了眼前的问题,但是埋下了很多风险,一个是该功能原本考虑的点没有考虑,如果是一个高压功能或行驶功能,可能会造成人车的潜在伤害风险。因此,正确的做法应该是重要的必须保留,而无关的直接删除,也别屏蔽了,免得造成干扰。

据我观察,如果这个“屎山”项目把无用的代码逻辑删除,直接瘦身一大半,那将会让接锅侠好受很多。但实际上很多项目都是如此,存在一大堆无用的代码逻辑,越到后期越没人敢动,因而能够贯穿整个软件生命周期。

4.3 模型生成的代码手动更改

当模型生成的代码还需要手动修改,尤其是直接去修改生成代码的逻辑,且没有任何软件变更记录,这绝不能被允许的,但是却实实在在发生了。那为什么会出现这样的行为呢?
有因为编译原因,比如,每次模型生成代码后,需要去屏蔽某些接口的操作,才能使得编译通过。也有因为工具链还不够成熟,某些原因下允许了这种操作。
其实,这看起来是个人原因,本质上是软件项目管理的问题,一没软件开发流程和工具,二没软件仓库和版本管理,才会造成了这样的乱象。因此,一些投入是必须的,包括软件开发流程、软件开发工具等。
5 小结
通过这样一个“屎山”项目,突然让我用起来多年积累的一些东西,有感而发。长路漫漫,有时候真不能只看眼前,还是得需要更系统更全局的视角去解决问题,这样才能做出更好的设计。

END



延伸阅读(全网正版最低价):


水轻言
探讨汽车软件项目管理、质量管理及AI数字化。