《代码中的软件工程》 学习总结与心得



前言

本学期选修了孟宁老师的高级软件工程,通过《代码中的软件工程》一书,学习如何科学进行软件开发,以减少错误。本人在此之前已在公司有两年开发经验,本文结合自身的开发经验,总结一下课程中学习到的内容,并谈一些自身的心得。

一、工欲善其事,必先利其器

这一部分则主要介绍了软件开发过程中常用且高效的一些工具,包括VS Code,Git、Vim和正则表达式的使用方式和技巧。

1. VS Code

VS Code是一个轻量级代码编辑器,它被广泛用于开发各种类型的应用程序。VS Code之所以强大,则是通过LSP和DAP这两个协议,使得VS Code应用于与各种编程语言的开发和调试相关的功能,例如代码补全、语法检查、断点设置等。以下是一些常见的快捷键:

Ctrl+Shift+P 调出 VS Code 命令行
Ctrl+~ 调出 VS Code 的终端
Ctrl/⌘+Shift+E 文件资源管理器
Ctrl/⌘+Shift+G 源代码管理
Ctrl/⌘+Shift+F 跨文件搜索
Ctrl/⌘+Shift+D 启动和调试
Ctrl/⌘+Shift+M 查看错误和警告
Ctrl/⌘+Shift+X 管理扩展插件

2. Git

Git是一个开源的分布式版本控制系统,广泛应用于软件开发中的代码管理和版本控制。Git的常用命令如下:

git init # 初始化一个本地版本库
git status # 查看当前工作区(workspace)的状态
git add [FILES] # 把文件添加到暂存区
git commit ­-m “wrote a commit log infro” # 把暂存区里的文件提交到仓库
git log # 查看当前HEAD之前的提交记录,便于回到过去
git push # 将本地仓库中代码提交到远程仓库中

3. Vim

Vim是Vi编辑器的改进版,提供了许多增强的功能和更友好的用户界面。

普通模式(Normal Mode):用于导航、删除、复制和粘贴等操作。
插入模式(Insert Mode):用于输入文本。
命令行模式(Command-Line Mode):用于执行复杂的编辑命令和搜索操作

4. 正则表达式

正则表达式是一种用于匹配和操作文本模式的工具。它是由一系列的字符和特殊字符组成的模式,用于描述匹配和搜索特定文本模式的规则。以下是正则表达式中的通配符:

点号" . “:点号表示匹配任意单个字符,除了换行符(\n)。
星号’’ * “:星号表示匹配前面的元素零次或多次。例如,” ab* “表示匹配一个字符"a"后面跟着零个或多个字符"b”。
问号”?“:问号表示匹配前面的元素零次或一次。例如,“colou?r"可以匹配"color"或"colour”。
加号”+“:加号表示匹配前面的元素一次或多次。例如,“go+l"可以匹配"gol”、“gool"等。
花括号”{}":花括号用来指定前面元素的数量范围。例如,"a{2,4}“表示匹配连续出现2到4次的字符"a”。

在我实际开发过程中,使用最多的就是Git了。不过由于项目的需要,我负责的内容工作的相关代码并没有与其他团队成员在一起,因此实际中我所接触到的git命令并不是很多,只有git clone,git add,git commit等操作。

二、工程化编码实战

这一部分则通过一个命令行控制的菜单子系统,来介绍编码过程中要注意的点,如代码风格、模块化设计、接口设计等。另外,还设计到可重入函数和线程安全相关的内容。课程所介绍的内容也恰是实际编码过程中所需要的,因此这部分内容对我来说是帮助是巨大的。

代码风格

还记得我刚入职接的第一件事,就是看公司的代码规范文档。代码不是给自己看的,而是给别人看的。由于一个大型软件必然不是由一个人完全开发的,那么就少不了看他人的代码。如果同事在的话还好,一旦同事离职,代码风格还不好的情况下,接手他人的代码真的很痛苦。我工作期间就接手过一段可读性特别差的,变量命名不规范,并且还没有注释,理清楚代码的逻辑需要大量的时间。

模块化设计

模块化就是在软件系统设计时保持系统内各部分相对独立,以便每一个部分可以被独立地进行设计和开发。就拿我工作的内容举个例子,开发的是一个桌面软件系统,涉及到如加解密、网络通信、捕获桌面信息等功能。那么在设计时,就会将这些功能单独开发,每个功能做成一个库的形式,在主程序中通过加载库来进行调用。一旦后续功能有变动,无需更改主程序,直接更新库即可。
模块化的基本方法有:

  1. KISS原则。提高模块的内聚度,降低模块间的耦合度。一段代码只做一件事。
  2. 本地化外部接口。通过使用接口本地化的方式,间接地访问该对象,从而限制、增强或修改该对象的一些特性。当外部对象变化时,只需求改本地接口即可。
  3. 先写伪代码的代码结构。伪代码不会破坏架构设计,可以很好的观察模块的逻辑关系。

接口设计

接口就是互相联系的双方共同遵守的一种协议规范,在软件系统内部一般的接口方式是通过定义一组API函数来约定软件模块之间的沟通方式。 在面向过程的编程中,接口一般定义了数据结构及操作这些数据结构的函数;而在面向对象的编程中,接口是对象public的一组属性和方法的集合。函数或方法具体包括名称、参数和返回值等。
在我开发的软件中,曾设计到对第三方软硬件的使用。但是由于第三方厂商众多,各个的标准不一,如返回值的类型,个数都不一样。如果新增加一个厂商接入,就需要修改主程序。后来设计使用一个抽象类,主程序对第三方软硬件的访问都通过这个抽象类,返回类型、个数等都是固定的,即使有新的厂商商品接入,也无需更改;对外则使用模块化的方法,将第三方的接口本地化处理。

接口的基本要素:

  1. 接口的目的
  2. 接口使用前所需要满足的条件,一般称为前置条件或假定条件
  3. 使用接口的双方遵守的协议规范;
  4. 接口使用之后的效果,一般称为后置条件;
  5. 接口所隐含的质量属性。

通用接口定义的基本方法:

  1. 参数化上下文
  2. 移除前置条件
  3. 简化后置条件

可重入函数和线程安全

可重入函数可以由多于一个线程并行调用,而不用担心数据错误。相反,不可重入函数不能由超过一个线程所共享,除非能确保函数的临界区是互斥访问的。我曾经遇到过一个bug,一段代码运行不起来,可是我只要加上一句打印信息(使用了cout)代码就运行正常了。当时改了好久都没有解决。通过这部分内容中关于指令优化的部分,我觉得当时问题可能是因此引起的。当然也给我增加了在以后开发中要有意识知道实际执行的指令和实际代码指令的先后顺序并不一定是一致的。

三、需求分析和软件设计

这部分内容主要学习了如何从获取需求,到需求分析再到软件设计的过程。在从需求分析到软件设计的过渡中,学习了敏捷统一过程、对象交互建模和形成软件设计方案的基本方法。

需求分析

需求的四种类型:

  1. 功能性需求:根据需要的活动描述需要的行为
  2. 质量需求或非功能需求:描述软件必须具备的一些质量特征
  3. 设计约束:设计决策,如平台或接口组件的选择
  4. 过程约束:对可用于构建系统的技术或资源的限制

需求分析的两类基本方法

  1. 原型化方法:可以很好地整理出用户接口方式(UI,User Interface),比如界面布局和交互
    操作过程。
  2. 建模的方法:可以快速给出有关事件发生顺序或活动同步约束的问题,能够在逻辑上形成模
    型来整顿繁杂的需求细节。而建模则可具体分为用例建模和业务领域建模。

用例的四个条件:

  1. 它是不是一个业务过程?
  2. 它是不是由某个参与者触发开始?
  3. 它是不是显式地或隐式地终止于某个参与者?
  4. 它是不是为某个参与者完成了有用的业务工作?

需求分析这部分内容在工作中接触较少,开发任务基本都是由产品经理分析分发的。不过通过本章学习知道了需求分析的过程。

软件设计

统一过程的核心要义是用例驱动、以架构为中心、增量且迭代的过程。用例驱动就是用例建模得到的用例作为驱动软件开发的目标;以架构为中心的架构是后续软件设计的结果,就是保持软件架构相对稳定,减小软件架构层面的重构造成的混乱;增量且迭代则是使用增量和迭代的方式开发软件,从小到大。
敏捷统一过程的四个关键步骤 ,其中前三步主要是计划阶段的工作,第四步是增量阶段的工作。

  1. 确定需求;
  2. 通过用例的方式来满足这些需求
  3. 分配这些用例到各增量阶段
  4. 具体完成各增量阶段所计划的任务

另外,通过本章的学习我知道了如何形成一个软件的设计方案。当项目中出现继承、组合或聚合关系时,一旦代码体积庞大,有一个类图进行辅助,那么开发起来效率很高。之前工作时当涉及新功能编写时,leader总是提醒要画好类图,当时还不是很理解,经过本章学习有了很深的体会。当然,也学会如何使用科学的方法画好一个类图,而不是靠自己的感觉去实现。

四、软件科学基础概论

本节介绍了什么是软件,讲解了软件的基本概念、设计模式、软件架构和软件质量。
在软件是什么一章中,给我印象最深刻的就是软件中的一些特殊机制,如回调函数、多态、匿名函数等。这些都是在实际项目开发中会用到的技术。不过由于我之前工作经验少,在实际项目中用到较少。通过本章学习,意识到之前的代码编写时可以用这些机制能够很好的实现一些功能。

设计模式

对于设计模式,我之前也只是听说过,并未在实际项目中使用过。不过经过学习,会想起之前的编码,觉得用一些设计模式会更加高效,在扩展上面也会有很好提升。而设计模式后的设计原则我也印象深刻,在实际开发中使用这些原则,确实能够简化软件开发。比如尽量使用合成复用原则,而不使用继承复用,能够减少模块间的耦合,在开发中能够避免很多代码改动。
设计模式具有以下优点:

  1. 可以提高程序员的思维能力、编程能力和设计能力。
  2. 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开 发周期。
  3. 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。

软件架构

常见的软件架构有MVC架构和MVVM架构。这两种架构我个人认为在前端页面开发中比较多,之前自己对这些并不熟悉,不过通过学习这两种架构,认识到这是一种很灵活的软件开发方式。通过将模型与视图进行分离,更加灵活与智能。

五、软件危机的前世后世

这部分内容主要介绍了软件危机和软件过程。软件危机是指在软件开发中遇到的各种问题和挑战,学习软件危机和软件过程可以帮助我们了解这些问题的原因,并提供一些解决方案和最佳实践。在公司开发中,更多的则是团队软件开发。经过本章学习,我认识到如何管理团队、让团队成员协作开发也是很难的。更意识到将来作为某一个团队成员,如何发挥出色。

总结

通过本课程的学习,我自身的感受颇深。更加明白,在软件开发的过程中,作为一名程序员,实现编码只是其中的一小块的工作。对本课程中所提到的一些问题和解决方案,相信在未来软件开发过程中能有得到应用。

参考资料:《代码中的软件工程

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值