571
社区成员
发帖
与我相关
我的任务
分享非常荣幸能够跟孟宁老师一起学习高级软件工程这门课程。在老师四个多月的传授下,我学习到了很多知识,在课程结束之际,想通过写篇博客回顾学习到的知识。
在本章节,老师首先推荐了一个打字测评网站。无论处于哪种行业,打字速度快都是很有用的,大家也可以去练一练。接下来分别讲授了VS Code、Git、Vim和正则表达式的使用。通过具体的实验,我更加熟悉了这些工具的使用。
Visual Studio Code(以下简称vscode)是一个轻量且强大的代码编辑器,支持Windows,OS X和Linux。内置JavaScript、TypeScript和Node.js支持,而且拥有丰富的插件生态系统。在本次课程学习之前本人已经安装过C++、Python语言的相关插件。为了后续实验需要,我在课程学习过程中安装了Go语言的相关插件。此外,我还学习到了一些常用的快捷键,比如打开文件夹( Ctrl/⌘+O)和关闭文件夹工作区( Ctrl/⌘+K F)等等,也了解到了VScode如此成功的原因。
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 clone https://DOMAIN_NAME/YOUR_NAME/REPO_NAME.git
git pull
# 为自己的工作创建一个分支,该分支应该只负责单一功能模块或代码模块的版本控制;
git checkout -b mybranch
git branch
# 在该分支上完成某单一功能模块或代码模块的开发工作;多次进行如下操作:
git add FILES
git commit -m "commit log"
# 先切换回master分支,将远程origin/master同步最新到本地存储库,再合并mybranch到master分支,推送到远程origin/master
git checkout master
git pull
git merge --no-ff mybranch
git push
vim是从vi发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。以下是Vim的三种命令模式。
正则表达式是对字符串操作的一种逻辑公式。在这节里。老师主要讲述了基本的字符串搜索方法、同时搜索多个字符串的方法、在匹配字符串时的大小写问题、通配符的基本用法、匹配具有多种可能性的字符集、贪婪匹配和懒惰匹配等内容。
模块化(Modularity)是在软件系统设计时保持系统内各部分相对独立,以便每一个部分可以被独立地进行设计和开发。这个环节讲到了用耦合度(Coupling)和内聚度(Cohesion)来衡量软件模块化的程度。
这部分首先讲到了消费者重用和生产者重用。然后是接口,接口就是互相联系的双方共同遵守的一种协议规范,在我们软件系统内部一般的接口方式是通过定义一组API函数来约定软件模块之间的沟通方式。其中包括软件模块接口举例和微服务接口举例。最后讲了可重用软件模块的接口设计范例和通用接口定义的基本方法。
需求分析是在获取需求的基础上进一步对软件涉及的对象或实体的状态、特征和行为进行准确描述或建模的工作。高质量需求的特点有Correct、Consistent、Unambigious、Complete、Feasible、Relevant等。
原型化方法(Prototyping)和建模的方法(Modeling)是整理需求的两类基本方法。原型化方法可以很好地整理出用户接口方式(UI,User Interface),比如界面布局和交互操作过程。建模的方法可以快速给出有关事件发生顺序或活动同步约束的问题,能够在逻辑上形成模型来整顿繁杂的需求细节。
面向对象有三个关键的概念:继承(Inheritance)、对象组合(object composition)和多态(polymorphism),其中多态是一种比较特殊的机制,另外还有回调函数(callback)、闭包(closure)、异步调用和匿名函数也经常用到特殊机制。
int SearchCondition(tLinkTableNode * pLinkTableNode, void * args)
{
char * cmd = (char*) args;
tDataNode * pNode = (tDataNode *)pLinkTableNode;
if(strcmp(pNode->cmd, cmd) == 0)
{
return SUCCESS;
}
return FAILURE;
}
int main()
{
...
//传递回调函数
SearchLinkTableNode(head, SearchCondition, (void*)cmd);
…
}
//执行回调函数
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable,
int Conditon(tLinkTableNode * pNode, void * args),
void * args)
{
...
tLinkTableNode * pNode = pLinkTable->pHead;
while(pNode != NULL)
{
if(Conditon(pNode, args) == SUCCESS)
{
return pNode;
}
pNode = pNode->pNext;
}
return NULL;
}
以下是几大原则
1986年,Brooks发表了一篇著名的论文“没有银弹(No Silver Bullet: Essence and Accidents of Software Engineering)”。Brooks认为软件工程专家们所找到的各种方法都是舍本逐末,它们解决不了软件中的根本困难,即软件概念结构(conceptual structure)的复杂性,无法达成软件概念的完整性和一致性,自然无法从根本上解决软件危机带来的困境。
瀑布模型(Waterfall Model)是第一个软件过程开发模型,对于能够完全透彻理解的需求且几乎不会发生需求变更的项目瀑布模型是适用的。但是由于瀑布模型能够将软件开发过程按顺序组织过程活动,非常简单和易于理解,因此瀑布模型被广泛应用于解释项目进展情况及所处的阶段。瀑布模型中的主要阶段通过里程碑(milestones)和交付产出来划分的。
V模型也是在瀑布模型基础上发展出来的,我们发现单元测试、集成测试和系统测试是为了在不同层面验证设计,而交付测试则是确认需求是否得到满足。也就是瀑布模型中前后两端的过程活动具有内在的紧密联系,如果将模块化设计的思想拿到软件开发过程活动的组织中来,可以发现通过将瀑布模型前后两端的过程活动结合起来,可以提高过程活动的内聚度,从而改善软件开发效率。这就是V模型。
螺旋模型是在1988年由Boehm提出,是一种演化软件开发过程模型,兼顾了快速原型的迭代的特征以及瀑布模型的系统化与严格监控。螺旋模型最大的特点在于引入了其他模型不具备的风险管理,使软件在无法排除重大风险时有机会停止,以减小损失。同时,在每个迭代阶段构建原型是螺旋模型用以减小风险的基本策略。
敏捷宣言的核心思想是
几个月的课程学习使我学习到了很多知识,课程实验也增强了我的代码能力和实践能力。桃李不言,下自成蹊,在此特别感谢孟老师这几个月的帮助!
代码中的软件工程 https://gitee.com/mengning997/se