一般来说,是让所有功能部件先使UI工作-还是两者兼而有之更好?


47

一般来说,是让所有功能部件先使UI工作-还是两者兼而有之更好?

假设您正在做的事情比较大,通常是在所有UI之前使所有功能数据收集Blob工作,或者一次使所有UI一起工作,还是在中间进行工作,这是公认的惯例吗?

我们都知道将工作分解为可管理的部分,但问题是最终我是否应该将UI包含在可管理的部分中。

对于该示例,请考虑一个GUI应用程序,该应用程序具有一个根窗口,但在各个扩展坞中有12个以上的选项卡用于分隔不同的数据组件。从功能单元的角度来看,每个单独的选项卡后面都有一组相对复杂的运动部件。

此特定问题的示例应用程序在此处带有随附的博客原始商业产品

Answers:


85

在许多业务用户和客户中都有一个普遍的概念,即当看起来完整时,它几乎是完整的。您可能知道,这与事实相去甚远。一个可以使它看起来不错,但是没有后端,并且一些用户认为使它看起来不错是工作的80%,而不是20%(或其他80%)。

无数的开发人员可以讲述这个恐怖的故事-使用其他工具的屏幕快照在Microsoft Word中完成页面的模型制作,并且客户说“那么,您已经完成了吗?”

您需要调整进度,以便完成所有部分。尝试先做所有后端,然后再做所有前端,将导致最终用户认为您什么都没做,并问为什么在没有东西可显示时您会得到报酬。另一方面,首先是前端,您将发现最终用户进行细微的更改并消耗了我们所有的时间。

“一个第一,另一个”的最坏情况是,当您到达另一部分时,您发现它根本不适合设计。

因此,建立两者。在前端显示进度,使后端与您所构建的对象一起工作。在很多情况下,交付增量构建并确保您满足客户的需求是一个好主意(这涉及敏捷)。展望过长用了“看得见的进展”会损害客户关系(这是双方的“万象做到早”和“没有什么是直到最后一刻完成”的情况下-它很难为客户端看到正在写的框架或单元测试或数据清理作为进度)。

乔尔在《冰山的秘密》(The Iceberg Secret,Revealed)中写道:

重要推论二。如果您向非程序员展示具有100%漂亮用户界面的屏幕,他们会认为该程序即将完成。

不是程序员的人只是看着屏幕,看到一些像素。而且,如果像素看起来像他们组成的程序能够执行某项操作,他们就会认为“哦,天哪,要使其真正发挥作用,会有多少困难?”

这里最大的风险是,如果您首先模拟用户界面,大概是为了与客户进行一些对话,那么每个人都会以为您已经完成了。然后,当您度过第二年的工作时间时,可以这么说,没人会真正看到您在做什么,他们会认为这没什么。

在博客文章“ 不要让演示看起来完成”中再次重申了这一点,它具有以下有用的图形:

效果如何

请注意,这里的两个选项通常反映“完成ui”(然后期望您很快就可以完成)和“完成后端”(然后客户担心您错过了最后期限)。

事物看起来“完成”的方式应该与事物“完成”的方式匹配。

每个软件开发人员在其职业生涯中都经历过多次。但是台式机发布工具也给技术作家带来同样的麻烦-如果您向某人展示具有完美字体和格式的草稿,他们会认为完成起来比您想要的要多。我们需要在我们所处的位置和其他人所认为的我们之间的匹配。

本文还提出了关于用户界面的不同完成级别所获得的反馈类型的重点。如果您看似完整的内容,则比“此布局无效-选项卡太多”,您更有可能收到有关“可以更改字体”的反馈。


对于那些在Java Swing世界中与之抗争的人来说,有一种名为Napkin外观和感觉,它可以使UI看起来不完整(即使是完整的)。

这里的关键是使它看起来不完整。完整的UI可以向许多业务用户发出信号,表明该应用程序已经完成(即使它只有几个静态页面,也没有背后的任何逻辑或内置于界面生成器中)。


进一步阅读(和文章链接):


7
听起来您正在提议某种敏捷方法 ... :)
亚历山大

7
在这种情况下,@ Alexander Agile会有所帮助,但这不是必需的。瀑布可能具有(可交付的)里程碑,而看到“它看起来完成了,为什么还要再花3个同样长的里程石呢?”,客户可能会非常失望。FWIW,由于技术设计(瀑布店)中的屏幕截图和ms油漆看起来不错,因此我曾经有业务用户认为它已经完成了。

3
如果您没有看到该视频的专家解答,则为:youtu.be/B7MIJP90biM
ragol 2014年

3
我一直在为我的编程职业生涯的大部分时间设计UI,而并不是让客户认为UI原型意味着该软件“差不多完成了”。在我看来,如果客户不知所措地认为项目即将完成,那么线框UI的演示者就无法很好地解释线框。
格雷厄姆

2
餐巾L&F +1。那肯定是我的未来。:)
凯西2014年

27

这取决于:您需要围绕最重要的功能进行紧密的反馈循环

如果您所做的工作的核心部分(风险和令人恐惧的部分)是某个内部引擎,则可以使核心部分(例如控制台)或通过单元测试工作。例如,协议解析器不需要UI即可知道其是否正常运行。

如果您的精彩事物涉及任何交互性(交互性,您需要不断地进行故障排除,丢弃和重新发现),那么UI优先方法至关重要。例如,我想构建一个应用程序以使人们与数据可视化进行交互。我需要弄清楚的最重要的事情是可视化是否有意义,因此在解决一个问题之前,我可能会放弃六种方法。在编写单个单元测试之前,我将先完成所有操作。

在这两者之间有一个模糊的灰色区域,您可以在其中决定如何最佳交互和验证代码的最佳组合(自动测试,实验UI)。我个人已经做到了极端,也做到了介于两者之间的一切,并且确定合适的位置是我必须决定的最困难的事情之一,并且100%取决于我要构建的事物的类型。


2
即预先识别并解决最危险和最关键的组件,以减少超支和/或故障的机会。那些组件是UI,业务逻辑等,还是所有组件的某种组合。
亚历山大

1
听起来确实像是您在跟我讲原型,因为如果您仍在放弃设计,那么这就是您应该迭代的内容-而不是实际的代码。
Aaronaught

8

在敏捷环境中,您可能会听到有关“行走骨骼”或“薄​​垂直切片”的讨论。这样做的想法是,由于对用户而言重要的是有效的软件,因此您需要以一种有效的方式逐步构建软件。

在您提到的示例应用程序中,您将从窗口甚至一个选项卡开始,并使它们以某种方式从头到尾地工作。然后,随着时间的流逝,您将逐个添加功能,并因此逐个添加选项卡,从而使每个功能在构建时都可以使用。这是频繁的客户演示给您带来的一部分:一个展示新作品并立即获得反馈的机会。

简而言之,是的,如果您有UI,则UI工作绝对是功能工作单元的一部分。

从可行的小程序开始,然后迭代其功能以交付完整的软件。


+1始终拥有一件可运送的物品是必不可少的。
JensG 2014年

@詹斯:“总要有一件可运送的东西是必不可少的”,这是一副鸭蛋。这种说法充其量仅适用于少数软件应用程序。在现实世界中,仅完成一部分所需工作的应用程序丝毫没有用处。
Dunk 2014年

那就是你的经验。我有不同的。包含大量里程碑和实际客户的大型,真实世界的项目。
JensG 2014年

1
@Dunk:不执行任何工作的应用程序比执行不执行工作的应用程序有用。但是,我并不是在谈论“完成”的应用程序;我说的是应该构建一个应用程序的顺序。我的经验与JensG是一致的:始终能够根据您当周的演示削减beta,并将其立即交付给客户,这会使客户更加满意。
Keith B

这是我唯一可以识别的答案。其他人甚至没有考虑好的产品开发不会完全分解为“ UI”和“后端”的可能性。这是一个只有新手程序员或项目经理才会提出的问题,而不是一个经验丰富的程序员或项目经理应该以表面价值回答的问题。询问哪个应该是瀑布的“第一臭”的想法。
Aaronaught 2014年

3

我建议混合使用功能和UI(并尽快获得反馈或测试经验)。

顺便说一句,这不是大多数大型GUI软件的开发方式吗?以Firefox浏览器为例:从一个版本到另一个版本,功能和用户界面都得到了发展。


2

在我正在使用的大型(基于PHP Web的)应用程序中,我尝试首先获取适当的类和方法,这些类和方法返回伪值。这是为了建立其他开发人员可以用来实现UI的伪合同。

该方法的第二个优点是,即使在编写和交付所有代码之前,我们也可以随着UI需求的变化(并且总是变化)而磨练合同/界面。


这是我正在尝试做的事情。由于我的特定项目是作为大型UI外壳实现的,并且每个数据点收集器都是一个插件,因此每个插件都负责管理自己的UI组件。这样,对于给定的人/一群人,不需要“合同”。假设同一组人员将开始完成给定的插件。这是我按照自己的方式进行设计的部分原因。另外,对于其他项目,这是一个很好的建议。因此,请远离我,因为这对其他人将是有用的。
RobotHumans 2014年

2

我倾向于做的是从一个糟糕的UI开始:只是将变量数据转储到屏幕上。很长一段时间没有字体,没有对齐,实际上没有图形。只是“欢迎用户x”和称为“加载图片”的按钮等。这样做的好处是,您将发现后端中的某些内容是否损坏。

随着开发的进行,您可能会发现需要做的事情更多或更少。但是在某个阶段,您将确定后端即将完成。现在,您拥有一个包含所有所需附件的UI,并且您可以花费大量时间来做所有图形化工作。

但是要当心,这不是万无一失的。您需要先见之明才能看到某些问题。例如,您可能需要研究UI组件才能以明智的方式显示数据。


客户在您的方法论中扮演什么角色?请记住,通常您的客户对他们想要的东西只有一个非常笼统的想法。由您自己决定如何准确地“画出”他们想要的东西,以便您进行构建。您的方法论只是建立了您认为客户想要的东西,但这很少是客户实际想要的东西。因此,您浪费了很多时间来编码客户不想要的东西。
Dunk 2014年

啊,我的“客户”就坐在我旁边,我在该领域有一定的背景,可以让我对所需的东西有个很好的了解。基本上,就UI而言,我们总是接近最终产品,而我总是可以得到反馈。我没有考虑过长反馈回路的问题。我想拥有领域知识是关键。
卡洛斯

0

如果您使用了良好的里程碑和问题跟踪系统,则可以避免其中的一些问题,因为管理人员一眼就能看到您的工作效率。他们将看到您80%完成了后端操作,并且UI是下一个里程碑。他们将能够看到您针对特定功能里程碑完成了一组UI和后端任务。但这一切都始于项目的需求,Doug T的回答提出了有关系统设计方面的一些优点。


0

从用户/客户的角度考虑。软件系统是为这些用户/客户提供一些价值的功能的集合。当然,每个功能都具有和UI,后端以及其他一些功能。

始终按功能构建您的系统,然后尝试划分很小的功能。这样一来,您总是可以将更多东西交付给您的客户,请记住,软件开发不是建立1.0版,而是要建立1.0.1到1.0.2版,依此类推...


0

这取决于。您的要求定义得如何?UI面对多少系统?

根据我的经验,大多数客户直到看到前方的东西时才知道他们想要什么。因此,我通常会提供一些关键的UI方面的框架,或者提供大部分的UI(无效)。由于数据库设计和代码结构仍仅处于设计阶段,因此客户可以改变其主意,而不会受到太大影响,因为修改设计很容易。在项目中较早地更改设计,然后再进行更改,数量级更容易/更快。

敏捷声明您还应该首先处理最困难的项目和最重要的项目。快速失败。因此,一旦客户看到了UI,我便会专注于构建功能全面的小型组件,这些组件最重要且最难实现是首先实现,因此您会尽快知道是否遇到任何障碍。

然后,您便拥有了冲刺,并与客户在开发UI和功能方面的同时保持了持续的沟通。

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.