软件工程(C编码实践篇)学习总结
姚德义 原创作品转载请注明出处 《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006
1、对软件工程代码层面的理解和学习软件工程的心得
有幸选到孟宁老师的《软件工程(C语言编码实践篇)》课程,非常感谢孟老师的悉心教导,从中收获了很多。
首先谈谈对软件工程的粗浅理解。我们为什么要学习软件工程?如果只是自己随便开发上千行代码的小系统,其实并不需要传统的软件工程方法。但是,如果开发的系统的规模上升到万行乃至十万行左右的规模,加上软件中各行代码间存在的千丝万缕的联系,普通人(即使是常常具有自我智力优越感的程序员)要继续开发并且维护这样一个系统就会变得很困难了。当现实中存在这种情况时,程序员们往往会说,这个系统“太复杂了”,或者会说这个系统“太乱了”。复杂原因在于程序员面对的问题规模(万行乃至于十万行左右的系统中千丝万缕的代码逻辑)超过了他人脑所能处理的极限。因而减少系统内部的逻辑耦合就更为重要。而软件工程的核心目的就在于做到这一点。学习软件工程的思想,采用软件工程的方法就可以做到高内聚低耦合、构件化软件开发以及关注点分离等等,这样就避免了工程的过度复杂、毫无层次结构、过度耦合等设计问题。
通过学习孟宁老师软件工程(C编码实践篇) 的线上课程和线下实验就可以理论和实践相结合,相得益彰的更好的学习和体会到软件工程的魅力。通过对孟宁老师的软件工程(C编码实践篇) 学习,在代码层面上对软件工程有了深刻体会:
1.代码风格规范——代码风格规范就像一个人的长相一样,通过看你的代码风格就能大致想象出你是一个什么样子的人,养成好的代码风格以及规范会使我们事半功倍。需要项目组统一格式,注意代码风格的原则:简明、易读、无二义性缩进、命名、注释等代码编排的风格规范。
2.设计规范——在设计规范上,要保证代码是高内聚,例如一个函数只做一件事,一个模块只做一类事的,实现功能尽量用库函数;还有要遵循“不和陌生人说话”的原则,以保证除了类提供的接口,别人无法访问类的其他内容。同时要合理使用数据结构、控制结构等来简化代码。
3.代码模块化——讲究高内聚低耦合,接口要规范,代码要注意通用性,注意以下原则,Purpose,Preconditions(assumptions),Protocols,Postconditions(visible effects),Quality Attributes。
4.代码可重用性——避免一些无用功,可以使以前自己或者前辈们写过的代码重用到现在要写的程序里面,在代码可重用性层次上面要非常注重模块化程序接口的设计,尽量多考虑到以后可能会用到的一些接口。
5.线程安全——在处理多线程问题中,需要关注函数是否是可重入的,使用互斥锁,读写锁以保证多线程安全。同时了解了函数的可重入性与线程安全之间的关系,可重入的函数不一定是线程安全的;可重入的函数在多个线程中并发使用时是线程安全的,但不同的可重入函数(共享全局变量及静态变量)在多个线程中并发使用时会有线程安全问题(可能是线程安全的也可能不是线程安全的);不可重入的函数一定不是线程安全的。
简而言之,用老师的话概括:我们写的不仅仅是代码!我们实现一个C语言小项目,通过其演化来呈现无设计代码、模块化设计的代码、可复用的代码和回调函数等接口设计,以及可重入函数、线程安全等较深入的设计问题。您可以通过跟随模仿来训练工程化代码的编写能力,辨识代码的工程质量差异。 —— 孟宁
2.软件工程课程各实验报告
实验一:写一个hello world小程序:熟悉Linux实验环境(工欲善其事必先利其器),通过这次实验会让你深刻的了解Linux下的一些基本的操作,在Linux环境下做开发可以让你彻底掌控你的开发设计,实验报告采用markdown进行书写,可以将自己的思路进行总结,也是对将来的软件工程文档的书写打下良好的基础。
实验二:命令行菜单小程序V1.0:代码风格规范(简约而不简单),从hello world开始不断迭代调试使代码长的越来越像一个命令行的菜单小程序,并且通过这次实验学习了代码风格规范。“写代码要小步快跑不断迭代,罗马不是一天建成的”。
实验三:内部模块化的命令行菜单小程序V2.0:基本的模块化设计(Separation of Concerns),使实验二的代码模块化,并且学习代码设计中的一些常见方法,KISS、不要和陌生人说话原则等。
实验四:用可重用的链表模块来实现命令行菜单小程序V2.5:可重用模块的接口设计(天王盖地虎),代码是一个不断迭代调试的过程-可重用的链表模块来实现命令行菜单小程序,通过本次实验会使你更加的了解到程序模块化设计的方便之处,在后期会更加方便的维护自己的代码等。
实验五:用callback增强链表模块来实现命令行菜单小程序V2.8:可重用模块的接口设计(callback函数),用callback函数实现的多态浅析并注意信息隐藏。
实验七:将menu设计为可重用的子系统:子系统的可重用设计(够用就好),把我们上几次做的命令行菜单通过老师讲的一些有用的方法做成一个可重用的子系统。
3.总结
学习这门课程彻底明白了我们为什么要学习软件工程,软件工程有什么作用以及如何用软件工程设计工程。简单来说,软件工程的核心不是在于如何去实现需求的功能而是在于如何高效的实现以及减少系统内部的逻辑耦合,用工程化方法构建和维护有效的、实用的和高质量的软件,让整个软件系统“大而不乱”,井井有条。这就是我最大的收获。
要说最大的遗憾就是:课程时间10周虽然够多了,但对于自己而言还需要更多的时间去领悟和体会软件工程的思想。在这10周里,仅用了C语言写工程,并没有用其他语言也感受下软件工程开发是否有大的区别,希望自己今后多加努力,也要用其他语言开发体验下。
最后,再次感谢孟宁老师对我们的教学指导。