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

来源:互联网 发布:百分百圣洁知乎 编辑:程序博客网 时间:2024/06/05 23:44

班级:软设4班 学号:SA17225449 姓名:杨双 网易云昵称:youyouyouyouyou
原创作品转载请注明出处
我的Github地址:https://github.com/ShuangYang516/programming001
《软件工程(C编码实践篇)》MOOC课程:http://mooc.study.163.com/course/USTC-1000002006
实验楼课程:https://www.shiyanlou.com/courses/122

一、学习心得:
本科专业是计算机科学与技术,学习的是C语言,其实学习过一些关于软件工程的一些知识,但是都只是类似于导论一类的基础知识,而要想成为一名合格的软件工程师,光懂得皮毛,而不应用于实践并且真实地深入了解到软件工程的思想和养成专业素养是远远不够的,深知自己的不足,所以我选择了孟宁老师的高级软件工程这门课程。虽然之前就已经学过一些关于软件工程的一些知识,但是在学习了这门课程之后,依然感觉受益颇丰,有很多的收获和心得。这门课的课程教授方式采取的是线上线下相结合的方式,线上网易云课堂加上线下的课堂讲授,老师的讲课风格非常的风趣幽默,通俗易懂,感觉很有意思,我还是很喜欢这种讲课风格的,而且尤其值得一提的是线下的作业也很循序渐进,非常适合初学者和想提升拔高的各位。
课程中,孟宁老师演示了如何从一个简单的“Hello World!”小程序,结合github、Coding等代码托管平台,将模块化、函数的可重用性、Callback、线程安全、Makefile工程文件等优秀的编程思想贯穿其中,一步步将其实现成一个可重用的菜单子系统,由浅入深,循序渐进。
在理论知识传授上,每周老师都会更新一个特定主题的课程,从代码风格规范到代码背后的软件工程相关的设计思想,结合作业要求的内容,围绕着我们所做的实践来进行理论讲解,我觉得教学效果要好于单纯的文本教学。
我觉得我的课程收获有以下几个部分:
一、理论知识:
1 代码风格规范:

  • 代码缩进4个空格;
  • 代码风格规范在团队协作和交流中有重要作用;
  • 行宽以前80,现在100;
  • 代码风格的原则:简明、易读、无二义性;
  • 不要把多条语句和多个变量定义放在同一行;
  • 注释使用英文,不要用中文,保持源代码是ASCII字符格式文件。

2 模块化思想 :

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

3 接口的五个要素:

  • Purpose:如函数名表明了接口的目的;
  • Preconditions:如接口函数调用前的准备条件;
  • Protocols:如参数和返回值的类型、指针所指的数据格式;
  • Postconditions:如返回值、printf函数接口的效果是在屏幕显示;
  • Qualityattributes如接口函数的执行时间限制;
  • 接口的两个隐含属性:前置条件和质量属性;
  • 明确了可重入函数和不可重入函数,以及与线程安全的关系。

4 Makefile工程文件

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

二、线上实验
在线上实验的学习中,我更多的可以熟悉Linux系统的一些基本命令。每一节课程之后都对应一个实验,最终目的是应用课程中学习的知识实现一个“可重用的菜单子系统”,是一个循序渐进的过程。心得大概可以分为:
实验一:写一个hello world小程序

  • 一个小menu程序,初步了解运用git的一些命令;

    实验二:命令行菜单小程序V1.0

  • 了解良好的代码风格应具备如下的原则:简明、易读、无二义性,值得注意的是,在用表达式作为判断条件时,不要用布尔变量做比较。

    实验三:内部模块化的命令行菜单小程序V2.0

  • 了解模块化的编程思想和相关概念;

  • 掌握c程序的一些编译调试方法和技巧;
  • 懂得如何提高menu程序的重用性;
  • 代码设计。

    实验四:用可重用的链表模块来实现命令行菜单小程序V2.5

  • 体会到接口使代码开发效率更高;

  • 提高了menu程序的重用性;
  • 掌握学习了c程序的编译调试方法。

    实验五:用callback增强链表模块来实现命令行菜单小程序V2.8

  • 回调函数是把函数的指针作为参数传递给另一个函数,回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应;

  • 回调函数可以允许用户把需要调用的函数的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法;
  • callback函数的使用提高了代码的重用性,实现了更松的耦合。同时将一些内部结构接口隐藏,简化了用户接口,更保证了使用安全,减少误操作。

    实验七:将menu设计为可重用的子系统

  • Makefile方法能够减轻执行程序时繁琐的指令输入过程,尤其是在Makefile文件中,代码必须以Tab键规范格式,不可以用四个空格键;

  • gets()方法有缓冲区溢出的问题,为了防止缓冲区溢出攻击的危险,使用fgets()方法更好。;shell将命令j解析成argc 和 argv传递给执行程序,可以使用getopt函数获取命令行参数;
  • 修改menu之后,能够扩展功能,支持对新功能的添加。

    三、实验报告与实验代码索引
    实验一:写一个hello world小程序
    实验二:命令行菜单小程序V1.0
    实验三:内部模块化的命令行菜单小程序V2.0
    实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
    实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
    实验七:将menu设计为可重用的子系统

    四、总结

    最大收获
    这门课程给我的最大收获无疑是对于软件设计的一些工程化思想的新的深入的理解。例如关于编码编写过程中的代码编写规范和风格,以及之前比较模糊的线程安全和可重用函数的概念的理解,还有从不同的客户角度去完成一项软件工程等等。

    小小遗憾
    遗憾应该就是没有能接触到设计模式的思想以及更直观的了解到一项软件工程全方面的思想和设计过程。

    建议
    建议孟老师将软件工程的思想和实验也能与C++或者java(一些面向对象的语言)相结合教学,毕竟很多学生可能不了解C而更多的了解例如java这类的语言或者对这类感兴趣。

    另外,祝孟老师的课程能够在不久的未来被更多的人所接触学习到,衷心希望孟老师的课程能越办越好!