《代码中的软件工程》学习总结/心得体会
一、心得体会
本学期很荣幸,同时选上了孟宁老师的《高级软件工程》和《嵌入式linux》两门工程课程。在理论分析上,孟宁老师讲究一个由浅到深由粗到细,如同庖丁解牛,同时又有足够和适当难度的实践作业,完成之后茅塞顿开,恍然大悟,有一种打通的感觉。总的来说,这门课程非常值得,既能学到实用的代码工具,俗话说得好,工欲善其事,必先利其器,又能学到软件工程的核心理论知识,学习性价比非常高。
二、课程回顾
本课程主要分为:工欲善其事,必先利其器、工程化的编程实战、从需求分析到软件设计、软件科学基础概论、软件危机和软件过程五个部分。
2.1 工欲善其事,必先利其器
这部分主要是介绍了在编写软件产品过程中可能会使用到的工具。覆盖了IDE、版本管理、文本编辑、字符串处理等部分。
VS code
Git 常用命令
git init # 初始化一个本地版本库
git status # 查看当前工作区(workspace)的状态
git add [FILES] # 把文件添加到暂存区(Index)
git commit -m "wrote a commit log infro” # 把暂存区里的文件提交到仓库
git log # 查看当前HEAD之前的提交记录,便于回到过去
git reset —hard HEAD^^/HEAD~100/commit-id/commit-id的头几个字符 # 回退
git reflog # 可以查看当前HEAD之后的提交记录,便于回到未来
git reset —hard commit-id/commit-id的头几个字符 # 回退
Vim 常用命令
命令模式
:set nu
: #添加行号 (临时设定)
p
: #粘贴
u
: #撤销
dw
: #删除一个单词
dd
: #删除一行
3dd
: #删除三行
插入模式
i
#在光标所在位置插入字符
I
#在光标所在行的行首插入字符
o
#光标所在行的下一行新行插入字符
O
#光标所在行的上一行新行插入字符
s
#删除光标所在字符并插入字符
S
#删除光标所在行并插入字符
a
#光标所在字符的下一个字符插入
A
#光标所在行的行尾插入字符
退出模式
:q
#当vim进入文件没有对文件内容做任何操作可以按"q"退出
:q!
#当vim进入文件对文件内容有操作但不想保存退出
:wq
#正常保存退出
:wq!
#强行保存退出,只针对于root用户或文件所有人生效
正则表达式 常用元字符
限定符
符号 | 含义 | eg | 解释 |
---|---|---|---|
* | 指定字符重复0或n次 | (abc)* | 等xiao |
+ | 指定字符重复1或n次 | m+(abc)* | m至少出现一次,后接任意数量abc |
? | 指定字符出现0或1次 | m+abc? | m至少出现一次,c有没有都行 |
{n} | 限定字符长度为n | [abcd]{3} | acd,abc,bcd |
{n,} | 至少n个匹配 | [abcd]{3,} | aac,aabbccdd |
{n,m} | 至少n个但不多于m个 | [abcd]{3,5} | aaa,bbbb,ccccc |
? | 当? 跟在 其他限定符后面,表示非贪心选择模式 |
选择匹配符
符号 | 含义 | eg | 解释 |
---|---|---|---|
| | 表示其中任意一个 | `ab | cd` |
字符匹配符
符号 | 含义 | eg | 解释 |
---|---|---|---|
[ ] | 可接收的字符列表 | [efgh] | 其中任意一个 |
[^] | 不接收的字符列表 | [^abc] | 除abc外任意一个字符 |
- | 连字符 | A-Z | 任意单个大写字母 |
. | 匹配除\n 以外任意字符 | a…b | |
\\d | 匹配单个数字字符,相当于[0-9] | \\d{3}(\\d)? | 包含3个或4个字符的字符串,? 表示匹配0 or 1次 |
\\D | 匹配单个非数字字符[^0-9] | \\D(\\d)* | 以单个非数字字符开头,后接任意个数字 |
\\w | [0-9a-zA-Z] | \\d{3}\\w{4} | |
\\W | [^0-9a-zA-Z] | \\W+\\d{2} | 以至少一个非数字或字母开头,2个数字结尾的字符串 |
\\s | 匹配任何空白字符,空格,制表符 | ||
\\S | 匹配任何非空白字符 |
定位符
符号 | 含义 | eg | 解释 |
---|---|---|---|
^ | 指定起始字符 | [0-9]+[a-z]* | 以至少一个数字开头,后接任意个字母的字符 |
$ | 指定结束字符 | ^[0-9]\\-[a-z]+$ | |
\\b | 匹配一个单词边界,也就是指单词和空格间的位置。 | han\\b | ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 |
\\B | 匹配非单词边界 | han\\B | ‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 |
2.2 工程化的编程实战
这部分主要是基于一个menu程序来展开,学习结构化程序设计的一般方法。主要是有以下部分:
- menu程序:这是一个非常基础的程序,基本的功能就是列出这个软件提供的小功能,用户可以通过键入命令来选择一个功能运行。这里重要的是基于结构化程序的思想,将这款简单的软件设计地可重用(满足开闭原则等)。在最终版本的menu程序中,我们使用链表管理menu可以提供的功能,使用回调函数来满足各种不同的查找需求,从而使得软件非常完备。
- 代码风格:关于什么样的代码是好代码,主要是易读性。
- 性能优先背后的代价:一昧追求性能带来的收益也许并不能抵消开发高性能程序的代价。
- 模块化代码设计:如何通过各种方法(如回调函数)来开发出高内聚、低耦合、可维护的代码。
2.3 从需求分析到软件设计
想要设计出一款合格的软件,需求分析永远是绕不过的一环,因为我们动手之前必须要知道:我们的软件到底要实现什么样的功能?
- 绘图工具:我们的软件工程过程中需要产出许许多多的文档,例如需求设计文档,而文档中的图是不可少的,比如用例图,时序图等。这部分主要是介绍了常见的绘图工具有哪些。
- 需求分析:原型化方法和建模的方法是两种基本方法,这里的主要内容是如何进行用例分析。
- 统一过程:一种软件过程模型,介绍了一种敏捷统一过程,主要内容是编排软件过程的具体方法。
这一部分主要是从较为宏观的角度介绍了一款软件是如何被设计出来的。
2.4 软件科学基础概论
这部分介绍的是软件科学的基础知识,例如常见的软件架构、设计模式等,从一种比较抽象地角度介绍如何设计一款好的软件。
- 什么是软件:介绍了软件的基本要素和基本结构等。
- 一些特殊的软件机制:例如闭包、回调、异步等,特别是介绍了Vue中的异步调用。
- 设计模式:介绍了一些基本的设计模式,设计模式是一种根据经验总结出来的软件设计思路,以及设计模式背后所遵循的几个软件设计原则。正确使用设计模式可以让我们设计出高效规范的软件。尤其是重点介绍了观察者模式,以及其在Vue中的应用。
- 一些软件架构:例如MVC、MVVM等,其中也是重点介绍了MVVM,它在目前的互联网产业中运用地非常广泛,这里也是重点介绍了Vue中的MVVM。
- 软件质量属性:什么样的软件是一款好的软件?这里解决的就是这个问题。
2.5 软件危机和软件过程
这部分的主要内容有:
- 软件危机及其发展过程
- 一些典型的软件模型:例如瀑布模型、V模型等,以及这些软件模型是如何发展过来的,考量是什么,有何优缺点。
- 个人软件过程:个人如何构建一款软件,在个人开发者越来越多的当下, 这部分的学习有相当的实践意义。
- 团队软件过程:一个团队如何构建一款软件,以及如何构建一个高效的开发团队,在工作中很有意义。
- 敏捷开发:敏捷开发是目前很多开发团队开发软件的第一选择,因为它的开发流程的快捷和高效。
- DevOps:一种把开发、运维、质量保障统一起来的过程,加强这些部门之间的协作和沟通。在云计算逐渐普及的现在,DevOps也逐渐流行了起来。