网易云课堂《软件工程(C编码实践篇)》学习心得

来源:互联网 发布:java 日期格式化 编辑:程序博客网 时间:2024/06/07 06:07

课程内容:网易云课堂《软件工程(C编码实践篇)》

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


学习心得:

   这学期,我通过网易云课堂学习了孟宁老师的《软件工程(C编码实践篇)》课程。此课程通过视频详解,以及课后编码练习的一种新颖的教学方式,获得了很多学者的关注。孟宁老师上课风趣幽默,举的例子大多贴近生活,简单易懂,让软件工程的学习过程变得轻松有趣。

通过这门课的学习,我的实践应用能力提高很多,对代码的风格规范,模块的设计方法,模块接口的设计与重用等有了全新的认识,此外也让我熟悉了linux系统下的编程开发环境,受益匪浅

在学习本门课程之前,我对软件的设计编程方法等并不是很了解,学习的过程也很曲折,因为基础差,加之对实验楼操作平台的不了解,每次课后实验都会几近崩溃(总是出错),但最终还是坚持了下来,通过八周的学习,我已经完全适应了这种教学方式,熟悉了实验楼,网易云课堂等操作平台,我极力认可这种教学方式,它锻炼的我们的实践能力,而不是只有填鸭式的理论内容,互联网时代应该充分利用此类教学资源,锻炼独立自我学习能力。

孟宁老师采用循序渐进的教学方式,从最简单的知识开始,每节课再在上节课的基础之上加入新的知识,线下实验内容也是环环相扣,层层递进,从简到繁,让新手容易理解,学习的效果更加的好。对这门课程也慢慢培养出兴趣,这对我今后的学习帮助很大,我也会更加的努力,不断钻研,提高自己的能力。

学习笔记:

1、我们为什么要学习软件工程?

不学习软件工程而成为产品经理或者程序员之类的大有人在,可是学习软件工程可以帮助我们少走弯路。

实验一:写一个hello world小程序

2、熟悉linux环境

2.1 我们为什么选择Linux

  因为现在大多数服务器都是linux系统,而且在linux中可以开发彻底掌握设计。不了解linux的程序要不是一个好的程序员。

2.2 linux的基本操作 。 比如:

cd.当前目录cd..上级目录cd/ 根目录
mkdir创建新文件
vim编辑(分为一般、编辑、命令模式)
gcc hello.c -o hello   将hello.c文件生成可执行文件hello
打包  tar  -zvcf  name.tar.gz  path_and_files解包 tar  -zvcf  name.tar.gz  
rm  删除

cp 拷贝

vim中的拷贝和粘贴:v可视化选择,y拷贝,p粘贴

dd剪切该行

实验二:命令行菜单小程序V1.0


3、代码风格规范 (原则:简明、易读、无二义性)

请注意缩进、命名、注释等风格规范。
① 注意在缩进中,使用4个空格,而不要使用Tab键。
② 命名:合适的命名可以增强易读性。 1、类成员变量通常用m_或_做前缀  2、一般变量使用lowerCamel风格  3、类/函数名一般使用Pascal风格,即所有单词首字母大写。

③ 注释:使用英文注释。不要解释程序是如何工作的。每个源文件的开头写上作者、版权等信息。

实验三:内部模块化的命令行菜单小程序V2.0

4、基本的模块化设计

· 代码设计中常用方法:

1. KISS(keep it simple & stupid)一个方法或函数只做一件事;不同的抽象层级看到的是不一样的;抽象实际上是选择地忽略一些细节。

2. using   design to frame the code(matching design with implementation) 设计模式和实现要保持一致。可以将设计转为伪代码,然后再完善成可实施代码。

3. including   pseuducode

4. 不要和陌生人说话原则。“防人之心不可无,害人之心不可有”

5. 合理利用Control   Structures、Data Structures来简化代码

6. 一定要有错误处理。注意错误处理和Assert断言的区别。

· 注意模块化的思想和关注点的分离(separation of concerns),包容变化是模块化的主要作用,把变化的放在一起。在基本模块化写法中,要遵循“开-闭”原则,也就是将扩展功能开放,而将修改功能封闭。

· 将软件分为两个层级:业务逻辑层,数据存储层。注意将系统模块化放在不同源文件比如实验中的menu.c、linklist.c、linklist.h

· 编码中的功能实现和错误处理符合20/80原则。

· 注意goto不是不能用,而是要用的合适。

实验四:用可重用的链表模块来实现命令行菜单小程序V2.5

5、可重用模块的接口设计

· 通用链表模块的设计接口,也就是说不要重复造轮子。在设计接口中,注意结对原则(生死相依原则),就比如说CreateLinkTable() 和 DeleteLinkTable(tLinkTable *pLinkTable) 成对出现。注意参数化上下文(移除前置条件,简化后置条件)。我们可以设置一个文件柜,这在这个文件柜里面,用户可以自定义数据类型的链表,实验中的文件柜是LinkTableNode。注意用表达式作为判断条件,而不要用布尔型变量做比较。Call-in函数方式遍历链表接口。DVT(开发者验证测试)。

· 接口概念:接口是定义了软件单元对外提供的服务。其中,有三个明显的要素(函数名、参数、返回值),有五个元素(目的、前置条件、协议、后置条件、质量属性)。接口可以按照功能分5类(共享数据或变量名、call-in functions、call-back functions、同步调用接口(阻塞式)、异步调用接口(信号量、消息队列等)。接口的设计遵循高内聚低耦合的原则,同时注意不要太具体也不要太通用。

实验五:用callback增强链表模块来实现命令行菜单小程序V2.8


6、可重用模块的接口设计(Callback)、函数的可重用性与线程安全

我们平常使用的都是call-in函数调用,但是在实验中,是给Linktable增加Callback方式的接口SearchLinkTableNode查询链表。实际上Lamda与Callback函数是最好的匹配,但是C语言里不支持Lamda,所以这里我们就没用使用了。在写代码的过程中注意全局变量cmd作用域问题,这里就涉及到了线程安全。如果代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全。可重用函数和线程安全的关系:可重入的函数不一定是线程安全的;可重入的函数在多个线程中并发使用时是线程安全的,但不同的可重入函数(共享全局变量及静态变量)在多个线程中并发使用时会有线程安全问题;不可重入的函数一定不是线程安全的。

实验七:将menu设计为可重用的子系统


原创粉丝点击