总结本学期各章节的学习
一、工欲善其事必先利其器
对于一位程序员来说 ,对现有的工具加以利用是一门必修课,例如vscode、git、vim等,其中快捷键的熟练使用更是加快了程序员工作的效率。
vscode快捷键的使用
- 打开文件夹( Ctrl/⌘+O)和关闭文件夹工作区( Ctrl/⌘+K F)
- 新建文件(Ctrl/⌘+N)、关闭文件(Ctrl/⌘+W)、编辑文件和保存文件(Ctrl/⌘+S)
- 文件内搜索(Ctrl/⌘+F)
- 关闭所有文件(Ctrl/⌘+K W)
- 关闭已保存的文件(Ctrl/⌘+K U)
- Ctrl+/用于单行代码注释和取消注释,Ctrl+Shift+A用于代码块注释和取消注释
- 文件资源管理器(Ctrl/⌘+Shift+E)
- 跨文件搜索 (Ctrl+Shift+F)
- 源代码管理 (Ctrl+Shift+G)
- 启动和调试 (Ctrl/⌘+Shift+D)
- 管理扩展插件 (Ctrl/⌘+Shift+X)
- 显示命令面板 (Ctrl/⌘+Shift+P)
- 显示问题面板 (查看错误和警告)(Ctrl/⌘+Shift+M)
- 显示集成终端 (Ctrl+`)
git快捷键的使用
## 1、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的头几个字符 # 回退
要是在本地对源代码进行基本的版本控制,主要通过git add和git commit -m提交版本,有了提交记录之后可以灵活地将当前工作区里的源代码回退到过去的某个版本,也就是回到过去。回到过去之后,也有可能发现之前撤销的某个版本是有价值的,希望找回来,这就需要回到未来。过去和未来之间的分界点就是HEAD,即当前工作区所依赖的版本。
## 2、git远程版本库的基本用法
- git clone命令官方的解释是“Clone a repository into a new directory”,即克隆一个存储库到一个新的目录下。
- git fetch命令官方的解释是“Download objects and refs from another repository”,即下载一个远程存储库数据对象等信息到本地存储库。
- git push命令官方的解释是“Update remote refs along with associated objects”,即将本地存储库的相关数据对象更新到远程存储库。
- git merge命令官方的解释是“Join two or more development histories together”,即合并两个或多个开发历史记录。
- git pull命令官方的解释是“Fetch from and integrate with another repository or a local branch”,即从其他存储库或分支抓取并合并到当前存储库的当前分支。
- line diff是形成增量补丁的技术方法,即一个文件按行对比(line diff)将差异的部分制作成一个增量补丁。
- commit是存储到仓库里的一个版本,是整个项目范围内的一个或多个文件的增量补丁合并起来,形成项目的增量补丁,是一次提交记录。每个提交(commit)都生成一个唯一的commit ID。
- branch是按时间线依次排列的一组提交记录(commit),理论上可以通过当前branch上最初的提交(commit)依次打补丁直到HEAD得到当前工作区里的源代码。
- tag标签就是某次提交(commit)的commit ID的别名
## 3、团队的分叉与合并
建议团队项目的每一个开发者都采用的工作流程大致如下:
1 克隆或同步最新的代码到本地存储库;
2 为自己的工作创建一个分支,该分支应该只负责单一功能模块或代码模块的版本控制;
3 在该分支上完成某单一功能模块或代码模块的开发工作;
4 最后,将该分支合并到主分支。
### 合并方法
默认的合并方式为"快进式合并"(fast-farward merge),会将分支里commit合并到主分支里,合并成一条时间线,与我们期望的呈现为一段独立的分支线段不符,因此合并时需要使用--no-ff参数关闭"快进式合并"(fast-farward merge)。
#### 一、克隆或同步最新的代码到本地存储库
1. git clone https://DOMAIN_NAME/YOUR_NAME/REPO_NAME.git
2. git pull
#### 二、为自己的工作创建一个分支,该分支应该只负责单一功能模块或代码模块的版本控制;
1. git checkout -b mybranch
2. git branch
#### 三、在该分支上完成某单一功能模块或代码模块的开发工作;多次进行如下操作:
1. git add FILES
2. git commit -m "commit log"
#### 四、最后,先切换回master分支,将远程origin/master同步最新到本地存储库,再合并mybranch到master分支,推送到远程origin/master之后即完成了一项开发工作。
1. git checkout master
2. git pull
3. git merge --no-ff mybranch
4. git push
## 4、Git Rebase
一般我们在软件开发的流程中,有一个朴素的版本管理哲学:开发者的提交要尽量干净、简单。开发者要把自己的代码修改按照功能拆分成一个个相对独立的提交,一个提交对应一个功能点,而且要在对应的 commit log message 里面描述清楚。因此在合并和 push 之前检查修改一下 commit 记录时常需要。
团队项目工作流程中增加一步Git Rebase,即在mybranch分支上完成自己的工作之后,为了让 log 记录将来更容易回顾参考,用 git rebase 重新整理一下提交记录。注意不要通过rebase对任何已经提交到远程仓库中的commit进行修改。
#### git rebase命令格式大致如下:
- git rebase -i [startpoint] [endpoint]
其中-i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支的HEAD。
一般只指定[startpoint] ,即指定从某一个commit节点开始,可以使用HEAD^^、HEAD~100、commit ID或者commit ID的头几个字符来指定一个commit节点,比如下面的代码指定重新整理HEAD之前的三个commit节点。
- $ git rebase -i HEAD^^^
- git rebase —abort
- git rebase --continue
## 5、Fork + Pull request
为了解决开源社区松散团队的协作问题,Github提供了Fork+ Pull request的协作开发工作流程。
当你想更正别人仓库里的Bug或者向别人仓库里贡献代码时,要走Fork+ Pull request的协作开发工作流程:
1 先 fork(分叉) 别人的仓库,相当于拷贝一份;
2 做一些 bug fix或其他的代码贡献;
3 发起 Pull request 给原仓库;
4 原仓库的所有者 review Pull request,如果没有问题的话,就会 merge Pull request 到原仓库中。
vim的快捷键使用
# 1、安装Vim
It is included as "vi" with most UNIX systems and with Apple OS X.
使用VSCode则可以在Linux、Windows和OS X上都能使用Vim
在VSCode中Ctrl/⌘+Shift+X管理扩展插件中搜索vim即可安装使用
- 命令模式(Command mode),用户刚刚启动vi/vim,便进入了命令模式。此状态下敲击键盘动作会被vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令
- 输入模式(Insert mode),在命令模式下按下i就进入了输入模式,按ESC退出输入模式,切换到命令模式。
- 底线命令模式(Last line mode),在命令模式下按下:(英文冒号)就进入了底线命令模式。底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。基本的命令有q(退出程序)、w(保存文件)等。按ESC键可随时退出底线命令模式。
# 2、移动光标的基本方法
- h 或 向左箭头键(←) 光标向左移动一个字符
- j 或 向下箭头键(↓) 光标向下移动一个字符
- k 或 向上箭头键(↑) 光标向上移动一个字符
- l 或 向右箭头键(→) 光标向右移动一个字符
- 如果你将右手放在键盘上的话,你会发现 hjkl 是排列在一起的,因此可以使用这四个按钮来移动光标。 如果想要进行多次移动的话,例如向下移动 30 行,可以使用 "30j" 或 "30↓" 的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可!
# 3、移动光标的更多方法
- n<space> 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20<space> 则光标会向后面移动 20 个字符距离。
- 0 或功能键[Home] 这是数字『 0 』:移动到这一行的最前面字符处 (常用)
- $ 或功能键[End] 移动到这一行的最后面字符处(常用)
- H 光标移动到这个屏幕的最上方那一行的第一个字符
- M 光标移动到这个屏幕的中央那一行的第一个字符
- L 光标移动到这个屏幕的最下方那一行的第一个字符
- G 移动到这个档案的最后一行(常用)
- nG n为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行
- gg 移动到这个档案的第一行,相当于 1G 啊! (常用)
- n<Enter> n 为数字。光标向下移动 n 行(常用)
# 4、删除
- x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
- nx n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
- dd 删除游标所在的那一整行(常用)
- ndd n 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用)
- d1G 删除光标所在到第一行的所有数据
- dG 删除光标所在到最后一行的所有数据
- d$ 删除游标所在处,到该行的最后一个字符
- d0 那个是数字的0 ,删除游标所在处,到该行的最前面一个字符
正则表达式也是一个需要掌握的工具
基本的字符串搜索方法
- 在VS Code中跨文件搜索(Ctrl+Shift+F)和文件内搜索(Ctrl+F)的输入框输入字符串即可进行基本的字符串搜索。
- 文件内搜索(Ctrl+F)可以使用Enter键代表继续搜索下一个,Shift+Enter键代表继续搜索上一个。这两个操作在文件内搜索面板上有对应的两个上下箭头,箭头右侧三条横线的小按钮是指在选定内容中查找(Alt+L)。
跨文件搜索(Ctrl+Shift+F)和文件内搜索(Ctrl+F)的输入框内部右侧都有三个小按钮:
- 第一个选中的话就是搜索时区分大小写(Alt+C);
- 第二个选中的话表示搜索时全字匹配(Alt+W);
- 第三个选中的话表示搜索时采用正则表达式(Alt+R),如果输入框中使用了正则表达式的语法规则,则需要选中第三个按钮或使用Alt+R快捷键。显然上图中还没有使用正则表达式。
- 在 Vim 一般命令模式(Normal Mode)下输入/word 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用)
- ?word 向光标之上寻找一个字符串名称为 word 的字符串。
- n 这个 n 是英文按键。代表重复前一个搜寻的动作。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!
- N 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。
- 使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键词
二、从需求分析到软件设计
本章的学习心得分别有敏捷统一过程(Agile Unified Process)、对象交互建模(Object Interaction Modeling)以及形成软件设计方案的基本方法
## 统一过程(Unified Process)
统一过程(UP,Unified Process)的核心要义是用例驱动(Use case driven)、以架构为中心(Architecture centric)、增量且迭代(Incremental and Iterative)的过程。用例驱动就是我们前文中用例建模得到的用例作为驱动软件开发的目标;以架构为中心的架构是后续软件设计的结果,就是保持软件架构相对稳定,减小软件架构层面的重构造成的混乱;增量且迭代。
敏捷统一过程(Agile Unified Process)进一步将软件过程中每一次迭代过程划分为计划阶段和增量阶段。
敏捷统一过程的计划阶段
在项目正式动手开工之前,敏捷统一过程要求进行精心周密的构思完成计划阶段。计划阶段要做的工作有如下几点:
- 首先明确项目的动机、业务上的实际需求,
- 以及对项目动机和业务需求可供替代选择的多种可能性;
- 然后充分调研获取需求并明确定义需求规格;
- 在明确需求规格的基础上进行项目的可行性研究;
- 如果项目可行,接下来接着进行用例建模并给出用例图;
- 同时明确需求和用例之间的可跟踪矩阵;
- 从而形成项目的概念模型草案;
- 以及项目可能的日程安排、需要的资源以及大致的预算范围。
敏捷统一过程的四个关键步骤
- 第一,确定需求;
- 第二,通过用例的方式来满足这些需求;
- 第三,分配这些用例到各增量阶段;
- 第四,具体完成各增量阶段所计划的任务。
显然,第一到第三步主要是计划阶段的工作,第四步是接下来要进一步详述的增量阶段的工作。
敏捷统一过程的增量阶段
•在每一次增量阶段的迭代过程中,都要进行从需求分析到软件设计实现的过程,具体敏捷统一过程将增量阶段分为五个步骤:
- 用例建模(Use case modeling);
- 业务领域建模(Domain modeling);
- 对象交互建模(Object Interaction modeling);
- 形成设计类图(design class diagram);
- 软件的编码实现和软件应用部署;
## 对象交互建模的基本步骤
- 找出关键步骤进行剧情描述(scenario)
- 将剧情描述(scenario)转换成剧情描述表(scenario table)
- 将剧情描述表转换成序列图的基本方法
- 从分析序列图到设计序列图
- 一个完整用例的对象交互建模
•第一步,在扩展用例中右侧一列中找出关键步骤(nontrivial steps)。关键步骤是那些需要在背后进行业务过程处理的步骤,而不是仅仅在表现层(presentation layer, i.e., the Graphical User Interface or GUI)与参与者进行用户接口层面交互的琐碎步骤。
•第二步,对于每一个关键步骤,从关键步骤在扩展用例两列表格中的左侧作为开始,完成剧情描述(scenario),描述一步一步的对象交互过程,直到执行完该关键步骤。
•第三步,如果需要的话,将剧情描述(scenario)进一步转换成剧情描述表(scenario table)。
•第四步,将剧情描述(scenario)或剧情描述表(scenario table)转换成序列图。
•对象交互建模的四个基本步骤以某个用例的扩展用例为输入,中间借助业务领域知识及业务领域建模中的相关对象、属性等,最终产出结果为序列图。
## 形成软件设计方案的基本方法
•软件产品庞大复杂,前面的形成的设计类图只是其中一个用例得到的设计结果,我们需要对每一个用例进行分析和设计,最终再将各用例得到的设计结果综合成一个软件产品的整体设计方案。其中涉及两个基本的方法:分析(analysis)和综合(synthesis)。
分析是分解大问题变成易于理解的小问题。比如用例建模是将错综复杂的需求分解成一个一个的用例。在分析的过程中除了“分而治之”的切分分解的方法外,抽象方法的运用是一个关键
综合是将一个个小问题的解决方案组合起来构建软件的整体解决方案。我们对每一个用例的关键步骤进行对象交互建模逐步形成了用例对应的解决方案,如何将多个用例的小解决方案组合起来构建软件整体设计方案?这在软件设计中是一个非常有挑战性的问题,一般我们通过参考已有的软件设计模式提供一个思路从而综合出一个软件整体解决方案
三、工程的编程化实践
本学期分别用go编写了Linktable库以及menu项目,其中在参考孟宁老师的代码的基础上完成了个人的实践编程。这是孟宁老师的博客地址软件工程: 《代码中的软件工程》一书的配套ppt和源代码
这是我编写menu项目的过程在vscode上编写go的menu程序-CSDN社区
这是我编写Linktable库的过程用Go编写一个Linktable的库-CSDN社区
在编写的过程中,也在孟宁老师的社区中无形中学习到很多同学的解决问题的方法,我对此深刻的感受到了对于一个程序员而已,加入或者拥有一个社区是非常重要的,知识永远是学不完的,在社区你可以博览大家的所长,学习后就能为己所用了,分享知识是一个收获知识的过程,收获知识是分享知识的结果。
作者:329