软件路上扬帆起航——《软件工程(C编码实践篇)》感悟

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

1.课程总结

《高级软件工程》这门课程在软件学院非常抢手,以致于上学期选课的时候稍微慢了一点就没抢到孟宁老师的课。我是个“半路出家”的新手程序员,在之前没有系统接触过软件工程的相关知识,也不是十分了解程序员的具体工作,一直以为其实就是简单的“码农”。上过这门课之后才发现,我想的太简单了,软件工程并不是简单地敲代码和调bug,而是一门为了更科学高效的开发大型软件的理论学科。首先大型软件功能复杂,层次多,因此需要一个开发团队协同合作完成;第二软件维护是一个漫长的过程,在不断的发现bug,解决bug的过程中,软件逐渐变得强大完善。基于这两点原因,软件开发大牛们总结了一套套的软件开发流程、方法,这就是软件工程。
这门课让我学到了许多,学得越多越发现自己知道的越少,要学的要补的越多,但要说到自己最大的心得的话,我觉得还是“软件工程”的思想吧!
作为一个新手,在初入“软件开发”这一行当的时候,我其实还是很困惑和迷茫的,找不准自己的方向定位,不知道自己该选择哪条路。《软件工程》的学习给我指出来一条明路,学习软件不能只是个“码农”,还要做个工程师,要明确好软件的需求目的和流程设计,其次才是代码的实现。向未知的方向使出全力猛打猛冲得到的结果不一定是自己预期的,有时甚至会南辕北辙。技术可以通过时间和练习积累,但是思想却要自己在一次次的失败和挫折中总结和参悟的。这么看来有点类似于哲学中的世界观和方法论了,可我觉得软件工程的思想实质确实是软件开发和维护的世界中的世界观和方法论,有些思想说起来很简单,但是要想真正理解并融会贯通却是要一次次反复实践的。我们要做的就是一次次尝试去抽象和设计,用满足软件要求的方式去实现。当然,一次就十全十美是不可能的,所以我们需要不断总结自己失败的经验和学习他人成功的设计,改变自己的思路去扩展新的领域,改进和完善自己的软件。

2.实验总结


实验六:函数的可重入性(reentrant)及线程安全
 

2.2实验详解

实验一:写一个hello world小程序
关键词:Linux环境、代码库管理
 实验一的内容非常简单,只是实现一个简单的hello world程序,但是在第一次试验中使用了linux编程环境,linux基本命令对于今后的学习会有很大的帮助,从小程序入手,才能逐步的过渡到大的软件工程项目,而且让我们学会使用代码库来管理代码,对于今后的维护和管理很有帮助。


实验二:命令行菜单小程序V1.0
关键词:代码规范性、代码编排风格
    本次试验通过一个简单的命令行菜单小程序来引导我们保持代码书写的规范性,遵守简明、易读、无二义性的代码风格,注意书写代码时候的缩进、命名、注释等代码编排的风格规范。


实验三:内部模块化的命令行菜单小程序V2.0
关键词:内部模块化
实验三是在实验二的基础上进一步的改进,在这一部分,主要强调的内容是注意代码的业务逻辑和数据存储之间的分离,即将系统抽象为两个层级:菜单业务逻辑,和菜单数据存储,使用不同的源文件实现,所以会有2个.c和一个.h作为接口文件。这部分很关注代码设计规范的方法中的内部模块化的方法,内部模块化的方法在软件开发中是利器,使得程序的整个结构体系更加的清晰,便于代码的阅读和后期的功能补充,而且在整个过程中简化了程序员对于代码的理解过程,所以在后续的程序开发中要尤其注重在这方面的提高。


实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
关键词:可重用链表、接口设计
 实验四仍然是在上一个实验的基础上进一步改进,在实验四中,要求使用用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作,链表模块能够简化对于命令行菜单小程序的功能调用,如果在遇到较大规模的软件,可重用链表模块能够使得整体结构更加清晰。


实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
关键词:callback回调、数据隐藏
 实验五是在实验四的基础上进一步进行改进,在这一部分,是为了学习callback函数,它是一种实现模块通用性的实现机制,能够实现模块解耦功能,
利用callback函数参数使Linktable的查询接口更加通用,同时我们也必须要注意接口的信息隐藏。


实验六:函数的可重入性(reentrant)及线程安全
关键词:函数可重入性、线程安全
 可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反,不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。
 线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全。如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
 可重入的函数不一定是线程安全的,可重入的函数在多个线程中并发使用时是线程安全的,但不同的可重入函数(共享全局变量及静态变量)在多个线程中并发使用时会有线程安全问题(可能是线程安全的也可能不是线程安全的)读写锁可以有效解决这里的线程安全问题。


实验七:将menu设计为可重用的子系统
关键词:Makefile方法、fgets()、menu子系统
    实验七仍然是在之前的实验基础上进行的新功能的添加,Makefile方法能够减轻执行程序时繁琐的指令输入过程,menu子系统的引入,能够支持带参数的复杂命令,在用户代码中定义一个带参数的复杂命令。getopt()用来获取命令参数,实现对指令的调用;gets()方法有缓冲区溢出的问题,为了防止缓冲区溢出攻击的危险,使用fgets()方法更好。

3.课程总结


3.1学习完《软件工程(C编码实践篇)》课程后您最大的收获是什么?  

经过认真的学习《高级软件工程》这门课程,感觉收获到了很多软件工程相关的知识,从中我学习到了问题解决方法论、软件生命周期、软件开发过程、图形化描述方法训练、工作量评估和项目管理、项目管理工具和软件测试技术方面的知识。但最关键的还是软件设计的思想,软件工程=最佳实践,对新手来说,要通过多实践、多犯错来积累经验,也要多吸收他人的失败与教训与成功的经验。
 老师在课上的讲解很精彩,网易云课堂的线上课堂和线上程序题目对于加深对于软件工程知识的理解非常有帮助。使得我从简单的代码书写到对软件工程有一个宏观的视角,这种思考问题的方式对今后的软件开发大有裨益。线下的go语言实现更是深化了我对软件的概念抽象和流程设计的进一步理解和体会。线上线下的同步教学感觉是一个很好的教学方法,通过使用不同的语言去实现相同的功能,既能学习不同编程语言的语法和编译原理,又能深化对软件工程的思想本质的理解。虽然课程结束了,但是学习的过程永远都不会结束。

 3.2学习完《软件工程(C编码实践篇)》课程后您最大的遗憾是什么?

 最大的遗憾是自己刚刚入门,开发经验尚浅,对于软件工程思想的理解可能还会比较浅显,只能通过想技术大牛们请教和自己总结等方式钻研积累开发经验,相信在此之后对于软件工程思想的理解会更加的深入。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值