1.在软件文档中最主要包括以下几点,能够帮助客户和开发人员理解产品如何工作,如何演化
语境、功能性概览、质量属性、约束、原则、软件架构、外部接口、代码、数据、基础设施架构、部署、运营和支持、决策和日记
(1)语境(必须)
*这个软件/产品/系统是关于什么的
*构建的是什么(愿景)
*如何融入现有环境
*谁在使用(用户、角色、参与者)
(2)功能性概览,了解系统的关键功能是什么,能够解释为什么让你可以在系统的功能切片之间建立明确的链接
*系统实际上做什么是否清楚
*那些特性、功能、用列、用户过时等对架构是重要的,是否清楚
*重要的用户是谁,以及系统如何满足他们的需求是否清楚
*上述已用于塑造和定义架构是否清楚
*从流程的角度系统做什么是否清晰
*系统的主要流程和信息流是什么
(3)质量属性
*架构必须满足的质量属性有清晰的认识
*质量属性是否满足(可衡量、可达成、相关、及时)
*明确标出一些有影响的质量属性(如多语言支持)
*列出每个质量属性时一个很好的起点
性能(延迟和吞吐)、可伸缩性(数据和流量)、可用性(运行时间、停机时间、定期维护、全天)、安全性(认证、授权、数据保密性)、可扩展性、灵活性、审计、监测和管理、可依赖性、故障转移、业务连续性、户操作性、遵守法律法规、国际化、可访问性、易用
(4)约束
*时间、预算和资源
*允许使用的技术清单和技术约束
*目标部署平台
*已有系统和继承标准
*局部标准(开发、编码)
*公共标准(交换数据格式、请求方式等HTTP/SOAP/XML/XML机构/WSDL等)
*标准协议
*标准格式
*软件开发团队的规模、技能配置
*所构建的软件的本质(比如战术和战略);
*政治约束;
*内部知识产权的使用;
(5)、开发原则
*架构分层原则
*视图中业务逻辑
*接口的使用
*始终使用ORM
*依赖注入
*高内聚低耦合
*SOLID原则(单一职责原则,开闭原则,里氏代换原则,接口隔离原则,依赖倒置原则)
*所有组件都是无状态的(让伸缩性更容易)
*富域模型、贫血域模型、选择存储过程、不使用存储过程、错误处理、日记等的通用方法、购买而非构建
(6)软件架构
*关键内部接口是那些
*展示了主要的组件及其交互
*展示了主要的容器和技术选择
*是否有清晰的结构,对于软件架构图的说明
(7)代码
*生成、渲染HTML,对生成HTML的内部框架的简短描述,包括主要的类和概念
*数据绑定:根据HTTPPOST 请求更新业务对象的方法
*多页数据采集:描述构建网页表单的内部框架
*web mvc
*安全性:使用windows身份基础(WiF)进行认证和授权的方法
*域模型:域模型重要部分的概览
*组件框架:简短描述了正在运行时重新配置组件而构建的框架
*配置:简短描述为了在运行时重新配置组件而构建的框架
*架构分层:分层策略和用来实现的模式的概览
*异常和日记
*模式和原则
(8)数据
*数据模型、数据存储、数据需要多少存储空间
*归档和备份
*日志文件和审计跟踪是否有相似的要求
*是否用单文件来存储
(9)基础设施架构
*是否有清晰的物理架构
*在所有层中,什么硬件做了这件事
*如果使用,他是否满足冗余,故障转移,和灾难恢复
*选择的硬件组件如何改变大小和被选中是否清楚
*如果使用了多个服务器和网站,他们之间的网络联系是什么
*谁负责基础设施的支持和维护
*有照管通用基础架构(比如,数据库,消息总线、应用服务器、网络、路由器,交换机、负载均衡器、方向代理、互联网连接)
*谁拥有资源
*开发、测试、验收、试制、生产等是否有合适的环境
(10)部署,软件和基础设施之间的一个映射
用来描述软件(容器)和基础设施之间的映射,有时候这是简单的一对一映射,(如把一个Web应用程序部署到单个web服务器上),其它时候回更复杂,一个web应用程序部署到服务器的集群的多个服务器上
*软件安装和配置软件在哪里,怎么做
*软件如何部署到基础设施脚骨部分描述的基础设施元素上是否清楚(一对一映射,每个服务器多个容器等)
*内存和CPU在运行于单块基础设施上的进程间如何分配是否清楚
*有容器和组件以主动-主动、主动-被动、热备用、冷备用等形态运行吗
*部署和回滚策略是否已经定义
*软件或基础设施出现故障时会发生什么
*跨站点的数据如何复制是否清楚
(11)运营和支持,描述人们如何运行、监测和管理你的软件
*软件如何为运营、支持团队提供监测和管理系统的能力是否清楚
*在架构的各个分层中这是如何实现的
*运营人员要如何诊断问题
*错误和信息的纪录在哪里
*更改配置是否需要重新启动
*有需要定期执行的手动管理任务吗
*旧数据需要定期归档吗
(12)、决策日记
简单纪录所做的重要决策,包括技术选择(产品、框架),整体架构(软件结构、架构风格、分解、模式)
*你为什么选择技术或框架X,而不是Y和Z
*你是怎么做的,产品评估还是概念证明
*你是否根据公司政策和企业架构战略而被迫做出关于X的决策
*你为什么选择所采用的软件架构?你考虑过其它那些选项,你怎么知道解决方案满足主要的非功能性需求