汽车软件架构学习笔记(一):九问软件架构
Q1.什么是软件架构?
软件架构的定义没有一个统一的标准,各有各的看法。但可以参考来自SEI的定义:
计算系统的软件架构是解释该系统所需要的结构体的集合,包括软件元素、元素的交互,以及两者各自的属性。
可以从 2 个维度描述:
- 静态结构,包括层次、模块划分以及更细节的数据结构体等等,代表一个系统的骨架,就如一幢建筑物的框架;
- 动态行为,包括模块间的通信、交互机制,代表系统的行为。
Q2.什么属于架构层面的内容?
架构一般指的是软件系统宏观层面的设计部分,前面讲到架构是骨架,关注于整体,一般不会关注于细节。
但同时,如果有一些元素的设计会影响到整体系统的质量属性,那么它也应该被拉进架构设计中讨论。 比如,嵌入式系统当中,实时性是一个很重要的质量属性,那么对于通信协议的技术选型也就是非常重要的。比如,一个汽车软件架构师,你说不你懂CAN协议终归不合适。
Q3.架构重要吗?
重要,关系到软件系统的成败。
有下面的作用:
- 扮演着系统骨架的角色
- 影响质量属性
- 与软件功能正交 决定系统能做什么
- 更加重要的是决定系统不做什么
尤其是最后一点非常重要,比如在汽车自动驾驶当中,自动化程度是分等级的,假如你设计一个L2级别自动驾驶系统,你就应该将L3级别以上功能排除在外,通过 ODD 进行准确的界定。
Q4. 什么时候需要架构?
可以不需要架构,这个叫大泥球模式。
说起来也挺尴尬的,很多时候我们发现一个软件团队没有架构师、没有架构也能正常开发并正常实现所有功能。但没有架构设计的系统其实也有架构,它代表一种功能优先设计的模式,就像一个大泥球一样越滚越大。
当然,正常的开发者都知道很多情况需要架构的,比如:
- 实现特别难的解决方案
- 非常容易失败的高度复杂项目
- 非常难以满足的质量属性的系统
- 需要统筹的产品线
无非就 2 点:
越难的项目越需要架构设计
产品平台需要架构设计,比如一家自动驾驶企业,如果做L3,也做L4,最理想的状态就是他们的产品基于同一套架构,这样能够避免资源冗余和浪费。
Q5. 什么是推定架构和参考架构?
推定架构(presumptive architecture) 是行业占主导地位的架构族,不采用会需要特别做说明的技术。比如你做汽车ECU软件开发,如果你不采用 CP Autosar,你得准备好来自各个方面的质问,你要说明你不选它的逻辑是什么。
参考架构(reference architecture) 是针对某个问题在架构方面的解决方案。推定架构是事实标准,参考架构想成为事实标准。
自动驾驶软件架构有一些参考架构,但它只做参考用,比如下面这张图。
Q6. 如何在一个项目中运用架构?
有几种选择:
- 不运用任何架构
- 从0到1严肃的正向设计开发
- 在原有架构上进行重构与提升
3 种方式都很普遍。
Q7. 企业架构师与应用架构师的区别?
企业架构师是站在企业的角度负责多个应用系统的开发,不负责单个系统的具体功能,专注于打造企业内的软件生态系统,促进每个软件系统为企业贡献力量。
应用架构师关注于单个软件系统的架构设计。
我举个例子。智能汽车当中现在有智能网联、智能驾驶、智能座舱 3 大系统。企业架构师的职责就是打造整个智能汽车软件生态。应用架构师可以只负责其中一个系统或者子系统的架构。
8.康威定律如何描述软件架构?
任何设计系统的组织…必然会产生以下设计结果,其结构就是该组织沟通结构的写照。
我比较认同一种说明,架构设计本质就是一种社交行为。和客户、用户、项目经理、产品经理、测试人员、开发人员、其他相关人员
9.软件架构的另外一个定义?
前面讲到软件架构没有统一标准,另外一个比较有名的定义来自 Martin Fowler 与 Ralph Jonson 之间的讨论。
架构是必须在项目早期作出的一组设计决策。
也被称为“那些在项目后期难以改变的内容”。
但我个人认为,这种说法只是为了强调架构设计在软件开发过程中应该越早介入越好,是一种理想的状态。
备注:本文观点大多来自《恰如其分的软件架构》。
汽车软件架构学习笔记(一):九问软件架构相关推荐
- Intel VT学习笔记(九)—— EPT应用示例
Intel VT学习笔记(九)-- EPT应用示例 内存保护 EPT violation 代码实现 参考资料 内存保护 描述:尝试使用EPT将一块特定的物理内存保护起来. 先来选择一块物理地址,那么这 ...
- Windows进程与线程学习笔记(九)—— 线程优先级/进程挂靠/跨进程读写
Windows进程与线程学习笔记(九)-- 线程优先级/进程挂靠/跨进程读写 要点回顾 线程优先级 调度链表 分析 KiFindReadyThread 分析 KiSwapThread 总结 进程挂靠 ...
- Windows保护模式学习笔记(九)—— 2-9-9-12分页
Windows保护模式学习笔记(九)-- 2-9-9-12分页 要点回顾 10-10-12分页 原理 环境配置 2-9-9-12分页 原理 PDPTE PDE PTE XD/NX标志位 环境配置 实验 ...
- OpenCV学习笔记(九): 漫水填充:floodFill()
OpenCV学习笔记(九): 漫水填充:floodFill() 定义: 漫水填充法是一种用特定的颜色填充联通区域(自动选中了和种子点相连的区域,接着将该区域替换成指定的颜色)通过设置可连通像素的上下限 ...
- QT学习笔记(九):遍历容器-迭代器(iterators)
QT学习笔记(九):遍历容器-迭代器(iterators) 遍历容器 : 1.Jave风格: 2.STL风格: 3.foreach 关键字: 遍历容器 : 遍历一个容器可以使用迭代器(iterator ...
- MATLAB学习笔记(九)
MATLAB学习笔记(九) 一.三维曲线 1.1 plot3函数 1.2 fplot3函数 二.三维曲面 2.1 平面网格数据的生成 2.2 绘制三维曲面的函数 2.3 绘制标准三维曲面 三.图形修饰 ...
- C++/C学习笔记(九)
C++/C学习笔记(九) --学习和使用STL 1.STL简介 STL(Standard Template Library)是C++标准库的最主要和最重要的组成部分.STL是一个标准规范,只是为容器. ...
- Python数据挖掘学习笔记】九.回归模型LinearRegression简单分析氧化物数据
#2018-03-23 16:26:20 March Friday the 12 week, the 082 day SZ SSMR [Python数据挖掘学习笔记]九.回归模型LinearRegre ...
- python学习笔记(九)之语句1
python学习笔记(九)之语句1 print python2中,print是一个语句,python3中它是一个函数. 实例1: >> print "hello,world!&q ...
- LabView学习笔记(九):数组与簇
Labview学习笔记: LabView学习笔记(一):基础介绍 LabView学习笔记(二):滤波器实验 LabView学习笔记(三):基本控件 LabView学习笔记(四):动态数据类型 LabV ...
最新文章
- CentOS 漏洞修补
- python有必要学吗-Python这么火,要不要学?听听华为工程师怎么说...
- Java_io体系之RandomAccessFile简介、走进源码及示例——20
- dotnet Blazor 用 C# 控制界面行为
- android 人脸识别_小模型,高精度!小视科技推出极致轻量型人脸识别SDK
- 基于Zookeeper使用ZkClient实现分布式锁
- Linux内核深入理解中断和异常(6):IRQs的非早期初始化
- sqlserver与mysql的一些不同的T-SQL语句
- VMware 虚拟机安装 CentOS 7.2 系统
- WeTest质量云平台,618盛惠活动开启
- 数理逻辑习题集(9)
- 计算机专业学生参加igem,喜讯:深圳大学iGEM团队再获金奖,并获得最佳单项奖,为今年大中华地区iGEM参赛队伍最佳成绩!-深圳大学生命与海洋科学学院...
- 拖拉机(寒假每日一题 4)
- 为什么需要API接口开发?
- SpringMVC一:概述、环境搭建及开发流程
- 步进电机正反转实验_只用一个接触器实现三相电机正反转
- Centos 7.0 安装Mono 3.4 和 Jexus 5.6
- 计算机高中教育日志,高中信息技术研修日志
- Vue 2 即将成为过去
- 人工智能在生物学和神经科学中的应用
热门文章
- python爬虫采集财经数据
- java泛型:T与?的使用及区别
- SQL创建数据库与写入数据的全过程
- 如何对谷歌地图的火星坐标进行纠偏校正
- 人性:《少年pi的奇幻漂流》和《一九四二》连看小感
- [快速学会Swift第三方库] SwiftyJSON篇
- android 11.0 去掉音量键电源键组合键的屏幕截图功能
- 计算机中的文档地址怎么填写,电脑中我的文档属性中没有位置选项如何修改存储位置...
- Restarting ..Terminated
- UnityC# MD5验证