软件工程(C编码实践篇)学习总结
班级:软设三班,学号:SA17225363,姓名:王世卿,网易云昵称:王世卿
- 原创作品转载请注明出处
- Github地址:https://github.com/wsqat/gaoruan
- MOOC课程 :
http://mooc.study.163.com/course/USTC-1000002006- 实验楼课程: https://www.shiyanlou.com/courses/122
一、学习心得
虽然我本科是软件工程出生的,但是从孟宁老师所讲授的软件工程(C编码实践篇)中还是学到了许多知识。孟宁老师作为中国科学技术大学的老师,上课认真,通俗易懂,思路清晰。在本门课程中,他带着我们从写一个简单的“Hello World!”小程序,不断的结合github代码托管平台、模块化、可重用链表模块、Callback、线程安全、Makefile工程文件等高级软件工程的思想,最终实现了一个可重用的菜单子系统,使得我们受益匪浅。
本门课程的学习主要分为两大部分,第一部分是视频讲课,学习理论知识,第二部分是线上实验,利用实验楼这一平台进行实际操作,下面针对每一部分说明我自己的个人收获和理解。
1、理论知识
每一周老师都会放出一节课程,每一节课老师都会主讲一个核心内容,从代码风格规范讲到代码背后的软件工程相关的设计思想,中间的课程会围绕我们自己实现的命令行菜单小程序来做一理论讲解,这里我就挑选其中印象很深刻的部分着重说明。
代码风格规范,对于我个人觉得以下部分需要多注意:
- 代码缩进4个空格
- 代码给谁看?程序员
- 代码风格规范在团队协作和交流中有重要作用。
- 行宽以前80,现在100
- 代码风格的原则:简明、易读、无二义性
- 不要把多条语句和多个变量定义放在同一行
- 注释使用英文,不要用中文,保持源代码是ASCII字符格式文件。
模块化思想 :
- ”开-闭”原则,对扩展是开放的,对修改是封闭的。
- 业务逻辑层和数据存储层。
- 将系统模块放在不同的源文件。
代码设计中的一些常见方法:
- KISS(keep it simple & stupid)
- using design to frame the code(matching design with implementation)
- including pseuducode
- 不要和陌生人说话原则
- 合理利用Control Structures、Data Structures来简化代码
- 一定要有错误处理
接口的五个要素:
- Purpose 比如函数名表明了接口的目的
- Preconditions 比如接口函数调用前已经做好了哪些准备
- Protocols 比如参数和返回值的类型,指针指向的数据格式等
- Postconditions 比如返回值、printf函数接口的效果是屏幕显示了字符串
- Quality attributes 比如接口函数的执行时间限制在1s内
前置条件和质量属性是接口的两个隐含属性。
可重入和线程安全
- 可重入函数和不可重入函数,以及它们和线程安全之间的关系
- Makefile工程文件
- make 从Makefile的第一个目标all开始执行
- Makefile文件不支持空格代替Tab键
- Makefile工程文件也是代码,也要考虑可维护性。
2、线上实验
每一节课程之后都对应一个实验,但整个线上实验的主题都是围绕着如何实现一个“可重用的菜单子系统”。为了实现这个目标,孟宁老师在授课中指引我们运用软件工程的思想,通过不断地迭代,从一个简单的打印“Hello World!”的字符输入输出程序,变成了一个具有复杂结构,功能强大的可重用的菜单子系统。
- 实验一:写一个hello world小程序
- 加深自己对C语言编码的实践能力,同时对git指令进行复习和巩固。
-
- 代码风格的原则:简明、易读、无二义性
- 用表达式作为判断条件,不要用布尔变量做比较
-
- 学习了模块化的编程思想
- 提高了menu程序的重用性
- 掌握学习了c程序的编译调试方法
- 代码设计中的一些常见方法
-
- 体会到接口使代码开发效率更高
- 提高了menu程序的重用性
- 掌握学习了c程序的编译调试方法
实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 回调函数是把函数的指针作为参数传递给另一个函数,回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
- 回调函数可以允许用户把需要调用的函数的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
- callback函数的使用提高了代码的重用性,实现了更松的耦合。同时将一些内部结构接口隐藏,简化了用户接口,更保证了使用安全,减少误操作。
- 实验七:将menu设计为可重用的子系统
- Makefile方法能够减轻执行程序时繁琐的指令输入过程,尤其是在Makefile文件中,代码必须以Tab键规范格式,不可以用四个空格键。
- gets()方法有缓冲区溢出的问题,为了防止缓冲区溢出攻击的危险,使用fgets()方法更好。
- shell将命令j解析成argc 和 argv传递给执行程序,可以使用getopt函数获取命令行参数。
- 修改menu之后,能够扩展功能,支持对新功能的添加。
二、实验报告索引
- Github:高软课程实验报告 & 代码 & Demos
- 实验一:写一个hello world小程序
- 实验二:命令行菜单小程序V1.0,具体要求参见视频
- 实验三:内部模块化的命令行菜单小程序V2.0
- 实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
- 实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
- 实验七:将menu设计为可重用的子系统
三、总结
学习了孟宁老师的这门软件工程(C编码实践篇)课程,使我受益匪浅,虽然课程作业有点多,但是的确能收获知识。纵观整个线上课程的安排以及线上实验的设置,孟宁老师匠心独运,一步一步的指引了我们如何运用软件工程的设计思想通过不断迭代去实现一个“可重用的菜单子系统”,其中软件工程思想和C编码实战相结合,理论联系实际,有利于我们更好的掌握软件工程的思想。本门课程具有完整的体系和完备的设计思想,使得我对软件工程有了更深入的认识和理解。
最大收获
本门课程使得我对软件工程有了更深入的认识和理解,将软件工程的思想运用到C编码实战之中,最大收获就是,代码规范很重要!代码规范很重要!代码规范很重要!此外,对之前比较模糊的线程安全和可重用函数有个清晰的认识,受益匪浅。
最大遗憾
如果说遗憾的话,唯一的遗憾就是没有能接触到设计模式的思想。毕竟,设计模式是软件工程的基石脉络,如同大厦的结构一样。