创业|花100美元搭建的App,5天时间拥有50万个用户!

在创业界似乎有一种共识,你应该开发一款不用太在意技术的产品。只要你的商业模式可行,你不应该把时间和金钱浪费在一个技术上不确定能否实现的产品上。你唯一需要担心的是,如何验证市场并获得用户的青睐。

创业者Jonathan Zarra开发的Pokémon GO聊天软件在5天之内就有了100万用户,用户有很多是游戏的粉丝。但他在和风投进行协商后,看看他的应用可以如何继续发展和变现。之后GoChat诞生了,失去了很多用户,还花了很多钱,这真是天大的耻辱。接着Zarra支付不起可以让1百万用户使用的服务器主机,开发失败了,就聘请了承包商修复性能问题。

其实GoChat完全不必花4000美元给1百万用户搭建聊天应用程序,为每月数以百万计的用户建立一个有成本效益的系统很不容易,但在云上为用户建立一个便宜又可以让大量用户使用的服务器也不是很复杂。

GoSnaps:5天之内就有了500000用户,但服务器只要100美元/月

我推出了一款Pokémon GO的粉丝应用——GoSnaps。在GoSnaps上,用户可以分享Pokémon GO的截图和地图上的图像。它是Instagram / Snapchat版本的Pokémon GO。这款应用在上线第一天就拥有了6万用户,第二天16万,5天后就有了50万。现在已经有15至20万张上传的照片,1000位随时在线用户。我还建立了图像识别系统,可以自动检查上传的图像是否和Pokémon GO有关。而且这个软件就运行在一个中等大小的谷歌云服务器上,每个月只要100美元,价格相当便宜,还用谷歌云存储功能来存储图像。

GoChat和GoSnaps的技术比较

让我们来比较一下GoChat和GoSnaps。这两个应用程序每秒可以上传很多次请求,获取一定区域内地图的聊天或图像。GoChat通过使用一个多边形的纬度/经度或特定点的位置,以地理空间数据库进行查找(或使用搜索引擎)。GoSnaps使用的是多边形的方法,每当有人在地图上移动,就发送请求。这些类型的查询很依赖于数据库的操作,尤其在结合排序或过滤的情况下。我们每秒得到数百次这种类型的搜索请求,GoChat可能也是这样。

GoChat的独特性在于它每秒必须获取和发布很多的聊天信息。一篇关于GoChat的文章说道,整个应用每秒会发送大约600次请求,这600次请求结合了地理位置的请求和聊天信息的请求。这些聊天信息的数据量都很小,可以用一个简单的套接字进行连接,但信息频率较高,还必须要分发给其他聊天用户。通过正确的设置,这些都是可控的,但问题是它有一个类似MVP的槽糕设置。

另一方面,GoSnaps上有很多图像和“喜欢”请求需要获取,而且有相关的旧图片,所以在服务器上累积了很多任务,不过之前的聊天记录是不需要储存的。因为实际的图像文件存储在谷歌云存储上,作为一名开发人员的我不需要考虑这些。谷歌云可以处理这些问题,我相信谷歌,但在地图上的拍摄要求是我最大的担忧。GoSnaps有图像识别软件,可以查找所有上传图片的模式,看它们是否与Pokemon相关。它还能调整图像的大小并将它们发送到云上存储。就CPU和带宽而言,这些都是比较高端的操作,比分发一些小的聊天信息复杂,但使用得不频繁。

我的结论是,这两个应用程序有非常类似的可伸缩性的复杂性。GoChat处理小型消息,而GoSnaps处理较大的图像和更重大的服务器操作。设计这两个应用程序的框架需要不同的方法,但同样复杂。

我在24小时内搭建了一个大小可变的MVP

GoSnaps是一款MVP(不太注重技术的产品),而不是一个专业的商业产品,它在24小时内就搭建完成。以NodeJS模板项目为基础,使用没有任何缓存的MongoDB数据库,不用复杂和花哨的Nginx设置。实际的iOS应用程序建立在本地的objective - c代码上,还使用了苹果地图的一些相关代码。那我怎么变化它的大小呢?勤快点就可以了。

假设说,我要用一个MVP来尽快构建功能性的应用,而不考虑技术后端的质量。我会把图片放到哪里呢?放到MongoDB数据库中。它不需要配置,也几乎没有代码,是一件很容易的事。我怎么查询在某一区域内最受欢迎的图片?只要通过运行MongoDB,就可以查询所有上传的照片。但在一个数据库内,只有一个数据库查询队列,以上的技术功能无法实现我开发的应用程序和应用程序的功能。

为了获取这些图片,我是这么做的:“找到多边形区域(A、B、C、D)内的所有照片,但不包括标记为常用的照片,也不包括正在处理的照片。这些照片都获得了很多喜欢,会先被Pokémon GO调用,然后被新应用调用。”这是功能在小数据集中运行良好,但在大负荷的数据操作中并不好用。即使我将以上的查询步骤简化到只有三个条件/排序操作,也没有很好用。为什么?因为这不是一个数据库的功能。数据库应该每次只查询一个参数,但这对地理空间查询来说是不可能的。如果用户数量不多,也许可以侥幸成功,但一旦用户量增加,就像GoChat一样不顶用了。

那我做了什么呢?通使用识别和调整图像后,将缩放后的图像上传到谷歌云存储。这样的话,服务器和数据库就不需要再获取图像。数据库只需要管理数据,而不是图像,这节省了很多服务器成本。在数据库端,我将图片库分为几个不同的集合:所有照片、最受欢迎的照片、最新的照片、最新的有效照片等等。只要提前添加、喜欢或将照片标记为常用,代码会检查它是否属于某一个集合并采取相应的行动。这样的话,代码可以在准备好的集合中进行查询,而不是在一大堆混乱复杂的数据中寻找。它只是在逻辑上把数据进行简单分类,没什么复杂的。但是,我可以仅根据一个地理空间坐标进行排序操作,而不用使用上述的复杂查询方法。简而言之:它让数据选择更加容易。

我花了多少时间在上面?也许2到3个小时。我为什么这样做呢?因为这是我的方式。我认为我的应用程序应该会成功,没有理由不成功。如果应用程序不成功,我就会难以入眠,会因槽糕的技术而死。我将最小范围的可扩展性原则应用到我的应用程序中,它是我认为MVP的必备部分。

为你的MVP选择正确的工具

如果我在搭建GoSnaps时用的是较慢的编程语言或一个比较大思维框架,就会需要更多的服务器。如果我像PHP的Symfony、Django的Python或者Ruby on Rails一样,就会花很多时间修复运行慢的部分,或者添加服务器。相信我,我以前这么做过许多次。这些语言和框架在多数情况很好用,但对于预算较低的MVP并不适合。这主要是由于许多层的代码,通常用都被于将数据库记录映射到逻辑和不必要的框架代码上。它太耗费CPU了,让我给你举个例子,说说它的重要性。

正如我所说,GoSnaps使用NodeJS作为后端语言/平台,它通常快速又高效。我一般把Mongoose当做ORM,这样MongoDB就可以直接工作了。我不是Mongoose专家,但我知道它的数列本身有巨大的代码库。因此,Mongoose非常重要。有一次,我们服务器的4 NodeJS进程占据90%的CPU,这就意味着有800至1000名用户无法使用。我意识到,一定是Mongoose和获取数据有了冲突。显然,我不得不使用Mongoose的“lean()” 函数来获得JSON对象,而不是使用Mongoose对象。改变之后,CPU使用率在NodeJS使用过程中降至5 - 10%。知道简单的逻辑代码,确实是非常重要,它减少了90%的负载,这是Symfony with Doctrine无法做到。它需要好几个服务器和许多CPU内核来执行代码,其实数据库才是瓶颈,而不是代码。

选择一个精益和快速的语言对可伸缩性很重要,除非你有很多钱砸在服务器上。选择一种语言有很多可用数据库的语言更重要,因为你需要快速建立MVP,NodeJS、Scala和GO都可以达到以上的两个两个要求。它们提供了很多好的工具,也有良好的性能。PHP或Java语言本身并不一定很慢,但它通常与大框架和代码库一起使用,使应用程序负担加重。这些语言都适合清理进程、开发和测试代码,但速度很慢。价格很贵,也没有可伸缩性。我不想讨论具体的编程语言,因为目前还很主观和不完整。我个人喜欢Erlang,但不会用它来搭建MVP,所以所有的讨论都是无效的。

我之前创立的公司:Cloud Games

几年前,我和别人共同创立了Cloud Games,一个HTML5游戏出版公司。刚开始,我们的网站专注于一个在中东和北非地区的B2C游戏。我们花了很多精力去争取用户,几个月后有了1百万的月活跃用户(MAU)。当时,我使用的是PHP、Symfony2、Doctrine和MongoDB,但设置得非常简单。我曾经为月活用户2亿的Spil Games工作过,它一开始使用的是PHP,然后换成了Erlang。Cloud Games有了大约10万月活跃用户后,我们才开始有了真正的服务器问题,因为我们使用了Doctrine and MongoDB,这些PHP库占很大的内存。于是我搭建了MongoDB,用正确方法进行索引和查询,是的,我用的是PHP的APC缓存。

因为cloudgames.com是仍然非常未定,我可以用Redis将MVP迁移到NodeJS。它们有类似的设置,但用的是不同的语言,这导致负载立即下降了约95%。当然,这也与避免了使用PHP库,而不是实际的语言。简约的NodeJS比简约的PHP安装设置更有意义,尤其是MongoDB和前端代码也都使用的是 JavaScript语言,这就像没有框架和库的NodeJS.PHP是另一种语言。

我们需要这种廉价的设置,因为早期的创业公司都是自筹资金。Cloud Games现在做得很好,而且仍然基于一个便宜的NodeJS架构。我们还没有办法使用更昂贵的技术设置,因为我们作为创业公司正在经历一段非常艰难的时刻。设计一个低成本、可伸缩的架构是成功的必要条件。

MVP和可伸缩性可以共存

如果通过炒作和媒体报道,让你的应用程序用户数量暴增,那就一定要考虑产品的可伸缩性。没有什么事情,比由于技术问题而看到成功产品走向失败更令人悲伤,Pokémon GO本身有很多问题,但它非常独特还善于炒作。小公司没有这种条件,时机就是一切。只有1百万用户的GoChat和只有50万用户的GoSnaps可能会同意我的观点。
推荐阅读
企业服务行业创业法律指南:企业服务22条...
我在北大旁听了一节电竞课,老师说很渣的游...
中兴前国际高管告诉你中兴遭制裁的真相和应...
【早报】英国女王欲让查尔斯王子继位;特朗...
把耽美关进笼子
为什么刷抖音会上瘾?
加速会的KOL观察团

热文