“柳潇 《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006 ”
原创作品转载请注明出处
学习心得
我是一名非计算机专业的学生,学习网易云课堂上软件工程这门课是想来提升自己的计算机编程能力。这门课的代码量并不算大,孟宁老师更关注的是将软件工程的思想教授给我们。自己根据课程内容总结下来,要想完成一个软件设计需要经过以下几步:
1. 对所要完成的任务进行抽象,设计基本的数据结构;
2. 进行模块化设计,一个模块只完成一类相似的任务,并且要具有可重用性;
3. 对模块的接口进行改进,使其达到高内聚低耦合;
4. 对模块进行封装,信息隐藏。
主要步骤是这些,在软件设计过程中还要注意函数的可重入性和线程安全问题,有的时候为了提高模块或者函数的通用性要使用call-back方式接口或者设计带参数的命令,这些都要具体情况具体分析。
我在学校内也选了java程序语言设计这门公选课,通过这 两门课的对比,我发现语言不同,但是软件设计的思想都是相通的。但有的时候自己会觉得知道模块化呀这些思想还是远远不够的,具体到代码实现时还是要多练习,多自己去动手做一些小项目才能更深刻的理解它们。
实验报告目录
- 实验一熟悉实验环境,写一个简单的hello world小程序;
- 实验二写一个简单的命令行菜单小程序;
- 实验三将菜单小程序内部模块化;
- 实验四用通用链表来设计菜单,并对模块接口改进;
- 实验五使用call-back方式接口,并实现信息隐藏;
- 实验七将menu程序改成一个子系统,并编写带参数的命令。
课程总结
我在软件工程这门课程的学习中最大的收获就是对软件工程有了一个系统的了解,并且学习到了它的思想。以前自己的专业也有过一些编程,不过主要是做科学计算,和软件工程的编程有很大的差别。现在自己编程的时候经常会自动地考虑到要不要模块化、要不要对接口加以改进,这也许就是我最大的进步。
个人感觉这门课已经做的很好啦,孟宁老师很用心也很幽默,讲那些思想的时候经常会用一些很通俗的例子来加以解释,上的时候一点也不觉得枯燥。
要说最大的遗憾就是:课程时间10周虽然够多了,但对于自己而言还需要更多的时间去领悟和体会软件工程的思想。
最后,再次感谢孟宁老师对我们的教学指导。
附录:软件工程学习笔记
基本的模块化设计
程序 = 数据结构 + 算法
软件 = 程序 + 软件工程
经过基本Modularity (also called separation of concerns)设计的代码
模块化的思想和命令行菜单的实现范例(开源社区中常见的写法)
基本模块化的写法
代码设计中的一些常见方法
- KISS(keep it simple & stupid)
- using design to frame the code(matching design with implementation)
including pseuducode - 不要和陌生人说话原则
- 合理利用Control Structures、Data Structures来简化代码
- 一定要有错误处理
“开-闭原则” 对于扩展是开放的,对于修改是封闭的。
模块复用和系统复用
软件的功能性需求和非功能性需求
非功能性需求,比如说提高软件的效率。
- 软件的业务逻辑,业务逻辑层
- 对菜单数据的存储,数据存储层
功能相关 menu
数据操作相关
将系统模块放在不同的源文件里面
把程序拆分成三个文件
linklist.h
linklist.c
menu.c
menu program放在menu.c
数据结构和操作放在linklist.h中
具体函数的实现放在linklist.c中
可重用模块的接口设计
通用Linktable模块的接口设计
将通用的Linktable模块集成到我们的menu程序中
定义接口 - “天王盖地虎,宝塔镇河妖”黑社会接头也设计接口的!
- 接口规范
- 内聚和耦合
- 通用原则
通用链表模块的接口设计
模块化的好处:包容变化
拿来主义 VS 从头干起
参数化上下文
开发者指南
将通用的LinkTable集成到我们的menu程序中
本地化外部接口(Localize input and output)
代码风格规范,对于我个人觉得以下部分需要多注意:
代码缩进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工程文件也是代码,也要考虑可维护性。