-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
112 changed files
with
4,809 additions
and
15,917 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
# Sphinx build info version 1 | ||
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. | ||
config: b7dffe6ee1c08dd1fdd4f38da7dbd7af | ||
config: 31ac907e9c79be7628508fe9b08d4157 | ||
tags: 645f666f9bcd5a90fca523b33c5a78b7 |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
# 项目范围管理 | ||
|
||
项目范围管理包括确保项目包含且仅包含完成项目所需的全部工作的过程。它主要涉及定义和控制项目应该包括和不应该包括的内容,包括收集需求(Collect Requirements)、定义范围(Define Scope)、创建工作分解结构(Create Work - breakdown Structure)、核实范围(Verify Scope)和控制范围(Control Scope)这些重要的子过程都属于项目范围管理的范畴。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
# 验收标准 | ||
|
||
项目范围书评审主要有以下标准: | ||
|
||
## 完整性标准 | ||
|
||
### 目标完整性 | ||
|
||
项目范围书应明确阐述项目的总体目标。这个目标应该是具体的、可衡量的、可达成的、相关的和有时限的(SMART原则)。例如,一个软件开发项目的目标可能是“在接下来的12个月内,开发一个能够支持10万用户并发访问,且系统崩溃率低于1%的电商APP”。如果目标缺失或者模糊,如仅说“开发一个电商APP”,就不符合完整性要求。 | ||
|
||
### 工作内容完整性 | ||
|
||
所有应该包含在项目范围内的工作任务都要详细列出。包括从项目启动到交付的各个阶段,如设计、开发、测试、部署等阶段的具体工作。以建筑项目为例,不仅要包含主体建筑的施工内容,还应涵盖附属设施建设、场地清理、绿化等工作。不能遗漏关键工作,否则可能导致项目执行过程中的混乱和额外成本。 | ||
|
||
### 交付成果完整性 | ||
|
||
明确规定项目的所有交付成果。对于一个产品研发项目,交付成果可能包括产品原型、测试报告、用户手册等。这些交付成果的具体规格、质量标准也要清晰说明。例如,产品原型应达到的功能完整性程度、测试报告应包含的测试用例覆盖范围等细节都要在范围书中体现。 | ||
|
||
## 准确性标准 | ||
|
||
### 范围边界准确性 | ||
|
||
精确界定项目范围的边界是至关重要的。明确哪些工作属于项目范围,哪些不属于。例如,在一个企业资源规划(ERP)系统升级项目中,要清楚说明升级的模块范围,如只包括财务和库存管理模块,而人力资源模块不在此次升级范围内。任何模糊的边界定义都可能导致范围蔓延,增加项目成本和时间。 | ||
|
||
### 需求描述准确性 | ||
|
||
对于项目的各种需求,无论是功能性需求还是非功能性需求,都要准确表述。功能性需求描述系统或产品能做什么,如电商APP中用户能够完成商品浏览、下单、支付等功能。非功能性需求包括性能、可靠性、安全性等方面,如APP的响应时间应在3秒内,系统的安全防护等级要达到行业标准等。不准确的需求描述可能会使项目团队误解工作内容,从而影响项目质量。 | ||
|
||
## 一致性标准 | ||
|
||
### 与项目战略一致性 | ||
|
||
项目范围书的内容应与组织的战略目标保持一致。如果组织的战略是拓展线上业务,那么相关的项目,如线上营销平台建设项目,其范围书所规定的工作内容、交付成果等都应围绕这个战略展开,包括建设具备市场竞争力的功能模块、支持大规模线上营销活动的系统性能等。 | ||
|
||
### 内部一致性 | ||
|
||
范围书内部各部分之间应保持一致。例如,交付成果的质量标准应与工作任务的要求相匹配,不能出现工作任务无法满足交付成果质量要求的情况。又如,项目进度安排应与资源分配和工作范围相协调,不能安排过少的资源在过短的时间内完成过多的工作。 | ||
|
||
## 可行性标准 | ||
|
||
### 技术可行性 | ||
|
||
项目范围书中规定的工作内容和交付成果在现有技术条件下是可以实现的。例如,在制定一个虚拟现实(VR)游戏开发项目范围书时,要考虑现有的图形处理技术、硬件设备支持等因素,不能提出超出当前技术能力的过高要求,如要求在不支持高级图形渲染的硬件平台上实现超逼真的3D场景。 | ||
|
||
### 资源可行性 | ||
|
||
考虑项目所需的人力、物力、财力等资源是否能够满足。如果项目范围要求在短时间内完成大量工作,而现有的人力资源无法承担,或者需要的特殊设备、材料无法及时获取,那么这个范围书就需要重新评估。例如,一个大型建筑项目需要特定型号的起重机,但市场上短时间内无法供应足够数量,这就影响了项目范围的可行性。 | ||
|
||
### 时间可行性 | ||
|
||
项目范围书规定的工作进度和交付时间是合理的。要考虑各项工作的先后顺序、依赖关系以及合理的工期估算。例如,软件开发项目中的测试工作必须在开发工作基本完成后才能进行,不能将测试阶段的开始时间安排在开发工作刚开始的时候。并且,每个阶段的时间估算要符合行业标准和项目实际情况,不能过于乐观或不切实际。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
# 工作流程 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
# 核实范围 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,27 +1,101 @@ | ||
var sd_labels_by_text = {}; | ||
// @ts-check | ||
|
||
// Extra JS capability for selected tabs to be synced | ||
// The selection is stored in local storage so that it persists across page loads. | ||
|
||
/** | ||
* @type {Record<string, HTMLElement[]>} | ||
*/ | ||
let sd_id_to_elements = {}; | ||
const storageKeyPrefix = "sphinx-design-tab-id-"; | ||
|
||
/** | ||
* Create a key for a tab element. | ||
* @param {HTMLElement} el - The tab element. | ||
* @returns {[string, string, string] | null} - The key. | ||
* | ||
*/ | ||
function create_key(el) { | ||
let syncId = el.getAttribute("data-sync-id"); | ||
let syncGroup = el.getAttribute("data-sync-group"); | ||
if (!syncId || !syncGroup) return null; | ||
return [syncGroup, syncId, syncGroup + "--" + syncId]; | ||
} | ||
|
||
/** | ||
* Initialize the tab selection. | ||
* | ||
*/ | ||
function ready() { | ||
const li = document.getElementsByClassName("sd-tab-label"); | ||
for (const label of li) { | ||
syncId = label.getAttribute("data-sync-id"); | ||
if (syncId) { | ||
label.onclick = onLabelClick; | ||
if (!sd_labels_by_text[syncId]) { | ||
sd_labels_by_text[syncId] = []; | ||
// Find all tabs with sync data | ||
|
||
/** @type {string[]} */ | ||
let groups = []; | ||
|
||
document.querySelectorAll(".sd-tab-label").forEach((label) => { | ||
if (label instanceof HTMLElement) { | ||
let data = create_key(label); | ||
if (data) { | ||
let [group, id, key] = data; | ||
|
||
// add click event listener | ||
// @ts-ignore | ||
label.onclick = onSDLabelClick; | ||
|
||
// store map of key to elements | ||
if (!sd_id_to_elements[key]) { | ||
sd_id_to_elements[key] = []; | ||
} | ||
sd_id_to_elements[key].push(label); | ||
|
||
if (groups.indexOf(group) === -1) { | ||
groups.push(group); | ||
// Check if a specific tab has been selected via URL parameter | ||
const tabParam = new URLSearchParams(window.location.search).get( | ||
group | ||
); | ||
if (tabParam) { | ||
console.log( | ||
"sphinx-design: Selecting tab id for group '" + | ||
group + | ||
"' from URL parameter: " + | ||
tabParam | ||
); | ||
window.sessionStorage.setItem(storageKeyPrefix + group, tabParam); | ||
} | ||
} | ||
|
||
// Check is a specific tab has been selected previously | ||
let previousId = window.sessionStorage.getItem( | ||
storageKeyPrefix + group | ||
); | ||
if (previousId === id) { | ||
// console.log( | ||
// "sphinx-design: Selecting tab from session storage: " + id | ||
// ); | ||
// @ts-ignore | ||
label.previousElementSibling.checked = true; | ||
} | ||
} | ||
sd_labels_by_text[syncId].push(label); | ||
} | ||
} | ||
}); | ||
} | ||
|
||
function onLabelClick() { | ||
// Activate other inputs with the same sync id. | ||
syncId = this.getAttribute("data-sync-id"); | ||
for (label of sd_labels_by_text[syncId]) { | ||
/** | ||
* Activate other tabs with the same sync id. | ||
* | ||
* @this {HTMLElement} - The element that was clicked. | ||
*/ | ||
function onSDLabelClick() { | ||
let data = create_key(this); | ||
if (!data) return; | ||
let [group, id, key] = data; | ||
for (const label of sd_id_to_elements[key]) { | ||
if (label === this) continue; | ||
// @ts-ignore | ||
label.previousElementSibling.checked = true; | ||
} | ||
window.localStorage.setItem("sphinx-design-last-tab", syncId); | ||
window.sessionStorage.setItem(storageKeyPrefix + group, id); | ||
} | ||
|
||
document.addEventListener("DOMContentLoaded", ready, false); |
2 changes: 1 addition & 1 deletion
2
....4045f2051d55cab465a707391d5b2007.min.css → _sphinx_design_static/sphinx-design.min.css
Large diffs are not rendered by default.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.