您的位置:首页 > 编程语言 > C语言/C++

软件工程(C编码实践篇)学习心得

2016-11-20 20:07 218 查看

付何山+原创作品转载请注明出处+《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006

       许久没有更博了,说起来这个博客也并没有用过几次,上一次密集更新还是在学习王爽老师的《汇编语言》的时候。这次重新更博,一是为了完成网易云课堂的软件工程(C编码实践篇)的课程考试,二也是希望借此契机,重新拾起更博的热情。

       零基础本科上了几年软院,从第二年就很清楚,软件学院和计算机学院是不同的。计算机学院的发展更偏向于学术,是理论基础,而软件学院的发展更偏向于工程,是实现导向。然而对于作为软院实践理论的软件工程这一门课始终是一知半解,甚至一直觉得它是一门经验堆叠的伪科学课程。

       本科期间,学校并没有开设专门教授软件工程的课程,只是在软件导论和UML建模(当然这一门中也提及了相当一部分的软件工程的内容,可是最终是为了UML建模服务的,有些本末倒置了)中提及了部分软件工程的内容。而且在这些课程中,软件工程显得枯燥乏味,浮于纸面,缺乏实际联系,老师更多的也是从理论下手,而疏于与实际coding的结合,加之当时的开发经验也不够,不能理解为什么软件工程需要这么多的标准,这么多的工具,方法,范式,以及甚至我们为什么需要软件工程。

       直到大三工程实践的时候,几个人一个小组一个月左右的时间一起开发一个基于Cocos2d-x引擎的塔防游戏时,我才明白软件工程的重要性。

       当时大牛(使用上述引擎写过两个游戏的)说代码他一个人来写,我们就完成文档跟美工、UI就好了。出于省事儿的心理,于是就进行了类似于外科手术团队的分工,相比起《人月神话》中提及的或许更简陋,因为只有一个主外科医生,没有别的医生了。其他人对于项目本身也不是每日实时跟踪,除了PM大家也是被动的做事情。

       然而后期游戏已经成型的时候,我们想要尝试一些新的功能,然而大牛对于一些我们想要尝试的功能并不感兴趣,于是我们想自己接手要添加功能的时候,我们才意识到软件工程是多么重要。文档不是后行,而应该是先行,文档体现的是设计而不是拍脑袋打完代码后再去填充文档。尽管大牛的代码写的不错,我们文档似乎填的也很好看(只是好看,却没有反映什么),但我们了解大牛的整个代码思路和意图还是花了很多时间,最后导致新功能并没有成功添加,虽然原本功能已经足够最终并没有影响到我们的成绩,却依然还是给我们所有人敲了一个警钟。

       那之后我觉得或许一个人写代码并不需要太多的思考,但是团队写代码,开发软件一定要先设计好整个工程架构,设计好开发方法,尽量做到让所有开发人员(因为都是本专业的,所以其实都是开发人员)明白所有已经确定的添加到工程中的代码的意图。不时对代码进行重新审查,并且适当的重构,不然后期真的是举步维艰

       然而后来上来这门课以后,我的观念又发生了一些变化。这门课告诉我或许并非只有团队的大项目才需要考虑软件工程,一个人的小项目也应该去思考,拍脑袋的想法或许只适合hello world等级的程序(甚至也不行)。

       孟老师的这门课先从代码风格(简明、易读、无二义性)下手,抓住了许多新手程序员并不关注的事情。刚读研时,看过一些跨专业的同学的代码。功能一般都完成了,但是变量命名很差,代码缩进很差,注释一个没有。面对这种代码,老实说,不想看,看的也很辛苦。所以代码风格真的很重要,虽然我不是很认同课中代码风格的一些细节,但无论如何,坚持一种优秀的代码风格就足够了。

       而后这门课从实现一个menu小程序入手,开始讲解模块化(关注点的分离)、代码设计原则(KISS,设计与实现保持一致,不要和陌生人说话,合理利用控制结构、数据结构简化代码,一定要有错误处理)和接口(接口五要素,接口设计)等等。并且也涉及到了一些线程安全的问题,最后还补充了设计的方法论,质量视角,设计原则等等。

       从menu这个程序来看,基本上是逐步深化、细化相关功能,在具体的实现中体现了许多优秀的思想。比如说callback机制,将用户的函数指针传入接口,在逻辑实现层进行调用,从而使得接口更加通用,用户使用更加方便。再比如说信息隐藏,将声明放在头文件中,具体的数据结构实现放在实现文件中。以及将实际接口再次进行封装,提供不多不少的接口给用户,而不是一股脑将create,add,delete这些接口全部提供给用户,将内部实现再一次加深隐藏。

       通过这次课程很好的弥补了之前空有理论无法结合实际的状况,同时也修正了自己之前关于软件工程对于一人编程来说不甚重要的想法。课程难度也相对来说比较简单,在了解了相应的思想后实现起来也变得得心应手(当然老师的demo也帮了很多忙)。

       以下是我这次课程期间的所有实验报告及其简介:

       实验1 简单的hello world程序(linux,vim简介)

       实验2 简单的menu程序:只有一个menu实现文件(command.c),没有业务逻辑层,数据存储层的分离,所有功能在一个文件实现。具体实现使用C的字符串匹配函数读取用户输入并进行匹配,根据不同命令输出调用不同函数输出结果。

       实验3 提供接口的menu程序:将用户与实现分开,创建linklist.h,linklist.c文件进行程序数据结构部分的定义和实现,在menu中进行调用。

       实验4 进一步抽象接口的menu程序:使用linktable替换linklist,其不再是简单的抽象数据结构定义,有了一定功能的模块,变得更加通用,不仅限于本程序。

       实验5 callback实现,信息隐藏:callback机制使得用户能够更好的调用接口,信息隐藏确保了用户不能更改实现。(由于课程安排,没有实验六)
       
       实验7 实现带参命令,进一步隐藏实现,将menu设计为可重用子系统:使用C语言string库中的strtok和getopt等实现带参数的命令,将暴露的接口进一步隐藏,仅提供两个接口。使用makefile文件编译工程代替手工输入命令。

       收获谈完了,但是课程依然有许多令人觉得不够好的地方。比如:

       1、最后一部分理论知识突然砸了下来,却没有相关的实验,显得脱离了原本与实践结合的初衷。

       2、线程安全的部分很重要,但是却没有相关编程(虽然老师说过这一部分跟操作系统有关,于是就不实现了,但我个人觉得老师依旧可以给出一些代码至少让大家跑跑看)。

       3、vim编辑器的比重介绍稍微有点重,有点像linux简单入门加C语言中级进阶(函数指针的灵活应用(误))再加软件工程课程。

       4、实验楼报告公开透明导致代码重复率高,实验报告流于形式,打分相对较水的情况。

       5、或许是因为自己之前有学习过软件工程的理论,觉得这些理论依旧还是不够,尤其是应对多人的软件开发的情况。

       以上或许有些苛责了,总而言之,这门课对于未曾思考过软件工程的C语言或其他语言编程人员来说,能够帮助你进一步去思考如何更好的完成自己的软件设计,进一步将设计变得更加清晰,理清编程思路。是一门值得大家学习的好课程,也希望孟老师今后能将这门课越讲越好。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息