本学期我们进行了软件工程的学习工作,其中一项内容就是重新对C语言就行学习,通过这一系列的作业,在软件工程领域中对代码的编写有了全新的认识。
最开始我对于代码的理解就是对于算法的完成,函数的调用,甚至于没有一个清晰的模块的概念,但是随着课程的加深,特别是在软件工程这门课上我逐渐对于软件系统的了解,明白代码只是软件的血肉,骨架在于架构的设计,而软件工程作为一个整体需要平衡的是各方面的关系(Availability,Modifiability,Performance,etc)所以这就导致了代码的存在性从我们最开始的程序员眼中的全部性渐渐地向软件工程的全局性转变。我们编写的代码不是给我们一个人看到的,最基础的要能让其他人看懂(所以各门语言都统一了自己的规范并且我们添加了自己的注释),通过课程的学习。我们发现在软件工程的建立过程中,我们更强调模块化的思想。这就回到了最初我的思想,在一个int main()函数中可以做到的一件事情,我们现在需要将里面的函数分离出来变成各个模块,甚至于原来 printf("XXX") 一行代码就可以完成的功能我们现在也需要将其变成函数void show():现在我逐渐明朗在软件工程中代码的编写只是功能实现的基础,在此之上我们还要进行横向(添加功能)以及纵向(完善功能)的拓展,而扩展的本人并不一定是你,所以在别人使用你的代码时可以清楚的看出每个函数,每个模块的用途,这样有利于整个软件体系的构建,增强了其中的Usability。
然后仅仅有模块化对于整个代码设计来讲是远远不够的,抛去隐藏函数信息,建立通用模块等细节技巧,我在软件工程中还学到了另一个重要的代码特性:灵活性。或许最初我们只认为代码就是代码,写好之后编译运行,出现bug之后进行调试就可以了,但是在大项目中这些事不存在的,代码量之大,分支之多绝非一人能够搞定,要不也不会出现运维或者软测团队。如今的代码讲究的是灵活性,软件工程可以深切的表现出它的这个性质。比如说工程的构建很多现在都是螺旋式并发的,需要不断地与客户交互并且添加上新的功能,这对于代码的灵活性来讲是很重要的,举一个很简单的例子,我们需要设置一个Menu,最开始我们设置一个数组,然后在其中写入我们需要的cmd,desc,但是数组可能设置的过大,浪费 了内存,所以我们理应从静态的Menu改变成动态的数组模样,所以我们使用了链表的功能,不断的设置新的结点然后添加data进去,这是一个比较传统的好方法,不浪费资源,使用动态指针完成了Menu的编辑工作。但是到后来我们并不满足动态链表的构成,因为数据是在建立链表时存储在结点中的(在建立initMenu函数中添加数据进去),我们希望在代码中可以手动的输入每个新的Menu结点,这时我们在动态建立Menu的时候添加了参数int argc,char argv,使用传参的做法我们可以在运行代码时输入每个结点的cmd和desc,使得Menu的构成方式更加健壮。从这个例子中我们可以看出在Menu的构建方面代码的使用越来越灵活,虽然说代码实现的功能没有改变,但是在实现的手段上越来越智能,或者说更人性化,符合我们的思维方式。以上是我对于软件工程中C语言编程的一些总结,接下来会从6次作业中逐一谈谈每次收获的知识。
https://www.shiyanlou.com/courses/reports/1244462 第一次作业我们进行了简单的hello world的代码编写工作,其中的重点在于让我们熟悉linux下的环境,也是在这几次的实验中我学会了一些基础的linux命令行以及git命令。从老师文档中提及的mkdir,git push等命令到后来自己能够掌握git diff,git merge,nohup等,我逐渐的发现对于命令行掌握的越熟练那么对于代码的管理与编辑上越方便,所以想要写好代码,对于终端的掌握十分重要。
https://www.shiyanlou.com/courses/reports/1245153 第二次作业要求写出具有实验命令的小程序,要求实现多功能的执行动作,大多数人用的是strcmp(cmd,XXX),然后调用某个函数,我选择了基于linux终端上的getpwuid(getuid())函数,通过函数本身的性质可以调用linux系统中的函数。
https://www.shiyanlou.com/courses/reports/1245714第三次实验我们采用了模块化的思想,将一个函数分成了linklist.h,linklist.c,menu.c三个部分来描写,具体的是menu.c调用linklist.c中的函数,而linklist.c中的Node调用了头文件linklist.h中的struct Node,本次实验的函数十分有逻辑,一层一层的调用。系统被抽象成两个层级:菜单业务逻辑和菜单数据存储。(另外在说一下本次实验是在十一的时候提交的,之前老师有说过十一作业是推迟一周的,结果我就没看网易云课堂打算下周再交作业了,结果发现10月3号的作业还是需要提交的,而十月10号左右的作业不需要提交,我本以为延迟的是十一这一周结果延迟的是下一周,导致一次作业加评论没有提交,希望通过这次对于6次实验的总结,能够让老师看到我写的作业,并不是当初没有完成啊0.0)
https://www.shiyanlou.com/courses/reports/1246256 第四次作业在我看来是最难的,任务量也最繁重,我们在这次实验中添加了链表,通过链表对Menu进行操作,包括Init,delete,add,getnextNode等等函数,并且添加了大量的指针操作,这使得代码表述上增加了许多的困难,比如说initMenu函数,最后AddLInkTableNode设置下一枚结点,但实际上结点并没有真正的指向谁,可以说程序能不能运行全凭指针自己的意志,在借鉴之前提交报告同学的代码时发现也不能很好的运行程序,比如命令只是能从help开始运行,而从中间结点的命令运行时也总是出错,既然指针指向不对,就需要将每一部分的指针,比如pNext=NULL编写出来,这个是最要的,每一次新建的结构体的指针,必须要初始化。
https://www.shiyanlou.com/courses/reports/1246941 第五次作业中我们主要学习了callback机制,这在软件工程中也是很重要的一部分,也算初步体现了函数灵活性的一面,在main函数中调用某个库函数时,需要先使库函数对某个函数进行调用,这种多层调用的关系缺少一层都是不完整的,而通过登记不同的回调函数,使得每次调用都有不同的功能发生,有点类似于C++的多态性质,极大的增加了函数的灵活性。
https://www.shiyanlou.com/courses/reports/1248086第七次作业中是对模块化思想以及灵活性的进阶展示,我们将menu子系统设计成一个借口,生成menu.h文件,再次细分了整个函数的模块,而函数中对于int argc,char argv的引用,让用户对于Menu菜单的使用更加方便,可以通过修改函数或者直接手动输入新的结点信息。在本次实验中我们还进行了宏命令的学习,连编译过程我们都可以简化以makefile的形式展现出来。
综上所述,在本次网络课程中,我们所要进行的函数功能并未发生改变,只是从结构上,从灵活性方面加深了对其的调用,这也是软件工程(c语言编程)的目的所在,让我们在短时间内能够了解模块化思想,灵活的处理各种问题。
学习软件工程最大的收获就是学会了模块化思想这一点,这对于程序员本身来讲算是一种质的飞跃,从拘泥于一小点的代码编辑跃升至站在整个工程的角度去看问题,这种收获无疑是巨大的。而想要去加深这种思想,我们还需要不断的练习,在程序编写过程中以模块化思想为中心来思考,设计问题。自己在课程中也存在着许多的不足与遗憾,由于自己来的比较晚课堂上总是占不到最前面的座位,有时孟宁老师讲的画在黑板上的结构与代码无法及时的理解,只能课后再进行总结。而下半学期孟宁老师的网络程序设计没有选到,无法跟着老师继续学习,听不到一些独到的见解与语录,算是本次实验最大的遗憾吧!在课后作业方面,有时知道某个函数的写法并不是最好的但是却不想去修改,或者设计某个指针时想去指向其他地方看看会出现什么错误等等,自己也没有花费时间进行深入的研究,在以后的课程学习中我一定要再多花费时间对于代码的整体设计方面多进行探讨!
作者:万鹏飞 SA16225275 原创作业转载请注明出处《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006