高级软件工程课程总结

2023-11-12

1.初识软件工程

1.1软件无处不在

“软件定义世界”成为社会发展的潮流,软件在人类生活中扮演者越来越重要的角色,软件已经成为一个极其重要的产业形态。

软件是软件工程的研究对象,也是软件工程的产品形态与客观存在。

工程是将理论和知识应用于实践的科学,其目的是经济有效地解决实际问题。

1.2软件的本质与特性

软件=程序+数据+文档

软件具有复杂性、一致性、可变性和不可见性等固有的内在特性,这是造成软件开发困难的根本原因。

1.3软件工程的产生与发展

根据美国standish集团的调查报告,软件项目的成功率大概在30%左右。

软件开发面临的挑战:交付的许多功能不是客户需要的,交付的日期没有保障,客户使用时发现许多bug,客户需求变化频繁,无力应对,无法预见软件的交付质量,对流程盲目遵从,忽视客户业务价值,开发团队专注于技术,忽视风险,无能力预测成本,导致预算超支,无法评估开发人员能力及工作进度,困扰于如何提升团队的能力与效率。

发展历史:

(1)史前阶段(1956-1967):软件开发没有方法可循;软件设计是开发人员头脑中的隐藏过程;60世纪中期的软件危机。

(2)   瀑布过程模型(1968-1982):1968年提出“软件工程”结构化开发方法,瀑布式软件生命周期模型成为典型。

(3)质量标准体系(1983-1995):面向对象开发方法,软件过程改进运动,CMM/ISO9000/SPICE等质量标准体系。

(4)20世纪90年代至今:敏捷开发方法流行,更紧密的团队协作,有效应对需求变化,快速交付高质量软件,迭代和增量开发过程。

1.4软件工程的基本概念

软件工程是:(1)将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护,即工程化应用到软件上;(2)对(1)中所述方法的研究。

软件工程的目标是创造出足够好的软件。

软件工程的基本要素:(1)过程(支持软件开发各个环节的控制和管理);(2)方法(完成软件开发任务的技术手段);(3)工具(为软件开发方法提供自动或半自动的软件支撑环境)。

软件开发活动:问题定义(构想文档,用户故事)》》需求开发(分析模型,软件需求规格说明)》》软件设计(设计模型,软件体系结构文档,软件详细设计文档)》》软件构造(源程序,目标代码,可执行构件)》》软件测试(测试规程,测试用例,测试报告)。

软件工程方法:面向过程(以算法为基本构造单元,强调自顶向下的功能分解,将功能和数据进行一定程度的分离)》》面向对象(以类为基本程序单元,对象是类的实例化,对象之间以消息传递为基本手段)》》面向构件(寻求比类的粒度更大的且易于复用的构件,期望实现软件的再工程)》》面向服务(在应用表现层次上将软件构件话,即应用业务过程由服务组成,而服务由构件组装而成)

软件工程工具:需求开发+软件设计(软件建模工具,数据库设计工具)》》软件构造(程序编辑器、编译器、解释器、调试器、集成开发环境)》》软件测试(单元测试工具,静态分析工具,自动化测试工具,性能测试工具,缺陷跟踪工具)》》软件维护(代码重构工具,逆向工程工具)》》开发管理(需求管理工具,项目管理工具,配置管理工具,测试管理工具)


软件开发的基本策略:软件复用(不仅仅是代码的复用,包括【库函数、类库,模板(文档、网页等),设计模式,组件,框架】),分而治之,逐步演进,优化折中。

例子:使用内存缓冲区方法,读取1468802字节文件时,2048和4096的缓冲大小对性能的提升不大,故选择2048的缓冲大小。

软件过程的Wasserman规范:抽象、软件建模方法、用户界面原型化、软件体系结构、软件过程、软件复用、度量、工具与集成环境。

1.5软件质量实现

软件质量:用户(功能质量)》》开发人员》》(结构质量)》》投资者(过程质量)。

软件过程(过程质量)》》软件产品(内部质量+外部质量)》》产品效用(使用质量)。

好的软件:正确的软件+软件运行正确;

ISO9126质量模型:外部和内部质量(功能性【适合性、准确性、互操作性、安全性】、可靠性【成熟性、容错性、可恢复性】、易用性【易理解性、易学习性、易操作性、吸引性】、效率/性能【时间特性、资源利用】、可维护性【易分析性、易改变性、稳定性、易测试性】、可移植性【适应性、易安装性、共存性、替换性】)

实现软件质量:高质量的设计+规范的编码+有效地测试。


2.编写高质量的软件代码

2.1编程过程与规范

软件编程是一个复杂而迭代的过程,它不仅仅是编写代码,还应该包括代码审查、单元测试、代码优化、集成测试等一系列工作。

软件编程规范是用特定语言相关的描写如何编写代码的规则集合。

Python 的import语句:先import内置模块,再import第三方模块,最后import自己开发项目中的其他模块;这几种模块中用空行分隔开来。

Python的列表推导:

[s['name'] for s in students if s['age']>18]

Python的条件表达式:

return s['name'] if s['age']>18 else s['nickname']

2.2良好的编程实践

模块化程序设计:将一个大的程序按功能分解成一系列小模块。

web应用系统:水平划分(用户管理、权限管理、...、业务功能),垂直划分(应用服务层、业务逻辑层、数据存储层);

基于易变和稳定:认识和识别变与不变的部分,并将之科学地分离开;

基于单一职责:类或者函数应该只做一件事,并且做好这件事;

模块设计》》开发模块之间的接口》》

2.3Python集成开发环境

PyCharm:涉及较多web开发时使用。

2.4代码静态检查




Pykint安装与使用:

pip install -U pylint  #安装最新版的Pylint
pylint [options] module_or_package_or_file  #对模块/包/文件运行pykint
            --rcfile=<file>  指定检查的配置文件
	    --ignore=<file>  不进行检查的文件列表
            --disable=<msg ids>   关闭某种类型的检查
	    --f <format> 报告类型,如html
pylint --help-msg <msg-id>   #查看某种类型问题的帮助
pylint --generate-rcfile   #根据当前配置生成配置文件

类型:

C(Convertion,约定)

R(Refactor,重构)

W(Warning,警告)

E(Error,错误)

2.5代码性能分析

优化是对代码等价变换,使得变换后的代码运行结果与变换前的代码运行结果相同,但执行速度加快或存储开销减少。

改进算法,选择合适的数据结构:

良好的算法对性能起到关键作用,因此性能改进的首要点事对算法改进;

算法时间复杂性的排序依次是 O(1)<O(lgn)<O(nlgn)<O(n^2)<O(n^3)<O(n^k)<O(k^n)<O(n!);

对成员的查找访问等操作,字典(dictionary)要比列表(list)要快;

集合(set)的并、交、差的操作比列表(list)的迭代要快;

循环优化的基本原则:尽量减少循环过程中的计算量,在多重循环的时候,尽量将内层的计算提到上一层;

字符串的优化:Python的字符串对象是不可改变的。字符串连接的使用尽量使用join()而不是+。当对字符串可以使用正则表达式或内置函数处理时,选择内置函数;

使用列表解析和生成器表达式:列表解析要比在循环中重新构建一个新的list更为高效,因此可以利用这一特性来提高运行效率。

2.6结对编程实践

结对编程是由两名程序员在同一台电脑上结对编写解决同一问题的代码。


3.单元测试

3.1单元测试概述

单元测试是对软件中的最小可测试单元进行检查和验证。

程序=UT+CODE,测试人员有权利对没有做过UT的代码说No。

单元测试:模块接口(对通过所有被测模块的数据流进行测试),局部数据结构(检查模块中的数据结构是否正确的定义和使用),边界条件(检查数据流或控制流中条件或数据处于边界),独立路径(检查由于计算错误、判定错误、控制流错误导致的程序错误),出错处理(检查可能引发错误处理的路径以及进行错误处理的路径)。

单元测试原则:快速的,独立的,可重复的,自我验证的,及时的。

指标:测试通过率,测试覆盖率。

代码覆盖率:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。

单元测试方法:静态测试,动态测试。

Mock测试:在测试过程中对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象(即Mock对象)来创建以便测试的方法。例如,真实对象具有不可确定的行为(产生不可预测的结果),真实对象很难被创建(如具体的web容器),真实对象的某些行为很难触发(如网络错误),真实情况令程序额运行速度缓慢,真实对象有用户界面,测试需要询问真实对象它是如何被调用的,真实对象实际上并不存在。

3.2黑盒测试方法

黑盒测试(black box testing):又称功能测试,它将测试对象看作一个黑盒子,完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。

测试用例(测试集:测试用例值的集合):测试用例值,期望结果,前缀值,后缀值。

测试用例设计:具有代表性和典型性;寻求系统设计和功能设计的弱点;既有正确输入也有错误或异常输入;考虑用户实际的诸多使用场景。

黑盒测试技术:等价类划分,边界值分析,因果图决策表,场景法,组合设计法,状态转换测试。

等价类划分是将输入域划分成尽可能少的若干子域,在划分中要求每个子域两两互不相交,每个子域称为一个等价类。

变量的等价类==》字符串:在规定了输入数据必须遵守的规则情况下,可确定一个有效等价类(符合规则)和若干无效等价类(从不同角度违反规则)。枚举:若规定输入数据是=一组值(假定N个),并且程序要对每一个输入值分别处理,可确定N个有效等价类和一个无效等价类。数组:数组是一组有相同类型的元素的集合,数组长度及其类型都可以作为等价类划分的依据。

测试用例生成:测试对象通常有多个输入参数,如何对这些参数等价类进行组合测试,来保证等价类的覆盖率,是测试用例设计首先需要考虑得问题。

边界值分析:基本思想【故障往往出现在程序输入变量的边界值附近】。

健壮性测试:是作为边界值分析的一个简单的扩充,它除了对变量的5个边界值分析取值外,还要增加一个略大于最大值(max+)以及略小于最小值(min-)的取值,检查超过极限时系统的情况。


3.3白盒测试方法

白盒测试(White Box Testing):又称结构测试,它把测试对象看做一个透明的盒子,允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有的逻辑路径进行测试。

测试覆盖标准:测试需求,覆盖标准,测试覆盖,覆盖程度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高级软件工程课程总结 的相关文章

  • 昨天看了一本c#的教程

    昨天看了一本c 的教程 昨天看了一本c 的教程 那是本很早前就买了的书 虽然也不是没看过 但是昨天重新看了下 感觉收获还是不小的 从c 的类型 到它的方法 还有就是面向对象的一些概念 覆盖 继承 我不敢说我学到了多少 但是我很喜欢 post
  • 2024年计算机专业毕业设计题目大全-吊炸天的2024届计算机毕业设计选题推荐参考

    作者 计算机源码社 个人简介 本人七年开发经验 擅长Java Python PHP NET 微信小程序 爬虫 大数据等 大家有这一块的问题可以一起交流 学习资料 程序开发 技术解答 文档报告 JavaWeb项目 微信小程序项目 Python
  • openwrt编译ipk包提示缺少feeds.mk文件

    问题具体表现如下 这个问题困扰了我两个多星期 总算解决了 解决方案如下 首先 先应该把配置菜单调好 我的硬件是7620a 要编译的ipk包为helloworld 所以应该使用 make menuconfig命令进入配置菜单 进入后 将1号框
  • TCP/IP基础&pysocket

    TCP IP基础 pysocket 1 网络简述 网络 计算机网络功能主要包括实现资源共享 实现数据信息的快速传递 网络协议 在网络数据传输中 都遵循的执行规则 规范 C S 服务器 Server 向客户端提供资源 保存客户端数据 处理客户
  • 【华为OD机试真题 python】支持优先级的队列【2023 Q2

    题目描述 支持优先级的队列 实现一个支持优先级的队列 高优先级先出队列 同优先级时先进先出 如果两个输入数据和优先级都相同 则后一个数据不入队列被丢弃 队列存储的数据内容是一个整数 输入描述 一组待存入队列的数据 包含内容和优先级 输出描述
  • PHP SQL实现公司数据库的增删改查

    文末附文件 题目要求 Use the following SQL DDL statements to create the six tables required for this project Note that you need to
  • python之celery

    Celery是由Python开发的一个简单 灵活 可靠的处理大量任务的分发系统 可以实时处理任务 也可以定时异步处理任务 每次分发任务后得到一个ID 然后根据这个ID查询任务执行情况 安装 pip install celery eventl
  • sqllabs详解与知识点汇总(内含代码审计)

    sqllabs 1 65 详解 关于注释符的详解 SQL注入注释符 使用条件及其他注释方式的探索 impulse 博客园 cnblogs com HTTP请求方法 GET 对比 POST HTTP 方法 GET 对比 POST 菜鸟教程 r
  • docker基本操作

    Docker官方建议在Ubuntu中安装 建议安装在CentOS7 X以上版本 1 安装Docker 1 yum包更新到最新 sudo yum update 2 安装需要的软件包 yum util提供yum config manager功能
  • java.math.BigDecimal用法

    Java在java math包中提供的API类BigDecimal 用来对超过16位有效位的数进行精确的运算 双精度浮点型变量double可以处理16位有效数 在实际应用中 需要对更大或者更小的数进行运算和处理 float和double只能
  • 继承和多态的内存图解

    今天被继承和多态困扰 在CSDN上找了好几个内存分配讲解 个人感觉不全吧 就把他们做了个整合 讲解的是多态的方法和成员调用和继承中的方法和变量的调用 什么是多态 同一个对象 在不同时刻表现出来的不同形态 多态的前提 要有继承或实现关系要有方
  • web robotframework xpath元素定位

    1 定位购买按钮 在这里 我写的是 td class text center button class ng isolate scope span text 购买 提示找不到元素 原因是button的class值 我把他改成class bt
  • 调试osgEarth(七)地图map图层的构建过程-添加layer(4)--打开ImageLayer

    继续调试 创建空影像 建了个1x1x1的空图片 这个也比较简单 ImageLayer建立了一个1x1x1的空图片
  • spring boot 2.x 应用可视化监控

    来源 简书 内容 应用可视化监控 prometheus grafana https www jianshu com p 7ecb57a3f326 修改为spring boot 2 0时 1 首先 添加依赖如下依赖
  • E: Unable to locate package kubelet 解决

    昨天搭建k8s集群环境时 安装报错 显示无法找到 1 打开vim etc apt sources list 写入阿里云的源 deb https mirrors aliyun com kubernetes apt kubernetes xen
  • aiVMS----CentOS7.6安装RabbitMQ安装

    entOS7 6安装RabbitMQ安装 安装一 快速的安装方法是使用Package Cloud提供的脚本 Package Cloud也可以用于通过yum安装最新的Erlang版本 使用PackageCloud安装RabbitMQ 官网参考
  • table问题总结

    前景 最近开发需要原生table 之前使用很少用 了解比较少 这次对于样式和功能要求也比较高 对与遇到的问题做下总结和分享 问题与解决方案 行高不定问题 描述 表格每一行的高度不确定 会自动适配 设置行高和高度均无效 产生原因 表格设置了固
  • R语言用ROCR包出现载入程辑包:‘gplots’ The following object is masked from ‘package:stats’错误

    谢谢点进来 如果你觉得有帮助 麻烦点个赞 假如在R studio运行的代码是这样的 library ROCR 首先看到这个问题的时候 我认为没有安装gplots包 可以按下图所示看是否有该包 如果没有则点击install输入包名安装 奇怪的
  • Ledger of Harms

    Under immense pressure to prioritize engagement and growth technology platforms have created a race for human attention

随机推荐

  • JavaScript快速排序算法

  • C#单线程和多线程端口扫描器

    C 单线程和多线程端口扫描器 一 项目创建以及页面设计 一 项目新建 二 页面设计 二 单线程实现端口扫描 一 代码实现 二 运行结果 三 多线程实现端口扫描 一 程序实现 二 运行结果 四 总结 五 参考资料 一 项目创建以及页面设计 一
  • JCenter下载太慢?教你修改Maven仓库地址为国内镜像

    转载自 http www yrom net blog 2015 02 07 change gradle maven repo url 近来迁移了一些项目到Android Studio 采用Gradle构建确实比原来的Ant方便许多 但是编译
  • StyleCLIP学习笔记

    https github com orpatashnik StyleCLIP The main inferece script is placed in mapper scripts inference py Inference argum
  • 安装librocksdb.so.4.1的共享库

    安装librocksdb so 4 1的共享库 注 以下命令需在root模式下进行 1 clone rocksDB 命令行运行git clone https github com facebook rocksdb git 2 切换到4 1
  • Java调试原理初探

    对于所有程序员 程序调试是一项必备的技能 在java程序中 最简单的就是通过 System out println 来打印输出各种变量来发现问题 而用的最多的莫过于通过各种调试器来进行调试 如图一所示的eclipse调试器 甚至还可以进行远
  • 微信号正则校验

    由于最近有朋友做微信开发 让我帮其找一个微信号正则校验 代码 本来以为网上会有很多 但一搜才发现 没有一个可用的校验微信号的正则 所以只好自己写一个了 废话不多说 直接贴结果 首先我们要明确微信号规则 微信账号仅支持6 20个字母 数字 下
  • linux内核分析笔记----内核同步

    内核同步讲的比较多了 我也就不太啰嗦了 先说一些概念 然后就是方法 同步就是避免并发和防止竞争条件 有关临界区的例子我就不举了 随便一本操作系统的书上都有 锁机制的提出也算解决了一些问题 我们待会再说 现在只要知道锁的使用是自愿的 非强制的
  • 【机器学习】鸢尾花Iris数据集进行线性分类

    目录 一 实验准备 二 线性分类 1 原始数据 2 训练模型 3 绘制决策边界 4 设置参数C 三 鸢尾花数据集分类 1 取萼片的长宽作特征分类 2 取花瓣的长宽作特征分类 四 参考 一 实验准备 安装python3 6 3 7 Anaco
  • crypto++加密算法库的编译和在项目中的使用

    简述 Crypto Library是一个免费的C 类加密方案库 该库包含以下算法 算法 名称 认证的加密方案 GCM CCM EAX 高速流密码 ChaCha 8 12 20 Panama Sosemanuk Salsa20 8 12 20
  • QT Modbus RTU调试助手(包含算法实现CRC MODBUS16校验)

    QT Modbus RTU调试助手 在类构造函数中将UI初始化和串口对象定义以及查找串口 串口设置 串口接受 QT延时函数 CRC校验 发送串口数据函数 总结 在类构造函数中将UI初始化和串口对象定义以及查找串口 foreach const
  • ElementUI el-table组件 树形数据不对齐的解决方案

    ElementPlus的el table组件在展示树状数据时 左侧的展开小箭头在部分情况下会导致第一列数据起始位置不对齐 添加一段css即可解决 环境 Vue3 0 Element Plus 1 0 2 beta 55 先看默认效果 效果图
  • Exception starting filter struts2 java.lang.NullPointerException 解决方法

  • springboot线程池ThreadPoolTaskExecutor使用

    https mp weixin qq com s 3DRBX9Wb OA NIfPXZjcw 前言 程池ThreadPoolExecutor 而用的是Spring Boot项目 可以用Spring提供的对ThreadPoolExecutor
  • Github搭建个人博客(2019最新版,亲测)

    版权声明 本文为徐代龙原创文章 未经徐代龙允许不得转载 https blog csdn net xudailong blog article details 78762262 敲黑板 如何写一个自己的小程序并上线 一 前言 建议 慢慢看 也
  • Windows Java环境变量设置 & Maven环境变量设置 & 常用环境问题设置

    Windows Java环境变量设置 Maven环境变量设置 常用环境问题设置 1 Java环境变量设置 Java8环境变量设置 1 进入环境变量设置界面 我的电脑 gt 属性 gt 高级系统设置 gt 环境变量 2 创建系统变量JAVA
  • 强化学习原理与python实现原理pdf_深度强化学习笔记——DQN原理与实现(pytorch+gym)...

    概要 本文主要总结深度强化学习中无模型基于值方法的DQN算法 说明其算法原理并用该算法在gym提供的cartpole上进行实现 有任何不准确或错误的地方望指正 1 DQN Deep Q Network 基本原理 DQN算法相当于对传统Q l
  • Python爬取的BOSS直聘的数据

    临近年末 互联网寒冬 的来临让大家倍感压力 大家纷纷感叹寒冬将至 但是 越是这个时候 越要明确自己的奋斗目标 不断的充实自己 提高自己的能力 为找工作打下坚实的基础 本次我们爬取了招聘网站上关于计算机视觉方向的招聘信息 并对于招聘信息进行分
  • 如何免费使用ChatGPT

    前段时间想使用一下CahtGPT产品说明文档 找了一大圈国内基本都收费或者需要开通会员的 需要使用所谓的算力 其实相对于所谓的算力和会员也可以理解 做一款产品是需要营利的 只是这个费用太贵了 可以对比一下官方报价 国外 国内 ChatGPT
  • 高级软件工程课程总结

    1 初识软件工程 1 1软件无处不在 软件定义世界 成为社会发展的潮流 软件在人类生活中扮演者越来越重要的角色 软件已经成为一个极其重要的产业形态 软件是软件工程的研究对象 也是软件工程的产品形态与客观存在 工程是将理论和知识应用于实践的科