高级软件工程学习总结

Ingram 2022-07-10 11:12:20

非常荣幸能够跟孟宁老师一起学习高级软件工程这门课程。在老师四个多月的传授下,我学习到了很多知识,在课程结束之际,想通过写篇博客回顾学习到的知识。

1 工欲善其事必先利其

在本章节,老师首先推荐了一个打字测评网站。无论处于哪种行业,打字速度快都是很有用的,大家也可以去练一练。接下来分别讲授了VS Code、Git、Vim和正则表达式的使用。通过具体的实验,我更加熟悉了这些工具的使用。

1.1 Vscode

Visual Studio Code(以下简称vscode)是一个轻量且强大的代码编辑器,支持Windows,OS X和Linux。内置JavaScript、TypeScript和Node.js支持,而且拥有丰富的插件生态系统。在本次课程学习之前本人已经安装过C++、Python语言的相关插件。为了后续实验需要,我在课程学习过程中安装了Go语言的相关插件。此外,我还学习到了一些常用的快捷键,比如打开文件夹( Ctrl/⌘+O)和关闭文件夹工作区( Ctrl/⌘+K F)等等,也了解到了VScode如此成功的原因。

1.2 Git

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。

img

1.2.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的头几个字符  # 回退

1.2.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”,即从其他存储库或分支抓取并合并到当前存储库的当前分支。

1.2.3 团队项目中的分叉合并

# 克隆或同步最新的代码到本地存储库
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

1.3 Vim

vim是从vi发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。以下是Vim的三种命令模式。

  • 命令模式(Command mode),用户刚刚启动vi/vim,便进入了命令模式。此状态下敲击键盘动作会被vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令
  • 输入模式(Insert mode),在命令模式下按下i就进入了输入模式,按ESC退出输入模式,切换到命令模式。
  • 底线命令模式(Last line mode),在命令模式下按下:(英文冒号)就进入了底线命令模式。底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。基本的命令有q(退出程序)、w(保存文件)等。按ESC键可随时退出底线命令模式。

1.4 正则表达式

正则表达式是对字符串操作的一种逻辑公式。在这节里。老师主要讲述了基本的字符串搜索方法、同时搜索多个字符串的方法、在匹配字符串时的大小写问题、通配符的基本用法、匹配具有多种可能性的字符集、贪婪匹配和懒惰匹配等内容。

2 工程化编程实战

2.1 编写高质量代码的基本方法

  • 通过控制结构简化代码
  • 通过数据结构简化代码
  • 一定要有错误处理
  • 性能优先策略背后隐藏的代价
  • 拒绝修修补补要不断重构代码

2.2 模块化软件设计

模块化(Modularity)是在软件系统设计时保持系统内各部分相对独立,以便每一个部分可以被独立地进行设计和开发。这个环节讲到了用耦合度(Coupling)和内聚度(Cohesion)来衡量软件模块化的程度。

2.3 可重用软件设计

这部分首先讲到了消费者重用和生产者重用。然后是接口,接口就是互相联系的双方共同遵守的一种协议规范,在我们软件系统内部一般的接口方式是通过定义一组API函数来约定软件模块之间的沟通方式。其中包括软件模块接口举例和微服务接口举例。最后讲了可重用软件模块的接口设计范例和通用接口定义的基本方法。

3 从需求分析到软件设计

需求分析是在获取需求的基础上进一步对软件涉及的对象或实体的状态、特征和行为进行准确描述或建模的工作。高质量需求的特点有Correct、Consistent、Unambigious、Complete、Feasible、Relevant等。

原型化方法(Prototyping)和建模的方法(Modeling)是整理需求的两类基本方法。原型化方法可以很好地整理出用户接口方式(UI,User Interface),比如界面布局和交互操作过程。建模的方法可以快速给出有关事件发生顺序或活动同步约束的问题,能够在逻辑上形成模型来整顿繁杂的需求细节。

4 软件科学基础概论

面向对象有三个关键的概念:继承(Inheritance)、对象组合(object composition)和多态(polymorphism),其中多态是一种比较特殊的机制,另外还有回调函数(callback)、闭包(closure)、异步调用和匿名函数也经常用到特殊机制。

4.1 回调函数

  • 典型的回调函数用法举例
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;
}

4.2 设计模式

以下是几大原则

  • 开闭原则(Open Closed Principle,OCP)
  • Liskov替换原则(Liskov Substitution Principle,LSP)
  • 依赖倒置原则(Dependence Inversion Principle,DIP)
  • 单一职责原则(Single Responsibility Principle,SRP)
  • 迪米特法则(Law of Demeter,LoD)
  • 合成复用原则(Composite Reuse Principle,CRP)

4.3 常见的软件架构

  • 三层架构
  • MVC架构
  • MVVM架构

4.4 软件架构的描述方法

  • 分解视图 Decomposition View
  • 依赖视图 Dependencies View
  • 泛化视图 Generalization View
  • 执行视图 Execution View
  • 实现视图 Implementation View
  • 部署视图 Deployment View
  • 工作任务分配视图 Work-assignment View

5 软件危机和软件过程

5.1 没有银弹

1986年,Brooks发表了一篇著名的论文“没有银弹(No Silver Bullet: Essence and Accidents of Software Engineering)”。Brooks认为软件工程专家们所找到的各种方法都是舍本逐末,它们解决不了软件中的根本困难,即软件概念结构(conceptual structure)的复杂性,无法达成软件概念的完整性和一致性,自然无法从根本上解决软件危机带来的困境。

5.2 软件过程模型

5.2.1 瀑布模型

瀑布模型(Waterfall Model)是第一个软件过程开发模型,对于能够完全透彻理解的需求且几乎不会发生需求变更的项目瀑布模型是适用的。但是由于瀑布模型能够将软件开发过程按顺序组织过程活动,非常简单和易于理解,因此瀑布模型被广泛应用于解释项目进展情况及所处的阶段。瀑布模型中的主要阶段通过里程碑(milestones)和交付产出来划分的。

5.2.2 V模型

V模型也是在瀑布模型基础上发展出来的,我们发现单元测试、集成测试和系统测试是为了在不同层面验证设计,而交付测试则是确认需求是否得到满足。也就是瀑布模型中前后两端的过程活动具有内在的紧密联系,如果将模块化设计的思想拿到软件开发过程活动的组织中来,可以发现通过将瀑布模型前后两端的过程活动结合起来,可以提高过程活动的内聚度,从而改善软件开发效率。这就是V模型。

5.2.3 螺旋模型

螺旋模型是在1988年由Boehm提出,是一种演化软件开发过程模型,兼顾了快速原型的迭代的特征以及瀑布模型的系统化与严格监控。螺旋模型最大的特点在于引入了其他模型不具备的风险管理,使软件在无法排除重大风险时有机会停止,以减小损失。同时,在每个迭代阶段构建原型是螺旋模型用以减小风险的基本策略。

5.3 敏捷宣言

敏捷宣言的核心思想是

  • 个体和互动 高于 流程和工具
  • 工作的软件 高于 详尽的文档
  • 客户合作 高于 合同谈判
  • 响应变化 高于 遵循计划

6 小结

几个月的课程学习使我学习到了很多知识,课程实验也增强了我的代码能力和实践能力。桃李不言,下自成蹊,在此特别感谢孟老师这几个月的帮助!

7 参考资料

代码中的软件工程 https://gitee.com/mengning997/se

...全文
145 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧