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作为事件管理器,事件触发时发出消息
- 具体实现分为发布订阅模式和观察者模式
- 软件的设计包括交互界面设计、系统设计、模块设计等
- 系统设计要考虑响应时间和吞吐量的权衡、节省内存与提高速度的权衡
- 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 重构
- 维护的目的:改正、适应、增加功能,成本高于开发
- 重构:不改变软件功能,将代码还原为文档,逆向工程
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!