积少成多

Just Do It


  • Home

  • Archives

  • Categories

  • Tags

16340179_penglsh_final_report

Posted on 2019-06-28 | In 系统分析与设计 | Visitors:

课程学习自我总结

我在项目开发小组中担任前端工程师的工作,同时在文档编写上也有一定贡献,主要工作为:

  • 前端vue页面实现和管理:
    • 信息通知页面的设计与实现
    • 任务发布历史页面的设计与实现
    • 任务领取历史页面的设计与实现
    • 任务详情页面及其时间进度条的设计与实现
  • 文档相关工作:
    • 用例和活动图文档编写
    • UI设计文档编写

特别致谢:

  • 项目经理兼后端工程师 16340173ousuixin,作为项目经理,尽职尽责,把自己的工作完成得十分出色的同时也负起了督促组员的责任,积极配合前端工程师进行项目开发。
  • 产品经理兼后端工程师 16340178 JH-Peng 尽职做好产品调研和竞品分析以及后端开发工作,积极配合前端工程师进行项目开发。
  • 前端开发工程师 16340174 Azure0SKY 在前端开发工作中带领我们一起学习vue,相互提携,相互督促,互相发现问题并解决问题。
  • 前端开发工程师 16340181 Vilinz相互提携,相互交流,在一起解决问题中成长。
  • 测试工程师兼后端工程师 16340176 PJsFirst ,设计了较友好的api,使得前后端工作能够较好地契合同步。

最得意/或有价值/或有苦劳的工作清单:

  • 最得意的工作:在设计任务详情时突发奇想手动实现了时间进度条,使得用户体验更加好。
  • 有价值的工作:在开发过程中能不断发现问题并解决问题,特别前后端合并后在测试debug上花了较多精力
  • 有苦劳的工作:大家作为一个团队,一起发现问题解决问题的过程让我十分享受,没有苦劳不苦劳之分。

PSP 2.1 统计表

PSP 2.1 Personal Software Process Stages Time (%)
Planning 计划 8
Estimate 估计任务所需时间 8
Development 开发 102
Analysis 需求分析(包括学习新技术) 15
Design Spec 生成设计文档(用例设计、UI设计等) 8
Design Review 设计复审 2
Coding Standard 代码规范 2
Design 具体设计 5
Coding 具体编码 30
Code Review 代码复审 10
Test 测试(自我测试,debug并自我完善) 30
Reporting 报告 9
Test Report 测试报告 0
Size Measurement 计算工作量 1
Postmortem&Process Improvement Plan 事后总结并提出过程改进计划 8
total 总计 119

个人分支的 GIT 统计报告

本人github:penglsh

看板记录:

  • 项目启动阶段:

  • 需求分析阶段

  • 系统分析阶段

  • 编码阶段

  • 集成测试&功能改进阶段

  • 系统测试&部署阶段


个人的技术类、项目管理类博客清单

vue+element时间进度条实现

vue+element时间进度条实现

Posted on 2019-06-28 | In 前端开发 | Visitors:

背景

项目前端开发使用了vue框架+Element组件,但是Element中没有已经实现了的时间进度条可以直接使用,为了满足项目展示任务详情剩余时间和进度的需求,我使用Element的Slider等组件自己封装了一个TimeSlider组件。


Element原组件Slider

  • 可以滑动
  • 可格式化滑点输出信息

效果图及源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div class="block">
<span class="demonstration">格式化 Tooltip</span>
<el-slider v-model="value4" :format-tooltip="formatTooltip"></el-slider>
</div>
<script>
export default {
data() {
return {
value1: 0,
value2: 50,
value3: 36,
value4: 48,
value5: 42
}
},
methods: {
formatTooltip(val) {
return val / 100;
}
}
}
</script>

目标样式

  • 进度条左右两端有开始时间和结束时间
  • 根据开始时间、当前时间和结束时间刷新进度条,即使用当前时间与开始时间的差占任务总时长的占比来更新进度
  • 格式化滑点输出:
    • 当任务在进行中,显示任务剩余时间
    • 当任务已完成,根据完成时间定格进度,滑点显示已完成
    • 当任务由于发布者取消、领取者放弃或超时,进度定格在100处,滑点显示任务未完成

编码实现

  1. 在<el-row>中分3列<el-col>,分别展示开始时间、进度条和结束时间,并设置好组件props以满足调用时传参所需。

    所传参数意义为:

    • startTime:任务开始时间
    • endTime:任务结束时间
    • finNum:完成任务的人数(仅当任务为问卷任务时需要)
    • missionState:任务当前状态(包括进行中、已完成、未完成即已结束)
    • finishTime:任务完成的时间
    • orderState:功能类似missionState,用于不同场景
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <template>
    <div>
    <el-row type="flex" align="middle">
    <el-col v-bind:span="5" style="text-align: center">{{ startTime }}</el-col>
    <el-col v-bind:span="14">
    <el-slider></el-slider>
    </el-col>
    <el-col v-bind:span="5" style="text-align: center">{{ endTime }}</el-col>
    </el-row>
    </div>
    </template>
    <script>
    export default {
    name: 'TimeSlider',

    data () {
    return {}
    },

    props: {
    startTime: {
    type: String,
    default: ''
    },

    endTime: {
    type: String,
    default: ''
    },

    finNum: {
    type: Number,
    default: 0
    },

    missionState: {
    type: Number,
    default: 0
    },

    finishTime: {
    type: String,
    default: ''
    },

    orderState: {
    type: Number,
    default: 0
    }
    }
    }
    </script>

    <style scoped>

    </style>
  2. 根据开始时间和结束时间计算时间进度条每次跳动的距离

    下面得到的结果为任务时长,使用100除以上述结果并向下取整即可得到时间进度条每次跳动的距离

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    timeDiff (sTime, eTime) {
    let startTime = new Date(sTime)
    let endTime = new Date(eTime)
    let leftHour = 0
    if (endTime.getTime() > startTime.getTime()) {
    let msDiff = endTime.getTime() - startTime.getTime()
    leftHour = Math.floor(msDiff / (1000 * 3600))
    }
    return leftHour
    }
  3. 计算当前时间距离开始时间过去了多久,并根据2计算的结果设置当前任务进度

    以下根据任务当前的状态设置进度值,若为进行中任务,则继续计算并持续更新进度,若为已完成则定格进度值,若为未完成(取消或超时),则进度值为100

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    passTime (startTime, endTime, finishTime) {
    let sTime = new Date(startTime)
    let nowTime = Date.now()
    let eTime = new Date(endTime)
    if (this.finNum !== 0 || this.orderState === 1) {
    let finTime = new Date(finishTime)
    let passHour = 0
    if (finTime.getTime() > sTime.getTime()) {
    let msDiff = finTime.getTime() - sTime.getTime()
    passHour = Math.ceil(msDiff / (1000 * 3600))
    }
    return passHour * (100.0 / this.timeDiff(startTime, endTime))
    } else if ((this.missionState > 2 && this.finNum === 0) || this.orderState === 2) {
    return 100
    }

    if (nowTime >= eTime.getTime()) {
    return 100
    }

    let passHour = 0
    if (nowTime > sTime.getTime()) {
    let msDiff = nowTime - sTime.getTime()
    passHour = Math.ceil(msDiff / (1000 * 3600))
    }
    return passHour * (100.0 / this.timeDiff(startTime, endTime))
    }
  4. 根据需求格式化滑点的输出

    根据任务状态和需求设置滑点数据的显示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    formatTooltip () {
    if ((this.finNum !== 0 && this.missionState === 2) || this.orderState === 1) {
    return '已完成'
    } else if (this.missionState > 2 && this.finNum === 0 && this.orderState !== 2) {
    return '任务已结束或已取消(未完成)'
    } else if (this.orderState === 2) {
    return '任务已结束或已放弃(未完成)'
    }
    let currTime = Date.now()
    let eTime = new Date(this.endTime.toString())
    let left = '任务未完成,已结束'
    if (eTime.getTime() > currTime) {
    let msDiff = eTime.getTime() - currTime
    // compute day left
    let leftDay = Math.floor(msDiff / (1000 * 24 * 60 * 60))
    // hours left after computing day left
    let leaveForHour = msDiff % (1000 * 24 * 60 * 60)
    // compute hour left
    let leftHour = Math.floor(leaveForHour / (1000 * 60 * 60))
    let leaveForMinute = leaveForHour % (1000 * 3600)
    let leftMinute = Math.floor(leaveForMinute / (1000 * 60))
    let leaveForSecond = leaveForMinute % (1000 * 60)
    let leftSecond = Math.round(leaveForSecond / 1000)
    left = '剩余' + leftDay + '天' + leftHour + '时' + leftMinute + '分' + leftSecond + '秒'
    }

    return left
    }
  5. 进度条不可人为改动,所以需要添加disable


完整代码及效果图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<template>
<div>
<el-row type="flex" align="middle">
<el-col v-bind:span="5" style="text-align: center">{{ startTime }}</el-col>
<el-col v-bind:span="14">
<el-slider
v-bind:step="Math.floor(100 / timeDiff(startTime, endTime))"
v-bind:value="passTime(startTime, endTime, finishTime)"
v-bind:format-tooltip="formatTooltip"
disabled>
</el-slider>
</el-col>
<el-col v-bind:span="5" style="text-align: center">{{ endTime }}</el-col>
</el-row>
</div>
</template>

<script>
export default {
name: 'TimeSlider',

data () {
return {}
},

props: {
startTime: {
type: String,
default: ''
},

endTime: {
type: String,
default: ''
},

finNum: {
type: Number,
default: 0
},

missionState: {
type: Number,
default: 0
},

finishTime: {
type: String,
default: ''
},

orderState: {
type: Number,
default: 0
}
},

methods: {
formatTooltip () {
if ((this.finNum !== 0 && this.missionState === 2) || this.orderState === 1) {
return '已完成'
} else if (this.missionState > 2 && this.finNum === 0 && this.orderState !== 2) {
return '任务已结束或已取消(未完成)'
} else if (this.orderState === 2) {
return '任务已结束或已放弃(未完成)'
}
let currTime = Date.now()
let eTime = new Date(this.endTime.toString())
let left = '任务未完成,已结束'
if (eTime.getTime() > currTime) {
let msDiff = eTime.getTime() - currTime
// compute day left
let leftDay = Math.floor(msDiff / (1000 * 24 * 60 * 60))
// hours left after computing day left
let leaveForHour = msDiff % (1000 * 24 * 60 * 60)
// compute hour left
let leftHour = Math.floor(leaveForHour / (1000 * 60 * 60))
let leaveForMinute = leaveForHour % (1000 * 3600)
let leftMinute = Math.floor(leaveForMinute / (1000 * 60))
let leaveForSecond = leaveForMinute % (1000 * 60)
let leftSecond = Math.round(leaveForSecond / 1000)
left = '剩余' + leftDay + '天' + leftHour + '时' + leftMinute + '分' + leftSecond + '秒'
}

return left
},

timeDiff (sTime, eTime) {
let startTime = new Date(sTime)
let endTime = new Date(eTime)
let leftHour = 0
if (endTime.getTime() > startTime.getTime()) {
let msDiff = endTime.getTime() - startTime.getTime()
leftHour = Math.floor(msDiff / (1000 * 3600))
}
return leftHour
},

passTime (startTime, endTime, finishTime) {
let sTime = new Date(startTime)
let nowTime = Date.now()
let eTime = new Date(endTime)
if (this.finNum !== 0 || this.orderState === 1) {
let finTime = new Date(finishTime)
let passHour = 0
if (finTime.getTime() > sTime.getTime()) {
let msDiff = finTime.getTime() - sTime.getTime()
passHour = Math.ceil(msDiff / (1000 * 3600))
}
return passHour * (100.0 / this.timeDiff(startTime, endTime))
} else if ((this.missionState > 2 && this.finNum === 0) || this.orderState === 2) {
return 100
}

if (nowTime >= eTime.getTime()) {
return 100
}

let passHour = 0
if (nowTime > sTime.getTime()) {
let msDiff = nowTime - sTime.getTime()
passHour = Math.ceil(msDiff / (1000 * 3600))
}
return passHour * (100.0 / this.timeDiff(startTime, endTime))
}
}
}
</script>

<style scoped>

</style>

在页面主键中引用上述TimeSlider并传相应参数即可使用该组件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<template>
<div>
<time-slider
v-bind:start-time="startTime"
v-bind:end-time="endTime"
v-bind:mission-state="missionState"
v-bind:fin-num="fin_num"
v-bind:finish-time="finishTime"></time-slider>
</div>
</template>
<script>
import backend from '../backend'
import TimeSlider from '../components/TimeSlider' // import TimeSlider 组件

export default {
name: 'PublishedPage',

components: { TimeSlider },

data () {
return {
startTime: '2019-06-25 23:28:45',
endTime: '2019-06-27 23:28:28',
finishTime: '', // 空表示未完成
fin_num: 0, // 0表示未完成
missionState: 0 // 0表示未完成
}
}
}

效果图如下:

系统分析与设计——作业9

Posted on 2019-06-20 | In 系统分析与设计 | Visitors:

使用 UMLet 建模,练习资源Asg-RH.pdf:

  • 1、使用类图,分别对 Asg_RH 文档中 Make Reservation 用例以及 Payment 用例开展领域建模。然后,根据上述模型,给出建议的数据表以及主要字段,特别是主键和外键

    • 注意事项:
      • 对象必须是名词、特别是技术名词、报表、描述类的处理;
      • 关联必须有多重性、部分有名称与导航方向
      • 属性要注意计算字段
    • 数据建模,为了简化描述仅需要给出表清单,例如:
      • Hotel(ID/Key,Name,LoctionID/Fkey,Address…..)

    Make Reservation

    Payment

    数据建模如下:

    1
    2
    3
    4
    5
    6
    7
    Hotel(ID/Key, name, address, CityID/FKey, roomDesciption/FKey)
    City(ID/Key, name)
    Customer(ID/Key, fullName, email)
    Room(ID/Key, type, price, isAvailable, description)
    Reservation(ID/Key, CustomerId/FKEY, HotelID/FKey, RoomID/FKey, in-date, nights)
    Payment (ID/key, ReservationID/Fkey, totalPrice)
    CreditCard(ID/Key, type, card-security-code, expiry-date)
  • 2、使用 UML State Model,对每个订单对象生命周期建模

    • 建模对象: 参考 Asg_RH 文档, 对 Reservation/Order 对象建模。
    • 建模要求: 参考练习不能提供足够信息帮助你对订单对象建模,请参考现在 定旅馆 的旅游网站,尽可能分析围绕订单发生的各种情况,直到订单通过销售事件(柜台销售)结束订单。

系统分析与设计——作业7

Posted on 2019-05-23 | In 系统分析与设计 | Visitors:

使用 UMLet 建模:

  • 1、根据订旅馆建模文档,Asg-RH.pdf

    • 绘制用例图模型(到子用例)

    • 给出 make reservation 用例的活动图

  • 2、根据课程练习“投递员使用投递箱给收件人快递包裹”的业务场景

    • 分别用多泳道图建模三个场景的业务过程

      • x科技公司发明了投递柜,它们自建了投递柜以及远程控制系统。注册的投递员在推广期免费使用投递柜。由于缺乏资源,仅能使用y移动平台向客户发送短信通知。

      • 随着产品推广,x公司与各大快递z公司达成协议。x公司在快递柜上添加了二维码扫描装置,z公司的快递员不仅可在快递柜上登陆(由z公司提供认证服务),且可扫描快递单号,投递入柜后自动由z公司发短信给客户。客户取件后,自动发送给z公司投递完成。

      • x公司进一步优化服务,开发了微信小程序实现扫码取快递。如果用户关注了该公司公众号,直接通过过公众号推送给用户取件码等信息。不再发送短信。

    • 根据上述流程,给出快递柜系统最终的用例图模型

      • 用正常色彩表示第一个业务流程反映的用例
      • 用绿色背景表述第二个业务场景添加或修改的用例,以及支持 Actor
      • 用黄色背景表述第三个业务场景添加或修改的用例,以及支持 Actor

系统分析与设计——作业四

Posted on 2019-04-29 | In 系统分析与设计 | Visitors:

[TOC]

一、简答题

1. 用例的概念

  • 用例是描述在一个项目中,参与者是否可以通过系统达到目标相关的成功和失败的集合
  • 用例是一种文本文档,而不是图表
  • 用例建模主要是编写文档,而不是画图
  • 用例是用于知识系统将要做什么的方法

2. 用例和场景的关系?什么是主场景或 happy path?

  • 用例和场景的关系:
    • 每一个用例是一些场景的集合(包括成功的场景和失败的场景),场景是actors和系统之间某些特定的一系列动作和绘画的实例
  • 主场景:
    • 每个用例都包含一个主场景,主场景通常是一个用例里成功的场景,对应于系统中的主要的交互,能够直接达到用户目标的场景
  • happy path:
    • 在测试用例时没有出现预期之外结果的场景。在用例建模中,happy path是主执行者完成了目标,所有有关人员的需求都得到了满足。

3. 用例有哪些形式?

用例有三种常用的形式:

  • 简短格式(brief):
    • 通常只包含主场景,在最开始的需求分析时候创建
    • 在早期需求分析过程中,快速了解主题和范围
    • 可能只需用几分钟来创建
  • 简便格式(Casual):
    • 一种不正式的格式,许多的图表涵盖了许多种场景
  • 完全格式(Fully):
    • 所有变化、步骤写的很详细,有支持部分,如前提条件和成功保证
    • 所有的用户样例都已经确定且简略写完后,经过迭代得到的完全格式的用例

4. 对于复杂业务,为什么编制完整用例非常难?

  • 因为复杂业务中包含的子用例非常多,流程复杂,业务繁琐,对应的场景因此也有很多,因此编制完整的用例难度非常高,需要的成本也比较高

5. 什么是用例图?

  • 用例图是指由参与者、用例、边界以及他们的关系构成的用于描述系统功能的视图
  • 用例图是外部用户(参与者)所能观察到的系统功能的模型图
  • 用例图是系统的蓝图,它是用户和系统交互的一种表示方法,显示了用户与用户所涉及的不同用例之间的关系

6. 用例图的基本符号与元素?

  • 参与者:表示的是一个系统用户,也就是与应用程序进行交互的用户、组织或者外部系统

  • 用例:表示对系统提供的功能、服务的一种描述

  • 用例之间的关系:

    • 包含关系:表示用例可以简单地包含其他用例所具有的行为,并把它所包含的用例行为作为自身行为的一部分。常用带箭头的虚线表示,箭头指向被包含的用例

    • 泛化关系:泛化指的是一个父用例可以被特定化形成多个子用例,而父用例和子用例之间的关系就是泛化关系。常用空心三角箭头实现表示,箭头指向父用例

    • 关联关系:表示的是参与者与用例之间的关系。常用一条直线,或者一条带箭头的线条表示,箭头指向信息接收方

    • 扩展/延伸关系:表示在一定条件下,把新的行为加入到已有的用例中,获得的新用例叫做扩展用例,原有的用例叫做基础用例,相当于基础用例提供一个附加功能。用带箭头的虚线表示,箭头指向基础用例

7. 用例图的画法与步骤

  • 确定系统的边界,然后画出系统框架并写上系统名字
  • 确定参与者,主要参与者在左边,支持性参与者在右边
  • 确定参与者之间的关系
  • 根据需求识别和创作用例
  • 确认用例与参与者之间的关系
  • 将用例画在系统中,如果涉及其他子系统,则将子系统放在右边

8. 用例图给利益相关人与开发者的价值有哪些?

  • 对于利益相关人:
    • 可直观看到系统的功能和操作过程,保证系统按用户的需求进行设计
    • 用例能够根据需要对复杂程度和形式化程序进行增减调节,即能够响应用户提出的需求
  • 对于开发者:
    • 明确系统的业务范围、服务对象(角色)、外部系统与装备
    • 可用于识别技术风险,提前实施关键技术原型攻关与学习
    • 使得工作量评估更加方便容易,更易于合理规划迭代周期,规划人力需要

二、建模练习题

  • 选择2-3个你熟悉的类似业务的在线服务系统(或移动 APP),如定旅馆(携程、去哪儿等)、定电影票、背单词APP等,分别绘制它们用例图。并满足以下要求:

    • 请使用用户的视角,描述用户目标或系统提供的服务
    • 粒度达到子用例级别,并用 include 和 exclude 关联它们
    • 请用色彩标注出你认为创新(区别于竞争对手的)用例或子用例
    • 尽可能识别外部系统和服务

    选择猫眼电影订电影票和携程定旅馆:

    • 猫眼电影订电影票:
    • 携程定旅馆:
  • 然后,回答下列问题:

  1. 为什么相似系统的用例图是相似的?
    答:因为用例图描述的是用户和用例的关系,而用例是描述参与者使用系统达成目标相关的成功与失败的场景的集合,如果最终目标相似,需求相似,达成目标的方法也相似,用例图就相似。因此,相似系统的用例图是相似的。

  2. 如果是定旅馆业务,请对比 Asg_RH 用例图,简述如何利用不同时代、不同地区产品的用例图,展现、突出创新业务和技术
    答:在不同时代、不同地区,旅馆的类型就会不同,而定旅馆业务的需求也因地区和时代而异,我们应该着重考虑哪些因需求变化而导致的用例图的差异,并结合市场调研,从中获取更加满足用户需求的用例,使得服务更加周到和细致。

  3. 如何利用用例图定位创新思路(业务创新、或技术创新、或商业模式创新)在系统中的作用
    答:使用不同的高亮的颜色标注创新点

  4. 请使用 SCRUM 方法,选择一个用例图,编制某定旅馆开发的需求(backlog)开发计划表
    这里选择订电影票用例图

    | ID | Name | Imp | Est | How to demo |
    | —- | ———— | —- | —- | ———————————- |
    | 1 | 查看电影 | 10 | 6 | 根据系统推荐查看要看的电影 |
    | 2 | 选择影院 | 25 | 10 | 根据距离、价格、环境等因素考虑影院 |
    | 3 | 选择观影时间 | 25 | 10 | 选择合适的日期和时间看电影 |
    | 4 | 选择位置 | 20 | 8 | 选择舒适的观影位置 |
    | 5 | 支付 | 10 | 8 | 选择合适的支付平台进行支付 |
    | 6 | 评价 | 10 | 5 | 对观看的电影进行合理的评价 |

  1. 根据任务4,参考 使用用例点估算软件成本,给出项目用例点的估算
    根据参考资料,可知评级依据(标准)为:

    • 简单用例:1 到 3 个事务,权重=5
    • 一般用例:4 到 7 个事务,权重=10
    • 复杂用例:多于 7 个事务,权重=15

    故任务4的用例点估算如下:

    | ID | 用例 | 事务 | 计算 | 评级 |
    | —- | ———— | —- | —- | ——– |
    | 1 | 查看电影 | 2 | 2 | 简单用例 |
    | 2 | 选择影院 | 4 | 7 | 一般用例 |
    | 3 | 选择观影时间 | 3 | 2 | 简单用例 |
    | 4 | 选择位置 | 3 | 2 | 简单用例 |
    | 5 | 支付 | 3 | 2 | 简单用例 |
    | 6 | 评价 | 3 | 3 | 简单用例 |

系统分析与设计——作业三

Posted on 2019-04-16 | In 系统分析与设计 | Visitors:

简答题

1. 简述瀑布模型、增量模型、螺旋模型(含原型方法),并分析优缺点

从项目特点、风险特征、人力资源利用角度思考

  • 瀑布模型:
    • 优点:
      • 降低软件开发的复杂程度,提高软件开发过程的透明性,开发过程的可管理性
      • 提供了开发过程的模板,有利于开发过程人员的组织、管理等,同时模型中阶段评审和文档控制等也使得分析、编码、测试和维护等有一个统一的理论指导
      • 有利于开发方法和开发工具的研究和使用,提高软件的质量和软件开发的效率
    • 缺点:
      • 开发过程线性化,一般不可逆转
      • 模型阶段化明确固定,阶段之间产生较多文档,这也增加了工作量
      • 缺乏灵活性和可变性,由于需求的可变和不可预见性,会导致后期需求变更时成本非常高
      • 模型风险控制能力较差
      • 软件开发的结果往往要到后期才能了解和明确
  • 增量模型:
    • 优点:
      • 人员分配灵活,刚开始时不用投入大量人力资源
      • 将待开发的软件系统模块化,分批次提交产品,使得客户可以及时了解整个项目的进展,从而提高客户对系统的信心
      • 以组件为单位的开发进程使得风险得到一定的控制,提高了系统的稳定性和可维护性
    • 缺点:
      • 建立初始模型时,作为增量基础的基本业务服务的确定有一定难度
      • 若待开发的软件系统很难被模块化将会极大地增大工作量和提高开发难度
      • 并行开发的各个组件可能遇到不能集成或者难以集成的问题
  • 螺旋模型(含原型方法):
    • 优点:
      • 设计具备灵活性,可在项目各个阶段进行变更
      • 客户参与度高,及时满足客户的需求,保证了项目的正确开发方向
      • 以小的分段来构建大型系统,使成本计算变得简单容易
      • 引入了风险分析,使得风险得到一定程度上的控制
    • 缺点:
      • 建设周期长,而软件技术发展比较快,所以经常出现软件开发完毕后,和当前的技术水平有了较大的差距,无法满足当前用户需求
      • 采用螺旋模型需要具有相当丰富的风险评估经验和专门知识,在风险较大的项目开发中,如果未能够及时标识风险,势必造成重大损失
      • 过多的迭代会增加开发成本

2. 简述统一过程三大特点,与面向对象的方法有什么关系?

  • 三大特点:
    • 以用户为中心(描述用户使用产品的故事)
    • 以架构为重心(软件产品分解的领域最佳实践)
    • 以风险驱动(早期暴露风险)
  • 与面向对象方法的关系:
    • 统一过程是基于UML、以构架为中心、用例和风险驱动相结合的迭代增量过程,是当下流行构造面向对象系统的迭代软件开发过程,它将软件开发过程要素和软件工件要素整合在统一的软件工程框架中,是 一个面向对象的程序开发方法论

3. 简述统一过程四个阶段的划分准则是什么?每个阶段关键的里程碑是什么?

  • 划分准则:
    • 初始阶段:通过对文档的评审确定用例需求理解正确、项目风险评估 合理、阶段计划可行,确定系统的业务模型,范围等
      • 里程碑:生命周期目标里程碑
    • 细化阶段:软件体系结构设计完成,高风险业务需求和技术机制得到完善和解决,项目计划细分等
      • 里程碑:生命周期体系结构里程碑
    • 构造阶段:得到可以运行的软件产品和较为详细的用户手册,能够在测试环境里进行部署运行
      • 里程碑:初始运行能力里程碑
    • 移交阶段:确定最终目标是否实现,是否应该开始产品下一个版本的另一个开发周期
      • 里程碑:产品发布里程碑

4. 软件企业为什么能按固定节奏生产、固定周期发布软件产品?它给企业项目管理带来哪些好处?

  • 原因:
    • 因为通过统一过程,软甲开发可以被分成四个阶段,每个阶段的里程碑明确,使得阶段性需求易于评估
    • 每个迭代过程都有固定的时长和产品生成,进而为企业按固定节奏生产、固定周期发布软件产品提供了依据
  • 好处:
    • 软件项目开发更加规范化,便于项目的管理
    • 统一过程的风险驱动特性使得风险评估更加准确,风险更容易被控制
    • 通过统一过程的迭代式增量开发,能够逐步解决高风险问题
    • 客户能够及时了解项目的进程,及时根据客户的需求进行开发调整,提高客户对项目开发的信心和团队的信任度

Hello World

Posted on 2019-04-16 | Visitors:

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

Liusheng Peng

Liusheng Peng

Be Myself

7 posts
2 categories
16 tags
GitHub
© 2019 Liusheng Peng
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4