wiki:ASE2013

2013年秋-高级软件工程

欢迎加入 2013级新童鞋 群 号:229570921

基本课程内容+实验 - 课外阅读 - 专业提升 - 思考题

课程安排

The Course Introduction of Software Engineering

Software engineering is a maturing discipline that is increasingly important in a technology enabled connected world. The scope of software engineering involves requirements engineering, software design, modular programming, software testing and software project management.This course is organized in three parts.

  • Part One is programming and testing techniques,such as code style,how to make the code easy to read/modify/reuse,how to test code module and the program etc.Programming and Testing are the basic ability,most knowledge of software engineering is the abstract of programming/testing and related activities.The C language and basic data structure is needed to learn this part.
  • Part Two is overview of software engineering,explaining why knowledge of software engineering is important,presenting different types of software process and life cycle models,and looking at project planning and scheduling.
  • Part Three walk through the major steps of development and maintenance,regardless of the process model used to build the software:eliciting,modeling,and checking the requirements;designing a solution to the problem;implementing the software;and turning it over to the customer.

This course focus on practice,evaluation and improvement.It looks at how we can achieve our goal,how we can assess the quality of our outcomes and processes,and how to take steps to improve them.And it think over where the Theory for Software Engineering is.

基本课程内容+实验

  • Writing the Programs
  • 【实验一】代码规范:写一个小程序实现插入1000个学生信息,比如学号为1-1000,并随机查询1000次,数据的管理可以使用链表或其他数据结构
  • 【实验二】模块化和重用:将【实验一】进行模块化,将增删改查操作定义为模块接口,初始化插入1000个学生信息,然后可以通过命令行增删改查。
    • 定义模块接口,例如Interface of Link Table - linktable.h
    • 测试驱动开发(Test-Driven Development,简称TDD),对于Link Table模块来讲,先写用来测试增删改查操作的测试程序,然后编程实现Link Table模块。linktable example code(只保证了写互斥,读写并发线程安全做的并不严密)
    • students.c(No Design) -> Modularity (also called separation of concerns) -> writing code to make it reusable on future projects -> callback函数 ->函数的可重入性(reentrant)或线程安全
    • 工程组织方法:工程文件Makefile
    • 考核要求:系统设计模块化,理解模块的内聚和耦合;数据存储模块可重用(对模块间的耦合提出了更高的要求),理解callback函数
    • 考核方式:Demo(自己负责的模块独立Demo + 集成Demo) & Code Review(自己负责的模块)
    • Deadline:2013/10/07 17:30
  • Testing the Programs
    • 编码的过程总结
      • 设计产出模块间接口定义
      • 针对接口写test driver(DVT)和test stub形成可编译运行的代码框架,但无实际功能;
      • 集中精力放在你负责的模块实际功能实现上,编码过程中始终保持代码可以编译运行,以便随时验证代码的执行效果。
    • 测试开发
      • DVT(test driver)只是典型正确情况的功能验证,用于驱动开发验证代码;
      • 独立测试需要设计测试用例(前置条件、参数设计和预期结果),往往一个接口函数对应着多个测试用例。
  • 【实验三】测试:在【实验二】数据管理模块的基础上,提升查询性能,至少要比单链表的查询性能提高一倍。模块设计时要增加考虑线程安全问题,要实现自动化回归测试。
    • 基本功能测试自动化?
    • 与单链表对比的性能测试?
    • 线程安全(函数可重入性)如何测试?
    • 考核要求:划分三个模块:查询优化后的数据管理模块、功能测试模块(每个接口都做全面测试)和性能测试模块
    • 考核方式:Demo(自己负责的模块独立Demo + 集成Demo) & Code Review(自己负责的模块)
    • Deadline:2013/10/21 17:30
  • Designing the Modules
    • OO的核心:封装、多态和继承
    • 高内聚低藕合的模块化设计是主要是为了谁?用户,开发者还是计算机。
    • 模块化架构最求高内聚和低耦合 vs SOA架构
    • 还需要学习UML吗?
      • ICSE上很有趣的talk:UML in Practice. Open Univ的Marian Petre在采访了许多知名软件工程师之后,发现绝大多数人不用UML,用的少数人,也主要把它当成交流或者教学工具,很少全程使用。这篇文章获得了最佳论文奖。文章指出70% 的调查对象从不用UML, 全心全意地使用UML 的比例是 0%
  • 【实验四】多态:请使用您熟悉的面向对象编程语言(比如Python、C++、Java等)编写一个多态用法的例子,要求能够充分体现多态的特点,对照理解liskov可替代性原则。
    • 最好能有简单而又典型的应用场景作为需求来设计
    • 要求用尽量少的代码行数和简单的代码结构来构建,最好不要多于300行代码,最好不要少于3个代码源文件。
    • 考核要求:小组内各成员独立完成,小组会审
    • 考核方式:Demo & Code Review
    • Deadline:2013/10/28 17:30
    • 要求每位助教老师推荐3-5个特别优秀的实验作业(没有被抽查到的同学可向助教老师自荐),被助教老师推荐的范例作业请同学自行发布到 PolymorphismExample 上并注明邮箱和姓名。
  • Why Software Engineering?
    • 编程的乐趣——简单的快乐、挑战的乐趣和创造的乐趣
    • 创造是解决问题的过程,软件工程就是利用计算机科学解决问题的学科
    • 怎么评价软件的质量?用户、产品(产出)、过程,还有商业角度
    • 软件工程 vs. 建筑工程
    • 工程方法和系统方法
    • 技术、过程、人员和质量保证
  • Modeling the Process and Life-Cycle
    • Waterfall model,V model,Prototyping model,Phased development: increments and iteration,Spiral model,RUP,Agile methods
    • Static model and Dynamic model,prescriptive and descriptive process
    • 我们自己的编码开发过程是什么样?从hello world开始的学编程,到编写大一点的程序时利用伪代码或代码框架,都体现了打草稿约束我们的思路并逐步细化优化(增量与迭代)的过程,从这一点上来讲,程序员与画家或建筑设计师的工作流程是类似的。
    • 上帝也在打草稿,3个月内受精卵逐步演变为胎儿,这一时段最易流产。与带原型的瀑布模型是否比较相似。
    • if you don't know where you are ,a map won't help.(Watts S.Humphrey)在繁琐的过程控制中迷失了方向,敏捷方法应运而生。
    • RUP - 用例驱动,以架构为中心,增量且迭代!其中不也是打草稿的思想吗?
    • 草稿即作品!就像画画没有画完的时候,只有不愿意继续花时间改进而已!
  • 【实验五】多人项目:项目开题,包括需求分析和概要设计
    • 每小组确定一个题目或要解决的问题,同组成员不得选择不同题目而且务必通过小组讨论达成一致,尽量结合工程实践项目选题
    • 按照开题报告的要求完成一份ppt(小组各成员独立完成,内容一致但具体图表(MS Visio,Rational Rose etc.)等独立制作)
    • 要求:项目目标明确、方案思路清晰,并能解释清楚关键问题的决策思路。
    • 考核形式:8分钟演讲现场答辩
    • 考核标准:1)演讲少于6分钟或超过10分钟最高评分为B,包括匆忙加快进度或增加生硬内容故意延长时间;2)ppt为个人独立制作并能提供相关源文件,有假冒行为的一经发现最高评分为C;3)ppt本身和演讲本身的主观评价,评价的主要依据为思路清晰重点突出。
    • 时间安排:从11周(11月11日)开始每周抽出1个小时左右上课时间抽查4-5组,其中11周为自告奋勇接受考核,起评分略宽松,之后现场抽查。
  • 【实验六】设计模式:商店管理系统有一个Smartphone类和它的派生类有iPhone、 AndroidPhone?、WindowsPhone等,以及以品牌名称命名的派生类如SonyPhone和手机版本iPhone 5c等。你该如何设计这一类的系统?
    • 具体要求(三个要求可以分开实现,组合实现评分从优)如下:
      • 增加新的手机种类、品牌、型号时只允许添加代码模块和修改客户初始化代码,其他代码不准修改;
      • 全店手机统一打折促销时只需要修改一处代码或修改一处策略;
      • 某个种类、品牌、型号的手机打折促销时也只需要修改一处代码或修改一处策略;
    • 请实现简单的代码原型(具体编程语言和开发环境自由选择),并解释其中使用了哪些设计模式,如果能比较多种方案(模式的选择和组合)优劣评分从优。
    • 要求个人独立完成代码,设计思想方法可以相互讨论学习,分组抽查,【抄袭代码者一经发现本门课程最终成绩扣20分】。
    • 考核方式:Demo & Code Review
    • Deadline:2013/12/16 17:30
  • 【实验七】课外阅读报告:通读您选择的课外阅读书,完成一篇不少于2000字的阅读报告,要求至少包括对全书内容的简要总结、对关键内容点的理解心得和主要收获等,像写一篇结构完整、逻辑思路清晰的作文一样,有一定的可读性和参考价值。
    • 要求以署名博客方式发表,题目自拟,正文开始前显要位置注明“中国科学技术大学软件学院”+ 真实姓名 + “原创作品版权所有转载请注明出处”;
    • 文章中如有引用请使用引号“”括起来并注明参考文献出处;
    • 博客文章URL提交到 实验七课外阅读报告提交处(只要将URL添加到您的姓名右侧即可)
    • Deadline:2013/12/23 17:30
  • Testing the System
    • Regression testing
    • Configuration management
    • 作为开发者您希望怎样的配置管理和测试管理能最大化提高开发者的工作效率?
    • 可靠性稳定地增长但无法预测下一次失效时间
  • Planning and Managing the Project - 1-2-3-4
    • 轻松理解CMMI
    • Scrum简介
    • People - 项目人员包括项目参与者、项目负责人、软件项目组,协调和通讯,人员的角色特征和工作风格;
      • 根据在项目中扮演的角色不同,对能力(技术能力、交流能力和管理能力等)和经验要求不同;
      • 工作风格:内向-外向,感性-理性,各不同工作风格的人最优先考虑的问题的相关信息?胆汁质、粘液质、多血质和抑郁质,各不同气质特点的人对问题的反应速度及情感表达方式有何不同?。
      • 人与人之间的交流成本:如果给一个本已延期的项目增加人手只会使项目延期更多。
      • 项目组织方式,高度结构化和松散结构化,首席程序员制(chief programmer team)和忘我方法(egoless approach)
    • Problem - 软件范围(见后面章节,主要是需求分析)、问题分解(见后面章节,主要是设计)
    • Process - 合并问题和过程,过程分解、工作量估算、风险管理、进度跟踪等
  • Delivering the System
    • Considering the Audience in Training and Documentation
  • Chapter-11 Maintaining the System
    • Software does not degrade or require periodic maintenance,However, software is continually evolving,so Maintenance process can be difficult.
    • The more a system is linked to the real world, the more likely it will change and the more difficult it will be to maintain
    • Impact analysis builds and tracks links among the requirements, design, code, and test cases
    • Software rejuvenation involves redocumenting, restructuring, reverse engineering, and reengineering
    • 我们的设计和开发工作大多都是在维护重用已有的软件,像本课程一样从头需求分析、设计、编码...的项目相对较少。
  • Chapter-14 The Future of Software Engineering

课外阅读

  • 《人月神话》Frederick Brooks
  • 《人件》Tom DeMarco
  • 《第五项修炼》Peter M. Senge
  • 《管理之美》
  • 《黑客与画家》
  • 《架构之美》
  • 《编程之美》 《编程之美》小组著 电子工业出版社
  • 《程序员的自我修养--链接、装载与库》 俞甲子、石凡、潘爱民著 电子工业出版社

专业提升

荣誉附加题

课程总结分析

高软考试top14人,判断题平均每人错8个,这14人里最少的错6个,全部统计起来太费力了,我只抽取分数最高的14张试卷统计了一下

【 ×】模块化(Modularity)的思想和关注点的分离(separation of concerns)是不同的,模块化使用耦合(coupling)和内聚(cohesion)的程度来度量;而关注点的分离是分解大的系统或模块的方法。 貌似课件介绍模块化的时候说是关注点分离的思想 14人有9人没有理解模块化(Modularity)的思想和关注点的分离(separation of concerns)内在思想的一致

【 ×】工作任务分解结构WBS(Work breakdown structure)在项目计划和管理中非常有用,因为它可以将项目划分成离散的独立任务,对进度追踪管理和项目工作量评估都可以起到基础性作用。另外,WBS在描述系统架构时也比较常用,因为它可以描述模块化架构中的模块内部的内聚性和模块之间的耦合性。 14人有9人这个题也错了,WBS能表述模块之间的耦合性吗?

【 ×】语句覆盖测试Statement testing,分支覆盖测试Branch testing,路径覆盖测试Path testing等有着不同的测试强度,语句覆盖一般比路径覆盖的测试强度要强,测试强度越强越容易发现软件缺陷(Fault)。 语句覆盖比路径覆盖的测试强度要强吗?这个14人中有8人出错

14人中出错的题目不是特别集中,也没有人出错率低于5%,出错率最低12%,可能和课程特点有关,操作系统课程出错率最好的可以在5%以下 软件工程涉及的知识面广,内容杂乱没有统一有机的理论贯通,和操作系统课程有显著的差异,但这其中有没有我出题考核上的问题呢? 大概有百分之十几的同学卷面成绩不及格,有百分之十几的同学卷面成绩在80分以上,没有人超过90分,课堂上反复讲的东西出错率还是非常高,这和其他技术理论性课程也有显著的差异。 统计下来总评排序和考试成绩排序总体一致,实验成绩按小组评分拉的相对平均

2013-2014学年《高级软件工程》课程总结

这一学年高软课程授课进一步打破选定教材的思路安排,强化实践能力训练,从学生较为熟悉的编程训练入手,以范例演示基本编码规范、 No Design时的代码、经过基本Modularity (also called separation of concerns)设计的代码、writing code to make it reusable on future projects以及一些特殊的接口设计如callback函数和​函数的可重入性(reentrant)或线程安全等较深入的设计问题;并在演示代码基础上进一步引入实际可用的测试代码并切入测试技术基本理论和方法;这是课程的第一部分,重实践,形成对软件工程直观感性的认识,并逐渐由直观感性的动手编码过度到更高层抽象的设计,如OO的封装、多态和继承,高内聚低藕合、UML等。课程的第二部分才开始对软件生命周期、软件项目任务切分工作量评估、项目计划、项目管理、进度跟踪等涉及软件工程项目全局性的概念方法做一梳理。第三部分则具体从需求、设计(重点是更复杂的设计模式体系结构等)、实现、维护等具体软件过程环节展开逐一分析讨论。

授课中的疑惑和问题:软件工程涉及面比较广泛,且与其他专业课多有交叉重合,在具体内容的教授上深入程度比较难把握,太浅显学生不过瘾,深入一点覆盖面又难以保证,如果能从课程体系上与其他专业课做好衔接过度适度重合,可能更有利于学习和教学。

Last modified 3 years ago Last modified on 07/16/14 09:37:01

Attachments (18)