软件构造学习心得——第一部分(1、3讲)(上)

软件构造学习心得——第一部分(1、3讲)(上)

内容重点

软件构造的多维度视图
软件构造的阶段划分、各阶段的构造活动
内部/外部的质量指标
软件配置管理SCM与版本控制系统VCS
Git的结构、工作原理、基本指令

1.软件构造的多维度视图

多维视图
Moment view:特定时刻视图
Period view:过程变化视图

翻译参考:感谢精译
在这里插入图片描述
第一讲最重要
考试:一个东西属于哪个阶段哪个层面

2.软件构造的阶段划分、各阶段的构造活动

Build-time (构造阶段):

idea Þ requirement Þ design Þ code Þ installable / executable package

三个层面(build+moment+code)

---- how source code are logically organized
by basic program blocks such as functions, classes, methods, interfaces,
etc, and the dependencies among them
代码层面、逻辑组织

Three inter-related forms内联形式
词汇层面 高级语言
半结构化:近乎自然语言的风格+遵循特定的编程语法前者:方便程序员后者:方便编译器

语法层面 eg:ast抽象语法树(用结构树来代替半结构化源代码)
在这里插入图片描述
彻底结构化,将源代码变为一棵树,对树做各种操作==对源代码的修改

语义层面 eg:UML在这里插入图片描述
描述接口、类、属性、方法和其中的关系
基于图形或者由形式定义
在设计阶段通常是模型化的,并且将其转换为源代码
根据用于需求面向对象分析和设计的结果

Code churn 代码变化(build+period+code):

Lines added, modified or deleted to a file
from one version to another.

architecture(文件、包、库、静态链接)(build+moment+componet)

---- how source code are physically
organized by files, directories, packages, libraries, and the dependencies
among them
模块架构层面、物理组织

Source code are physically organized into files which further are organized by directories;
Files are encapsulated into packages and, logically,components and sub-systems.
Reusable modules are in the form of libraries.

静态链接发生在构造阶段
动态链接发生在运行阶段

版本、配置项(变化)(build+period+component)

各项软件实体随时间如何变化?
在这里插入图片描述

Runtime Views(运行阶段)

(snapshot)可执行程序以及逻辑实体在内存中如何呈现(run+code+moment)

Code-level view: source code ---- what do the in-memory states of an
executable program look like and how do program units (objects,
functions
, etc) interact with each other? 代码层面:逻辑实体在内存中如何呈现?

考试重点:代码快照图(会画,内容变化、引用变化,单双线圈)
在这里插入图片描述
Memory dump (内存信息转储)
硬盘上包含着内存内容复件的文件,在进程因信号或错误中止时产生

动态链接、库、包、配置文件、中间件、数据库、网络(run+moment+component)

Component-level view: architecture ---- how are software packages
deployed into physical environment (OS, network, hardware, etc) and how do they interact? 构件层面:物理实体在物理硬件环境中如何呈现?
在硬件架构中应用与交互
动态链接、库、包、配置文件、中间件、数据库、网络

执行跟踪、多线程(run+code+period)

逻辑实体在内存中如何随时间变化
UML明确不考怎么画
Execution tracing 执行跟踪 用日志方式记录程序执行的调用次序

事件日志、多进程、分布式处理(run+period+component)

物理实体在物理硬件环境中如何随时间变化
事件日志:系统层面
事件日志可以给系统管理员提供诊断和审查的有用信息。
每一类事件可以通过给定的独特代码来格式化并且输出人能够读懂的信息。

感谢学长翻译
在这里插入图片描述

阶段划分、构造活动

null Þ Code 编程、回顾、静态分析
– Programming / Coding (ADT/OOP)
– Review, static analysis/checking
Code Þ Component设计、编译、静态链接、打包、安装、清理
– Design (ADT/OOP; Reusability; Maintainability)
– Build: compile, static link, package, install, etc
Build-time Þ Run-time安装/部署,Debug,单元/整体测试
– Install / deploy
– Debug, unit/integration testing (Robustness and Correctness)
Moment Þ Period重构、版本控制、加载、动态链接、解释、执行
– Version control
– Loading, dynamic linking, execution (dumping, profiling, logging)
– Concurrent threads

3.内部/外部的质量指标

外部
speed ; ease of use——detected by its users
外部质量因素 影响 用户

内部
being modular; readable——only to developers
内部质量因素 影响 软件本身和它的开发者

外部质量最重要,但外部质量取决于内部质量

External quality factors

Correctness正确性:最重要的质量指标

按照预先定义的“规约”执行

每一层保证自己的正确性,同时假设其下层是正确的

测试和调试:发现不正确、消除不正确 ÞRobustness
防御式编程:在写程序的时候就确保正确性ÞRobustness
形式化方法:通过形式化验证发现问题
Þ Formal Language, Graduate courses

Robustness健壮性:针对异常情况的处理

出现异常时不要“崩溃”—— “abnormal case”
normal and abnormal case are always relative to a certain specification(规约),其中“normal”和“abnormal”是主观而非客观

未被specification覆盖的情况即为“异常情况”,所谓的“异常”,取决于spec的范畴;normal的不一定是想要的好情况,只要被规约考虑进去都叫normal

健壮性是对正确性的补充
区别
正确性:软件的行为要严格的符合规约中定义的行为
健壮性:出现规约定义之外的情形的时候,软件要做出恰当的反应

Extendibility (可扩展性)

对软件的规约进行修改,是否足够容易?

规模越大,扩展起来越不容易
为什么要扩展:应对变化

简约主义 a simple architecture will always be easier to adapt to changes than a complex one
分离主义a simple change will affect just one(or some) module

(ADT and OOP)/ (Modularity and adaptability)

Reusability (可复用性)

一次开发,多次使用
发现共性
不要repeat!

Compatibility (兼容性)

不同的软件系统之间相互可容易的集成
The key to compatibility lies in homogeneity of design (保持设计的同构性), and in agreeing on standardized conventions for inter-program communication
标准化:文件格式、数据结构、用户接口
更通用的方法是通过协议来实现更通用的兼容性

Efficiency性能

processor time, space occupied in internal and external memories, bandwidth used in communication devices硬件

性能毫无意义,除非有足够的正确性;对性能的关注 要与 其他质量属性进行折中;过度的优化导致软件不再适应变化和复用

Portability (可移植性)

软件可方便的在不同的技术环境之间移植,包括硬件、操作系统

Ease of use (易用性)

容易学、安装、操作、监控;给用户提供详细的指南
系统结构简明;客户目标明确

Functionality

每增加一小点功能,都确保其他质量属性不受到损失

过多的新功能容易带来一 致性的缺失,影响易用性;在质量提升技术的帮助下,可以在整个项目中保持质量水平不变,而不仅仅 是功能性;通常设计时,首先实现一小部分功能并保证各种质量目标,逐渐增加功能并继续保证质量目标

Timeliness (及时性)

及时发布

其他质量目标

可验证性:是否易于验证
完整性:软件系统保护其各种组件(程序和数据)免受未经授权的 访问和修改的能力。
可修复性:便于修复软件的缺点
经济性:同及时性相伴,是系统能够按照其分配的预算或低于预算完成的能力。

Internal quality factors

圈复杂度:用来衡量一个模块判定结构的复杂程度 。
耦合度:设计中追求高内聚和低耦合。
可读性、易理解性、清晰度、复杂度、体积

内部质量因素通常用作外部质量因素的部分度量。

折中

在这里插入图片描述
正确的软件开发过程中,开发者应该将不同质量因素之间如何做出折中的设计决策和标准明确的写下来
虽然需要折中,但“正确性”绝不能与其他质量因素折中

key

四个关键质量指标

面向对象如何提升质量
在这里插入图片描述
五个关键质量目标
可理解性:代码风格、注释、规约、命名
可复用性:
在这里插入图片描述
可维护性:
在这里插入图片描述

健壮性:

在这里插入图片描述

性能:设计模式、代码调优;时空复杂度;分布式;并行多线程

版本控制和git放在下篇 链接

写作于6月10日,7月2日再修订后发布博客

感谢
第一讲精译

热门文章

暂无图片
编程学习 ·

exe4j详细使用教程(附下载安装链接)

一、exe4j介绍 ​ exe4j是一个帮助你集成Java应用程序到Windows操作环境的java可执行文件生成工具,无论这些应用是用于服务器,还是图形用户界面(GUI)或命令行的应用程序。如果你想在任务管理器中及Windows XP分组的用户友好任务栏…
暂无图片
编程学习 ·

AUTOSAR从入门到精通100讲(126)-浅谈车载充电系统通信方案

01 引言 本文深入研究车载充电系统策略,设计出一套基于电动汽车电池管理系统与车载充电机的CAN通信协议,可供电动汽车设计人员参考借鉴。 02 电动汽车充电系统通讯网络 电动汽车整车控制系统中采用的是CAN总线通信方式,由一个整车内部高速CAN网络、内部低速CAN网络和一个充电…
暂无图片
编程学习 ·

CMake(九):生成器表达式

当运行CMake时,开发人员倾向于认为它是一个简单的步骤,需要读取项目的CMakeLists.txt文件,并生成相关的特定于生成器的项目文件集(例如Visual Studio解决方案和项目文件,Xcode项目,Unix Makefiles或Ninja输入文件)。然…
暂无图片
编程学习 ·

47.第十章 网络协议和管理配置 -- 网络配置(八)

4.3.3 route 命令 路由表管理命令 路由表主要构成: Destination: 目标网络ID,表示可以到达的目标网络ID,0.0.0.0/0 表示所有未知网络,又称为默认路由,优先级最低Genmask:目标网络对应的netmaskIface: 到达对应网络,应该从当前主机哪个网卡发送出来Gateway: 到达非直连的网络,…
暂无图片
编程学习 ·

元宇宙技术基础

请看图: 1、通过AR、VR等交互技术提升游戏的沉浸感 回顾游戏的发展历程,沉浸感的提升一直是技术突破的主要方向。从《愤怒的小鸟》到CSGO,游戏建模方式从2D到3D的提升使游戏中的物体呈现立体感。玩家在游戏中可以只有切换视角,进而提升沉浸…
暂无图片
编程学习 ·

flink的伪分布式搭建

一 flink的伪分布式搭建 1.1 执行架构图 1.Flink程序需要提交给 Job Client2.Job Client将作业提交给 Job Manager3.Job Manager负责协调资源分配和作业执行。 资源分配完成后,任务将提交给相应的 Task Manage。4.Task Manager启动一个线程以开始执行。Task Manage…
暂无图片
编程学习 ·

十进制正整数与二进制字符串的转换(C++)

Function one: //十进制数字转成二进制字符串 string Binary(int x) {string s "";while(x){if(x % 2 0) s 0 s;else s 1 s;x / 2;}return s; } Function two: //二进制字符串变为十进制数字 int Decimal(string s) {int num 0, …
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统: 微信小程序——辩论管理前台涉及技术:WXML 和 WXS…
暂无图片
编程学习 ·

树莓派驱动DHT11温湿度传感器

1,直接使用python库 代码如下 import RPi.GPIO as GPIO import dht11 import time import datetimeGPIO.setwarnings(True) GPIO.setmode(GPIO.BCM)instance dht11.DHT11(pin14)try:while True:result instance.read()if result.is_valid():print(ok)print(&quo…
暂无图片
编程学习 ·

ELK简介

ELK简介 ELK是三个开源软件的缩写,Elasticsearch、Logstash、Kibana。它们都是开源软件。不过现在还新增了一个 Beats,它是一个轻量级的日志收集处理工具(Agent),Beats 占用资源少,适合于在各个服务器上搜集日志后传输给 Logstas…
暂无图片
编程学习 ·

Linux 基础

通常大数据框架都部署在 Linux 服务器上,所以需要具备一定的 Linux 知识。Linux 书籍当中比较著名的是 《鸟哥私房菜》系列,这个系列很全面也很经典。但如果你希望能够快速地入门,这里推荐《Linux 就该这么学》,其网站上有免费的电…
暂无图片
编程学习 ·

Windows2022 无线网卡装不上驱动

想来 Windows2022 和 windows10/11 的驱动应该差不多通用的,但是死活装不上呢? 搜一下,有人提到 “默认安装时‘无线LAN服务’是关闭的,如果需要开启,只需要在“添加角色和功能”中,选择开启“无线LAN服务…
暂无图片
编程学习 ·

【嵌入式面试宝典】版本控制工具Git常用命令总结

目录 创建仓库 查看信息 版本回退 版本检出 远程库 Git 创建仓库 git initgit add <file> 可反复多次使用&#xff0c;添加多个文件git commit -m <message> 查看信息 git status 仓库当前的状态git diff 差异对比git log 历史记录&#xff0c;提交日志--pret…
暂无图片
编程学习 ·

用Postman生成测试报告

newman newman是一款基于nodejs开发的可以运行postman脚本的工具&#xff0c;使用Newman&#xff0c;可以直接从命令运行和测试postman集合。 安装nodejs 下载地址&#xff1a;https://nodejs.org/en/download/ 选择自己系统相对应的版本内容进行下载&#xff0c;然后傻瓜式安…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…