Skip to content

Software Engineering Project Management for Scientific Research

VodkaSoul edited this page Dec 3, 2019 · 6 revisions

Table of Content

1 科研领域软件开发特点

  1. 软件需求不够明确。 本软件项目涉及到大量的数据,并且需求不断变化,无论是软件提出者还是用户,往往难以用计算机思维或语言清楚描述问题;我们开发小组起初对项目物理目标缺乏深刻的理解,不能很好地理解软件功能细节及需求,因此对数据处理流程中进行的数据转换、修正、数据结构重组也缺乏深刻理解;
  2. 人员结构较为单一。 本小组在软件开发中通常一人需要承担多种角色,包括软件需求分析员、设计者和开发者,甚至测试者。这样的职位设定,人员分工不明确,难以深入把握某一领域(比如测试)的特点和方法,从而影响了整个软件开发过程;
  3. 软件的实现细节难以把握。 即使需求仅仅是求解线性方程组的矩阵求法,但我们知道,针对不同特征的矩阵(比如对称正定矩阵、严格对角占优矩阵等等)均有特定的解法进行求解,不同的方法往往会对结果带来一定的影响,而且不同的数据输入形式、不同的数据类型、不同的精度要求所依赖的求解方法也各不相同。如果我们考虑的情况过于理想,那么就难以满足实际的需求。
  4. 硬件频繁改动增加软件开发风险。软件依赖于硬件,设计初期软件是在理想的硬件设计状态下运行,但如果硬件发生变更或者运行影响因素增加,软件也随之变动,从而加大开发风险。
  5. 软件测试及评估缺乏专业水平。 由于开发者、测试者与用户的专业测试能力都比较欠缺,难以涉及到核心质量问题,往往无法全面对软件作出专业评估。
  6. 项目进度管理难度大。 本项目实现的复杂度较高,难以在短短几周内完善地实现所有的功能;如何在课程结束后跟进该项目,继续完善本项目是一个亟待解决的问题。
  7. 软件不确定性因素多。 随着工程实施,软件提出者、用户会不断改变、增加需求,加上开发者及测试者缺乏相关经验,代码开发不规范、开发人员流动性强等增加了软件开发的不稳定性。另外,为降低开发成本和难度,开发人员通常会引入现成的工具,这可能给软件开发带来隐患。

然而,面向某一科研领域的软件开发项目也有自身的优势。如和大型专业软件相比,本项目所需的功能很少,开发平台具有可移植性。

2 软件开发流程管理

项目流程甘特图:

Gantt

2.1 确定软件开发模型——原型模法

瀑布模型不适合本项目不断需求变更和迭代的场景,而增量模型、快速应用开发 (RAD) 模型等功能驱动型模型又要求能将系统划分为多个拥有独立功能的子模块,因此也不适合本项目。

综合考虑上述于需求不明确、流程不清晰、算法不确定等科研领域软件开发特点,我们认为采用需求变更驱动型的开发模型较好。因此,经过综合考量,我们认为采用原型模型作为开发模型,具体的介绍和细节如下所示。

Evolutionary Model

Prototyping Model has become a popular technique used in defining system- and software-level functional requirements for interactive information systems. This is due primarily to the desire of software developers to adequately define and validate user requirements early in the software lifecycle, when changes can be made economically.

原型模型需要迅速建造一个可以运行的软件原型,以便理解和澄清问题,使开发人员与用户达成共识,最终在确定的客户需求基础上开发客户满意的软件产品。

原型模型允许在需求分析阶段对软件的需求进行初步而非完全的分析和定义,设计开发出软件系统的原型,该原型向用户展示待开发软件的全部或部分功能和性能;用户对该原型进行测试评定,给出具体改进意见以丰富细化软件需求;开发人员据此对软件进行修改完善,直至用户满意认可之后,进行软件的完整实现及测试、维护。

if a designer has sufficiently rapid feedback from what happens when a user uses a program, there is no need to know anything about the human.

Newell, A. and Card, S.K.(1985) The prospects for psychological science in human-computer interaction, Human-Computer Interaction,1, 209-242.

2.2 加强开发流程控制

确认采用如上所述的开发模型后,开发人员必须在每一次迭代中完整实现需求分析、设计、编码和测试等步骤。各阶段的评审或项目报告尤为重要,项目前期要确保软件开发人员准确理解项目需求以及软硬件环境;中期阶段要确保开发流程和方法可靠;后期要通过测试确保软件运行符合要求。

2.3 需求分析中注重物理分析

本软件在设计和实现时涉及到了大量的数据操作,这些数据通常都是由土木工程专业所使用的工程软件产生的,相邻的数据之间可能会有一定的关联;因此在需求分析中需要进行一定的物理分析,把握数据之间的关联、特殊的条件,以简化算法。

2.4 采用串行开发方式

在对算法进行迭代更新时,可以注意到算法之间有很强的相似性,有许多组件可以复用,因此可以将相关性较强的算法以串行的方式进行开发;串行开发的另一个优势是,在一次迭代过程中会对该算法结果进行评估,因此可以从中选择较优的算法进行讨论和分析,从而进一步确认下一步迭代的方向和目标,降低了工作量也使团队的目标更为明确。

2.5 提高开发人员的主观能动性

本项目需要实现的算法拥有一定的创新性(主要体现在在既有的迭代解法中发现可并行计算的点实现算法加速,并想办法使用稀疏矩阵的链式存储等方法来优化存储空间)。在此过程中,需要开发人员经常一同探讨,寻找项目的突破点,并定期对当前取得的成果进行分析和评价,对开发的进度、质量进行考核。

3 软件质量保证措施

  1. 加强开发过程中的沟通。 本项目的许多不确定因素会给软件开发的需求带来变动,随着迭代次数的增加,对算法进行优化就愈发需要新的想法、新的突破口,因此团队需要定期的沟通以交流思路,总结现阶段的成果并明确下一阶段的目标和方向,不使项目因为一个难点而停滞不前。
  2. 充分调动开发人员的积极性。 本项目中算法需要多次迭代改进,而每一次迭代改进随着难度的增大其周期会不断增长,因此充分调动开发人员的积极性尤为必要。可采取的措施包括但不局限于定期总结当前的工作结果,展现研究过程中的创新性结果;在成绩评定等方面提供支持等。
  3. 注重软件测试。 每一次迭代过程中,都会对实现的算法进行测试,通过测试可以评定当前实现算法的优劣、可改进之处,从而确认下一步迭代的方向;可以说在每一个迭代周期的软件测试在很大程度上决定了资源的科学配置以及项目的前进方向。

4 开发所需的工具

  1. 项目托管平台 GitHub。通过 GitHub 对项目的代码进行托管,并使用 GitHub Wiki 进行文档管理。
  2. 跨平台编译工具 CMake。通过 CMake 项目构建工具,能够在不同的操作系统和平台下,通过简单的指令编译和运行这个程序。并且 Cmake 可以组织和管理项目代码,使项目代码层次结构清晰易读,这对以后的维护工作大有裨益。
  3. 排版系统 LaTeXLaTeX 是一种基于 ΤΕΧ 的排版系统,非常适合于大型论文排版和数学公式输入,生成高印刷质量的科技和数学类文档。同时可以通过 OverleafVerbosusScribTeX 等在线 LaTeX 编辑器进行多人协作。
  4. 开源 UML 建模工具 StarUMLStarUML 是一种生成类图和其他类型的UML图表的工具,它支持 UML2.0 定义的大多数图,能够生成较为规范、专业的 UML 图表。
  5. 在线编辑、实时协作作图平台 ProcessOnProcessOn可以支持更多类型的图(流程图、思维导图、UI原型图、UML、网络拓扑图、组织结构图等),但是相对于 StartUML 来说稍微不够专业。