本学期选修了孟宁老师的《高级软件工程》课程,经过上课听讲、完成课后作业和阅读教材《代码中的软件工程》,让我对软件工程的理解更加全面和深入,了解到的工具使用、编码规范、软件设计过程、设计模式以及对于软件危机的思考等将深深影响我之后的编程生涯。课程分为五个部分展开,在课程结束之时,我也分别就以下五个部分记录自己学习的心得体会和收获。
本篇介绍了编程过程中常用的几个工具,这些工具可以提升我们编程的效率。
Visual Studio Code(以下简称vscode)是一个轻量且强大的代码编辑器,支持多平台,强大的插件拓展使得vscode支持各种语言和各种功能,课上孟老师在介绍其使用的同时也以其作为例子分析了其作为一款优秀软件而风靡编程界的特点:
Git作为版本控制工具在项目编码过程中十分重要,本节学习了其使用,比如以下命令:
git init # 在一个新建的目录下创建版本库
git clone https://github.com/YOUR_NAME/REPO_NAME.git # 通过clone远端的版本库从而在本地创建一个版本库
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命令官方的解释是“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”,即从其他存储库或分支抓取并合并到当前存储库的当前分支。
正则表达式是对字符串操作的一种逻辑公式,是程序员手中一把威力无比强大的武器,通过其学习我们可以方便的查询和替换字符串,提高编程效率,对常用的通配符做以下总结:
本篇以menu菜单项目的不断迭代介绍了工程化编程的基本方法,例子深入浅出,有许多点让我印象深刻。
之前的编码中我不怎么注重编码的风格,导致代码十分难读,了解了简明、易读、无二义性的代码风格原则后我又学习了googleC++编程规范,现在的代码较之前易读许多。将课程中提到的规范总结如下:
最初学习编程时接触到的就是性能优先策略,在课上了解到的其代价改变了我的一些编程习惯,代价具体如下:
模块化编程是面向过程编程的重要方法,其基本原理是关注点的分离,关注点的分离的思想背后的根源是由于人脑处理复杂问题时容易出错,把复杂问题分解成一个个简单问题,从而减少出错的情形。
接口就是互相联系的双方共同遵守的一种协议规范,
可重入的函数不一定是线程安全的,可能是线程安全的也可能不是线程安全的;可重入的函数在多个线程中并发使用时是线程安全的,但不同的可重入函数(共享全局变量及静态变量)在多个线程中并发使用时会有线程安全问题;不可重入的函数一定不是线程安全的。
这三个角度的软件质量有着内在的联系,比如具有商业价值的软件产品是以用户质量为前提的,具有良好用户质量的软件产品也往往有一些好的产品内在质量特点。
本篇介绍了一种从需求分析到软件设计的基本建模方法。按照敏捷统一过程的基本流程,包括获取需求、用例建模、业务领域建模、对象交互建模、形成设计类图、软件编码实现和应用部署。
需求是期望行为的表述,需求分析就是需求分析师对用户期望的软件行为进行表述,并进一步用对象或实体的状态、属性和行为来定义需求。
用例(Use Case)的核心概念中首先它是一个业务过程(business process),经过逻辑整理抽象出来的一个业务过程,这是用例的实质。
统一过程(UP,Unified Process)的核心要义是用例驱动(Use case driven)、以架构为中心(Architecture centric)、增量且迭代(Incremental and Iterative)的过程。
设计模式的本质是面向对象设计原则的实际运用总结出的经验模型。
MVC即为Model-View-Controller(模型-视图-控制器),MVC中M、V和C所代表的含义如下:
MVVM即 Model-View-ViewModel
特点:
软件架构模型是通过一组关键视图来描述的,同一个软件架构,由于选取的视角(Perspective)和抽象层次不同可以得到不同的视图,这样一组关键视图搭配起来可以完整地描述一个逻辑自洽的软件架构模型。
IEEE将软件质量定义为,一个系统、组件或过程符合指定要求的程度,或者满足客户或用户期望的程度。
软件工程专家们所找到的各种方法都是舍本逐末,它们解决不了软件中的根本困难,即软件概念结构(conceptual structure)的复杂性,无法达成软件概念的完整性和一致性,自然无法从根本上解决软件危机带来的困境。
分析、设计、实现、交付和维护五个阶段
在瀑布模型的基础上增加一个原型化(prototyping)阶段,可以有效将风险前移,改善整个项目的技术和管理上的可控性。
原型就是根据需要完成的软件的一部分,完成哪一部分是根据开发原型的目标确定,比较常见的有用户接口原型和软件架构原型。
V模型也是在瀑布模型基础上发展出来的,我们发现单元测试、集成测试和系统测试是为了在不同层面验证设计,而交付测试则是确认需求是否得到满足。也就是瀑布模型中前后两端的过程活动具有内在的紧密联系,如果将模块化设计的思想拿到软件开发过程活动的组织中来,可以发现通过将瀑布模型前后两端的过程活动结合起来,可以提高过程活动的内聚度,从而改善软件开发效率。
互联网使得知识的获取变得更加容易,很多软件可以由一个小团队来实现。同时,技术更新的速度在加快,用户需求的变化也在加快,开发流程必须跟上这些快速变化的节奏。于是敏捷方法就产生了。
敏捷宣言:
DevOps(Development和Operations的组合)是一组过程、方法与系统的统称,用于促进软件开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作。
以上是对本课程内容的总结,很荣幸本学期选修了孟宁老师的这门课程,学习到如此多软件工程领域的知识,相信这些知识会对我之后的编程生涯产生非常有益的影响。
学号后三位:290
参考资料:代码中的软件工程