软件工程学习小结
在《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006 的学习过程中对软件工程这个概念有了自己一点想法。
首先我对软件工程的理解是软件工程是一种优化软件设计与实现的一种思想和方案,比如说我们需要注重代码的格式这是为了增加可读性,模块化的思想是降低模块间的耦合模块内的内聚,可重用模块接口的设计使得代码块更加通用……软件工程的核心不是在于如何去实现需求的功能而是在于何如高效的实现。这就好比瓦匠可以盖几层小楼,但是无法去盖一栋高层大厦。而软件工程就是告诉我们如何从只能够从盖几层小楼的“瓦匠”转变为能够盖高楼大厦的工程师。
其次对于软件工程的学习心得,我的感觉就是要转变思想方式。软件工程要求我们有一种更加抽象的思想去理解和实践,不能拘泥于把功能实现就好的程度,而是把我们的实现更加抽象起来从另一个角度来思考如何更加有效地实现功能。比如考虑代码的模块化,接口的可重用设计,以及系统的可重用设计。
代码层面的演练:
实验一:写一个hello world小程序 https://www.shiyanlou.com/courses/reports/643226
理解:了解linux系统下vim编辑器的使用,在vim编辑器下编写C语言代码。和老师说的一样,一开始用特不习惯,然后越用越觉得还不错。
实验二:命令行菜单小程序V1.0 https://www.shiyanlou.com/courses/reports/658767
理解:代码编写时要注意规范包括缩进、命名方式、注释等,因为在后期维护或者阅读时方便理解。
实验三:内部模块化的命令行菜单小程序V2.0 https://www.shiyanlou.com/courses/reports/661599
理解:模块化的思想正式为了实现 高内聚、低耦合 的思想。提高代码的质量。还有就是一定要有错误处理,这样可以是系统更加稳定好用。
实验四:用可重用的链表模块来实现命令行菜单小程序V2.5 https://www.shiyanlou.com/courses/reports/702086
理解:设计一个单独可重用的链表数据结构,并将这个数据结构用在 命令行菜单小程序中。实现了对能够单独完成某项功能代码块的重用。
实验五:用callback增强链表模块来实现命令行菜单小程序V2.8 https://www.shiyanlou.com/courses/reports/717551
理解:隐藏单独完成某项功能代码块的某些信息,增加该模块的通用型。用callback函数实现的多态浅析以 及信息隐藏。类似于遥控器一样,用户只需要了解按哪个按键对应的机器的就会实现什么样的功能,而内容的具体实现以及机制,用户没有必要知道。C中的多态性可以用callback实现,即函数回调。
什么是线程安全?
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
函数的可重入性与线程安全之间的关系
可重入的函数不一定是线程安全的;
可重入的函数在多个线程中并发使用时是线程安全的,但不同的可重入函数(共享全局变量及静态变量)在多个线程中并发使用时会有线程安全问题(可能是线程安全的也可能不是线程安全的);
不可重入的函数一定不是线程安全的;
实验七:将menu设计为可重用的子系统 https://www.shiyanlou.com/courses/reports/746852
理解:通过暴漏接口的方法实现了对可以单独完成某些功能的子系统的重用。最后学会了编写makefile文件,编写可接受带复杂参数的函数是命令行菜单更加通用和多功能。
学习这门课最大的收获我觉得是在思想上有了改变,以前没有引起注意的方面现在都会有所留意,为以后程序的编写和设计很有帮助。说起最大的遗憾,就是学习的时间比较短理解的不够深入,而且我用java语言比较多,C语言好久没有用了,因此在编程伤会有一点困难。
最后,非常感谢中国科学技术大学 孟宁老师,您幽默简洁讲解方式以及对知识点独创性地命名 让我对于某些思想记忆犹新。