在开始编码之前,软件产品应定义得如何?


13

我想知道人们在开始实际编写代码之前通常对软件产品的定义有多好,以及它对他们的效果如何?我指的是定义用例,分析风险,绘制类图等。

我知道,对最终产品将在将来能够避免的风险有足够的了解是一个好主意,但是,也不能将产品定义得太好以致于难以适应,这一点也很重要。更改。

其他更具体的问题可能是:

  1. 通常在开发之前的计划阶段花费项目时间的百分之几?

  2. 在开始编写代码之前,您是否想满足某些可衡量的标准?或者仅仅是胆量?

  3. 您是在开始编写代码之前就绘制了所有类的图,还是主要是希望从一开始就创建一个动态设计,以期望事情会发生变化?

您愿意分享的任何经验都将非常棒!

Answers:


10

字面回答“定义得如何?” 是

定义明确,足以开始使用。

定义明确,足以确定初始工作范围(针对初始概念)。这足以帮助确定不可避免地发生的更改。

定义明确,足以优先考虑冲刺。

我指的是定义用例,

总是有帮助的。但不是全部。您首先要确定优先级并涵盖重要的用例。其他用例将在以后的版本中介绍。有些用例的优先级很低,它们将永远无法完成。

分析风险,

通常浪费时间。

绘制类图等

如果有帮助。

通常在开发之前的计划阶段花费项目时间的百分之几?

它变化很大。购买一本好书,例如Software Engineering Economics,以获得“权威”数字。

在开始编写代码之前,您是否想满足某些可衡量的标准?或者仅仅是胆量?

“可衡量的”。这几乎是不可能定义的。

“胆量”。错误的政策。

问题是“您了解自己在做什么吗?”

这不是直觉。这是一个是/否问题。

这不是“可测量的”,因为它只是一个是/否问题。

而且,您还必须确定优先级。你什么都不做。刚好足以应付前几个冲刺。

您是在开始编写代码之前就绘制了所有类的图,还是主要是希望从一开始就创建一个动态设计,以期望事情会发生变化?

您无法事先了解所有内容。

不要尝试


我个人觉得花太多时间编写类图是浪费时间,因为启动后无论如何模型和代码都会改变。
AndersK 2011年

我同意您无法事先了解所有内容,但是一份好的设计文档至少可以帮助您在发生作用域和特征蠕变时对其进行识别。
蒂姆·波斯特

@Tim Post:好建议。这是定义问题中“定义得如何”的一种方法。它将“帮助您确定范围和特征蠕变”。不多了吧?
S.Lott

@Tim Post:“确定范围”具有误导性。这意味着在项目开始时就可以使用一些明确的“范围”知识,这是不正确的。范围将在项目的整个生命周期中随着业务需求的变化而变化,因为没有静态的市场。
Rein Henrichs

@Rein Henrichs:我略微调整了答案,以体现您的观点。足够的范围定义可以入门。我很想添加“并且不再添加”。
S.Lott

2

如果您的客户以项目团队成员的身份积极加入该项目,那么开发人员可以向他们提出问题并快速做出有关功能的决策。然后,该规范可能不太详细。

如果您的客户距离很远并且长时间无法获得反馈,那么您的规格应该非常详细。

在我们公司,我们创建用户故事,并与该项目的开发人员一起玩Planning Poker。这可以使我们清楚地了解花费在用户故事上的时间。


“客户代表”(您为客户建议的角色)是整个团队中最重要的角色。如果您的团队无法获得有关产品和业务问题的答案,那么他们应该如何做出正确的决定?
Rein Henrichs

很好,谢谢!我没有考虑过客户的参与如何能够如此大地改变对于给定项目最有效的方法。绝对是我应该记住的事情。另外,我从未听说过“ Planning Poker”,那看起来真的很有价值。
drewag

2

该项目需要达到的定义足够好,足以让您入门并知道接下来两周的发展方向。

作为Scrum Master,我只想简单地说,您需要在Excel工作表或其他任何地方定义产品的主要功能,而只是为了跟踪您的功能。使它们成为用户故事可以帮助您思考下一步需要什么功能。然后,对它们进行优先级排序:最重要或命令式功能放在顶部,最不重要的位置放在底部。

列出一些最重要的功能后,请选择您认为可以开发的功能,在两周或一个月的时间后,如果愿意,可以将其设置为“完成”状态。然后,展开这些选定的功能,以便您可以开始进行一些编码。

在编码时,您一定会想到需要开发其他元素才能使所选功能进入“完成”状态。完成意味着您无事可做,也就是说,测试,编码,组装,说明文件都完成了!

只要您达到目标,即可以在给定时间内开发您想要的所有功能,您选择的功能列表随时可能会扩展。

简而言之,没有什么是完美的。提出一些想法,与您的同志分享,看看所写的内容是否符合要求的产品要求。如果是这样,那么您就来了!为了清楚起见,我将使用一个简单的客户管理产品。需要什么?

As a user, I may manage the Customers;
As a system, I persist changes to the underlying data store;
As a user, I need to enter my credentials to be able to manage customers;
As a system, I have to authenticate the user against the Active Directory;

您的初稿就这么简单!然后,我们可以看到安全性是我们系统中的重要部分,是否足以使最终优先级(Y / N)足够重要?这将取决于您必须满足的要求。假设客户管理是这里最关键的事情。因此,在下一个Sprint中,我们需要能够以一种基本但可以接受的方式来管理客户。什么是客户管理?

As a user, I may manage Customers;
    -> As a user, I add a customer to the system;
    -> As a user, I change a customer details;
    -> As a user, I delete a customer;
    -> As a system, I flag a deleted customer as being inactive instead of deleting it;
    -> As a user, I need to list the customers;
    -> As a user, I search the customers data bank for a given customer;
    -> ...

这已经说明了足以开始开发应用程序的功能。如果您的程序员需要进一步的说明,那么也许一个熟悉类图的开发人员可以设计Customer类及其属性和方法!但是就我而言,我写的这几本书,足以让我开始。在此过程中可能会添加或更改某些功能。重要的是要专注于您所说的将要完成的内容。在我们的示例中,这是客户管理事务。到目前为止,我们不需要关心用户身份验证。这将在下一个Sprint中介绍。

我希望这有帮助!=)


非常感谢!很高兴在这样的特定情况下看到这一点。我觉得这是一个很好的框架,可以使您对整体产品的定义至少具有某种程度的可衡量性,但要强调子目标和面向功能的方法。当我将来开始新项目时,这种方法绝对很重要!
drewag

别客气!我很高兴我的盐可以帮助您!=)重要的是,不要定义太多的深度功能,因为产品要求可能会随之变化,因为客户在看到到目前为止所完成的工作时,可能会对您的工作有其他想法或更改做完了 您将需要相应地调整产品,使其符合新要求。因此,如果您在项目开始时立即建立了整个项目,请想象这可能会导致工作丢失!也许您会花几个小时只是为了扔掉它并从头开始重新工作。让它进化=)
Will Marcouiller

1

好吧,最适合我的是指定了“相当好”的功能,而软件体系结构只是非常宽松地指定。

为了让我开始工作,我需要知道我正在努力。当我仅了解客户的需求时,它对我不起作用。即使编写自己使用的工具,我也会绘制屏幕,​​描述功能,每个按钮的功能以及所有功能。否则我发现我无法开始。

另一方面,我已经放弃了真正绘制出我将如何开发代码的确切方式。也许这是最糟糕的做法,但这对我有用。我可能会定义一组将创建的数据库表,但不会定义每个表中的列。我可能会考虑需要什么对象和类,但是我绝对不会绘制图表。

天哪,有时候我什至不知道怎么做才对,直到我做错了。现在,我知道该怎么做,将其构建一次,拆下然后再做一次。此时,我可以绘制一个非常详细的路线图并重新启动。


感谢您分享您的体验。似乎已经达成共识,即重要的是,作为开发人员的您要足够舒适,可以开始使用。当然,如果您再次进行更改,您会发现可能会更改的内容,否则您将花费​​太多时间进行计划。我知道想要在产品完成后立即进行完全重写的感觉,这就是我要避免的某种事情;)(至少在合理的程度上)。
drewag

1

您使用什么语言和方法?

诸如Java和C ++之类的某些语言比诸如Common Lisp或Python之类的语言需要更多的初始结构(C ++比Java多,因为在Java中重构更容易)。Leo Brodie(我认为在“ Thinking Forth”中)就何时开始编码给出了两条建议:比您对使用Forth感到自在的时间要早​​,比对其他语言的使用要晚。

瀑布方法论(特别是在早期设计可交付使用时)将比敏捷性需要更多的前期工作(尽管您也不想忽略敏捷性方法的早期计划)。拥有一套良好的自动化测试可以使您更安全地进行较大的更改,因此可以减少前期工作。

而且,这取决于个人及其对要创建的软件类型的熟悉程度。有时候,当主要使用CRUD应用程序时,我可以编写一个完整的程序,其中包含一些规格和一张3“ x5”的空白便条纸。我不能像现在这样写东西。


感谢您的观点。我没有考虑语言和平台如何影响项目管理的最佳实践。我碰巧主要是在谈论Objective-C,UIKit和AppKit。但是我也使用其他多种语言(C,C ++,C#,Java,Python等)工作。这意味着我应该谨慎,不要以为某种方法对所有项目都是最好的,我应该根据目标平台和语言来调整我的方法(如果可以选择的话,也可以根据此选择一种语言)。
drewag

1

这里有两个有用的术语:MVP(最小可行产品)和MMF(最小可销售功能)。MMF是可带来业务价值的功能的最小版本。MVP是作为产品可行的最少的MMF。启动项目时,最好的办法是识别MMF和MVP并从那里开始。

尽快发布您的产品,然后继续逐步改进它。


这是一些非常好的术语,谢谢!到目前为止,这是提出可衡量的最佳方法。当然,它不是完美的,但是似乎很容易确定某个功能是否适销对路和/或是否为产品增加了价值。
drewag
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.