前言
软件工程一直是一门被认为是水课的课程,但是自从接触到生产实践,才发现软件工程是一门庞大的学问。《代码中的软件工程》可以作为一本步入工作岗位的预备书来阅读,颇有裨益。值此复习之际,结合自己实习中的实践,对每一章知识点进行简单的总结。
一、工欲善其事必先利其器
1、vscode
前端开发的利器,非常容易通过插件的使用来跟进小组的开发风格和工程结构。常用的代码格式化插件以及语言、框架提示插件十分好用。本身也比较轻量级,不需要额外的环境配置,只需要针对项目进行一些环境的搭建即可。
常用命令:mac和win不同,而且我有改键的习惯。。。
重要概念
插件进程隔离
ui渲染与业务逻辑隔离
LSP
2、git
合作的基础,十分方便快捷。好的团队他的git flow自然也是十分完善的。虽然很多操作在vscode界面上很容易实现,而且也有gitlens这种辅助的展示工具,但git基本命令还是要牢记。
重要概念
版本控制:独立文件,补丁,中心版本控制,分布式版本控制
rebase
3、vi/vim
常用,比如配置多仓库ssh的时候,不过对于我这个前端程序员来说,vim确实用的不熟悉。
重要概念
命令模式、输入模式、底线命令模式
4、正则
常用,url的匹配、用户输入的校验,包括一些邪道的拍平数组。很好用,很通用,就是难记,现用现查。
二、工程化编程实战
1、menu.c实验
这个实验贯穿了许多章节,整个流程体现出了一个简单的软件工程分析改进重构过程,十分具有学习意义。
2、代码风格
常用prettier风格,在合并分支时也不会和团队出现代码缩进、换行等差异。eslint也需要
重要概念
规范:简明、易读、无二义性
编写高质量代码的基本方法:控制、数据、异常处理、重构、性能优化、团队合作
3、模块化设计
前端中,比如commonjs和es6的模块化,以及vue的组件渐进式开发,都很符合模块化的概念
重要概念
高内聚低耦合
kiss,一行代码/一个块代码/一个函数/一个模块只做一件事
本地化外部接口,适配器模式
4、可复用软件
npm的每一个轮子都是一个可复用的软件,发布npm包也有相对应的约束。当然往小了说,vue中的mixin,plugin也是可复用的代码组。
重要概念
消费者重用,生产者实现重用
接口:目的,前置条件,协议规范,后置条件,质量属性
微服务
耦合度与接口:无耦合、数据耦合、标记耦合、控制耦合、公共耦合、内容耦合
通用接口定义:参数化上下文,移除前置条件,简化后置条件
5、可重入函数和线程安全
pure和readonly一般都可重用,readonly可能进入临界区
可重入函数:
6、子系统工程化
软件质量角度:产品、用户、商业
软件设计的方法原则:不断重构;模块化、接口、信息隐藏、增量开发、抽象、泛化
三、需求分析和软件设计
1、获取需求的方法
实习中,一般是用户反馈需求给项目经理,在经过评估后合理的加入迭代过程中。这个过程充满了折衷,很像集市买菜一样。
重要概念
需求类型:功能性需求、非功能性需求(质量需求)、设计约束、过程约束
需求相关人员:客户、顾客、用户、行业专家、市场研究院、法务人员、软件工程师、相关技术专家
获取需求的方法:访谈、查阅资料、观察工作方法、向用户学习、头脑风暴、特定领域策略
高质量需求:正确性、一致性、无二义性、完整、可行、可跟踪;可测试、可解决冲突、独特
2、需求分析建模
前端开发中我比较倾向于先规划页面交互原型,使逻辑逐渐清晰,说实话这种方案比起建模方案来说更加直观易懂,而且更加适合页面开发的逻辑。
重要概念
原型方法、建模方法
用例是业务过程:抽象用例、高层用例、扩展用例
面向对象:继承、组合、关联
业务领域建模
数据库设计
反范式化
3、从需求分析到软件设计
敏捷!但是很容易出现返工等问题,需求分析至关重要。
重要概念
瀑布模型:需求分析,概要设计,详细设计,编码,测试,部署,维护
统一过程:用例驱动,架构为中心、增量且迭代
敏捷统一过程步骤:确定需求、用例满足需求、用例分配到增量阶段、完成迭代
四、软件科学基础概论
这一部分,第一学期的软件体系结构详细学过,当时没有什么意识,越做项目越感觉怎么这么多似曾相识的东西
1、软件是什么
重要概念
对象、函数和变量、指令和操作数、0|1
顺序结构、分支结构、循环结构、函数调用框架、继承和对象组合
特殊机制:回调函数、多态、闭包、异步调用、匿名函数
软件内在:复杂、多变、抽象vs逻辑、不统一
s系统,抽象后不管了,p系统,需要不断从现实世界抽象,e系统,全部的环节都在现实世界抽象
2、软件设计模式
前端常见的有单例模式(vue router)、迭代器模式(生成器函数,迭代器等)、ts有模板模式等等,设计模式随处可见
重要概念
分类:创建模式,结构模式,行为模式,
设计原则:开闭原则,里氏替换原则,依赖倒置原则,单一职责,迪米特,合成复用
3、软件架构
mvvm虽然好用,但也会出现很多控制难题,双向数据绑定总有一些复杂的控制情况
重要概念
三层架构,mvc,mvvm
mvvm,低耦合 ,可重用,独立开发,可测试
4、软件架构风格
重要概念
复用方法:克隆,重构
面向功能/特征/数据/并发/事件/对象的分解
架构风格:管道过滤器,客户服务,p2p,发布订阅,crud,层次化
架构视图:分解、依赖、泛化、执行、实现、部署、工作任务分配
CMM/CMMI
5、高质量软件
高质量软件必然是能经得起风吹雨打的,易用性、鲁棒性、可用性十分重要。当软硬件的能力比较充足时,用户体验永远是摆在第一位。但高质量的软件如果不及时重构,随着技术的革新和时代的变迁就会变成shi山
重要概念
三种视角:产品、过程、价值
质量属性:易于修改维护、可靠性、易用性、安全性、健壮性、商业目标
五、软件危机和软件过程
软件真的是一个十分复杂的系统,他沉浮在这个现实世界中,无时无刻不在走向堕落,维护者只能减缓而不能逆转这个过程。比如目前前端新兴的框架逐渐有一席之地,包括go对java的替代等等,从技术栈的角度来说,软件存在风险。当然,从用户、商业的角度更有许多未知的难题。
重要概念
过程模型:瀑布模型、v模型、增量和迭代开发、螺旋模型
psp和tsp
cmm/cmmi:五种:初始级、管理级、已定义级、量化管理级、持续优化级
敏捷宣言:
个体和互动>流程和工具
工作的软件>详细的文档
客户合作>合同谈判
响应变化>遵循计划
总结
《代码中的软件工程》是一本循序渐进接触软件工程的书籍。我认为前些章节,到menu设计完毕,都很接地气,可以由浅入深。但是有一个小小的建议,后几章对于第一次接触软件工程的人来说较为难以理解,如果能搭配上代码讲解,可能更好。另外,关于设计模式推荐一个网站,可以赋给同学们查缺补漏。常用设计模式有哪些? (refactoringguru.cn)