编者按:开发项目初衷很好,功能需求很明确。但是为什么在实际的开发过程中,你的软件项目总是需要改动和调整呢?到头来,功能越来越多……要知道,那些看似理所当然的功能列表,真正去做之后,你会发现事情并没有那么简单。本文整理自Medium上一篇原名为《Your app is an onion: Why software projects spiral out of control》的文章。一开始,你的想法很美好。您将聘请一名开发人员来实施您的创业理念。但几乎每周,项目似乎都需要调整。各种功能开始涌入,范围越来越广。就好像这个项目被赋予了生命,它正试图毁掉你的生活。这一切是怎么发生的?您是否雇用了不可靠的开发人员?还是你没有把项目管理好?或者这个想法从头到尾都是糟糕的?一切皆有可能。但是有一个主要的误解常常从一开始就注定了项目的失败。我们假设我们的项目是由我们写在纸上的特征组合定义的。偶尔会添加一些功能,偶尔会减去一些功能。但是你仍然可以一眼看出项目的范围。然而,这个假设是错误的。您的项目不存在于二维空间中,它不是一张纸。它有自己的深度。软件的每一个功能都可以层层剥离。事实上,如果我倾向于成为头条新闻,我会直截了当地说你的应用是洋葱。让我解释一下这实际上意味着什么。我将告诉您为什么在您逐层剥离自己的应用程序时它会让您热泪盈眶。一个终结所有图书馆的图书馆下面我们讲一些具体的例子。给我一个想法。人们平时想看的书,附近的图书馆没有。但其他地区的人可能有。因此,该应用程序允许人们发送图书请求,而拥有图书的人会做出回应。对于每笔交易,我们都会收取佣金。卓见!我知道,不是吗?功能列表非常简洁:是时候将规格发送给开发人员并开始为公司考虑一个很酷的名字了。卡布基?lib.rari.ly?还是reddit?嗯?别紧张。让我们多想想。更何况现在已经有一个叫reddit的软件了。让我们通过以下问题仔细研究您的想法,看看结果如何。用户如何交易?他们是在见面、送货时付款还是通过应用程序付款?好吧,他们应该在应用程序上使用信用卡付款,这样我们就可以抽成。他们如何发送图书请求?我的意思是,他们在应用程序上到底做了什么?用标题和作者信息填写一个打开的表格?哦...他们应该在应用程序上在互联网上搜索书籍并选择您感兴趣的书籍。好的,所以我们需要创建一个图书数据库。我觉得应该是。那么实际上,图书需求到底是什么?图书销售商能否看到所有的图书需求清单?或者我们是否需要向Uber或Thumbtack等书商发送通知?是的,我们需要向拥有这本书的人发送需求通知。那么,图书销售商需要在软件中填写自己要销售的书目信息吗?嗯,是。那么如何完成图书的交接呢?是用户交接,还是我们帮忙解决发货问题?我们负责送货。然后你需要一个系统来告诉你需要取哪些书以及将它们送到哪里。我想你的司机会想知道最短的路线,对吧?好吧,那不是要走的路。这个怎么样?让用户互相邮寄书籍。那么,我们就这样将收货人的地址信息告知托运人了吗?那我们如何解决运费问题呢?事实上,你知道的。这些用户都需要靠近。如果他们可以来取货并结识新朋友,那不是很好吗?所以,我们需要匹配彼此接近的用户。那么他们是如何找到彼此的呢?该应用程序是否还需要嵌入实时地图以便他们安排会面?好吧,那行得通。去做就对了。我们需要设定书的价格吗?还是买卖双方同意?让他们同意并定价。他们怎么知道?我们要在应用程序中嵌入聊天功能吗?他们可以打电话和连接。好的,那我们是不是要发短信确认号码的有效性?如果……嗯,你应该明白我的意思。我们可以这样没完没了地聊下去。不,不要再谈这个问题了。那么让我们看看现在的功能列表是什么样子的。每行列出的内容可以多次扩展。我们只是剥掉洋葱的皮,结果就是这样。现在,你不要哭。这到底是怎么回事?我们将找出不会导致函数崩溃的原因。这不是我们常说的特征蠕变。功能蔓延是指不断向产品添加新功能。如果您查看我们的最终功能列表,您会发现每一个功能都符合最初的想法。这与任何技术考虑无关。比如,什么是最合适的聊天系统架构?最容易集成的支付平台是什么?我们不会在这里详述这个问题。好的开发人员会告诉你各种技术方案。但是他无法帮助您决定软件需要什么功能。它也与任何市场考虑无关。人们需要这样的产品吗?在用户数量很少的情况下,如何吸引尝鲜者注册?用户愿意为这项服务付费吗?这类问题必然与创意的验证、产品市场组合的确定以及定价策略密切相关。同样,这些问题非常重要。然而,这并不是功能列表激增的原因。这与全球变暖或牙仙子无关。你要告诉我为什么一个东西会变成洋葱吗?或者你要告诉我每一个非原因项目?你很闷。这就是它实际工作的方式。我们从根本上误解了复杂性的运作方式。我们本来以为每个功能的复杂度都像我们一开始描述的那样。哎,也许程序员写代码要辛苦,但是用几句商业术语,就可以轻松描述产品的功能了。例如,“用户使用Y来做X”。不是吗?但这种观点是错误的。软件功能更像是分形,你看得越近,它们揭示的细节就越多。洋葱是分形的吗?不,我只是换了比喻。继续。关于功能,我们最初是基于一个大蓝图来描述的。但是当开发人员在开发应用程序时,或者当用户或您在使用应用程序时,它实际上是在较小的范围内进行的。它是在软件中逐步完成的。每走一步,你都会遇到一些问题。为了解决这些问题,需要重新规划这一步,增加一个新的步骤或者增加一个新的功能。这就像规划一条从家到办公室的路线。看地图,这段旅程似乎是一条连接两点的直线。但是当你把这条路线小一点看的时候,你会发现你原先规划的直线并不符合城市路网。您会遇到交通站点、高地或道路堵塞。根据您是步行、骑自行车还是开车,您可能需要规划不同的路线。开发软件是类似的。您看得越近,就越能详细了解您的解决方案。太棒了,一路上有各种各样的细节,这就是我需要考虑的全部。这是否意味着我的产品永远不会完成?是和不是。之所以显得复杂,是因为我们一开始就描述了功能,通常是要达到的目标。然后我们将其放大并逐步设计解决方案以实现目标。当我们放大细节时,我们发现事情变得更加复杂。复杂性本身不是问题。问题是我们如何选择发现复杂性。我们将功能规范交给开发人员。几周后,我们将获得应用程序的初始版本并对其进行测试。这是我们第一次一步步操作整个软件,然后发现了很多漏洞。我们将记录更改并将它们发送给开发人员以获取该应用程序的第二个版本。整个流程的最后,经过多次修改调整,我们得到了一个比较好的解决方案。问题是开发周期太长了。每件作品可能需要数周或数月才能完成,但有必要发现应用程序的内部复杂性。与开发人员反复沟通以发现这种复杂性既费时又费钱。我们想这样做:我们想在编写代码之前尽可能多地发现这种复杂性。我们想剥开“洋葱”以发现更可靠的功能列表,最好以快速且廉价的方式进行。我们不想来回修改应用程序,我们想反复修改软件规范。我们想从这个过程:到这个过程:为了有效地做到这一点,我们需要两件事。首先,我们需要一种方法来呈现我们以后可以迭代修改和调整的功能列表。其次,我们需要一种有效的方式来查看此功能列表。下面说一下如何实现这两点。规划功能我们不再需要从业务的角度来思考这个问题,而是作为用户来思考功能需求。在这个层面上,我们需要处理软件的复杂性。首先,列出用户目标。用户将使用您的应用做什么?接下来,您需要规划用户流量。确定以用户角色实现目标所需的每个步骤,并记录这些步骤。我们想创建一个用户使用该应用程序的流程图。有很多方法可以实现这一点。您可以简单地绘制所需步骤的草图。您可以为用户看到的每个界面设计布局。您也可以在纸上或使用软件绘制流程图。图为布局。无论您选择哪个,请确保优先考虑速度。除非您是Photoshop专家,否则请放弃该软件并拿起笔和纸。确保每个界面都显示在缩略图中。例如,如果某个特定步骤需要在多个屏幕中呈现,那么您需要将该步骤分开。我们希望梳理出更多细节。这个过程应该揭示应用程序中的一些复杂性。现在,我们要开始深入挖掘。像我们之前问的那样对所有问题都提出质疑是一个太宽泛的问题。很难找到切入点。首先,我列出了适用于大多数软件的一些常见问题。这些问题分为四大类,您可以将它们用作模板来询问您自己的软件草图。仔细观察草图中的每一步,并问自己清单上的每个问题。如果答案揭示了一个新步骤,请将其添加到您的软件草图中。用户输入:这些是用户在将信息输入产品时遇到的问题。用户会输入什么样的信息?输入的信息是开放的还是交互式的?开放信息示例:输入自由格式的文本内容、选择图片上传或录制视频。交互示例:在搜索框中输入文本以显示可选择的结果、在地图上选择地址、从预定义的选项组合中进行选择。是否有应被视为无效的输入?应用程序应该如何处理它们?有被动输入吗?最常见的示例:通过GPS进行用户定位。产品需要从新用户那里获取哪些信息(https://www.useronboard.com/)?用户以后可以修改信息吗?如果把前面呈现给用户的部分信息算作信息输入,那么这部分应该就是信息输出了。屏幕上的哪些信息将呈现给用户?信息将如何呈现?例如:文本、图片、地图、列表或图表。这些信息是否需要以某种形式进行过滤?例如:距上次使用时间、用户距离、相关性等。产品能否主动与外界沟通?例如:电子邮件、推送通知、短信。部分之间的交互??这部分问题是关于软件体验的各个部分之间的交互。用户是否相互交互?例如:短信、加好友、点赞或标记其他用户内容。用户会与外部服务交互吗?例如:付费服务、物流跟踪、社交媒体账户登录。产品会与外部服务交互吗?例如:位置查询服务、天气API、社交网络(“你的朋友XXX刚刚加入!查看他们的信息!”)企业家特征这部分问题是关于企业对产品的需求。您需要通过电子邮件或其他媒体发送提醒或介绍吗?您是否需要为您自己或您的员工提供专用系统?例如:为送货人员提供导航软件,为厨房人员提供实时订单管理界面。您是否需要一个界面来手动批准用户/内容?您是否需要一个允许管理员轻松删除内容或使用户帐户无效的内容管理系统?有很多很多问题。这是正确的!这实际上是人们在开发应用程序的早期经常忘记的事情。对于你的产品,会出现更多的问题,需要你慢慢发现。总结构建软件草图和审核软件的过程将告诉您缺少什么。重复此过程几次,然后您将更有信心交付可靠的功能列表。你知道,我真的希望你有一些很好的技巧来修复我的项目。但这听起来像是很多工作。这是事实。但这是你在软件开发过程中必须做的事情,无论你处于哪个阶段。记住我们为什么要这样做。无论如何,您需要发现软件功能中隐藏的复杂性。您所要做的就是选择何时剥洋葱。本质上,您有两个选择:您可以发现用户目标,构建布局设计或流程图,质疑您自己的假设,然后在我们说话时逐层剥离软件。也就是说,可以让开发者直接开始开发应用,然后根据开发的每个版本暴露出的问题进行修改,每周一次。几个月后,你会发现这些问题,这些问题你用纸笔一周就能解决。这就是为什么软件项目通常会变得如此复杂,以至于它们会把你活活吃掉。所以,快点找出你需要什么。构建布局设计,然后质疑您自己的假设,以快速且廉价的方式发现大量问题。这将使您免于压力和痛苦,并帮助您将产品推向世界,让它像花朵一样绽放。洋葱会开花吗?你有一个可怕的比喻。
