在学习《高级软件工程》课程内容和《代码中的软件工程》一书后,我对软件工程领域有了更深入的了解和体会。下面是我对学习内容的总结和心得体会。
学习内容回顾
工欲善其事,必先利其器
首先,工欲善其事,必先利其器。学习中强调了版本控制工具Git的使用,包括本地版本库和远程版本库的基本用法,团队项目中的分叉合并,Git Rebase以及Fork + Pull request等。
通过 rebase,可以将一个分支的修改应用到另一个分支上,实现两个分支的合并。相比于使用 Git merge命令, rebase 可以将多个commit历史合并为一个或者修改提交的顺序,避免了冗余的提交历史,使得项目的演进更加 清晰。
需要注意的是,由于 rebase 修改了提交历史,因此在共享分支的情况下,应谨慎使用 rebase。
git rebase -i [startpoint] [endpoint]
其次,学习了vim编辑器的使用。vim是一款强大的文本编辑器,在开发过程中起到了重要的作用。学习了vim的三种模式,包括命令模式、插入模式和底线命令模式,以及光标的移动、删除、复制粘贴、搜索替换等基本操作。
- 命令模式(Command mode),用户刚刚启动vim,便进入了命令模式。此状态下敲击键盘动作会被vim 识别为命令,而非输入字符。
- 输入模式(Insert mode),在命令模式下按下i就进入了输入模式,按ESC退出输入模式,切换到命令模 式。
- 底线命令模式(Last line mode),在命令模式下按下:(英文冒号)就进入了底线命令模式。底线命令模式 可以输入单个或多个字符的命令,可用的命令非常多。基本的命令有q(退出程序)、w(保存文件)等。按 ESC键可随时退出底线命令模式。
另外,正则表达式也是软件工程中常用的工具。学习了正则表达式的字符匹配、重复匹配、边界匹配、分组和捕获、贪婪匹配和懒惰匹配等基本概念和用法。正则表达式在文本处理和数据提取等方面非常有用,能够快速有效地完成各种匹配操作。
字符匹配
.
:匹配除换行符外的任意字符。
\w
:匹配任何字母、数字和下划线。等效于[a-zA-Z0-9_]
。
\d
:匹配任何数字。等效于[0-9]
。
\s
:匹配任何空白字符,包括空格、制表符、换行符等。
[...]
:字符类,匹配方括号内的任意字符。例如,[aeiou]
匹配任何一个元音字母。
重复匹配
*
:匹配前面的元素零次或多次。例如,ab*
匹配"a"、"ab"、"abb"等。
+
:匹配前面的元素一次或多次。例如,ab+
匹配"ab"、"abb"等,但不匹配"a"。
?
:匹配前面的元素零次或一次。例如,ab?
匹配"a"和"ab",但不匹配"abb"。
{n}
:精确匹配前面的元素出现n次。例如,a{3}
匹配"aaa"。
{n,}
:匹配前面的元素至少出现n次。例如,a{2,}
匹配"aa"、"aaa"等。
{n,m}
:匹配前面的元素至少出现n次,最多出现m次。例如,a{2,4}
匹配"aa"、"aaa"和"aaaa"。
边界匹配
^
:匹配字符串的开头。例如,^abc
匹配以"abc"开头的字符串。
$
:匹配字符串的结尾。例如,xyz$
匹配以"xyz"结尾的字符串。
\b
:匹配单词的边界。例如,\btest\b
匹配单词"test",但不匹配"atesting"。
分组和捕获
(...)
:分组匹配,可以用于组合多个元素。例如,(ab)+
匹配"ab"、"abab"等。
(?:...)
:非捕获分组,类似于普通分组,但不会生成捕获结果。
掌握了这些技巧可以提高编辑效率,并且在命令行环境下进行配置,进一步提升了开发效率。
代码中的软件工程
在软件设计方面,学习了模块化软件设计的重要性,以及一些基本的软件设计方法。强调了代码风格的原则,包括简明、易读、无二义性等,以及编写高质量代码的基本方法。讲解了KISS原则、可重用软件设计、接口设计、微服务、RESTful API等概念和技术,这些都是提高软件质量和可维护性的重要手段。
KISS(Keep It Simple & Stupid)原则
- 一行代码只做一件事
- 一个块代码只做一件事
- 一个函数只做一件事
- 一个软件模块只做一件事
从需求分析到软件设计
在需求分析和软件设计过程中,学习了需求的类型、高质量需求的特点,以及需求分析和用例建模的基本方法。了解了用例的概念、用例的信息流特征、用例建模的步骤和技巧,以及面向对象分析的基本概念和建模方法。这些内容对于从需求分析到软件设计的过程起到了指导作用,帮助开发人员更好地理解和满足用户需求。
需求分析的两类基本方法
- 原型化方法:可以很好地整理出用户接口方式(UI,User Interface),比如界面布局和交互操作 过程。 建模的方法 (Modeling)
- 建模的方法:可以快速给出有关事件发生顺序或活动同步约束的问题,能够在逻辑上形成模型来 整顿繁杂的需求细节。
敏捷统一过程的四个关键步骤
- 第一,确定需求;
- 第二,通过用例的方式来满足这些需求;
- 第三,分配这些用例到各增量阶段;
- 第四,具体完成各增量阶段所计划的任务。
软件科学基础概论
此外,学习了软件科学中的一些特殊机制,如回调函数和多态。对抽象思维和逻辑思维进行了比较,并认识到软件的复杂性是其本质属性。介绍了常用的设计模式及其背后的设计原则,设计模式能够提供解决常见问题的经验模型,提高代码的可重用性和灵活性。
一小部分常用的设计模式
-
单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。这对于需要在整个应用程序中共享相同资源的情况非常有用。
-
工厂模式(Factory Pattern):用于创建对象的模式。它提供一个公共接口来创建不同类型的对象,而无需直接实例化具体类。
-
观察者模式(Observer Pattern):定义对象之间的一对多依赖关系,当一个对象状态发生变化时,它的所有依赖对象都会收到通知并自动更新。
-
职责链模式(Chain of Responsibility Pattern):用于将请求的发送者和接收者解耦,并允许多个对象都有机会处理请求。它将这些对象连接成一个链,并沿着链传递请求,直到有一个对象能够处理它为止。
软件危机和软件过程
最后,学习了软件危机和软件过程模型。了解了软件危机的争论和软件过程模型的不同类型,包括瀑布模型、原型化的瀑布模型、V模型、螺旋模型等。探讨了个人软件过程PSP、团队软件过程TSP以及CMM/CMMI等软件过程改进方法和标准。
CMMI共有5个级别,代表软件团队能力成熟度的5个等级,数字越大,成熟度越高,高成熟度等级表示有比较强的软件综合开发能力。
-
一级,初始级,软件组织对项目的目标与要做的努力很清晰,项目的目标可以实现。
-
二级,管理级,软件组织在项目实施上能够遵守既定的计划与流程,这级能保证项目的成功率。
-
三级,已定义级,软件组织能够根据自身的特殊情况及自己的标准流程,将这套管理体系与流程予以制度化。
-
四级,量化管理级,软件组织的项目管理实现了数字化,降低了项目实施在质量上的波动。
-
五级,持续优化级,软件组织能够充分利用信息资料,对软件组织在项目实施的过程中可能出现的问题予以预防。能够主动地改善流程,运用新技术,实现流程的优化。
此外,还学习了敏捷方法、Scrum敏捷开发方法和DevOps等新兴的软件开发方法和流程,这些方法和流程强调迭代、增量和团队协作,能够提高开发效率和产品质量。
我的收获和感想
-
通过学习Git和版本控制的基本用法,我能够更好地管理代码的版本和协作开发,提高团队合作效率。
-
vi/vim编辑器的学习让我在命令行环境下更加高效地进行代码编辑和操作,提高了我的开发效率。
-
正则表达式的掌握让我能够快速有效地进行文本处理和数据提取,提高了处理复杂文本的能力。
-
代码中的软件工程的学习让我更加注重代码的质量和可维护性,掌握了编写高质量代码的基本方法和设计原则。
-
从需求分析到软件设计的过程让我更好地理解和满足用户需求,掌握了用例建模和面向对象分析的基本方法。
-
软件科学的学习让我认识到软件开发中的抽象和逻辑思维的重要性,以及设计模式在提高代码复用性和灵活性方面的作用。
-
学习软件过程模型让我了解了不同的开发方法和流程,帮助我更好地组织和管理软件开发项目。
总之,通过学习《代码中的软件工程》一书和《高级软件工程》课程内容,我对软件工程领域有了更深入的了解。这些知识和技能对于我作为一名软件开发人员来说非常重要,能够帮助我编写高质量的代码,进行有效的团队协作,并且在需求分析和软件设计过程中更好地满足用户需求。孟宁老师不仅对软件工程领域有深入的了解,还涉猎广泛,引入哲学、历史故事等其他领域的知识。这样的引入不仅增加了课程的趣味性,也让我们从更宽广的视角思考软件工程问题,让学习变得更加愉快且非常有意义。感谢孟宁老师为我们带来的愉快而丰富的学习体验!
参考资料:
- 《代码中的软件工程》代码中的软件工程: 《代码中的软件工程》一书的配套ppt和源代码
- 《高级软件工程》课程内容