识别软件开发过程中的依赖关系对于提高开发效率和软件产品质量起着非常重要的作用。
这里所说的依赖关系既包括技术依赖关系,也包括管理依赖关系,可以认为是GJB5000B三级实践“识别和协商活动之间的依赖关系”和“管理项目活动之间的依赖关系”的增强版。
技术依赖性
技术依赖性是指软件各个组件之间的相互关系。 在设计阶段,这些部分可以是组件、模块或类。 在实现阶段,我们关注的组件是源代码文件。
技术依赖可以分为两种类型:语法依赖和逻辑依赖。 语法依赖是指编程语言元素(例如数据结构、函数或方法)之间的调用关系。 逻辑依赖是指软件组件之间的逻辑关系。 例如,实现相同需求的两个组件在逻辑上是相关的。
分析语法依赖关系是通过从源代码中提取相关信息。 分析各种语法单元,例如语句、函数或方法,看看是否存在数据相关(例如,某个数据结构被函数 A 修改,然后被函数 B 使用)或函数相关(例如,方法 A调用方法 B) 依赖项。
然而,语法依赖分析在实际使用中并不容易。 一方面,从源代码中获取的关联信息在某些情况下并不准确(C或C++的多态性使得我们在程序运行之前很难弄清楚两个类之间的关系),另一方面另一方面,一些复杂程序的源代码文件之间存在着千丝万缕的依赖关系,给分析带来了困难。
逻辑依赖关系是通过分析在同一开发操作(例如开发新功能或修复缺陷)中同时修改的源代码文件来获得的。 这些同时修改的文件之间的依赖关系就是逻辑依赖关系。 逻辑依赖和语法依赖并不是完全不同的关系。 事实上,逻辑依赖包括语法依赖,但它比语法依赖更强大,因为它可以基于逻辑发现两个独立模块之间的关联,这是语法依赖所无法比拟的。
当然,逻辑依赖也有其问题。 因为分析逻辑依赖关系是从历史数据中提取的。 如果没有良好的配置管理,就无法有效确定源代码文件之间的逻辑依赖关系。
我们分析软件开发过程中的技术依赖性,因为它们会对软件开发的生产力和质量产生重大影响。 软件组件之间的技术依赖性越多,复杂性就越高,潜在的缺陷就越多,与之相关的维护成本就越高。
工作依赖性
软件开发过程中的依赖关系还有社会性的一面,即完成开发任务所必需的沟通、信息共享和协调需求。 我们将这些依赖关系称为工作依赖关系。
工作依赖离不开技术依赖,尤其是逻辑依赖。 例如,A和B分别负责模块A和B。 由于B需要调用模块A(所以A和B之间存在逻辑依赖关系),一般情况下A需要先完成模块A的开发软件开发的过程,然后B开始开发模块B。,并且由于需要缩短开发周期中,项目经理要求模块A和B并行开发,这就需要A和B之间更加密切的沟通,避免完成各自的工作后因无法正常调用而返工。 确认它们之间的工作依赖关系可以提前为它们之间的沟通做好准备,这样可以减少bug的发生,保证开发效率。
识别工作依赖关系可以让项目经理更合理地分配任务。 经验表明,处于项目核心的成员需要进行更多的沟通,这些额外的成本使他们更有可能不知所措,从而增加了软件质量下降的风险。 事实上,以下研究结果证明了这一点:
当源代码文件被高度依赖它的人修改时软件开发的过程,该文件更有可能出现问题。
这就需要项目组做好沟通管理工作。
简而言之,识别和管理软件开发过程中的依赖关系对于软件开发的效率和质量至关重要。
这正是:
依赖性很重要并影响质量和性能
不仅技术依赖,工作依赖也很重要
参考文献数量:《软件之道:软件开发中争议问题分析》,作者:Andy Oram Greg Wilson,出版社:人民邮电出版社
作者简介:王小双长期从事GJB5000的推广、实施、评估和改进工作。 创建“软件工程思考”微信公众号,一直在“软件工程思考”中分享GJB5000、CMMI和软件工程的知识和见解。 现致力于GJB5000软件过程改进和软件工程能力提升的咨询和研究工作。