软件工程

本课程为网易云课堂孟宁老师《软件工程:C编码实践篇》的配套实验与作业。软件工程C编码实践篇强化实践能力训练,从学生较为熟悉的编程训练入手,重实践,形成对软件工程直观感性的认识。
MOOC课程 http://mooc.study.163.com/course/USTC-1000002006

感悟:

首先我觉得通过孟宁老师的讲解和练习收获到很多,对Linux上的基本操作,C语言编码和软件工程都有了更进一步的认识和理解。觉得老师设置的课程恰到好处,我从中受益多多。老师上课特别的风趣有意思,对知识点讲解很透彻和有深度。只要从开始到结尾好好地跟着老师的思路去做实验,必定会得到巨大的进步!

1. 熟悉Linux实验环境。

实验一:写一个hello world小程序。
实验总结:第一次在Linux下操作,感觉和windows还是很不一样的。刚开始用vim编译器很不习惯。并且linux的很多命令和参数,需要长时间练习操作才能熟练掌握。第一次在Linux下写hello world,是很适合初学者的。但是由于不熟悉git,所以还是需要花点时间去了解一些的。

实验报告: https://www.shiyanlou.com/courses/reports/1271123

技能点: git linux vim

参考书: git 权威指南

2. 代码风格规范。

实验二:命令行菜单小程序V1.0。
实验总结:懂得了代码风格在团队合作中的重要性,也初步接触了模块化设计思想,也学会了将命令封装成函数从而进行一部分的独立。

实验报告:https://www.shiyanlou.com/courses/reports/1272186

技能点: 代码命名 编码规范

参考书: 构建之法,google c++规范

3. 基本的模块化设计。

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

实验总结:初步实现了业务逻辑与数据结构的分离,大大地加深了对模块化思想的理解。

实验报告:https://www.shiyanlou.com/courses/reports/1273655

模块化 解耦 复用

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

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

实验总结:用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作,链表模块的接口设计到达足够通用,
同时命令行菜单小程序的功能保持不变。在此我将通用的Linktable模块集成到menu程序中。

实验报告:https://www.shiyanlou.com/courses/reports/1275223

技能点: 单链表 ,接口规范化

问题: 项目的单链表设计存在冗余,代码不够精简,可能是考虑新手

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

实验五:用callback增强链表模块来实现命令行菜单小程序V2.8。
实验总结:首先利用callback函数使得linktable的查询接口更加通用,再者通过Debug调试的使用增强了代码调试的能力。

实验报告:https://www.shiyanlou.com/courses/reports/1276221

技能点: 回调:下层调用上层

思考: 解耦操作的延伸,方便层级间的交互,上册调用下层是正常逻辑, 回调提供了一种反向机制

6. 函数的可重入性(reentrant)及线程安全浅析。

本次没有实验,但是老师主要介绍了多线程编程和线程安全方面的知识。
多线程和线程安全是当今计算机很重要的知识,通过本次学习初步了解了多线程编程和线程安全的重要性和解决方案,对以后的学习和工作都有着很重要的作用。

技能点 : 线程安全 可重入

总结: 可重入:可中断, 线程安全:多线程同时运行与单线程运行结果一致,无明显包含与被包含关系

7. 子系统的可重用设计。

实验七:将menu设计为可重用的子系统。
实验总结:本次实验,添加了menu接口,扩展了命令行功能,使其可以输入带参数的命令。编写Makefile文件使编译变得简单。
同时还有Liunx系统函数getopt的理解和使用。最后一次实验,综合了前面所学知识,完成目标需要全面设计和仔细分析调试。但是通过这次实验可以学到很知识。

实验报告:https://www.shiyanlou.com/courses/reports/1276221

技能点 : 封装 接口的暴露程度,

总结: 避免暴露给用户不必要的接口和操作

常见开发流程

  • 瀑布模型:阶段性进展
  • 原型模型:快速构建
  • 转换模型: 增量反复和迭代

项目安排

1/3 计划规划, 1/6 编码, 1/4 构件测试和早期系统测试, 1/4 系统测试

  • 详细周全的计划减少后期重复工作
  • 测试:对代码质量的控制比编写代码本身用时更多
  • 计划周全,提早测试都可以有效降低二次成本
  • 系统由尽可能少的人员开发,减少沟通成本且可以有效提高项目进展效率
  • 单个模块有一个精干队伍实现,一人设计分工,多人辅助精细实现

首席程序员:极高天分,十年经验,文档编辑能力,大量系统应用知识

  • 大型项目中将设计方法与具体实现严格分离
  • 结构师:制定说明并建议一种实现方法,同时准备着接受实现人员其他可能达到目的的方法

编程人员仅了解自己负责的部分,而不是整个系统的开发细节时,工作效率最高。这种方法的先决条件是精确和完整地定义所有接口

  • 减少交流的方法是人力划分(division of labor)和限定职责范围(specialization of function)
  • 产品责任人必须对技术主管的技术才能表现出尊重
  • 开发和维护公共的通用编程工具的效率更高
  • 一次添加一个构件,定期阶段化变更

软件开发中困难的部分是规格化、设计和测试这些概念上的结构,而不是对概念进行表达和对实现逼真程度进行验证

  • 需求精炼和快速原型。开发软件系统的过程中,最困难的部分是确切地决定搭建什么样的系统
  • 层次化,增量化开发

课程贡献:

  • git 原理与使用讲解
  • google c++编程规范讲解

课程感悟

复习了git、linux 基本操作, 认真学习了项目解耦和复用的思想,对封装和接口的认知有了更深的理解,开始学会从工程角度思考问题,之前局限于代码实现,缺乏对工程抽象和数据抽象、代码复用的思考,开始试着从项目组织和架构上思考问题,顺带学习了go 语言,go在结构和规范上属于进化之后的c语言,更适用于当下的开发需求,基本用go可以实现简单的小程序,希望之后有机会更加深入的学习go语言

相关go代码

http://www.cnblogs.com/zeroArn/p/7029455.html

posted @ 2017-06-16 17:11  zeroArn  阅读(174)  评论(0编辑  收藏  举报