我们如何在一周内构建并发布约会应用(第 1 部分)
我们如何在一周内构建并发布约会应用(第 1 部分)
原文:https://medium.com/hackernoon/how-to-build-and-launch-a-dating-app-in-a-week-759e6d32b764
大约一个月前,我们最近为 iOS 和 Android 推出了颜色约会。它就像 Tinder,但专注于少数民族和那些喜欢少数民族的人。
它在 Reddit 上获得了许多积极的反馈,我也收到了许多关于/r/learnprogramming 的问题,这些问题都是关于我们的技术堆栈和流程的,所以我想我应该在这里写一篇简短的博文。
堆栈概述
iOS: Swift
后端: Ruby on Rails
数据库: Postgres
平台: Heroku
域名注册: 域名便宜(披露:附属链接)
应用概述
就其核心而言,iOS 应用相当简单。MVP 仅仅由几个特征组成。
- 用户可以设置他们想要匹配的人的偏好
- 用户有一个可以刷卡的屏幕
- 用户有一个可以发送和回复信息的屏幕
- 用户有一个配置文件屏幕,他们可以编辑自己的基本信息

快速还是客观-C
在一个 iOS 项目中经常被问到的问题是,是用 Swift 还是 Objective-C 来写。
如果你在一年前问我,我会更倾向于 Objective-C,因为 Github 上的许多第三方框架才刚刚起步。如今,支持 Swift 的现代项目在支持 Objective-C 的项目数量上不相上下。
从大多数指标来看,Swift 似乎是移动 iOS 开发的未来,所以如果你还没有开始学习,那就不要错过了。然而,在一天结束的时候,这实际上是关于什么样的语言你最舒服,以及你愿意投入多少时间。
如果你来自一个用 C++ / Java / C#编程的世界,那么如果你只是想快速而简单地完成项目,Objective-C 可能更容易上手。或者,如果你更习惯于 JavaScript、Ruby 或 Python 等解释型语言,那么 Swift 可能更适合你。
1.添加卡和刷卡
在编程时,太多的时间被浪费在重写以前已经存在的相同功能上。我对于移动应用开发的理念是:既然可以通过 CocoaPods 安装,为什么要重新发明轮子呢?
对于那些被启动的,CocoaPods 是 iOS 的依赖管理器。传统上,当一个人想要集成第三方库时,他必须手动下载 zip 文件,解压缩并将其导入到他们的项目中,然后手动配置项目构建标志以避免完全打乱您的构建。CocoaPods 通过自动处理来解决这个问题。
我强烈建议您在项目中使用 CocoaPods,因为这可以节省大量处理框架冲突和更新框架的时间。
对我们来说,我们最终决定用科洛达来处理我们的刷卡视图。但即使你没有开发卡片浏览/刷卡类的应用,同样的原则也适用:不要多此一举。上 Github,搜索一下,看看是否已经有一个库可以帮助你实现你想要的东西。
2.启动后端
我们使用 Ruby on Rails 作为后端。
我知道有很多其他的 web 替代品,人们有不同的看法,但是对我来说,Rails 一直是快速部署 CRUD(基本)后端服务器的最快和最直接的方法。
当开始一个新的 Rails 项目时,我也一直是 Rails Composer 的粉丝。它帮助我处理了很多问题,比如设置你的邮件程序,添加一个用户对象并使它能够与 device/omni auth 一起工作,设置用户角色等等。
无论您选择什么,创建后端的过程都是一样的。我们有一个“用户”对象,包含基本的用户信息,如用户名、名字、照片、年龄、经度和纬度两列。
基本上,您所需要的就是让用户模型有一个“find_matches”方法,该方法根据用户的偏好/位置返回潜在匹配的列表。
为了处理来自脸书的概要文件创建,我们还必须将 Sidekiq 与 Redis 一起使用,这样我们的概要文件创建工作就可以在后台完成。之所以需要异步,是因为从脸书下载和上传一张照片可能需要时间,整个 HTTP 请求可能需要 10 秒以上,否则会阻塞您为其他 HTTP 请求提供服务的能力。
如前所述,我们用的是 Sidekiq,但其他人用的是 Resque。我不够聪明,分不清两者的区别,所以我只挑了一个。
就数据存储而言,我们和地球上的其他人一样,使用回形针和亚马逊的 S3 进行存储。回形针已经为 S3 内置了一个很好的适配器,这使得处理,上传和检索图像变得很神奇。它还负责调整缩略图的大小。
就 MVP 而言,这几乎是我们让用户登录并开始工作所需的全部内容。再说一遍,它的要点是,当你试图快速解决问题时,不要重复发明轮子。使用你能支配的所有工具。
3.将后端与应用程序连接
我认为大多数人都使用 JSON 作为他们从后端到前端交换信息的首选格式。
幸运的是,如果你在 Rails 上,它已经打包了一个 JSON 序列化器,如果你使用的是 Alamo Fire (这是我对 Swift 的首选 HTTP 库),它也配备了一个 JSON 到 Swift 对象反序列化器。如果您使用的是 Objective-C,ASIHTTP 库也会为您处理 JSON 序列化。
对于一个 MVP 来说,我不认为真的有必要在客户端过分强调数据持久性。我认为这是许多新老开发人员在开始他们的项目时都会犯的错误,因为不同组件之间的数据同步总是一个挑战。尤其是在早期阶段,当您的后端模式更加不稳定时,您很可能会浪费大量时间去做许多烦人的迁移。
唯一需要客户端持久存储的是您的“用户”对象。客户端用户对象应该有向上和向下同步方法,以便能够将新数据上传到服务器,并将信息同步回应用程序。
4.向应用程序添加消息
这可能是构建应用程序中最棘手的部分,也是花费时间最多的部分。我们最初试图整合各种预建的聊天解决方案,但它们都被否决了。定制这些库花费的时间比我们想象的要长,最后,我们得到了一个只能工作一半的解决方案,它写得很差,很难维护。
我们最终不得不放弃大约 2-3 天的工作,并决定实施我们自己的定制解决方案。幸运的是,Rails 并没有那么难。
这就强调了为什么尽管我以前使用过许多其他的 web 框架,但我总是发现自己又回到了 Rails。当 Rails 运行时,它运行得非常好。只要你在预期的惯例范围内做事,我的观点是这是最快的启动和运行的方式,因为几乎所有事情都有一个宝石。
我在 Github 上找到了一个名为" acts-as-messageable" 的消息传递工具,它基本上就像在用户 activerecord 模型中添加两行代码一样简单。它不仅允许用户对象发送和接收消息,还负责构建对话模型。唯一的问题是,它不是真正的实时聊天系统,因为它需要定期轮询,而不是通知 UI 立即刷新的发布/订阅模式。这也意味着它缺少像打字指示器这样的东西。
这可能会有一些性能上的折衷,但是我们很早就想到,在我们扩展到成千上万的用户之前,我们很可能不需要重写这个组件。此外,我们是约会应用,我们不需要聊天应用的所有功能。
在 iOS 客户端,我们使用了 pod“JSQMessageViewController”,它提供了所有必要的 UI 元素,开箱即可完美运行。
5.部署到生产
部署后端应用时,有很多解决方案。老实说,我对这些并不太了解,但我认为总的来说有几点你应该考虑。
一方面,你有 PaaS(平台即服务),比如 Heroku。Heroku 的问题是,对于你所得到的硬件规格来说,它会变得非常昂贵。另一方面,还有其他选项,如 AWS EC2,您可以自由启动自己的虚拟实例,并在资源调配方面拥有几乎完全的控制权,但需要更多的时间和精力。
根据您选择在何处启动 EC2 实例、规模和合同协议,在 EC2 上类似的硬件性能方面,您可能会看到多达4–5 倍的成本降低。
然而,Heroku 的好处是,它可能最终会节省你很多时间和头痛。我本人首先是一名开发人员,并不是一个系统管理员/操作人员。因此,在 Unix 系统上用黑白文本进行终端工作和调试问题并不是我真正喜欢的。
对我来说,当选择 Heroku 作为平台时,我觉得收益大大超过了成本。然而,如果您在运营方面更有经验,您可能会考虑纯粹在 EC2 上运行实例,以节省成本,或者您可能会选择更混合的方式,如使用 Dokku 推出您自己的开源部署平台。
例如, DigitalOcean 是我过去广泛使用的云计算平台。如果你想要感觉像 Heroku 但又省钱的东西,他们可以在几秒钟内准备好图像,包括 Dokku。
6.杂项业务
部署应用程序后,您可能会想要添加一些监视器,以确保当事情不可避免地发生时,您会收到警报。
对于的基本 HTTP 监控,我不受 Pingdom 免费计划的限制,所以我选择了它。然而,我也听说过 StatusCake 的好处,它标榜自己永远免费。这种类型的监控基本上只是让你知道你的应用程序何时关闭和无响应。
对于性能监控,我们使用的是 New Relic,但是你可能也想试试其他的。性能监控让您深入了解应用程序的性能,如响应时间、内存和应用程序级代码。这让你知道哪些地方速度慢或者占用内存,哪些地方可以优化。
对于错误监控,我们使用了滚动条,但是没有别的原因,它是谷歌搜索中出现的第一个东西。你可能想看看空气制动,或类似的服务。错误监控允许您捕获应用程序中发生的错误,并以外部的、更易于阅读的格式记录下来。例如,如果您想跟踪某个错误的频率并将其标记为已修复。
最后,对于一般的日志,我们使用 Logentries。我最初是在 Papertrail 上,但是我认为 Logentries 提供了更多的帮助。它还更好地解决了错误,界面也更容易设置警报。
摘要
大多数业余爱好者和专业人士在开始一个新项目时会遇到的问题是,他们没有限制自己的范围,也没有重用他们已经可以使用的工具。
当定义你的范围时,确保将它限制在3–5 个主要特性或者更少。如果你有一整块白板都是功能,那你肯定做错了。知道你的路线图上想要什么特性可能是好的,但是把它们放在冰桶里,因为我们在这里谈论的是 MVP。
当涉及到构建您的项目时,我强烈建议您选择有大量社区支持的堆栈。这将允许你在 Github 上搜索,然后把东西放到你的项目中。只是要小心,你注意到项目的许可。
如果你已经读到这篇博文的结尾,但你仍然犹豫是否要开始入侵,那就去做吧。




