软件工程笔记 清华大学刘强etc

1. 初识软件工程

  • 面向过程 -> 对象 -> 构件 -> 服务,粒度逐渐增大
  • 开发过程:需求 - 分析、设计、实现、测试 - 产品

2. 编写高质量代码

  • google 推出的针对多种语言的编码规范,建议阅读
  • 结对编程
  • python IDE pycharm
  • 代码静态分析,检查代码是否符合规范:pylint、HTMLHint、CSSLint、JSHint
  • 代码优化,提高时间空间性能,流程:分析是否需要优化 - 找出瓶颈 - 优化 - 测试
    • 性能分析工具,分析性能瓶颈,python内置的Profile

3. 单元测试

  • 单元测试 Unit Testing,是对软件的最小可测试单元进行检查和验证
  • 在开发单元代码前,编写单元测试代码
  • 测试工具:
    • 一系列xUnit,如Python - PyUnit,类和函数等简单对象的测试
    • Mock测试,虚拟一个对象,比较复杂的、交互行为的测试
  • 测试用例:一组输入值预期结果
  • 黑盒测试,将测试对象看做黑盒子,不考虑内部结构,只关注输入输出
    • 等价类划分,将输入域划分为若干互不相交的子域,每个子域称为一个等价类;从同一个等价类中选取任何一个输入值,会得到相同的结果
    • 要考虑不合理的输入
    • 边界值分析,对输入或输出的边界值进行测试,作为等价类划分的补充
  • 白盒测试,根据程序逻辑设计测试用例
    • 控制流图 CFG,Control Flow Graph,程序的流程图,根据路径设计输入值

4. 软件开发过程

  • 包括以下阶段:
    • 问题定义:提出问题,技术探索,市场调查 => 可行性研究报告
    • 需求分析:收集用户需求,分析需求,建模 => 软件需求规格说明文档
    • 软件设计:体系结构设计,接口,组件的算法和数据结构,数据库 => 软件设计说明书
    • 软件构造:编写代码,审查,优化 => 源代码
    • 软件测试:单元测试,子系统测试,集成测试,验收测试
    • 软件维护:投入使用后的改进过程
  • 瀑布模型:将开发过程看成一系列独立、线性的活动,对需求变更的响应不灵活,文档太多,现已很少使用
  • 原型开发,先得到只具有界面和部分功能的产品,以明确需求、帮助开发,可以快速响应
  • 迭代式开发,构建、发布、用户使用循环进行
    • 增量模型:优先实现一小部分功能,逐步增加模块;
    • 迭代模型:优先实现基本的整体功能,逐步完善各个功能
  • 可转换模型,数学描述,经过转换得到产品,严密准确,适用于嵌入式系统
  • 敏捷开发,自适应,增量和迭代,强调:
    • 个体和交互 > 过程和工具
    • 可以工作的软件 > 面面俱到的文档
    • 客户合作(频繁与客户沟通) > 合同谈判
    • 响应变化 > 遵循计划
  • Build to Learn -> Show -> Serve -> Win

5. 团队开发管理

  • 技术与管理分离
    • 技术经理:技术上的决策
    • 项目经理:过程管理和绩效评价
  • 选择合适的沟通方式:
    • 着重及时反馈(面对面、电话)
    • 着重信息的完整丰富(书面)
  • 团队分工一般按照模块进行划分,比如前端、后端、数据库等,减少耦合
  • PM:人月工作量

6. 敏捷开发与配置管理

  • Scrum: feature list -> sprint planning meeting -> sprint (1-2 weeks) -> review
    • 角色
      • Product Owner
      • Scrum Manager (tech lead)
      • Team Member
    • 活动
      • Planning Meeting
      • Daily Meeting
      • Review
      • Retrospective 回顾
    • 制品
      • Product Backlog 产品订单
      • Sprint Backlog 迭代订单
      • Burndown Charts 燃尽图
      • Working Software 可工作软件
  • 用户故事 User Story:站在用户角度来看待软件的功能点,角色 + 活动 + 价值
  • 配置管理:版本管理
    • 软件配置项,Software Configuration Item,SCI:包括代码、文档和产品
    • Git - Github
      • 教程:try.github.io/levels/1/challenges/1
      • 详细说明:Git Book,git-scm.com/book/zh/v2
      • sourcetreeapp.com 图形化git工具

7. 需求获取

  • 需求工程师 Requirements Engineer,负责需求的获取、建模、分析
  • 面谈、问卷、群体诱导、原型
  • 用例模型,需求数据库
  • 软件需求规格说明 Software Requirements Specification, SRS
  • 需求是不断变化的

8. 用例建模

  • 用例建模是获取需求的方式,是一个迭代的、逐步细化的过程:用例图 -> 用例提纲 -> 用例详细规约
  • 用例 Use Case:系统的理想行为、功能,谁 + 做什么
  • 用例要有合适的粒度
  • 用例按优先级排序,以决定开发顺序
  • 要考虑异常状况
  • 用例不包括具体实现,相当于系统提供给用户的接口
  • CRUD,增查改删,Create Retrieve Update Delete,合并为一个维护用例
  • UML, Unified Modeling Language, 统一建模语言,可视化的软件建模方法
  • 建模工具:IBM Rational Rose、JUDE、Enterprise Architect

9. 面向对象分析与设计

  • 将实体建模为对象
  • 对象封装属性和行为
  • 类的层次结构:关联、泛化(is-a),聚集、组合(has-a)、依赖
  • CRC卡片分拣法
    • Class 类,Responsibility 责任,Collaboration 协作
  • 接口设计:多个分离的小接口要好于一个通用的大接口
  • UML类图:对类层次结构的建模,可以根据模型自动生成类的代码

10. 行为建模

  • UML顺序图:对交互行为建模,消息传递序列,与用例相对应
  • UML状态图:对状态变化和触发状态变化的事件建模,对象的存在与否、不同的属性都体现为状态

11. 软件系统设计

  • 目标:可复用、可扩展、简单、有效
  • 构件组合成系统
  • 构件提供服务,通过接口与其他构件进行交互
  • 连接件是负责构件之间交互的专用构件,如管道
    • 连接机制:过程调用、事件、进程、同步、并发、API等
    • 连接协议:参数个数类型、消息格式等
  • 设计的趋势:分布式、低耦合、开放
  • 设计原则:抽象、封装、模块化
    • 高内聚(模块内元素间依赖程度高)
    • 低耦合(模块之间依赖性低)
    • 层次化(以安卓为例,从下到上的层级为:Linux内核 -> 系统运行库 -> 应用框架 -> 应用
    • 复用,是多个层次的概念,包括代码、体系结构、框架、设计模式
  • 体系结构风格,构件和连接件的组织方式,常见风格如下:
    • 主程序 - 子程序,树形结构,如C程序
    • 面向对象,网状结构,如CPP/JAVA程序
    • 管道 - 过滤器,通过输入和输出串联,线性结构,如媒体播放器
    • 仓库结构,以数据为中心,放射状结构,如剪贴板、编译器、数据库
    • 层次结构
      • 客户机 - 服务器
      • 表示层 -(功能层)- 数据层
    • MVC结构:Model 模型、视图 View、控制器 Controller,前端给后端AJAX,后端返回给前端JSON
      • REST,REpresentational State Transfer
    • 事件风格,以代码调试为例
      • 调试器设置断点,作为事件源
      • IDE作为事件管理器,事件触发时发出消息
      • 文本编辑器、编译器、变量监视器对断点事件进行响应,相当于event handler
      • 具体实现分为发布订阅模式和观察者模式
  • 软件的设计包括交互界面设计、系统设计、模块设计等
  • 系统设计要考虑响应时间和吞吐量的权衡、节省内存与提高速度的权衡
  • RESTful API
    • 过去的做法是,后端根据网页模板生成响应发送给前端,但会造成前后端的耦合
    • 更好的做法是,把模板从后端剥离,通过GET、PUT、POST、DELETE的方式,后端发送给前端JSON。这样就实现了前后端更好的分离,web和移动端app可以按照相同的方式与后端通信,通用性更好
  • AJAX需要前后端有相同的域名和端口,否则会产生跨域,带来安全性问题;可以通过NGINX托管的方式解决,并且支持多个RESTful后端,提高可扩展性
  • Celery,异步任务和定时任务框架
  • 内存型数据库,通过把数据缓存到内存中,以提高速度,如redis、memcashed
  • 数据库的选择
    • 关系型,规整的表格;key-value型,灵活的内容
    • 事务,即对数据库的一次操作确保原子性,完全执行或不执行
    • 一致性,A发照片,好友都能看到;理想情况要求实时,现实中允许一定延迟
    • 主要的数据库类型:
      • MySQL,关系型数据库,支持事务操作,安全性高
      • MongoDB,非关系型数据库,结构灵活,数据模型易扩展易修改,分布式,不支持事务操作,安全性一般
      • Redis,内存数据库,速度快,数据安全性差
    • 需要事务操作 - MySQL,发展中的业务 - MongoDB,频繁读取 - Redis

12. 交互设计

  • 可用性:低学习成本、低记忆成本、高交互效率、高满意度
  • Steve Jobs 黄金法则
  • 人的因素:物理、感知、认知
  • ISO 9241 可用性标准
  • 所见即所得 What you see is what you get, WYSIWYG
  • WIMP, Windows - Icons - Menu - Pointing devices
  • Gestalt 格式塔理论,完形心理学,意识对图像的加工
    • 闭合率,自动补全
    • 连续率,自动外延
    • 相似率,相似的元素视为一个整体
    • 接近率,靠近的元素视为一个整体
    • 对称率,对称元素视为一个整体
    • 前景背景分离,自动区分主要对象和背景
  • 一致性,遵从人们的习惯,同样的功能 - 同样的外观 - 同样的操作
  • 直接映射,虚拟元素与现实元素具有同样的操作
  • 有效反馈,提供充足的信息
  • KLM效率模型,Keystroke Level Model
    • 操作:按键,鼠标点击、双击、拖拽,以及思考
    • 通过实验得到每种操作的平均操作时间,得出总时间,用来评价设计的好坏
  • Fitts定律:移动距离越大,目标越小,则鼠标点击花费的时间越长
    • 设计时,移动距离尽量小,点击目标尽量大
    • 屏幕边缘的元素相当于被放大了
  • 设计 - 原型 - 评估,迭代过程

13. 系统测试

  • 正常的输入 + 异常、边界、破坏性的输入
  • 流程:单元测试 - 集成测试 - 系统测试(功能测试 + 性能测试)- 验收测试(需求)- 安装测试(用户实际使用环境)
  • 性能测试:大数据量、高并发、兼容性、安全性,主要因素:
    • 用户数:注册用户、在线用户、并发用户
    • 响应时间
    • 吞吐量
    • 资源利用率
  • 测试方法:长时间高负载、破坏性、峰谷交替,注意是否有内存泄漏、崩溃后恢复能力
  • HP LoadRunner、Apache JMeter
  • 验收测试:
    • alpha测试:公司内部人员模拟用户进行测试
    • beta测试:用户测试

14. 交付与维护

  • 软件部署、客户培训、项目验收,完成交付之后进入维护阶段
  • 开发人员每天向代码库提交代码,集成服务器自动化的编译、静态检查、单元测试、打包、在预演环境和端对端环境进行功能测试、最终发布
  • 单一主干、分支提测形成发布版本
  • 软件在使用中不断变化,复杂性增加,结构恶化
  • 维护 vs 重构
    • 维护的目的:改正、适应、增加功能,成本高于开发
    • 重构:不改变软件功能,将代码还原为文档,逆向工程

你可能感兴趣的:(软件工程)