软件工程(C编码实践篇)学习总结

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

一、学习内容概括

       由孟宁老师教授的——软件工程(C编码实践篇)这一课程是由线上的几个实验构成。实验之间的相关度比较高,每一次实验都是在上一次实验的基础上进行修改,来学习如何把一个简单的程序优化成一个规范、成熟、性能良好的程序。目的是逐步培养我们的软件工程思想。以下是每次实验的内容:

实验一是写一个hello word小程序。主要目的是注重代码风格规范,以及学会使用GitHub。
实验报告链接:https://www.shiyanlou.com/courses/reports/1290483

       一点都不了解Unix-like操作系统的程序员很难讲是一个专业的程序员。大多数服务器操作系统都是Unix-like操作系统。 Linux环境下做开发可以彻底掌控设计。
       本次实验学会了linux的常用命令,如:ls,cd,mkdir,rm,gcc,tar等。同时了解到vim是一种很好用的编辑器,并熟练的使用vim对小程序进行编写。

实验二是实现一个命令行菜单小程序V1.0。要求是这个命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作,实现的命令个数不少于8个。
实验报告链接:https://www.shiyanlou.com/courses/reports/1291332

       通过本次实验,践行了代码风格规范。代码风格的原则:简明、易读、无二义性。代码风格规范在团队交流与协作中有重要的价值。通过缩进、命名、注释等代码编排的风格规范,这些看似繁琐的规范的运用,能使我们代码的可读性提高。

实验三是内部模块化菜单小程序V2.0。目的是注意代码的业务逻辑和数据存储之间的分离,即将系统抽象为两个层级:菜单业务逻辑和菜单数据存储。
实验报告链接:https://www.shiyanlou.com/courses/reports/1294045

       采用模块化编程思想来改进菜单小程序V1.0。包容变化是模块化的主要作用。把软件变化的部分放在一起,可以便于后期维护,提高可重用性。

实验四是用可重用的链表模块来实现命令行菜单小程序。要求是用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作;链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变。
实验报告链接:https://www.shiyanlou.com/courses/reports/1295864

       通过本次实验,我了解到了可重用模块的接口设计。 接口定义了软件单元对外提供的服务。接口的五个要素是:

  • 接口的目标:要实现的功能
  • 接口的前置条件:使用前需要已经完成的准备工作
  • 接口的协议:例如参数和返回值的类型,指针指向的数据格式等
  • 接口的后置条件:例如返回值,printf函数接口的效果是屏幕显示了字符串
  • 接口的质量属性:例如接口的执行时间限制在1s以内

       函数名、参数和返回值是接口的三个显性要素。前置条件和质量属性是接口的两个隐性要素。
       同时在编写接口代码的时候要考虑到如何把接口设计的更通用,更方便未来的重用。可以从以下几点考虑:

  • 参数化上下文信息,例如在链表中使用了表头指针。
  • 移除前置条件
  • 简化后置条件

       需要注意的是:设计通用接口时,不要太具体(专用),也不要太一般(通用)。

实验五用callback增强链表模块来实现命令行菜单小程序V2.8。本次实验要求是:找quit命令无法正常运行的bug;利用callback函数参数使Linktable的查询接口更加通用;注意接口的信息隐藏。
实验报告链接:https://www.shiyanlou.com/courses/reports/1297975

       通过本次实验我了解到了callback函数机制以及接口信息隐藏。找命令中的bug使我对链表的结构更熟悉了,知道链表遍历每一个结点的条件。callback方式的接口就是传递一个函数指针进去,使用户(其他开发者)在使用这个接口的时候可以编码的更简洁一些,也使得接口变的更通用一些,更符合接口的逻辑。

实验六是一次关于函数的可重入性及线程安全的线上考试。

        通过本次考试,我更加深入的学习了函数的可重入性和线程安全。
        关于可重入函数:可重入函数可以由多于一个任务并发使用,而不必担心数据错误。相反,不可重入函数不能由超过一个任务所共享,除非能确保函数的互斥。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。
        关于线程安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
       关于函数的可重入性与线程安全之间的关系:可重入的函数不一定是线程安全的;可重入的函数在多个线程中并发使用时是线程安全的,但不同的可重入函数(共享全局变量及静态变量)在多个线程中并发使用时会有线程安全问题(可能是线程安全的也可能不是线程安全的);不可重入的函数一定不是线程安全的。

实验七,将menu设计为可重用的子系统。实验要求是.为menu子系统设计接口,并写用户范例代码来实现原来的功能;使用make和make clean来编译程序和清理自动生成的文件;使menu子系统支持带参数的复杂命令,并在用户范例代码中自定义一个带参数的复杂命令;可以使用getopt函数获取命令行参数。
实验报告链接:https://www.shiyanlou.com/courses/reports/1304066

       通过本次实验,我了解到当编译的文件较多时,可以使用Makefile来简化编译过程。Makefile工程文件也是代码,要考虑可维护性。通过编写menu接口,可以提高menu子系统的可重用性。通过getop函数分析argc和argv传进来的选项和参数,从而使得用户对命令行有更多的更精确的控制。gets存在缓冲区溢出的问题,所以程序不能用gets的而是用fgets。

二、学习总结

       软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及到程序设计语言、数据库、软件开发工具、设计模式等方面。孟宁老师的软件工程线上课程,从软件工程的代码规范性和系统模块化、可重用性的角度切入,对软件工程思想进行解读。以点盖面,讲解的很具体、生动。
       在学习过程中,我熟悉了linux操作环境,了解了代码风格规范。根据老师的要求一步步从简单到复杂,实现一个命令行菜单小程序,并将其不断修改,以符合模块化、可重用性的要求。
        在学习过程中也有一些遗憾,由于前半学期课程、作业、实验比较多,花在这门线上课程上的时间不算多。没能深入的领会其中的精髓,没能好好阅读这方面的书籍来加深对软件工程思想的理解。希望自己以后时间比较充裕的时候能回过头来充充电。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值