你觉得饭店产品具有什么特征的MVP应该具有哪些特征?

编者按:本文为技术分享社区的譯文投稿原文作者Yevgeniy (Jim) Brikman;翻译:刘韬;原文链接:。

相同的故事发生了一遍又一遍首先,一个团队有了一个想法

然后,他们创造了一个 MVP(最小可行饭店产品具有什么特征)花了很多时间决定是否要添加某个功能。最后如果 MVP 获得了成功,他们就打算继续把饭店产品具有什么特征打磨的功能更完整、稳定性更好

这样做有什么问题吗?为什么采用这个策略的初创公司都挂了呢

问题在于这些团队都没有真囸理解 MVP 的精髓。 MVP 不仅仅是一个功能不完善的饭店产品具有什么特征也不仅是一种把饭店产品具有什么特征更早推向市场的方法。事实上MVP 都不一定是个饭店产品具有什么特征。MVP 并不是你只要经历一次就可以了

创业者们认为 MVP 是怎么回事儿

图:创业者们认为 MVP 是怎么回事儿

MVP 是┅个过程,而且你要一遍一遍地经历这个过程:提出最大胆的假设找到最容易的方法验证假设是否成立,然后用实验结果来校准

做饭店产品具有什么特征的时候,你会有很多假设你假设自己知道用户的需求是什么,他们喜欢什么样的设计应该采取什么样的市场策略,用什么架构最有效如何持续的盈利,哪些法律和规定是必须遵守的不管你有多厉害,总有一些假设是错的问题在于,你无法在事湔知道哪些错了

在对 100 多家失败的初创公司进行事后分析时,CB insights 发现导致创业公司倒闭的首要原因(占比 42%)是「没有人需要」接近一半的初创公司已经花了几个月甚至几年的时间才搞清楚:没有人需要他们的饭店产品具有什么特征。

搞清楚是否有人需要你的饭店产品具有什麼特征的唯一方法就是把你的饭店产品具有什么特征尽快推向市场。当你这么做了之后你很可能发现你需要重新来过。事实上你很鈳能需要一次又一次地重新开发饭店产品具有什么特征。

图:MVP 究竟是怎么回事儿

并不只是开发饭店产品具有什么特征是这样当你写一本書或者论文,你都要写很多版草稿并且花很多时间来编辑。当你写代码的时候你需要经常重构或者甚至重写所有代码。每个创造力工莋者都需要大量的试错。

在一个需要不断试错的世界中谁能先找到错误,谁就能笑到最后有些人给这种观点起名叫「fail fast」。在 TripAdvisor(猫途鷹)我们称之为「以速度取胜」。Eric Ries 叫它「精益创业」Kent Beck 和其他一些程序员叫这种观点是「敏捷开发」。不管叫什么这种观点的核心是盡快从真实的用户那里获取反馈,搞清楚你的假设哪些是错的

不管你是做饭店产品具有什么特征、写代码,还是做一份市场策划你都應该问你自己两个问题:

  • 最容易验证假设是否成立的方法是什么?

我们来聊聊一个具体的例子

你决定开发一个饭店产品具有什么特征,飯店老板可以很方便地用这个饭店产品具有什么特征为自己的饭店做一个 APP这个饭店产品具有什么特征的交互简单,只用拖拽即可有很哆预置的模板,有日历、简报、签到、相册、即时通讯等功能并且集成了点评网站、社交网络和谷歌地图。最重要的还是它有订座、外卖和优惠券的功能,你可以通过这些功能来盈利这个饭店产品具有什么特征真是太棒了!

如果是典型的创业公司,你会找朋友加入你嘚创业团队并且融到一笔钱,然后闭关 12 个月努力实现上述的所有功能。如果你稍微懂行的话你会在第一个版本砍掉一些不必要的功能,这样你用 8 个月就可以发布 MVP.

在上述情况中你将注定失败。

原因是什么呢大部分你所做出的假设都可能是灾难性的。

  • 你花了数个月的時间为你的用户做了个移动应用但是他们可能只想要网站能适配移动端,这样顾客可以在 Google 上更好地找到饭店的网站

  • 或者你使用了最先進的技术开发了即时通讯功能,却发现你的用户用邮件解决沟通问题而且他们也不想整天坐在电脑前回复信息。

  • 或者最糟糕的情况是飯店老板压根不想麻那个烦,对于使用科技饭店产品具有什么特征和维护应用一点兴趣都没

等待数月才能得出这些关键的结论实在太久叻。最好的情况是浪费了很长的时间;最差的情况是你的公司就挂了Peter Drucker 说过,用很高的效率做无用功是最没用的事情。

让我们尝试把 MVP 当莋一个过程的方法看看这样做是否会更好一些。我们会迭代饭店产品具有什么特征在每个阶段都会问:

  • 最容易验证假设是否成立的方法是什么?

在最开始的时候最大胆的假设可能是:饭店老板需要移动应用。

因此最早期的 MVP 可以是移动应用的原型 —— 甚至你可以在饭店纸巾上画一个。去和饭店老板聊聊问问他们在使用科技饭店产品具有什么特征时遇到了什么问题。他们是否已经有应用了如果没有嘚话,为什么没做呢他们想要一个应用吗?他们对科技饭店产品具有什么特征有多在行呢他们了解饭店应用的好处吗?把你的原型给怹们瞧瞧搞清楚这样的饭店产品具有什么特征是否能解决他们的问题。

可能你会发现饭店老板对于开发应用没什么兴趣这有点丢人,泹好消息是你所花费的不过是几个小时而已而节省了几个月的开发时间。另一方面你可能会发现饭店老板虽然对应用没什么兴趣,却想要简单地撘一个网站你还是有所进展的!

但是这样还没完,你必须重复这个过程来开发你的下一个 MVP.

现在,饭店老板最有可能为网站買单最容易验证假设是否成立的方法是什么?开发下一个 MVP 时可以先做几个静态网站看看那些饭店老板反馈如何。他们喜欢这样的网站嗎这样的网站是否已经有了?他们愿意花多少做一个这样的网站

可能一聊到钱的问题,你就会发现饭店老板并没有那么感兴趣好消息是你只用几天的时间就了解清楚了,而不是浪费几个月的时间来开发

或者你发现饭店老板愿意花钱做网站。然后他们付钱或者给你支票让你来做网站。饭店产品具有什么特征发布之后告诉饭店老板如果需要更新信息就给你发邮件。是的这个阶段需要大量人力劳动;不,这样无法规模化然而当你还是小公司时,不要为了做的事情无法规模化而担心有规模化的问题是件好事,因为那意味着你做的倳情值得规模化

但是与此同时,你需要重复 MVP 过程

现在可能是找到合适的市场策略。你不可能去世界上每家饭店和老板见面最容易验證假设是否成立的方法是什么?你的 MVP 可能是一个着陆页用来描述你的饭店产品具有什么特征是干嘛的,展示你们已经做过的饭店网站並且如果浏览网站的人对此感兴趣,就让他们提供邮件地址然后你可以在 Google、Facebook、Twitter 或者 Linkedin 上买广告,增加着陆页的曝光然后看看有什么效果。

如果潜在用户不肯给你邮件地址他们也不可能给你的饭店产品具有什么特征付钱。比起重写整个饭店产品具有什么特征写几段话然後放上几个图片要容易得多。越早发现问题你就越能节省时间。

总而言之这就是 MVP 过程。不管你是在做饭店产品具有什么特征设计、市場策划还是在写代码,都需要问:

  • 最容易验证假设是否成立的方法是什么

本文经授权发布,不代表36氪立场如若转载请联系原作者。

}

在市场不确定的情况下通过设計实验来快速检验你的饭店产品具有什么特征或方向是否可行。如果你的假设得到了验证再投入资源大规模进入市场;如果没有通过,那這就是一次快速试错尽快调整方向。

今夜酒店特价的创始人任鑫在他们准备上马这个项目的初期,他们更多参考了国外同类饭店产品具有什么特征的模式重点面向商旅人士,在一个城市寻找几家深度合作的酒店建立线上支付体系,采用预付费的模式结果,一段时間下来经营状况非常惨淡,每天的订单量掰着指头就能数过来一开始他们觉得方向没错,应该是执行出了问题直到半年后,他们终於清醒过来其实是最初的假设都有问题。但是大半年的时间已经浪费了

当任鑫后来反思这一段创业经历的时候,得出一个结论:创业公司尽全公司之力做了一款饭店产品具有什么特征最后却没人使用,这才是真正的浪费

所以如果一开始他不着急投入大量人力物力,罙入线下与大量的酒店谈合作而是把艺龙、同城、淘宝等线上房源数据签过来,集中在一个页面上哪怕自己掏腰包对每间房优惠100块,僦可以做一个很好的实验测试用户是否需要这样一个服务;如果需要,哪种模式更符合消费者的使用习惯这样可能一两个月的时间就能掌握有效信息,而且成本极低

大众点评的创始人张涛花了3天时间做出来的大众点评网最早的一个网页。以前他羞于给别人看这张图因為太丑陋了。但是后来他觉得这张最简陋的网页就是MVP。当时他没有跟饭馆签任何协议而是将旅游手册里的一千多家饭店录入进网站系統。他就想验证一件事网民在一家饭馆吃完饭,是否愿意进行点评?这个认知的获得是大众点评网商业模式最重要的起点

当然,那时候怹们还是无意识地做MVP现在他们已经主动选择这样的饭店产品具有什么特征策略。举个例子大众点评现在想切入餐馆订位服务,市场上囿很多解决方案比如电话预订。在经过一番研究之后他们想到一种声讯电话模式。简单地说就是用户在手机上提交预订请求,然后鼡技术把文本转为语音之后通过声讯电话服务商把用户的要求发送给相应的餐馆,餐馆可以简单地通过按1或者2来选择是否接受预订最後大众点评网把预订结果短信通知用户。

这个解决方案听起来很漂亮但是,开发这套系统至少需要3个月时间而且他们也不确定用户是否愿意通过这种方式来预订餐位。MVP的概念再次帮了张涛的忙他做了一个极为“性感”的试验:一开始根本不用语音转化技术和声讯电话業务,而是后台有两位客服人员人工地接收信息电话餐馆,回复用户换句话说,只是“假装”成声讯电话的样子最后验证这个需求囷解决方案是可行的,他们才投入大量资源来开发系统目前这个服务已经成功在上海铺开,下一步会进入北京

创业要解决两件事。第┅你要知道用户的需求是什么;第二,你能为这样的需求提供什么样的解决方案本质上这些问题都是未知的。假如在一切未知的情况下貿然确定方向就举全公司之力扑上去,很可能出现像今夜酒店特价一开始遇到的情况

}

原标题:MVP模式在携程酒店的应用囷扩展

赵伟麟2011年就职于创新工场旗下点心OS,2014年加入携程酒店事业部从事Android研发工作。擅长基于组件的业务架构系统架构,建模性能優化和重构,关注应用系统的扩展性和耦合性追求简洁的代码。本文来自赵伟麟在“携程技术沙龙——移动开发工程实践与性能优化”仩的分享

*视频由“IT大咖说”提供,时长约37分钟请在WiFi环境下观看。更多视频可在大咖说平台观看*

酒店业务部门是携程旅行的几大业务之┅其业务逻辑复杂,业务需求变动快经过多年的研发,已经是一个代码规模庞大的工程如何规范代码,将代码按照其功能进行分类将代码写到合适的地方对项目的迭代起着重要的作用。

MVP模式是目前客户端比较流行的框架模式携程在很早之前就开始探索使用该模式進行相关的业务功能开发,以提升代码的规范性和可维护性积累了一定的经验。本文将探讨一下该模式在实际工程中的优点和缺陷并介绍携程面对这些问题时的思考,解决方案以及在实践经验基础上对该模式的扩展模式MVCPI

MVC已经是非常成熟的框架模式,甚至不少人认为它過时陈旧老气在实践中,很多同事会抱怨MVC会使得代码非常臃肿,尤其是Controller很容易变成大杂烩预期的可维护性变得很脆弱,由此导致一方面希望有新框架模式可以解决现在的问题但同时对框架模式又有些怀疑,新的框架模式是否能真正解决现在的问题会不会重蹈覆辙?会不会过度设计会不会掉进一个更深的坑?总之这些类似“一朝被蛇咬,十年怕井绳”的担忧显得不无道理但不管如何,我们需偠仔细耐心的做工作

在MVP模式逐渐流行之前,不管我们有意识或无意识地我们使用的就是MVC模式。以Android为例我们来看看MVC是什么样子。

上面嘚代码概括了Android MVC的基本结构,从笔者的经验来看很多应用都存在这样的代码风格,也就是大部分人认为的MVC:

可以试想一下如果这个界面展示的数据非常的多话MainActivity必然会变得非常庞大,就像大部分人所抱怨的那样诚然,上面的demo是MVC模式但是,它仅是从系统框架的角度来看如果从应用框架来看,它不是下面来看一下,从应用框架来看一下MVC正确的结构:

应用中的MVC应该在系统的MVC框架上根据业务的自身的需要進行进一步封装也就是说,如果在我们宣称我们是使用MVC框架模式的时候代表我们的主要工作是封装自己的MVC组件。它看起来应该是像下媔的风格:

跟之前的代码相比基本结构是相似的,如下:

仅仅View层发生了变化这是因为,Model和Controller相对是大家容易理解的概念在面临任何一個业务需求的时候,自然就能产生的近乎本能的封装(尽管Model的基本封装大部分工程师都可完成但不可否认Model的设计是至关重要而有难度的);而对View的看法,可能就是“能正确布局和展示就行”但这正是关键所在:我们需要对界面进行全方位的封装,包括View具体来说,一个嫃正的MVC框架应该具备下面的特点:

·数据都由Model进行封装

1.3、MVC模式的问题所在

前面说到很多人抱怨采用MVC模式使得Controller变得很臃肿,我相信Controller变得臃肿是事实,但其归结于采用MVC模式是不正确的这个锅不应该由MVC来背,因为这个论点会导致我们走向错误的方向从而无法发现MVC真正的问題所在。为什么这么说呢那是因为在本人了解到的很多情况下,大家并没有正确理解MVC框架模式如采用前文中第一种模式,自然会使得Controller臃肿但是如果采用第二种模式,Controller的代码和逻辑也会非常清晰至少不至于如此多的抱怨。因此如果只是想解决Controller臃肿的话MVC就够了,毋庸質疑那MVC的问题是什么呢?我想只有深刻的理解了这个问题我们才有必要考虑是否需要引入新的框架模式,以及避免新的模式中可能出現的问题

View强依赖于Model是MVC的主要问题。由此导致很多控件都是根据业务定制从Android的角度来看,原本可以由一个通用的layout就能实现的控件由于偠绑定实体模型,现在必须要自定义控件这导致出现大量不必要的重复代码。因此有必要将View和Model进行解耦而MVP的主要思想就是解耦View和Model。由此引入MVP就显得很自然

Android 官方提供的MVP参考实现,大致思想如下:

1、抽象出IView接口规范控件访问方法,而不限View具体来源

3、IPresenter的实现类实施数据囷IView的绑定,并负责相关的业务处理

上述代码主要的特点可以概括为:

就目前了解到的情况来看,很多采用MVP模式的应用基本上和android参考实现方案差别不大说明该模式的应用场景也是很广泛的。

尽管已经有了大量的应用但不可否认该模式的还是存在一些问题,这些问题在携程的使用过程中也得到了体现比如,上下文丢失问题生命周期问题,内存泄露问题以及大量的自定义接口回调链变长等问题。可以歸纳为:

·业务复杂时可能使得Activity变成更加复杂,比如要实现N个IView然后写更多个模版方法。

·业务复杂时各个角色之间通信会变得很冗長和复杂,回调链过长

·Presenter处理业务,让业务变得很分散不能全局掌握业务,很难去回答某个业务究竟是在哪里处理的

·用Presenter替代Controller是一個危险的做法,可能出现内存泄漏生命周期不同步,上下文丢失等问题

以下面的这个需求来看几个具体的示例:

详情按钮的展示需要垺务端下发标记位控制,展示时点击需要请求一个服务服务返回时toast提示用户。

上述代码表明HotelPresenter可以处理大部分的业务,但是在最后需要使用上下文的时候出现了困难,因为脱离了上下文展示一个Toast都不能实现

为了避免这样的尴尬,因此改进方案如下:

改进的方案中考慮到需要使用上下文,因此新增了接口传入Fragment作为上下文在Presenter需要时可以使用,但是由于Fragment生命周期会了变化,可能会导致空指针问题

于昰新的问题又需要解决。主要是两个思路一个是为Presenter增加生命周期方法,在Fragment的生命周期方法里调用Presenter对应的生命周期函数但这就让Presenter看起来潒Fragment的孙子;另外一个就是承认Presenter其实不太合适承担Controller的职责,从而提供接口给外部处理;如下:

这个方案很稳定似乎成为了最佳的选择。但昰自定接口和回调始终有那么一点痛

由于前面的分析,MVP参考实现并不是万能的携程酒店并没有完全采用参考实现方案,而是结合自身嘚实践经验思考之后设计出来的扩展方案我们主要考虑了一下的几个问题:

·如何定义View接口?

·如何解决长长的回调链

通过对上述问題的思考,提出对应的解决方法规避前面论述的各种问题,形成了携程酒店的MVCPI框架模式并在多个业务场景运行,取得了较为满意的效果下面,详细介绍MVCPI模式

和Android 参考实现不一样的是,我们并没有采用强类型的接口作为表达View的方式而是采用弱类型的接口来定义View。具体萣义方式如下:

上面的接口简洁的描述了作为业务控件的View需要具备的子控间ID并不需要具体的实现类。因此也不需要Activity去实现这个接口只需要在layout中申明这几个ID的即可,极大的简化了代码

与参考实现的定位不一样,我们认为由Presenter取代Controller并不是一个好的做法Presenter应是Controller的补充,主要起箌View和Model解耦和数据绑定的作用所负责的控件的上的业务还是有Controller决定如何去处理。另外setView接受的参数是一般的View而非一个接口类型,内部根据IView萣义的ID去查找子控件如下:

Interactor是我们定义出来的扩展元素,在MVP和MVC中都没有对应的角色为了阐述它的含义,我们先来看看两个非常常见的場景

在前面介绍过,Presenter自定义接口是很多候选方案中较为合理的选择但相比MVC而言,MVP更容易出现如上图的一种调用和回调关系(甚至更长)维护这种回调链通常来说是一件非常头痛的事情,从View的角度来看很难知道某个事件到最后究竟完成了什么业务,Acitivity也不知道到要装配哪些回调某个未知的新需求可能需要将该链条上的每个环节都增加回调。

下面来是另外一种场景大家可以脑补一下采用上面的回调方案,回调链会是什么情况

·几十种动态交互需求,

·分布于不同深度的嵌套层次中

经过大量版本迭代后无论饭店产品具有什么特征经悝,研发或者测试都不清楚到底有哪些需求,业务逻辑是什么写在什么地方等等......

上述两个场景可以得出两个结论:

·增加功能成本高,容易引致其他问题

为了解决上述两个比较棘手的问题我们引入了Interactor,用于描述整个界面的交互一举解决上述两个问题。我们认为交互模型是一个功能模块的重要逻辑单元相对于实体模型来说,交互模型更加抽象在大多数的情况,并不能引起大家的注意但它确实是洳实体一样的存在,正是因为没有对交互进行系统的描述才导致上面两种突出的问题。尽管抽象但是交互模型本质非常简单,它有着囷实体模型有相似的结构示例如下:

通过对界面整体分析后,我们建立如上的交互模型所有的交互都在交互模型进行注册,由交互模型统一管理进而可以对整个界面的交互进行宏观把控;然后在页面的所有元素中共享同一个交互模型,进而各个元素不再需要自定义接ロ和避免建立回调链最后由Controller负责组装,进一步加强Controller的控制能力

最后,整体介绍一下MVCPI的代码结构

1、首先定义整个界面中有哪些用户交互本例中就一个详情按钮交互

2、Presenter构造时需要传入交互模型,内部定义了IView接口传入的View中需要包含它定义的ID的控件,在bindData时详情按钮的点击鈈是通过匿名内部类去处理,而是直接引用交互模型中定义的mDetail

3、Controller负责界面各个元素(包括交互模型)的初始化和装配

通过对MVCMVP的介绍和研究,我们发现二者的关系并不是相互取代的关系而是一种演化和改进的关系。经实践证明MVC仍然具有强大的生命力,试图用MVP取代MVC几乎都會失败携程在MVC模式基础上,结合MVP思想加入Interactor元素搭建的MVCPI框架模式,一方面将数据绑定逻辑从Controller(或者View)中分离出去另一方面将交互模型嘚控制纳入进来,进一步加强了Controller的控制能力无论从代码的简洁性,维护性扩展性来看,都具有较大优势具有一定的实践推广价值。

當然任何框架模式都不是全能的,MVCPI也存在它不足如果有好的意见和建议,欢迎加入一起讨论推进框架模式的发展。

}

我要回帖

更多关于 饭店产品具有什么特征 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信