高级软件工程课程总结

来源:互联网 发布:身材好的女友知乎 编辑:程序博客网 时间:2024/06/06 08:45

詹港 原创作品转载请注明出处《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006

1.前瞻

本篇博客是为了对2017年上半年在中国科学技术大学软件学院苏州研究院由孟宁老师开讲的高级软件工程一课的线上学习总结。在同时本篇博客中我将回顾整个高软学习的历次实验并试图做出总结,同时对课程进行个人总结。

2.实验总结

在本次学习中,通过网易云课堂进行视频学习知识点,配套实验楼进行实验。下面对实验进行总结。先将所有的实验做成目录,再对每个部分的实验进行分述。

2.1实验列表

  • 实验一:写一个hello world小程序
  • 实验二:命令行菜单小程序V1.0
  • 实验三:内部模块化的命令行菜单小程序V2.0
  • 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
  • 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
  • 实验六:函数的可重入性(reentrant)及线程安全
  • 实验七:将menu设计为可重用的子系统

点击链接可以直接查看实验报告,其中实验六属于网易云课堂线上测试,并没有实验楼实验。

2.2实验详解

实验一:写一个hello world小程序
关键词:Linux环境、代码库管理
实验一的内容非常简单,只是实现一个简单的hello world程序,但是在第一次试验中使用了linux编程环境,linux基本命令对于今后的学习会有很大的帮助,从小程序入手,才能逐步的过渡到大的软件工程项目,而且让我们学会使用git代码库来管理代码,对于今后的维护和管理很有帮助。

实验二:命令行菜单小程序V1.0
关键词:代码规范性、代码编排风格
本次试验通过一个简单的命令行菜单小程序来引导我们保持代码书写的规范性,遵守简明、易读、无二义性的代码风格,注意书写代码时候的缩进、命名、注释等代码编排的风格规范。

实验三:内部模块化的命令行菜单小程序V2.0
关键词:内部模块化
实验三是在实验二的基础上进一步的改进,在这一部分,主要强调的内容是注意代码的业务逻辑和数据存储之间的分离,即将系统抽象为两个层级:菜单业务逻辑,和菜单数据存储,使用不同的源文件实现,所以会有2个.c和一个.h作为接口文件。这部分很关注代码设计规范的方法中的内部模块化的方法,内部模块化的方法在软件开发中是利器,使得程序的整个结构体系更加的清晰,便于代码的阅读和后期的功能补充,而且在整个过程中简化了程序员对于代码的理解过程,所以在后续的程序开发中要尤其注重在这方面的提高。

实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
关键词:可重用链表、接口设计
实验四仍然是在上一个实验的基础上进一步改进,在实验四中,要求使用用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作,链表模块能够简化对于命令行菜单小程序的功能调用,如果在遇到较大规模的软件,可重用链表模块能够使得整体结构更加清晰。

实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
关键词:callback回调、数据隐藏
实验五是在实验四的基础上进一步进行改进,在这一部分,是为了学习callback函数,它是一种实现模块通用性的实现机制,能够实现模块解耦功能,
利用callback函数参数使Linktable的查询接口更加通用,同时我们也必须要注意接口的信息隐藏。

实验六:函数的可重入性(reentrant)及线程安全
关键词:函数可重入性、线程安全
本次实验是知识点详述,所以内容比较多。
可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反,不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。
线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全。如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
可重入的函数不一定是线程安全的,可重入的函数在多个线程中并发使用时是线程安全的,但不同的可重入函数(共享全局变量及静态变量)在多个线程中并发使用时会有线程安全问题(可能是线程安全的也可能不是线程安全的)读写锁可以有效解决这里的线程安全问题。

实验七:将menu设计为可重用的子系统
关键词:Makefile方法、fgets()、menu子系统
实验七仍然是在之前的实验基础上进行的新功能的添加,Makefile方法能够减轻执行程序时繁琐的指令输入过程,menu子系统的引入,能够支持带参数的复杂命令,在用户代码中定义一个带参数的复杂命令。getopt()用来获取命令参数,实现对指令的调用;gets()方法有缓冲区溢出的问题,为了防止缓冲区溢出攻击的危险,使用fgets()方法更好。

3.课程总结

## 3.1学习完《软件工程(C编码实践篇)》课程后您最大的收获是什么?
在学习这门课程之前,我对软件工程的知识知之甚少,通过大半个学期的感觉收获到了很多软件工程相关的知识,线下课程中我们一起研读了google软件工程,从中我学习到了google的代码风格、构建系统、代码审查、测试、Bug 跟踪、调试和剖析工具、发布工程、启动批准等方面的知识。
通过线上向下的综合学习,我学习了系统化的软件工程,知道了要以软件工程的方法进行设计、编码、测试和发布等。

3.2学习完《软件工程(C编码实践篇)》课程后您最大的遗憾是什么?

最大的遗憾当然是由于代码量过少,能够学习到的实际经验有限。毕竟很多软件工程知识只有当有了一定的代码经验积累才能真正的融会贯通。希望自己能在以后的工作和学习中对本次课程中学习到的软件工程方法思想进行验证,进一步学习。