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

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

学号:SA17225159
姓名:李宝全
网易云昵称:sa17225159
《软件工程(C编码实践篇)》MOOC课程作业 http://mooc.study.163.com/course/USTC-1000002006


一、学习心得

不同于早期的软件开发,如今的软件开发早已经不是一个人的战斗,一个软件的开发,运行,维护需要很多人的参与,另外,现代化软件也朝向巨型化,复杂化发展。

  • 软件 = 程序 + 软件工程
  • 软件工程就是用工程化的思想来构建软件的过程。件工程是把系统的, 有序的, 可量化的方法应用到软件的开发, 运营, 和维护上的过程。

在《软件工程(C编码实践篇)》课程中,孟宁老师带着我们从一个简单的“hello world”程序开始,逐步深入,结合menu命令行菜单小程序,一步一步带领我们学习了代码风格规范、模块化设计思想、可重用的接口设计,callback机制、多线程与线程安全、Makefile等软件工程的设计思想。此外,还教我们使用了git这一分布式版本控制系统来管理我们自己的代码。

《软件工程(C编码实践篇)》主要有8个课时,下面介绍一下我对每一个课时的理解。

1.熟悉Linux实验环境

在本次课程中我了解了如何在linux环境下进行C语言程序的开发以及简单的vim应用。

2.代码风格规范

代码是给程序员看的,而不是给机器看的,所以编写具有良好风格规范的代码是很重要的,代码风格规范在团队协作和交流中有重要作用,可以帮助其他人更加有效率的了解自己编写的代码。良好的代码风格规范应该包含如下的特点:

  • 代码缩进4个空格,而不是使用tab
  • 一行代码最好可以完整的在屏幕中显示,原先行宽是80个字符,现在100最好是100个字符
  • 代码风格的原则:简明、易读、无二义性
  • 不要把多条语句和多个变量定义放在同一行
  • 即使只有单条语句,也使用{}分割,这样可以更好的定义循环体或条件体的范围
  • {和}单独占据一行
  • 注释使用英文,不要用中文,保持源代码是ASCII字符格式文件,这样可以防止代码在迁移到其他机器时发生乱码现象

更具体的可以参见 现代软件工程讲义 3 代码规范与代码复审

3.基本的模块化设计

模块化思想 :

  • “开-闭”原则,对扩展是开放的,对修改是封闭的。
  • 业务逻辑层和数据存储层。将系统模块放在不同的源文件。

代码设计中的一些常见方法

  • KISS(keep it simple & stupid),一个函数只做一件事
  • using design to frame the code(matching design with implementation)
  • including pseuducode
  • 不要和陌生人说话原则
  • 合理利用Control Structures、Data Structures来简化代码
  • 一定要有错误处理
4.可重用模块的接口设计

定义接口

  • 接口规范
  • 内聚和耦合
  • 通用原则

模块化的接口设计,可以实现模块内的高内聚和模块间的低耦合。
接口的五个要素:

  • Purpose 比如函数名表明了接口的目的
  • Preconditions 比如接口函数调用前已经做好了哪些准备
  • Protocols 比如参数和返回值的类型,指针指向的数据格式等
  • Postconditions 比如返回值、printf函数接口的效果是屏幕显示了字符串
  • Quality attributes 比如接口函数的执行时间限制在1s内
    前置条件和质量属性是接口的两个隐含属性。
5.可重用模块的接口设计(callback函数)

call-in与call-back

  • call-in指的是通常的函数调用方式,在一个函数中调用另一个函数。
  • call-back指的是回调函数,”回调函数”就是通过“函数指针”调用的函数。通常这个”函数指针”会作为另外一个函数的一个参数,当这个指针被用来调用其指向的函数的时候,便产生了“回调”。
  • 不同于call-in的立即调用,call-back会在合适的时候调用,以完成目标任务。
6.函数的可重入性(reentrant)及线程安全浅析

不同于单线程编程,在多线程编程时需要考虑函数的可重用性和代码的线程安全问题。

  • 可重入函数可以由多于一个任务并发使用,而不必担心数据错误。
  • 线程安全就是指运行在多线程环境下的代码,每次运行结果和运行在单线程环境下是一致的,则这段代码就是线程安全的。

函数的可重入性与线程安全之间的关系

  • 可重入的函数不一定是线程安全的;
  • 可重入的函数在多个线程中并发使用时是线程安全的,但不同的可重入函数(共享全局变量及静态变量)在多个线程中并发使用时会有线程安全问题(可能是线程安全的也可能不是线程安全的);
  • 不可重入的函数一定不是线程安全的
7.子系统的可重用设计

可重用设计要考虑设计复杂度和重用颗粒度的协调性,重用颗粒度越小,其设计就越复杂,所以可重用设计采取的准则是——够用就好。

Makefile工程文件

  • make 从Makefile的第一个目标all开始执行
  • Makefile文件不支持空格代替Tab键
  • Makefile工程文件也是代码,也要考虑可维护性。
8.代码背后的设计思想

几个重要的设计指导原则

  • Modularity
  • Interfaces
  • Information hiding
  • Incremental development
  • Abstraction
  • Generality

二.实验报告和实验代码

写一个hello world小程序:

  • 在Linux命令行环境使用C语言编写,编译后执行输出”Hello,World!”;
  • 实验务必在linux命令行环境下完成,课程视频是在本地虚拟机上操作的,除了目录环境和作业提交方式不同外,基本的命令和编辑操作方式是一致的。

实验报告:https://www.shiyanlou.com/courses/reports/1290113
实验代码:https://github.com/libaoquan95/seClass_lab1

1、代码风格规范:

  • 代码风格的原则:简明、易读、无二义性;
  • 缩进、命名、注释等代码编排的风格规范;
  • 《构建之法》4.1代码规范
  • 高质量C++/C编程指南(林锐)

2、具体要求(参照视频中的具体实验过程):

  • 实现一个命令行的菜单小程序,执行某个命令时调用一个特定的函数作为执行动作,实现的命令个数不少于8个;
  • 类似ftp的help目录或者bash的help目录;
  • 程序循环、接收用户的命令,如help、others等命令;
  • 可以广泛通用的命令行菜单子系统组件,可方便地定制而嵌入到其他系统;

实验报告:http://blog.csdn.net/lbq19950117/article/details/78034057
实验代码:https://github.com/libaoquan95/seClass_lab2

实验要求(参照视频中的具体实验过程)

  • 注意代码的业务逻辑和数据存储之间的分离,即将系统抽象为两个层级:菜单业务逻辑和菜单数据存储
  • 要求:
    1)遵守代码风格规范,参考借鉴代码设计规范的一些方法;
    2)代码的业务逻辑和数据存储使用不同的源文件实现,即应该有2个.c和一个.h作为接口文件。

实验报告:http://blog.csdn.net/lbq19950117/article/details/78076687
实验代码:https://github.com/libaoquan95/seClass_lab3

实验要求(参照视频中的具体实验过程)

  • 用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作;
  • 链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变;
  • 可以将通用的Linktable模块集成到我们的menu程序中;
  • 接口规范;

实验报告:http://blog.csdn.net/lbq19950117/article/details/78180402
实验代码:https://github.com/libaoquan95/seClass_lab4

实验要求(参照视频中的具体实验过程)
本实验在提供的代码基础上进行

  • 给lab5-1.tar.gz找bug,quit命令无法运行的bug 利用callback函数参数使Linktable的查询接口更加通用
  • 注意接口的信息隐藏

实验报告:http://blog.csdn.net/lbq19950117/article/details/78247607
实验代码:https://github.com/libaoquan95/seClass_lab5

实验要求(参照视频中的具体实验过程)

  • 为menu子系统设计接口,并写用户范例代码来实现原来的功能; 使用make和make
  • clean来编译程序和清理自动生成的文件;
  • 使menu子系统支持带参数的复杂命令,并在用户范例代码中自定义一个带参数的复杂命令;
  • 可以使用getopt函数获取命令行参数。

实验报告:http://blog.csdn.net/lbq19950117/article/details/78379688
实验代码:https://github.com/libaoquan95/seClass_lab7


三、课程总结

孟宁老师的《软件工程(C编码实践篇)》让我收获颇丰。

在我的印象中《软件工程》这门课程涵盖的知识点很多,知识结构也比较松散,在没有实际的工程经验下,很难对这门课程有深入的理解。

但是在孟宁老师的精心安排下,没有让这门课程成为一个枯燥难懂的理论课程,孟宁老师运用自己的工程与教学经验,通过一个menu命令行菜单程序,一步一步带领我们学习了代码风格规范模块化设计思想可重用的接口设计callback机制多线程与线程安全Makefile等软件工程的设计思想,理论和实际相结合,让我更好的掌握软件工程的思想,使得我对软件工程有了更深入的认识和理解。

在这门课程中,我最大的收获就是了解了模块化的设计思想,也意识到如果想要自己的程序有更长的生命周期,更好的可维护性,获得更好的使用效果,模块化的设计思想是不可或缺的,模块化真的很重要。

此外,良好的代码风格规范也很重要,风格良好的代码,不仅方便他人理解自己的代码,也方便自己在以后重构自己的代码。在团队合作中,风格规范,注释良好的代码会给团队效率带来很大的提高。

还有,我还学到了简单git应用和vim操作,为以后的学习打下了基础。

不过这门课程也有些小遗憾,通篇课程下来,我们基本上都是在编写自己的代码,并没有涉及到软件工程中最大的问题——团队合作。如果可以在课程中添加多人的合作项目,比如结对编程或者一个团队做出一个小项目,又或者在他人的代码上进行迭代开发的话,我相信会让我们对软件工程这门课程有更加深入的认识。这也是我对这门课程的一个小小的建议。

希望孟宁老师的课程越办越好,也希望越来越多的同学可以从这门课程中收获多多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值