刘洋 原创作品转载请注明出处《
软件工程(C编码实践篇)
》MOOC课程http://mooc.study.163.com/course/USTC-1000002006 ”
- 学习心得
首先,必须要声明一件事,这是一门非常有用且实用的课程。说实话,本以为这门课可能是对着某本书照本宣科一番,学习一些看上去非常高大上但是实际上用处不大的学术名词……咳,但事实证明这确实是我想的太多。这门课是以做一个简单的命令行菜单小程序来说明一个软件在代码编写时如何做到更标准,更规范。而且在这门课中,我更是深刻地体会到了代码规范的好处,线下课中老师也强调了在实际工作中合作开发和其他后续工作的普遍性和重要性,其中最基础的一点自然是规范的代码,这包括代码书写规范,注释清晰明了等等内容,在实验中能够详细体现出来。
其次,在代码模块化方面我受益匪浅。在本科时就学习过程序模块化的优点和重要性,在平时自己写代码的时候也是很注意,希望尽量把程序做到模块化。然而这种所谓的模块化非常浅显,只是简单地尽量把程序功能分开,而没有发现模块化更深层的要求,至少是不知道怎么做到高内聚低耦合……这门课则清楚明了地向我们展示了最基础的模块化怎么设计,代码怎么编写,特.别.实.用。
在上面的基础上,还学习了什么是可重入,怎么去实现一个可重用的子系统,这些也都是非常实用的内容,我将在下一部分实验中详细叙述。
作为第一部分的结语,我真心感谢学校要求必修这门课,真的获益不浅啊~
- 实验列表
实验一 写一个helloworld小程序
实验报告在这里:实验一
实验要求
- 写一个hello world小程序:
- 在实验楼Linux环境使用C语言编写,编译后执行输出"Hello,World!";
- 实验和实验报告务必在实验楼linux下完成,课程视频是在本地虚拟机上操作的,除了目录环境和作业提交方式不同外,基本的命令和编辑操作方式是一致的。
这个实验主要目的是要求我们熟悉实验楼和git的操作,因为特别不熟悉,学习了实验楼官方的教学,链接在这里:Git实战教程
这几次实验下来,养成了保存版本代码的习惯。在做了那么多次实验以后,我已经非常习惯于使用git来保存代码了,相比较于之前有过的“辛辛苦苦一整天,一秒回到解放前”的经历,这个保存代码的习惯非常要得。并且保存版本代码也是非常实用的行为,非常有助于代码的进一步开发和回顾,咳咳,当然也清晰明了地看到了自己的进步,非常有成就感。
至于代码部分……恩,下一个。
实验二 命令行菜单小程序V1.0
实验报告在这里:实验二
具体要求(参照视频中的具体实验过程):
- 实现一个命令行的菜单小程序,执行某个命令时调用一个特定的函数作为执行动作,实现的命令个数不少于8个;
- 类似ftp的help目录或者bash的help目录;
- 程序循环、接收用户的命令,如help、others等命令;
- 可以广泛通用的命令行菜单子系统组件,可方便地定制而嵌入到其他系统;
这个实验主要强调了代码书写规范,养成正确的代码书写习惯真的非常重要……作为一个轻微强迫症,我已经养成了奇怪的习惯……写个文档都要前面空四个空格……但是结局实在是非常好,现在写出来的代码非常清晰明了,可读性upup~
此外,对于vim编辑器的实用我也有了更深入的了解,具体使用的内容报告里有写,这里就不再赘述。这里感谢博客:vim的使用方法,非常清楚明了。
具体代码的难度不高,老师在教学视频里也描述地非常清楚,不多说,只把重要的代码书写规范写一下:
- 缩进: 4个空格
- 行宽: <100字符
- 括号: 在复杂的条件表达式中,用括号清楚地表示逻辑优先级
- 程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐
- 分行: 不同的变量的声明定义都不要放在一行
- 命名: 下划线用来分隔变量名字中的作用域标注和变量的语义; 类型/类/函数名常用Pascal形式,变量常用Camel形式;
- 注释和版权信息: 注释解释程序做什么(What),为什么这样做(Why),以及要特别注意的地方的; 复杂的注释应该放在函数头; 注释(包括所有源代码)应只用ASCII字符;每个源文件头应有版权描述等信息
- 空格: 代码行内要适当多留空格,如操作符前后、参数之间等
实验三 内部模块化的命令行菜单小程序V2.0
实验报告在这里:实验三
实验要求(参照视频中的具体实验过程)
这个实验主要就是简单地把程序分成逻辑和数据两个模块,这是最基础的模块化的案例,为了更深入地了解模块化的思想和方法,我还参考了这两个博客:程序为什么要模块化、软件模块化设计和软件模块化设计,基本讲解了模块化的基本原则和设计方法~
- 注意代码的业务逻辑和数据存储之间的分离,即将系统抽象为两个层级:菜单业务逻辑和菜单数据存储
- 要求:1)遵守代码风格规范,参考借鉴代码设计规范的一些方法;2)代码的业务逻辑和数据存储使用不同的源文件实现,即应该有2个.c和一个.h作为接口文件。
至于代码部分,难点没有太多,比较顺利地完成了。
实验四 用可重用的链表模块来实现命令行菜单小程序V2.5
实验报告在这里:实验四
实验要求(参照视频中的具体实验过程)
- 用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作;
- 链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变;
- 可以将通用的Linktable模块集成到我们的menu程序中;
- 接口规范;
这次实验也不是很难,但是非常重要,重点就在于接口的设计,接口定义了软件单元对外提供的服务:函数名、参数和返回值是接口的三个显性要素;五个要素:接口目标(purpose),接口假定(precondition),接口协议(protocols),接口后置条件(postsconditions)比如返回值,接口规范(quality attributes)。在工作中,接口常常用到,但是我从未思考过接口怎么设计才标准易用……本科的时候学到的……早就忘光了。这次的实验既是回顾又是学新,虽然老师讲的非常明了,我也又看了一些资料,但是忘了是哪些了……下次一定不会随手就关掉。
代码部分难度也不大,简单基础,除了因为我之前为菜单设计了二级菜单这里修改的需要麻烦一点,其他的和老师的实验流程差距不大。
实验五 用callback增强链表模块来实现命令行菜单小程序V2.8
实验报告在这里:实验五
实验要求(参照视频中的具体实验过程)
本实验在提供的代码基础上进行
- 给lab5-1.tar.gz(在实验楼Linux虚拟机环境下~/se_files/目录下)找bug,quit命令无法运行的bug
- 利用callback函数参数使Linktable的查询接口更加通用
- 注意接口的信息隐藏
非常有用的部分来了,本科的时候也学习过callback,但是因为非重点内容,老师一带而过,我们也是听听就算了,一直没弄明白callback函数到底是怎么回事。这次课上讲了以后,发现回调的用法真是非常精巧,来来回回看了好多遍,实在是非常佩服第一个想到的人。在老师讲解了这次实验以后,我明白了回调函数的使用优势,简单原理,但是落实到使用上还是有点蒙圈,所以又找了几篇文章看:C/C++回调函数,这篇文章通过简单的例子,也清晰地说明了回调函数的使用方法~
另外的重点在于接口信息隐藏,这部分实验中体现不多,更具体的内容参考: C语言开发函数库时利用不透明指针对外隐藏结构体细节和 从信息隐藏的一个需求看C++接口与实现的分离,我觉得都讲的非常好,值得看下。
实验六 函数的可重入性
这次课没有实验内容,不过老师用非常有趣生动的例子讲解了函数的可重入性与线程安全问题,让人记忆犹新……我这辈子都不会忘了这个了~另外,线程安全与可重入也讲的非常简洁明白,记录下来。
实验七 将menu设计为可重用的子系统
实验报告在这里:实验七
实验要求(参照视频中的具体实验过程)
- 为menu子系统设计接口,并写用户范例代码来实现原来的功能;
- 使用make和make clean来编译程序和清理自动生成的文件;
- 使menu子系统支持带参数的复杂命令,并在用户范例代码中自定义一个带参数的复杂命令;
- 可以使用getopt函数获取命令行参数
这次的实验内容很丰富,首先是Makefile部分,这个以前没有接触过,也很新奇,参考资料在这里:跟我一起写Makefile,一共十四篇,非常非常详实,有需要的童鞋可以移步过去看一下。另外还是接口设计,这部分的重要性在前面已有体现,不再赘述。
还有一个非常重要的内容在于命令行参数,argc和argv。这部分老师也讲的非常详细。因为我一起没有进行过命令行相关的研究,非常陌生且茫然,不过经过学习和实践,已经有了很清楚的了解了。另外一些参考资料在这里:C++ main函数中参数argc和argv含义及用法,int main(int argc,char *argv[])中参数的意义,讲的也很实用,非常有助于我对参数的理解。此外,这里还具体实用了字符串操作相关的函数还有getopt()函数,虽然网上有很多讲解,一搜都是,我这里还是想推荐一篇Linux下getopt()函数的简单使用,作者很是风趣幽默,咳,也是忘不了系列哈哈~
- 课后总结
总之,经过这么长时间的学习,对我最大的影响不在于学习了多少新的知识,而是在实践中让我不知不觉地养成了更好的代码编写习惯,不仅是书写更加规范,命名更加明了,还养成了保存版本代码的习惯,这点最赞。此外,因为要找很多资料进行进一步的学习,我也养成了随手保存标签的习惯,这也简直不能更有用。作为一个对Linux不怎么熟悉的未来程序员,在这次的实验过程中还顺带学习了很多Linux系统相关的知识。万事最怕有心人,真正的财富正是这些不起眼的小习惯,这么一说,对未来更有信心了呢哈哈哈~
过两天再把线下的go语言部分放上来,和大家一起学习~以上。