软件工程基础


1 软件与软件的概念

软件的概念、特性、分类

概念

  • 具有产品和产品生产载体的双重作用。

  • 软件 = 程序 + 数据 + 文档

特性

形态特性(无形)

智能特性(智力产品)

开发特性(尚未实现自动化、人力开发)

质量特性(没有完美的)

生产特性(复制简单、边际成本低)

管理特性

环境特性(对环境有依赖)

维护特性

废弃特性

应用特性

分类

系统、应用、支撑、可复用

软件危机

爆发于1960s,软件发展速度太慢了。

催生==软件工程== - 最终实现软件的工业化生产

软件的质量特性

功能性、可靠性、可使用性、效率、可维护性、可移植性

软件生存期

软件定义时期

做什么

问题定义、可行性研究、需求分析

软件开发时期

怎么做

概要设计、详细设计、编码、测试

运维

DevOps

典型文档

软件需求规格说明书、项目计划、软件测试计划、软件设计说明书、用户手册。

软件生存期模型

常见的软件生存期模型

瀑布模型:按部就班、一个阶段完成再进行下一个阶段。

快速原型模型、增量模型、螺旋模型、喷泉、统一过程

敏捷模型、极限编程

面向对象

  • 面向对象 = 对象+类+继承+消息通信
  • 接口:对象向外界提供的方法,外界可以通过这些方法对对象进行交互。

  • 多态:对某个请求提供服务的对象的不同,达到不同的行为,称为多态;在子类中覆盖父类的方法实现多态。

统一建模语言UML

面向对象的建模语言:Unified Modeling Language;可视化界面、不依赖于开发过程。类的建模、属性设计、消息传递。


2 文件和文件系统

文件

分类

文本文件、二进制文件;有结构文件、无结构文件;系统文件、用户文件、库文件;源文件、目标文件、可执行文件(目标代码+链接库lib、dll文件)

文件系统

作用

  • 管理文件、目录、磁盘存储空间的一套控制器。

  • 对对象操纵和管理的软件集合。

文件系统的接口

  • 命令接口:用户与文件系统直接交互的接口

  • 程序接口:程序中调用接口来操纵文件

文件的逻辑结构

顺序文件、索引文件。

文件控制块(File Control Block)

  • 基本信息:名字、物理位置、逻辑结构、物理结构

  • 控制信息:权限等

  • 使用信息:建立日期、修改日期等

一个硬盘格式化之后,就会划分出很大一块的信息表来存放这些metadata信息。

文件共享

系统始终允许多个用户或晋城共享同一份文件。这样,在系统中只需保留该共享文件的一份副本即可。

网盘极速秒传功能

你上传的文件,生成一个哈希值;检测到跟别人的文件的哈希值一样,就不需要完整上传你的文件了;直接在后台把别人文件和你相同的内容写入到你的网盘的namespace就行了。


3 系统服务

Windows服务

  • Windows服务,过去叫NT服务,允许用户创建可在其自身windows会话中长时间运行的可执行程序,不显示任何用户界面。本质就是一个进程。
  • services.msc来查看windows服务。

Windows服务应用程序

  • 服务要符合服务控制管理器==SCM==的接口规则
  • 服务可以由用户手动启动,也可以由应用程序使用服务函数来启动

  • 即使没有用户登录到系统,也可以执行服务

使用SCM提供的函数来构建服务

(符合微软提供的框架来构建服务,要实现规定的全部接口)

  • 服务计划

为一个或多个服务提供可执行代码的程序

  • 服务配置程序

查询或修改服务数据库的程序

  • 服务控制程序

启动和控制服务

服务写好之后,要在服务管理程序中进行注册(services.exe)

Linux系统服务

启动后在后台运行,等待用户或其它应用程序来调用。

分类

系统服务、网络服务

服务管理方式

  • 通过/etc/init.d目录中的启动脚本来管理:

所有独立服务启动文件均存储在/etc/init.d目录下,通过 start,stop,status,restart来管理服务

  • 通过servicesystemctl来管理

本质也是调用/etc/nint.d来管理。

  • 修改/etc/rc.d/rc.local文件

  • 设置服务自启动,修改/etc/.rc.d/rc.local文件,在文件中加入服务的启动命令。

  • 这个文件是系统启动的时候,在输入用户名密码之前,最后读取的文件,(/etc/rc.d/rc.local/etc/rc.local是软链接,改哪个都行)

  • 这个文件中有啥命令,都会在系统启动时运行。

守护进程Daemon

分类
  • stand_alone
  • 独立的启动,这类进程可以自行启动不必透过其他的机制,启动后就一直占用内存和系统资源。响应速度较快。
  • 常见的有:httpd、vsftpd(FTP)、docker.service等
  • super daemon
  • 一个统一的super daemon来负责唤起其他系统服务。
  • 没有客户端请求时,各项服务都是未启动的状态,等到有客户端的请求时,super daemon才会唤醒相应的服务;客户端联机结束后就会结束该进程。比如telnet。
daemon工作形态
  • singal-control

这种daemon通过消息通信来管理,只要有任何客户端的请求进来,他就会立即启动去处理,比如打印机的服务cupsd。

  • interval-control

这类的daemon是每隔一段时间就主动去运行某项工作,需要配置好间隔时间,比如crontab。

daemon的启动脚本和启动方式
  • /etc/init.d

系统上几乎所有的服务启动脚本都放在这里,CentOS中是在,/etc/rc.d/init.d/,不过也是连接到这里的

  • /etc/sysconfig/*

各服务的初始化环境配置文件

  • /etc/xinetd.conf, /etc/xinetd.d

super daemon的主要配置文件

  • /etc/*

各个服务的配置文件。

  • /var/lib/*

各个服务产生的数据库放到这里

  • /var/run/

各个服务进程的PID记录处。


数据库基础

组成

数据库、数据库管理系统DBMS、数据库管理员、应用程序

关系型数据库

所谓关系,就是二维表、行和列组成。

  • 行 -- 记录,一行数据就是一条记录。

  • 列 -- 字段,一列字段的数据类型一致。


Java基础

Package 命名规则

由于Java面向对象的特性,每名Java开发人员都可以编写属于自己的Java Package,为了保障每个Java Package命名的唯一性,在最新的Java编程规范中,要求开发人员在自己定义的包名前加上唯一的前缀。由于互联网上的域名称是不会重复的,所以多数开发人员采用自己公司在互联网上的域名称作为自己程序包的唯一前缀。例如: com.sun.swt.……

从而,我们知道,一般公司命名为com.公司名.项目名.模块名....

那,我们个人的项目又怎么命名呢?

经过我对"个人的"单词搜索,有"individual、personal、private、one-man",进一步对以上4个单词词意的分析,并在保证了唯一性,使用每个单词的前4个字母作为前缀,正好和"com"也做了区分。如下:

Java包命名约定

indi

个体项目,指个人发起,但非自己独自完成的项目,可公开或私有项目,copyright主要属于发起者。

包名为indi.发起者名.项目名.模块名.……

pers

个人项目,指个人发起,独自完成,可分享的项目,copyright主要属于个人。

包名为pers.个人名.项目名.模块名.……

priv

私有项目,指个人发起,独自完成,非公开的私人使用的项目,copyright属于个人。

包名为priv.个人名.项目名.模块名.……

onem

与"indi"相同,推荐使用"indi"。

另外,我为了区分团队项目和前面所说项目的区分,还有了一下扩展:

team

团队项目,指由团队发起,并由该团队开发的项目,copyright属于该团队所有。

包名为team.团队名.项目名.模块名.……

com

公司项目,copyright由项目发起的公司所有。

包名为com.公司名.项目名.模块名.……

两个Java代码示例

package com.ms.test;

public class JavaDemo {
    /*
     * java中,每个class中,都有属性和方法
     * 属性就是对象当前的静态数据
     * 方法是操作这些数据或对象本身的
     */

    /*
     * 属性部分
     * private -- 私有数据,一般数据都是私有的
     */

    /*
     * 整数:byte(1字节),short(2字节),int(4个字节),long(8个字节),unsigned int(无符号)
     * 小数:float(单精度,4字节),double(双精度,8字节)
     * 布尔值 boolean
     * 字符串 String
     */
    private String name;
    private int age;

    //构造方法 -- 对象产生后的实例化过程,所调用的方法

    //不指定,默认方法
    public JavaDemo() {
    }

    //指定要传参进去
    public JavaDemo(String name, int age){
        this.name = name;
        this.age = age;
    }


    //定义一个方法,提供接口获取这个类产生的对象的age
    public int getAge() {
        return this.age;
    }

    //定义一个方法,在外部修改该对象的age属性
    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /*
     * main() -- 写一个main函数,左手alt,右手/,自动补齐
     */
    public static void main(String[] args) {

        System.out.println("HelloWorld");
        JavaDemo jd = new JavaDemo("zhangsan", 28);
        System.out.println("name = " + jd.getName() + "\n" + "age = " + jd.getAge());       
    }
}
package com.ms.test;

public class BmiFunc {
    /*
     * Bmi = 体重/(身高平方)
     * Bmi < 18.5 : too thin
     * Bmi < 24: normal
     * Bmi < 28: a little overweight
     * Bmi < 32: overweight
     * or : heavily over weight
     */
    private float height;
    private float weight;

    //构造函数
    public BmiFunc() {

    }

    public BmiFunc(float weight, float height) {
        this.weight = weight;
        this.height = height;
    }

    //获取数据的接口
    public float getHeight() {
        return this.height;
    }

    public float getWeight() {
        return this.weight;
    }

    //设定数据的方法
    public void setHeight(float h) {
        this.height = h;
    }

    public void setWeight(float w) {
        this.weight = w;
    }

    //计算bmi指数
    public float bmiRate() {
        return this.weight / (this.height * this.height);
    }

    // 判断bmi
    public String bmiJudge() {
        float bj = bmiRate();
        if (bj <= 18.5) {
            return "1";
        } else if (bj <= 24.0) {
            return "2";
        } else if (bj <= 28.0) {
            return "3";
        }else {
            return "4";
        }
    }
}

Devops基础

是什么

  • 是一组过程、方法、与系统的统称,用于促进==开发、运营和质量团队==之间的沟通协作与整合。

  • 通过自动化软件交付和架构变更的实施,使得频繁的构建、测试、发布、更加快捷和可靠

  • 包括:代码托管、项目管理、测试管理、持续集成、制品库等。研发团队可以在云端高效协同,实践敏捷开发与DevOps,提升软件交付质量与速度。

软件测试基础

测试环境基本知识

  • 测试计划 - 测试设计 - 测试实施
  • 测试计划是确定测试各阶段的目标策略
  • 测试设计是制定方案
  • 测试项目管理软件:
  • JIRA
  • 禅道

测试方法

测试方法分类

  • 按照测试用例设计方法来分:黑盒、白盒、灰盒
  • 黑盒:等价类、边界值、因果图、错误推测、判定表、正交时延、功能图、场景
  • 白盒:代码检查、静态结构分析、静态质量分析、逻辑覆盖、基本路径测试

  • 功能测试:主要是用黑盒测试方法,检查软件功能是否符合要求。

  • 冒烟测试:BVT,对基本功能特别是关键功能测试,确认软件基本功能正常。测试人员测试的版本必须经过冒烟测试才能进行后续。即版本确认性测试。
  • 回归测试:发生修改后,重新测试先前的测试内容,确保修改没影响先前的功能。

  • 场景测试:基本流、备选流、异常流

  • 状态转移图测试用例设计
  • 需求 - 有限状态机 - 看看这些有限状态能不能达到
  • 组合测试
  • 两因素组合测试(配对测试):生成的测试集可以覆盖任意两个变量的所有取值组合。
  • 基本选择组合:基础组合中包含每个参数的基础值,每次改变一个参数创建新的组合。
  • 单一选择组合:每个测试输入的每一个取值在所有组合中至少出现一次
  • 完全组合:每个测试输入所有取值的所有组合

测试设计规格说明

  • 测试设计

  • 测试设计是指定详细可行的方案

  • 流程:测试需求分析 - 测试策略设计 - 用例框架设计 - 测试用例编写

自动化测试

JavaScript

背景
  • 1995年网景公司(现在的Mozilla)设计出的。2015年Emca组织发布了新版本ES6,做出改进。
  • 是一种脚本编程语言。
  • Chrome开发出==ChromeV8引擎==,可以将js语言编译执行;后来出现==nodejs==可以将JS放到服务端去执行,而不是在浏览器中解释执行。
运行环境
  • 编写JS代码,需要编辑器:SublimeText、Dreamweaver等;执行调试JS代码,需要浏览器。
  • 除非是需要编译执行,放到服务端作为程序,那么需要nodejs。

相关笔记