软件工程(C编码实践)课程学习心得及总结

软件工程(C编码实践)课程学习心得及总结

一.前言

大龄跨专业,以前机缘巧合学过一点linux皮毛,但是仅仅限于基本的shell和vim命令,由于不知道能否暴露身份(哈哈),所以不能说更多,想一想已经几乎很多年没有写过博客之类的东西了,接下来说一下这门课的得失吧。

二.课程实验报告

实验一:写一个hello world小程序
https://www.shiyanlou.com/courses/reports/1244076
实验二:命令行菜单小程序V1.0,具体要求参见视频
https://www.shiyanlou.com/courses/reports/1244504
实验三:内部模块化的命令行菜单小程序V2.0
https://www.shiyanlou.com/courses/reports/1245468
实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
https://www.shiyanlou.com/courses/reports/1246306
实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
https://www.shiyanlou.com/courses/reports/1246942
实验七:将menu设计为可重用的子系统
https://www.shiyanlou.com/courses/reports/1248072

三.课程知识总结

1.熟悉linux实验环境

 linux在我整个大学四年期间,完全停留在只知道它是一个操作系统,好像是苹果电脑用的,就没有然后了,之后接触到了linux相关的一点编程知识,才真正接触到了linux,知道了传说中的linus大神是多么放荡不羁,talk is cheap,show me the code,这句话从第一次看到就一直牢记在心,就像乔布斯在斯坦福那句stay hungry,stay foolish一样,时时刻刻提醒我,不会的时候请动手,迷茫的东西赶紧学。
 linux从李纳斯大神在赫尔辛基大学读研的时候独自写出来,到现在成为全世界服务器端操作系统的龙头,有其明显优于windows的地方,那就是它的稳定性和开源性,不会在linux上编程的码农不是好码农,linux最基础的操作如ls,mkdir,mv,cp等等需要熟练使用,还有vim编辑器的i,o,a,j,k等功能键的使用也可以极大的简化操作,在此就不再赘述。

2.代码风格规范

代码风格规范是很重要的一件事,程序员写出来的代码不仅仅是给自己看的,就算是给自己看的,简洁明了符合规范的代码也会令人赏心悦目,我的c语言启蒙老师就一直强调C语言格式的重要性,记得运算符两边加空格,逻辑无关的代码行可以分割开,for和while等有自己代码块的地方记得缩进,这些东西在老师推荐的资料《构建之法》里面有详细的论述,软件就是一个工程,一个工程不可能一个人独立完成,符合规范的代码风格可以让自己的合作者不付出多余精力来读懂自己的代码。
代码风格的原则:简明、易读、无二义性
缩进、命名、注释等代码编排的风格规范

3.基本的模块化设计

刚开始编程的时候,什么东西都放在一个main.c里面,反正也就那么几行,后来代码实在太长了看不下去,就知道把函数和结构的实现放在另一个.c文件里面,声明放在.h里面,然后include一下就行了,这可能就是孟老师说的业务逻辑和数据结构分离的雏形吧,等程序再长一点,就真的有点手忙脚乱了,连命名都成问题,模块化思想就是解决这种困惑的利器,软件工程是一个宏观的思想,好的模块化设计可以让项目的耦合度降低,提高可维护性。
实验将菜单命令显示和命令行匹配函数放到了单独的.c文件里面,实现了基本的模块分离。
课程内容
KISS(keep it simple and stupid)一个函数或者方法只做一件事 
Using design to frame the code 设计与实现保持一致 
Including pseuducode 
不要和陌生人说话 
合理运用Control Structure和Data Structure简化代码 
一定要有错误处理 goto 语句的用法用数据结构简化代码 

4.可重用模块的接口设计

最近看java,涉及到接口的概念,java中接口是一种特殊的抽象类,用来说明实现它的类需要实现哪些功能,为类的可读性提供了入口,而软件工程的模块接口设计在我看来也是类似的思想,接口的设计与模块的耦合度息息相关,清晰明了的接口设计说明这个软件的模块化设计的很好,模块间耦合度很低。
本次实验根据个人理解分成了两个模块,一个是链表模块,这个模块不关心它的使用者,他只是单纯实现了对于链表的建立删除和查询等等功能,对外界的变化一无所知,是个可重用性很高的数据结构模块;上次实验的menu.c则是集成到了一起形成了功能模块,用来实现用户想要的功能。
课程内容
用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作 
链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变 
可以将通用的Linktable模块集成到我们的menu程序中 
接口规范 

5.可重用模块的接口设计(callback函数)

callback回调函数是一种常见的程序设计模式,这种模式中可以指出某个特定时间发生时应该采取的动作,字面意义上理解就是某个被调用模块回过头调用自己的使用者,java把相关的知识放在了接口章节里面,与用户接口在一起,其实就是个模块交互的过程。还知道了要把某些结构定义移除头文件,隐藏信息。
实验做的是学习利用callback函数参数使Linktable的查询接口更加通用,比上个实验多了些接口的定义,向用户提供接口的时候,要注意接口信息的隐藏,只提供给对方必要的信息,而不能完全暴露自己的信息,以免被别人攻击,修改自己内部信息而造成不可预估的后果。

6.函数的可重入性和线程安全浅析

这次课程没有实验,由于考研已经把线程和进程的定义及区别背的滚瓜烂熟,所以概念上没什么问题,但是对于可重入和线程安全的概念和实现是真的第一次接触,收获很大,大型软件不仅仅有庞大的代码量,还有无数的全局或者局部变量与多线程问题,多线程的优点自不必说,但是带来的风险是显而易见的,线程安全对于程序的重要性不言而喻。孟宁老师说可重入函数不一定是线程安全,关于这个问题我还是不太明白,csapp那本书并发编程那章明确指出可重入函数是线程安全函数的真子集,对此我还是没有理清头绪,可能还要回头看一下老师的视频看看是否有所遗漏。

7.子系统的可重用设计

这次课说实话理解的不是很透彻,把前面所有实验的知识点都涉及到了,而且还增加了makefile的用法和简单的带参命令写法,相当于一个简单的shell,把menu设计成了一个子系统的可重用接口,还使用了strtok和getopt两个系统函数。简单的一个make命令就可以让一个大型程序顺利的编译,为makefile的设计思想点个赞,为大型软件的程序员省了多少力气。
课程内容
menu作为一个子系统的可重用接口设计
手里有把锤子,看哪里都是钉子
够用就好——不要太具体,也不要太通用
Makefile工程文件
make == make all
make clean
支持带参数的复杂命令的方法
int main(int argc, char * argv[])
strtok
getopt

8.代码背后的设计思想

作为本课的结课视频,孟老师讲解了在代码背后的设计思想,就像我党的行动路线指导方针一样,没有十月革命的一声炮响,哪来的马列主义?虽然我们程序员没有飞机大炮,但是我们有软件工程思想的指导,必然会编出精彩的程序。
课程内容
几种不同的质量视角
产品的视角(内部质量)
用户的视角——是不是对用户有帮助
商业上下文的质量——投资回报和驱动力问题
运营推广也是一个关键
将menu开源希望有人使用它
设计方法论
不断地重构
几个重要的设计指导原则
Modularity
Interfaces
Information   hiding
Incremental   development
Abstraction
Generality

四.课程总结

收获是非常多的,每次课都是一种新的体验,每次都会感慨,原来我上次的代码还可以这样改,改成这样比以前更好用,个人认为最大的收获是对软件工程思想里面关于模块化和接口的设计,这与我同时在学习的java面向对象的思想有千丝万缕的联系,java中的类就是软件工程的模块,模块分层就好像类的继承层次一样,代码会写的人一大堆,能有宏观的系统设计思想的人委实不多,有了思想指导,代码不成问题,孟宁老师说,两成的时间开发,八成的时间维护与测试,好的代码不仅仅是性能与功能的问题,而是后期维护代价的问题,干净利落总比一团乱麻强得多。以前总以为软件工程真的是门政治课,现在发现,确实是门政治课,只是学的人不懂其精髓罢了。
本课的遗憾呢,其实和收获是成双成对的,本来课程一直进行的很完美,每次实验都很顺利,评分也不错,但是第六次课的小测验,由于侥幸心理,以为可以重复提交,然后就悲剧了,只得了四分,认真做了一下得了满分却发现不能交了,为此郁闷了几天,之后认真的回顾了一下,真的发现做事不能轻视,狮子博兔亦需全力,那是生存压力使然,可能是之前的顺利造成了此次的损失,还好只是一门课,若是工作中的事就不是简单的扣分了,希望自己谨记。
最后学孟宁老师每次引用资治通鉴一样,附上自己最喜欢的一句话:
**书到用时方恨少,事非经过不知难!**
希望大家和孟老师都前程似锦,成为人生赢家,哈哈。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值