软件工程(C编码实践篇)----高质量程序员的起跑线
By:成运畅+ 原创作品转载请注明出处 + 《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006
1.课程背景
软件工程(C编码实践篇)时候本人作为研究生一年级的核心课程高级软件工程课程学习的重要的一部分。该课程是在网易云课堂上开设的一门程序员基础课程,整个学习过程是在线上完成的。而恰好该课程的网易云课堂制作人孟宁老师也是我们高级软件工程的代课老师,这也使得我们有更多的机会能够跟老师面对面交流课程问题和心得,尽管本科阶段已经有了四年的软件工程学习历程,但这门课对我的帮助不可谓不大。
2.学习体会
课程初期,作为程序员基础课程的该课程并没有引起已经有四年软工学习历程的我过多的注意,但是越随着课程的深入开展,我越是发现自己所欠缺的东西实在很多。本课程从最简单的最细致程序员注意事项开始学起,通过一个小小的C语言项目的不断演化,体现了许多工程化的思想和方法,从而让我们更加深刻的理解软件工程理论的内涵。通过跟随模仿孟宁老师的代码实现,从无设计代码,模块化设计的代码,到可复用的代码和回调函数等接口设计,提高了我们工程化代码的编写能力,让我们能够严格遵守代码风格规范来编写代码。总之,这门线上课程重视实践,可以使我们对软件工程有一个直观感性的认识。从编码规范到项目设计和开发的准则,这些东西是我之前学习过程中从没有重视和注意的,随着对软件工程学习和理解的不断深入,越是发现这些准则和习惯的重要性,以及它们对合作开发的帮助和对学习效率的提高。该课程对于入门程序员帮助尤为明显,从学习初期就养成规范标准的开发习惯将对整个学习工作生涯受益匪浅。所以该课程可谓高质量程序员入门必学的起跑线课程。
3.学习总结
该课程并没有什么代码量,老师在讲授过程当中更加注重的是将软件工程的思想表达出来,工欲善其事必先利其器,确立明确的设计和开发标准往往在软件开发中占据着十分重要的地位。本课程介绍了代码书写的规范,介绍了一些模块的设计准则,通过对其总结,大概明确了项目开发的基本步骤:
1)对所要完成的任务进行抽象,设计基本的数据结构;
2)进行模块化设计,一个模块只完成一类相似的任务,并且要具有可重用性;
3)对模块的接口进行改进,使其达到高内聚低耦合;
4)对模块进行封装,信息隐藏。
这些模式跟语言无关,无论你的发展方向如何,这些都是基本而且必要的。本人之前是做Java开发方向的,仍然受益匪浅。当然实际应用过程中还是需要多多实践,在自己的开发过程中真切的注意到这些方面,才能深入消化和理解所学。
4.课程实验
实验报告目录:
实验一:写一个hello world小程序
主要是熟悉实验楼环境,初步了解代码规范,熟悉linux基本命令,包括cd、ls、mkdir等命令,vim基本命令,包括vi使用,一般模式、编辑模式、命令模式等模式切换,markdown的书写,包括标题、插入链接、插入图片、两次enter等。
实验二:命令行菜单小程序V1.0
实现了命令行的小程序,最主要的学习到很多代码规范,包括:
缩进4个空格
变量命名采用lowCamel风格
类型/类/函数名用Pascal风格
类型/类/变量名用名词或名词组合
函数名用动词或动宾短语
括号清楚地表示逻辑优先级
所有{和}独占一行,且成对对齐
不要把多个语句和多个变量定义放在同一行
注释、文件名、路径等用英文ASCII字符,不要用中文和特殊字符
实验三:内部模块化的命令行菜单小程序V2.0
将程序内部进行模块化,设置接口,使程序更加逻辑清楚
KISS(keep it simple and stupid)一个函数或者方法只做一件事
Using design to frame the code 设计与实现保持一致
Including pseuducode
不要和没陌生人说话
合理运用Control Structure和Data Structure简化代码
一定要有错误处理 goto 语句的用法用数据结构简化代码
实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
将数据结构抽出来独立成一个通用模块的技巧,linktable模块与具体的数据类型无关,是一个通用的链表模块,我们要用到模块时,再具体定义数据类型。这样就可以在C语言没有泛型的情况下尽最大可能复用数据结构的代码,这是非常厉害的技巧
用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作
链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变
可以将通用的Linktable模块集成到我们的menu程序中
接口规范
实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
学习利用callback函数参数使Linktable的查询接口更加通用。
当我们向用户提供接口的时候,要学会注意接口信息的隐藏,只提供给对方必要的信息,而不能完全暴露自己的信息,以免被别人攻击,修改自己内部信息而造成不可预估的后果。
实验六:函数的可重入性(reentrant)及线程安全(本次实验内容无报告)
实验七:将menu设计为可重用的子系统
将menu设计为可以重用的子系统,利用命令行参数argc/argv来处理命令参数,由于menu函数是提供给用户使用的,它只需要向外提供一个执行命令的方法和一个初始化方法。
Makefile,这个我是新学到的,真的很好用,程序更加有套路,编译程序更方便,相信以后会越来越多的用到,。
大概了解了函数getopt的用法,虽然基本实现了复杂命令参数,但是getopt函数里的定义的几个全局变我并不太清楚其功能,在后续的编码中,应该继续完善
5.课程小遗憾
该课程作为程序员基础课程难度足够,但个人觉得对有一定基础和开发经验的程序员来说,更希望有一些项目实战,希望老师能够制作适合这一类程序员的进阶版的软件工程,十分期待。对老师幽默的教学风格十分喜爱~