(3)软件实现细节难以把握。此类软件一般涉及复杂的物理过程,需要用一定的物理方法解决,但方法并不唯一,不同方法会对结果带来一定影响,而且不同类型数据所依赖的方法也不同。软件开发中还有些研究性课题,只能以接口形式存在于软件中,但预留接口时往往设计较为简单,考虑的情况过于理想,难以满足实际需求。然而,如果设计时考虑得比较复杂,接口较多,又往往缺乏必要的软件技术和经验,不能有效把握细节。
(4)硬件频繁改动增加软件开发风险。软件依赖于硬件,设计初期软件是在理想的硬件设计状态下运行,但如果硬件发生变更或者运行影响因素增加,软件也随之变动,从而加大开发风险。
(5)软件测试及评估缺乏专业水平。由于开发者、测试者与用户的专业测试能力都比较欠缺,难以涉及到核心质量问题,往往无法全面对软件作出专业评估。
(6)人员管理难度大。科研机构、高校一般热衷于科学研究而不是工程项目本身,因此难以兼顾两方面工作。软件提出者和管理人员往往对软件工程缺乏深入了解,难以对开发工作作出客观评价,因此对软件开发的进度和质量带来一定影响。
(7)软件不确定性因素多。随着工程实施,软件提出者、用户会不断改变、增加需求,加上开发者及测试者缺乏相关经验,代码开发不规范、开发人员流动性强等增加了软件开发的.不稳定性。另外,为降低开发成本和难度,开发人员通常会引入现成的工具,这可能给软件开发带来隐患。然而,面向某一科研领域的软件开发项目也有自身的优势。如和大型专业软件相比,所需的项目功能不是特别多,部分开发平台具有可移植性,开发人员综合素质较高,学习能力强,英语基础较好。此外,很多工程与国外合作开发,可参考国外成熟软件,并方便引进一些免费的软件框架和平台,如Gaudi[6]框架、天文分析工具库Ftool[7]等。
二、软件开发流程管理
2.1确定软件开发模型
科研机构,尤其是一些缺少经验的团队,习惯采用瀑布模型进行开发,主要由于该模型分阶段,且各阶段间存在因果关系,比较符合思维模式。但它会产生大量文档,到开发后期会凸显软件开发缺陷。适合科研领域的开发模型有迭代式模型[8-9](需求变更驱动型)、增量模型(功能驱动型)及快速原型开发[10]等。对于科研软件而言,模型选择需综合考虑软件框架稳定性和开放性、构件独立性以及项目组开发经验等。比如对于需求不明确、流程不清晰、算法不确定的项目(如数据处理软件、分析软件和标定软件等)采用迭代模型或者快速原型开发较好。此外,采用一种模型为主,其它模型为辅,也会得到很好的效果。
2.2加强开发流程控制
无论采用何种开发模型,开发人员必须在每一次开发或迭代中完整实现需求分析、设计、编码和测试等步骤。各阶段的评审或项目报告尤为重要,项目前期要确保软件开发人员准确理解项目需求以及软硬件环境;中期阶段要确保开发流程和方法可靠;后期要通过测试确保软件运行符合要求。
2.3需求分析中注重物理分析
科研软件中一般涉及大量数据操作,而且过程比较复杂,一些原始数据要经过转换、重建、标定及修正等步骤,而且处理不一定是线性的,即相邻数据之间可能有关联。这些功能和性能需求不容易明确,需要着重把握。软件中还可能涉及一些物理算法(比如图像修正、频率分解等),因此在需求分析中需要着重进行物理分析,包括流程梳理、特殊方法和条件选择等。
2.4采用串行开发方式
科研机构人员结构比较单一,往往多项工作并行执行,给软件开发质量提升及人才培养带来不利影响,可将相关性比较强的软件以串行方式开发,数据产品生成软件和数据分析软件可以依次开发。
2.5提高开发人员的主观能动性
软件开发过程中,保障软件项目负责人在经费使用及绩效考核中的话语权,组建凝聚力强的研发团队,对软件开发的进度、质量进行考核。
三、软件质量保障措施
(1)加强开发过程中的沟通。科研项目的不确定性带来软件开发需求的变动,用户往往只注重项目需求功能满足,而不关心软件的实现细节,所提出的功能或接口可能不切实际,因此需要加强与用户的沟通,明确软件开发目标。