用户故事与用例:软件开发的双翼-程序员宅基地

技术标签: 用例图  用户故事  产品管理相关  

用户故事与用例:软件开发的双翼

引言

在敏捷软件开发中,理解用户需求是成功交付高质量产品的关键。本文将详细介绍两种收集和定义需求的流行技术:用户故事和用例。我们将探讨它们的理论基础、区别、联系,以及如何在实际工作中应用这些概念。
在这里插入图片描述
图注:团队成员在一起讨论的场景,传递了理解用户需求的重要性

1. 用户故事和用例简介

用户故事和用例是需求获取和记录过程中常用的两种形式,它们在软件开发中扮演着帮助团队理解客户需求的角色。

用户故事 是敏捷开发中常用的一种方式,用于捕捉产品的功能性需求。一个用户故事通常非常简洁,它从用户的角度描述了用户的一个需求,强调的是“为什么”这个需求对用户来说是有价值的。它通常遵循这样的格式:“作为一个[角色], 我想[目标], 以便[原因]。” 这种格式有助于确保团队聚焦于用户的需求以及这些需求背后的目的和价值,而不是一开始就深入到解决方案的具体实现上。用户故事强调与业务代表的合作,以便确保软件能够解决实际的业务问题。

用例 则是另一种形式,它更加详尽和具体。一个用例描述了系统如何响应外部交互以实现一个特定的目标,通常会包括主成功场景和可能的替代场景或异常流程。用例描述了谁(参与者)在什么条件下想要用系统做什么(目标),并详细说明了为了达到这个目标需要哪些步骤。用例主要关注“怎样做”,以确保考虑了用户与系统交互的所有环节,常用于传统的瀑布模型开发过程中。

具体两者的差异,列了一个表格,供读者参考:

特性 用户故事 用例
定义 简短的,非正式的,自然语言描述的功能需求。 详细的,正式的交互序列描述,包括参与者、系统和交互步骤。
格式 “作为[角色],我想[目标],以便[原因]。” “主成功场景”描述正常流程,可能还包括“扩展”和“例外”场景。
侧重点 描述用户的需求、目标以及达成这个目标的原因。 描述系统如何响应外部交互以实现一个特定的功能。
使用情景 适用于敏捷和迭代的开发环境。 适用于传统的瀑布模型和需要详尽说明系统交互的场景。
细节层次 通常较为高层和概要,细节在讨论中逐步揭露。 较为详细和具体,通常前期就定义清楚。
用户参与 强调与用户或业务代表的合作来确保理解需求价值。 可以由业务分析师独立完成,但也需要用户或利益相关者提供需求详细信息。
变更管理 灵活,易于修改和重新排列优先级。 变更可能需要更多的文档更新和重新审批流程。
目标 促进沟通,快速捕捉和理解用户的需求。 确保需求完整性,详尽描述功能实现过程和可能的异常场景。
演进 用户故事在开发过程中可能会分解为更多细节或转化为用例。 用例在开发前通常已经定义得非常详细,不太可能改变。
结果 产出是用户故事卡片和故事地图,便于追踪和讨论。 产出是用例文档和模型,如UML用例图,用于指导设计和测试。

总之,用户故事侧重于从用户角度描述问题,而用例侧重于描述问题的技术解决方案。用户故事适合用于迭代的开发过程,它们简单、灵活,便于调整和重新排序。用例则对于确保需求的完整性和系统的复杂交互非常有用。两者在软件开发中都是必不可少的工具,但根据项目的不同阶段和需求的复杂性,可能会选择偏重使用其中之一。

2. 用户故事的理论基础和构成要素

在这里插入图片描述
图注:用户故事示例,关注角色、功能和利益

2.1历史和理论背景

用户故事起源于敏捷软件开发领域,特别是极限编程(XP)实践。它们是在1990年代末由Kent Beck等人推广的,作为捕捉产品功能需求的一种方法,而且是以一种非技术的语言来描述,使得所有利益相关者都能容易理解。

用户故事的理论基础来自于认识到开发团队需要集中关注用户的需求和体验。传统的需求规格书往往是静态的、详细的和技术性的,这常常导致开发团队与用户的实际需求脱节。用户故事则通过简短、具有对话性质的语句,使得开发过程更加用户中心化,也促进了团队成员间的交流和协作。

2.2 “作为…我想要…以便…”模板的使用

用户故事通常遵循“作为 [角色],我想要 [功能],以便 [利益]”的模板。这个模板帮助团队集中关注用户的角色、需求以及这些需求背后的价值:

  • 作为 [角色] — 指定故事的主人公,通常是一个用户角色或系统角色。
  • 我想要 [功能] — 描述角色想要执行的活动或希望系统提供的功能。
  • 以便 [利益] — 阐明执行该功能所希望实现的结果或价值。

这种格式的优点在于它强调了需求背后的目的,而不仅仅是需求本身。这有助于团队理解为什么要开发某个功能,以及它对用户来说的真正价值。

2.3接受标准和冲刺计划中的角色

接受标准 是与用户故事相伴随的一组条件,它们定义了故事需要满足的具体要求以被视为完成。接受标准有助于开发团队和产品所有者确保功能的完成质量满足用户的期望。

冲刺计划中,用户故事通常作为开发任务的基础。在冲刺开始时,团队会从产品待办事项列表中选取用户故事,制定为本次冲刺的工作目标。每个故事都会通过团队协作来实现。

  • 产品所有者 负责确定用户故事的优先级,并确保它们反映了用户的需求。
  • 开发团队 负责实现用户故事,并确保它们符合接受标准。
  • Scrum Master(如果采用Scrum方法)帮助管理过程,确保团队能够有效地完成用户故事。

用户故事是敏捷开发中一个核心的元素,它们帮助团队保持关注用户的需求,并以此推动产品的持续改进和增值。

3. 用例的理论基础和构成要素

在这里插入图片描述
图注:用例图示例,关注参与者、交互过程和功能点

3.1UML用例图的介绍

UML(Unified Modeling Language)用例图是用来描述系统的功能和用户(参与者)如何与这些功能交互的一种图形化表示。它是UML的一部分,UML是一套广泛使用的软件工程建模语言。

在用例图中,用例是系统可以执行的一组相关行动或步骤,通常是为了提供一个或多个参与者的某些可观的结果。参与者是与系统交互的人或事物,可以是人、系统或设备。用例图中还可能包括以下元素:

  • 系统边界:定义了用例图所描述的系统的范围和上下文。
  • 关系:包括依赖关系、关联关系和泛化关系。

3.2主成功场景、扩展和异常流程的描述

在定义用例时,通常会描述以下流程:

  • 主成功场景(Basic Flow or Main Success Scenario):描述当一切按预期进行时,用例如何成功地完成目标。它是最理想的、没有错误或异常的流程。

  • 扩展(Extensions or Alternate Flows):这些是可以从主成功场景中分出来的额外流程,提供了达到同样目标的替代方法。扩展流程可能会在主流程的某个点起始,然后返回到主流程中,或者完成不同的成功或失败的结果。

  • 异常流程(Exception Flows):描述当出现问题或错误时系统应如何响应。它们是用例中处理失败的流程,例如输入错误、系统失败或其他问题。

3.3用例和系统边界的确定

确定用例和系统边界是定义系统范围的关键步骤。

  • 用例边界:它定义了一个用例的开始和结束,通常是用户开始和结束使用系统的一项功能。

  • 系统边界:它定义了系统所负责的功能区域,区分了系统负责和不负责的功能。系统边界通常在用例图中以一个框表示,用例在框内,参与者在框外。

确认用例和系统边界有助于团队更好地理解功能需求,避免功能蔓延,并确保系统设计的集中和高效。在软件开发过程中,这有助于确保所有相关的用例被识别并正确处理。

4. 用户故事与用例的关系

在软件开发中,用户故事用例是两种描述软件功能的方法,它们在定义需求和设计解决方案时相互补充。下面是它们之间的关系,以及它们如何在不同的开发阶段和项目规模中得到应用。

4.1用户故事与用例的关系

  1. 互补性

    • 用户故事:用户故事是敏捷开发中常用的一种技术,它从用户的角度描述用户希望软件做什么。用户故事通常很简洁,它着重于价值输出,而不是具体实现。用户故事通常遵循这样的模板:“作为[某类用户],我想要[某功能],以便[某价值]”。
    • 用例:用例则更详尽,它是一种结构化的方法,用来详细说明系统如何响应外部交互以实现特定目标。用例通常包括主成功场景、替代流程和异常流程。
  2. 转换

    • 用户故事可以看作是用例的“高层次摘要”。一个用户故事可能对应一个或多个用例,因为一个用户的需求可能需要多个步骤或者交互来实现。
    • 反过来,用例中的每一个步骤或交互都可以转化为一系列的用户故事,这有助于团队更好地理解每个功能的用户价值。

4.2在不同阶段和项目规模中的应用

  1. 项目早期阶段

    • 在项目的初期,用户故事非常有用,因为它们帮助团队快速抓住关键用户需求,并开始进行概念验证和原型设计。
    • 用户故事有助于促进团队之间的沟通,因为它们是用非技术语言表述的,可以让非技术团队成员(如产品所有者、商业分析师)更容易理解。
  2. 项目详细设计和开发阶段

    • 当项目进入更详细的设计和开发阶段时,用例提供了一种更详细的框架来指导系统的实现。
    • 用例可以帮助明确系统如何在各种不同的情况下响应用户操作,这对于定义测试计划和确保质量保证至关重要。
  3. 不同项目规模

    • 对于小型项目,可能只需用户故事来指导开发,因为过度的文档可能会导致不必要的开销。
    • 对于大型复杂项目,用例可能更为重要。它们能够提供足够的细节来管理复杂性,确保团队成员之间的一致理解,并指导测试和验证过程。
  4. 维护和迭代

    • 在产品维护和迭代阶段,用户故事有助于引导增量式的改进,特别是在敏捷或持续交付的环境中。
    • 用例则可以帮助维护团队理解系统的现有行为,并确保在更改时不会破坏现有的功能。

总而言之,用户故事和用例之间的转换不是一对一的,更多的是相互补充。用户故事提供了一个高层次的视角来捕捉用户的需求和目标,而用例则提供了实现这些需求的具体步骤和交互细节。它们在不同阶段和项目规模的应用表明,好的产品管理不仅需要关注用户需求的广度,也要关注实现这些需求的深度。

5. 实施过程概述

在软件产品管理中,从需求收集到产品发布的实施过程是一个复杂且动态的过程。它涉及多个阶段,其中每个阶段都需要不同程度的利益相关者参与,并伴随着持续的需求细化和优化。以下是一个概述,将帮助你理解这一过程:

5.1收集需求的步骤

  1. 确定利益相关者:首先,识别出所有潜在的利益相关者,包括最终用户、市场营销团队、销售团队、客户支持、开发团队以及任何其他可能受产品影响的人或团队。
  2. 需求搜集技术:使用不同的技术来搜集需求,如一对一访谈、问卷调查、焦点小组讨论、用户故事会议、竞争分析等。
  3. 记录和分类需求:将收集到的需求记录下来,并将其分类(如功能需求、非功能需求、业务需求等)。
  4. 需求验证:与利益相关者一起审查需求,确保理解一致,需求是可行的、必要的,并且支持业务目标。

5.2利益相关者的参与

  • 需求定义阶段:在最初的需求收集阶段,利益相关者应积极参与,提供他们的视角和需求。
  • 开发过程中:在产品开发过程中,定期与利益相关者沟通,以确保产品的方向与业务目标和用户需求保持一致。
  • 评审和反馈:在产品的各个阶段,从原型设计到测试版本,邀请利益相关者参与评审,收集他们的反馈并进行适当的调整。

5.3持续细化和优化的过程

  1. 优先级排序:根据业务目标、市场需求和技术可行性,对收集到的需求进行优先级排序。
  2. 迭代开发:采用敏捷开发方法,将产品开发分为多个迭代或冲刺。这允许团队逐步构建产品,同时在每个迭代末尾评估和调整方向。
  3. 用户测试和反馈:在开发周期中,定期进行用户测试,收集用户的反馈并据此优化产品。这包括使用A/B测试、用户访谈、beta测试等方法。
  4. 性能监控和优化:产品发布后,继续监控其性能指标,并根据用户行为数据和反馈进行持续优化。

实施这一过程,需要高度的组织协调能力、对市场和技术的深入理解,以及强大的沟通能力,以确保所有利益相关者的需求得到考虑,同时保持产品在快节奏的市场中的竞争力。

6. 用户故事的实施

在产品管理的世界里,“故事”不仅仅是儿时睡前的读物,而是构建成功产品的关键砖块。用户故事,以用户的需求为核心,指导我们开发的每一步。今天,让我们一起探索如何将这些故事从纸上的想法转变为实际可以开发的计划。

6.1创建故事地图

故事地图是将用户故事组织在一起的一种工具,它帮助团队理解产品的全貌。想象你是一位导演,而用户故事则是你手中的剧本。通过创建故事地图,你将这些剧本按照旅程的流程排列起来,从用户开始使用产品的那一刻,到他们完成目标的整个过程。

首先,识别出用户的主要活动或任务,然后按照用户完成任务的顺序将它们排列。接着,将这些活动或任务细分为更具体的步骤或故事,这样就构成了我们的故事地图。这个过程不仅有助于确保我们覆盖了用户体验的每一个方面,还帮助团队成员之间建立了共同的理解。
在这里插入图片描述
图注:故事地图示例,展示如何通过故事地图来安排优先级和迭代计划

6.2优先级评估和迭代计划

有了故事地图后,下一步就是决定哪些故事最重要。并不是所有的故事都是紧急的,有的甚至可能不是必须的。优先级评估就是要确定哪些故事对于达成产品目标最为关键。

一种常用的方法是使用“摩斯科法则”(Must have, Should have, Could have, Won’t have)来分类。这个过程需要团队成员的积极参与,讨论每个故事对于用户和业务的价值。

随着优先级的确定,我们就可以开始制定迭代计划了。迭代计划是敏捷开发的核心,它允许团队分步骤逐渐构建产品。每一次迭代都会选择一组优先级最高的故事进行开发,这样可以确保团队始终专注于最重要的功能。

6.3让故事“就绪”进行开发

但是,即使是优先级最高的故事,也需要通过“就绪”的审核,才能进入开发阶段。一个“就绪”的故事,意味着它已经被充分定义、讨论并且同意。通常,这包括:

  • 明确的接受标准: 这是衡量故事完成的具体标准。
  • 足够的细节: 团队成员需要清楚地了解故事的所有细节,这样才能进行开发。
  • 可行性分析: 确保故事在技术上是可实现的,并且资源充足。
  • 依赖关系解决: 确保该故事的实现不依赖于其他未完成的工作。

通过这个过程,我们确保每个故事不仅是对用户重要的,而且是准备好被团队开发的。这是一个持续的循环过程,随着项目的进展,我们不断地回顾、调整优先级,并且让新的故事“就绪”进行下一轮的开发。

在这个敏捷的时代,用户故事以及围绕它们的实践,是帮助我们以用户为中心,灵活适应变化,逐步构建出伟大产品的重要工具。让我们一起踏上这段旅程,将用户的需求和梦想转化为现实。

7. 用例的实施

在软件产品的世界里,用例(Use Cases)扮演着至关重要的角色。想象一下,你正坐在一家咖啡馆的窗边,从你的笔记本电脑上看着外面的世界,而你的任务是将一个含糊的想法转化为一个具体的产品功能。这正是用例能大放异彩的地方。

7.1用例模板和实例的开发

首先,让我们聊聊用例模板。这不仅仅是一个文档; 这是一个故事的蓝图,一个让软件开发团队进入用户头脑的传送门。用例模板是标准化的,可以包含如角色(actors)、场景(scenarios)、目标(goals)等元素,以及用例开始和结束的条件。开发这样的模板需要对产品和用户有深刻的理解。在模板准备就绪后,实例的开发就变得简单了,你只需要填充特定的详情,就像在画布上绘画一样,用色彩填满轮廓。

7.2用例与测试用例的关联

然后是将用例与测试用例进行关联的艺术。这是测试团队确保软件行为符合预期的方式。用例描述了“什么”,而测试用例则是关于“怎么做”。一旦开发团队建立了用例,测试团队就会进入,转化这些故事为一系列的步骤,以确保每一个功能都按照预期工作,没有任何遗漏。

7.3用例的审阅和验证

最后,让我们来谈谈用例的审阅和验证过程。这是一个协作的舞蹈,涉及到产品经理、设计师、开发人员和测试人员。每个人都要细致地审阅用例,确保它们不仅清晰无误,而且完全反映了用户的需求和商业目标。验证是这个过程中的关键,它保证了用例的有效性和准确性。

在所有这些步骤中,沟通、透明度和同理心是成功的关键。抓住每一个细节,确保每个声音都被听到,在故事中找到真正的宝藏,这样你的产品就能在用户手中发光发热。

将这种方法应用到你的产品管理实践中,你就会发现,一个好的用例就像一杯精心调制的咖啡,能激发团队的潜力,带领他们前往成功的彼岸。

8. 用户故事和用例在敏捷方法中的角色

在敏捷的世界里,用户故事和用例不仅仅是文本或工具,它们是沟通和协作的媒介。让我们来看看它们在Scrum和Kanban这样的敏捷方法中扮演的角色以及如何与产品负责人、开发团队和测试人员等关键角色相互作用。

8.1用户故事在敏捷中的应用

用户故事是一种高度简化的、非技术性的语言描述,用来表达用户的需求或愿望。在Scrum方法中,用户故事通常被记录在产品待办事项清单中,并且是持续演进的。它们是轻量级的,为的是促进对话。你可以把它们看作是邀请团队成员进行更深入讨论的入场券。

与Kanban相比,Scrum更强调时间框架和迭代。在这样的框架下,用户故事可以在每个冲刺期间被挑选出来,优先级排序,然后分配给开发团队。而在Kanban中,更加强调流动性和效率,用户故事会在它们准备好被开发时进入工作流程。

8.2用例在敏捷中的应用

用例提供了一个更详细的功能描述,通常涵盖了一个用户如何与系统交互来实现目标的完整场景。与用户故事相比,用例更加详尽和结构化,但在敏捷开发中通常被视为过于繁琐,因此并不总是首选。

尽管如此,在一些需要严格验证和文档记录的情况下(比如金融或医疗行业),用例可能会变得非常重要。它们可以帮助确保所有的业务规则和异常情况都已经被考虑和测试。

8.3用户故事和用例的关键角色

在Scrum团队中,产品负责人负责定义用户故事和用例。他们需要确保这些故事和用例都是有价值的、可交付的,并且对商业目标和用户需求具有相关性。产品负责人将这些故事介绍给团队,解释它们的价值,并帮助团队理解用户的需求。

开发团队是实现这些用户故事的人。他们需要了解每个故事背后的目标,以便设计和实现最佳的解决方案。在Scrum中,他们自我管理,决定如何分配工作并满足冲刺目标。在Kanban中,他们更加专注于保持流动性,减少瓶颈,快速交付。

测试人员在敏捷团队中扮演的角色同样重要。他们确保用户故事的验收标准被满足,从而保证了产品的质量。在敏捷方法中,测试是一个持续的过程,从需求开始,贯穿于整个生命周期。

总结一下,用户故事和用例是敏捷方法中不可或缺的元素,它们促进了团队内部和团队与利益相关者之间的沟通和理解。通过这种持续的交流和迭代,敏捷团队能够快速应对变化,持续交付价值。

9. 最佳实践和常见陷阱

在软件产品管理的世界里,故事总是丰富多彩,挑战与机遇并存。作为行业内部人士,我们都知道,把握最佳实践的同时,规避常见陷阱,对于确保项目顺利进行至关重要。下面,就让我们一起探讨如何保证用户故事和用例的质量,避免过度复杂和需求膨胀,以及持续反馈和改进的重要性。

9.1确保用户故事和用例质量的策略

用户故事和用例是连接用户需求与技术实现的桥梁,它们的质量直接影响着产品的成功。那么,如何保证这两者的质量呢?

  1. 明确和具体:确保每个用户故事和用例都是具体且明确的,避免任何模糊的描述。每一个故事和用例都应该清楚地表达用户的需求和预期结果。

  2. 持续沟通:与团队和用户保持定期沟通,确保在创作用户故事和用例时,所有人都对需求有一个共同的理解。

  3. 用户参与:让用户参与到用户故事和用例的创作过程中来,这样可以确保故事和用例真实反映用户的需求。

9.2避免过度复杂和需求膨胀的技巧

在软件开发中,过度复杂和需求膨胀是两个常见的问题,它们往往会导致项目延期和预算溢出。那么,如何避免这两个问题呢?

  1. 优先级排序:为需求和特性设定优先级,专注于那些对用户最有价值的功能。这样可以避免在不那么重要的功能上浪费时间和资源。

  2. 迭代开发:采用敏捷开发方法,分阶段逐步推进项目。每个迭代阶段都集中实现一小部分功能,这样可以及时发现并修正方向上的偏差。

  3. 限制范围:明确项目和迭代的范围,避免“范围蔓延”。对于新增的需求,应该评估其优先级,并决定是否纳入当前或未来的迭代中。

9.3持续反馈和改进的重要性

在软件产品管理过程中,持续地获取反馈并根据反馈进行改进是非常重要的。

  1. 定期回顾:定期组织团队回顾会议,讨论项目进展、遇到的问题以及成功案例。这有助于识别改进的机会。

  2. 用户反馈:持续收集用户反馈,无论是通过用户访谈、问卷调查还是数据分析,了解用户的使用体验和需要。

  3. 适应变化:市场和技术的变化总是在发生,持续的反馈和改进机制可以帮助你的产品适应这些变化,保持竞争力。

通过采用这些策略和技巧,我们不仅可以提高用户故事和用例的质量,避免过度复杂和需求膨胀,还可以通过持续的反馈和改进,确保产品始终满足用户的需求。

10. 结论

确实,用户故事和用例在软件开发过程中扮演着不可或缺的角色。它们不仅是沟通用户需求的桥梁,而且还是指导团队开发与设计解决方案的重要工具。让我们来总结一下它们的重要性,以及它们如何帮助团队更好地理解用户需求,再探讨一下未来的趋势和预测。

10.1总结用户故事和用例的重要性

用户故事和用例提供了一种结构化的方式来捕捉和解释用户需求。用户故事以用户的视角来描述需求,强调了用户的目标和为什么这个目标对用户来说很重要。用例则进一步详细地描述了实现这些需求的具体步骤和过程。这种方法有几个显著的优点:

  • 增强了用户参与度:用户故事和用例的编写过程通常要求与最终用户直接沟通,这有助于确保产品开发的方向与用户的实际需求相一致。
  • 提高了沟通效率:使用用户故事和用例可以帮助团队成员之间,特别是非技术人员和技术人员之间,建立更有效的沟通机制。
  • 促进了敏捷开发:敏捷开发依赖于快速迭代和频繁反馈,用户故事和用例允许团队以用户为中心,快速适应用户需求的变化。
  • 确保了需求的完整性和可追溯性:通过明确记录用户的需求和期望,用户故事和用例帮助团队追踪需求在开发周期中的实现情况。

10.2它们如何帮助团队更好地理解用户需求

  • 通过具体案例进行体验设计:用户故事和用例将抽象的需求转化为具体的场景,使设计和开发团队能够更准确地理解用户的体验和感受。
  • 促进多学科团队合作:它们为不同背景的团队成员提供了一个共同的理解基础,有助于促进跨职能团队间的协作和创新。
  • 优化产品功能:通过分析用户故事和用例,团队可以识别并优先处理最关键的用户需求,确保产品功能最大程度地满足用户期望。

10.3未来趋势和预测

  • 更加个性化的用户故事:随着数据分析和机器学习技术的发展,未来的用户故事和用例可能会更加个性化和动态,能够根据用户行为和偏好的变化实时调整。
  • 用户故事与AI的结合:AI技术的进步将使得从大量用户反馈中提取和生成用户故事和用例变得更加高效,帮助团队更快速地识别用户需求的变化。
  • 增强的可视化工具:随着可视化技术的进步,未来可能会有更多工具出现,使得用户故事和用例的表示更加直观和生动,进一步提升沟通的效率和效果。

总的来说,用户故事和用例作为理解和沟通用户需求的工具,它们的重要性随着时间的推移将会不断增加。随着技术的发展,我们预计会看到这些工具变得更加智能化、个性化和可视化,从而帮助团队更有效地开发满足用户需求的产品和服务。

结束语

用户故事和用例是软件产品经理的核心工具,它们帮助团队以用户为中心,确保需求被正确理解和实施。本文提供了对这两种技术的全面理解,可以帮助您在日常工作中更有效地使用它们。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fanjianglin/article/details/137224522

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签