软件设计中的图表——正向设计还是反向设计?
软件和Web应用程序变得越来越复杂,它们需要与许多不同的系统交互,并使用各种各样的服务和库。良好的文档,包括各种类型的技术图表,既可以作为规划和设计工具,也可以用于记录运行中的系统,以便于部署后的维护和扩展。
作为软件工程师或系统设计师,你应该能够熟练地绘制系统架构图、代码和数据结构图以及流程图和数据流图。
如果你从事前端用户界面设计工作,你还需要绘制用户界面模型、导航树和用户流程图。
作为项目经理或团队负责人,可以使用许多技术性较低的图表来组织和确定团队工作的优先级,例如看板、时间线、甘特图和面向业务的信息图表。
正向设计与反向设计
“逆向设计”一词源于教育和教学设计,指的是先设定学习目标,然后设计活动来系统地、具体地达成这些目标,从而规划课程。它也适用于软件设计,即在系统和数据结构实现之后再进行文档记录。有时,甚至连系统开发过程中遵循的工作流程也会在事后记录下来。
教育领域的前向设计则与之相反,它先规划学习活动,然后再定义学习目标并将其与这些活动联系起来。在软件工程中,这指的是在编写代码之前,在遵循任何工作流程之前,先编写系统设计文档和图表。
软件开发人员需要熟练掌握这两种文档编写方法。
软件开发中的前向设计
首先采用前瞻性设计方法绘制技术图,可以帮助您可视化系统、预见问题区域、发现安全隐患并探索不同的解决方案。这将有助于您预测软件和系统的需求、局限性和约束条件,避免在开发过程中意外遇到这些问题。

在投入开发资源之前,先对用户进行导航结构、工作流程和用户界面模型测试,以便发现并修复问题。在开发周期的早期阶段发现问题总是更具成本效益,因为那时变更简单,不会影响已集成的系统或流程。
软件开发中的逆向设计
如今几乎所有软件都包含遗留组件——库、需要交互的旧系统以及用不再常用的编程语言编写的脚本。因此,详细记录现有系统和代码的工作原理至关重要,尤其是在缺乏前瞻性设计文档的情况下,以便于未来的升级、维护、自动化测试和集成。
正向设计中的技术图纸
在开发开始之前绘制的通用技术图可以帮助您设计界面和用户流程,以满足用户的需求,并确保您的新软件能够与它需要使用的外部系统和组件进行交互。
用户故事和工作流程:确定用户的需求,并将工作流程和功能与他们希望通过软件实现的目标相匹配。
导航树、用户界面模型和流程图:在实施之前与用户共同设计合理的导航结构、工作流程和界面模型,以便大多数用户会发现您的软件易于理解和使用。
数据结构和关系:绘制ER 图和UML 类图,以匹配您在上述文档中确定的数据和功能。
高级系统集成和架构:包括所有外部系统或现有库及其集成要求。这可能包括系统架构概述和网络图、UML 包图和组件图。

请记住,高层级的图表(例如云架构、数据结构等)会随着开发进程而变化。因此,务必及时更新文档或图表,否则实现与设计之间的不匹配会导致严重的延误,并引发团队间的摩擦。
您可能会发现,使用更详细的图表(例如UML 序列图和活动图、SysML 状态机图和框图)在实施开始之前更详细地指定设计,可以使开发进程更快、更顺利。
逆向设计中的技术图
开发完成后,软件部署完毕,此时绘制的技术图表是为了方便其他应用程序或软件服务与您的软件进行交互,并向用户解释如何安装和使用该软件。
API、系统和架构文档:确保外部软件了解如何(以及应该如何)与您的软件或系统交互,并记录您的系统工作原理,包括其依赖关系图,以便尽可能轻松地修复错误。如果您使用SysML 图来记录系统,则可能需要绘制参数图来衡量已完成系统的性能。
部署设置:如果您使用功能标志向不同的客户群体提供不同的功能,请仔细记录您的开发结构和部署设置。
软件测试流程: 绘制软件测试所需的流程和数据图,无论是否自动化,以便在添加功能或修复错误时可以轻松重复这些流程和数据。
用户文档:通过绘制安装和支持流程图,以及使用带标签的屏幕截图和信息图以可视化的方式记录用户界面和功能,最大限度地减少语言误解。
在敏捷和精益开发中
正向设计和反向设计与瀑布式开发模型相结合,都是合乎逻辑的方法。
那么敏捷和精益方法呢?
在这种快节奏的软件开发方法中,规划、实现、测试和部署都是短周期迭代,每个迭代都建立在前一个迭代的基础上。“可运行的软件”比详尽的文档更重要。
在仓促推进之前先绘制图表:用户故事地图(或称 UML 用例图)是重要的前瞻性设计图表之一,尤其是在遵循敏捷方法论时。这些图表需要在项目启动时或在特性迭代开发开始之前与用户一起绘制和评估。
理想情况下,在开始任何实施周期或冲刺之前,应该明确每个团队和团队成员的角色和职责,最好用图表来可视化。

迭代周期后的维护和扩展性图表:为了确保您能够持续快速地为软件添加新功能和修复错误,请在每个迭代周期结束后更新所有技术图表和文档。这一步骤最常被忽略,导致软件产品随着时间的推移而停滞不前,因为没有人知道如何安全地扩展或更新它。
同时采用正向和反向设计
无论你采用线性开发模型还是循环敏捷方法,最好的方法都是同时进行正向设计文档和图表编写,以便顺利实施,以及反向设计文档编写,以确保未来的开发和维护不会出现任何巨大的返工噩梦。
