软件工程(C编码实践篇)学习总结
首页说明
真实姓名李小强,网易云昵称演绎v + 原创作品转载请注明出处
+ 《软件工程(C编码实践篇)》MOOC课程
http://mooc.study.163.com/course/USTC-1000002006
心得体会
这个学期我学习了中国科学技术大学的孟宁老师所讲的软件工程(C编码实践篇),收获很大,孟老师讲课,很完整清晰条理,从是什么讲到为什么,再讲到怎么做。比如一开始就给我们讲清楚为什么要使用linux系统,软件工程的概念,设计思想等,让每个人都能理解这一思想。
我们的学习分为两个部分,第一部分是视频讲课,学习理论知识,第二部分是动手实践,利用实验楼这一平台进行实际操作,下面针对每一部分说明我自己的个人收获和理解。
理论学习部分
每一节课老师都会主讲一个核心内容,从代码风格规范讲到代码背后的设计思想,中间的课程会围绕我们自己实现的命令行菜单小程序来做一理论讲解,我挑选其中印象很深刻的部分着重说明
- 代码风格规范
对于代码风格规范,我听了老师的讲课,除此之外还学习了老师分享的资料《构建之法》,对于我个人觉得很容易学习到的地方有以下几个方面:
(1)花括号:左括号要和右括号处于对应的位置,并且都单独一行,这样会更明了对应关系。
(2)行缩进:每一级都相对上一级缩进四个空格。
(3)赋值或者等于判断“=”/“==”等二元操作符的前后应当加空格,但一元操作符就不用这样做。
至于命名规则,和我比较熟悉的java语言很像,之前一直也保持了良好的习惯。 模块化思想
我学习到了模块化的思想,学会如何让一个程序更具模块化,除此之外通过看视频课程我们还学习了代码设计中的一些常见方法
KISS(keep it simple & stupid)
using design to frame the code(matching design with implementation)
including pseuducode
不要和陌生人说话原则
合理利用Control Structures、Data Structures来简化代码
一定要有错误处理可重入和线程安全
可重入函数和不可重入函数,以及它们和线程安全之间的关系- 代码背后的设计思想
质量的用户视角以及商业视角
模块化Modularity
接口Interface
增量开发Incremental Development
抽象Abstraction
一般化Generality
课程实践部分
我们的课程实践围绕的主题是“通用命令行菜单小程序的实现”,通过不断的迭代,从一个简单的读字符输入输出逐步迭代为具有复杂结构、接口等的通用菜单程序,完成七个实验之后我个人收获很大,真正动手编码完成理论和实践的结合,受益颇多,以下对其中一部分列出心得。
- 命令行菜单小程序V1.0
遵循一定的代码规范 - 内部模块化的命令行菜单
贯彻应用模块化的思想 - 用可重用的链表模块
通过实验熟悉了接口这一常用设计,运用接口使得程序达到高内聚低耦合目标。此次还学到其他知识,比如宏定义,可以防止重复的include。高质量c/c++编程指南中提到的用表达式作为判断条件,不要用布尔变量做比较;通用接口定义之后最好做个开发者文档或者叫做DVT(Developer Verify Test)。 - 用callback增强链表模块
主要就是使用callback机制遍历、搜索链表,而callback的机制就是在于用户可以自定义函数,把这个函数传进去,执行完之后再返回,达到一个卧底的目的。这一方式很像lamda函数传参,最新的java8就新增了这一机制。 - 函数的可重入性
考虑线程安全问题 - 将menu设计为可重用的子系统
实验完成了通用菜单命令子程序的实现,本节还学习了一些主要概念,包括接口定义不要太具体,也不要太通用。为了让编译操作更简便,我们使用Makefile工程文件来直接执行多行命令;除此之外可以定义宏来使得工程文件更加可维护。对于传递参数的程序,Shell将命令行解析成argc和argv传递给执行程序。另外还有fgets和gets的区别在于gets有缓冲区溢出的危险。
附上报告链接
总结
学习这门课之后我对软件工程有了更深入的认识和理解,它是一门研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。它具有完整的体系和完备的设计思想,每个知识都需要我们慢慢钻研进而掌握。但是学习这门课程孟老师给了我们明确的指引方向,帮助我们有条有理的学习软件工程,通俗易懂的比喻也让我们更好的理解。唯一的遗憾就是希望可以学习到孟老师更多的课程。