当前位置: 首页 > 科技观察

创办一家互联网公司需要多少人?一个就够了

时间:2023-03-16 18:18:39 科技观察

创建一家互联网公司需要多少人?一位来自旧金山的软件工程师告诉我们:一个就够了。这位工程师创建了一个名为“听笔记”的播客搜索引擎,可以像谷歌一样轻松搜索海量播客资源。在这篇文章中,工程师向我们展示了他用来创建“ListenNotes”的各种“无聊”技术。ListenNotes地址:https://www.listennotes.com/ListenNotes是一个播客搜索引擎和数据库。而ListenNotes背后的技术其实并不是什么新鲜事。没有人工智能,没有深度学习,没有区块链。“任何说我必须使用AI的人都没有使用真正的AI,”该文章的作者说。作者在序言中说:“读完这篇文章,读者应该可以复制我为ListenNotes构建的东西,或者轻松实现类似的操作。你不需要雇佣很多工程师。还记得吗,当Instagram筹集了5750万美元并且当他们被Facebook以10亿美元收购时,他们有13名员工——而且并非所有人都是工程师。Instagram的故事发生在2012年初,现在是2019年,一个小型的工程团队甚至一个人创造一些有意义的事情的可能性更大比以往任何时候都。”这篇介绍使用很多“枯燥”的技术来打造互联网产品的文章,引起了网友们的诸多讨论。有人说,技术本身就是一种手段。如果产品能很好地实现功能,再“无聊”的技术也可以很棒。也有网友表示,能同时掌握前端、数据库、搜索引擎、存储、集群、开发、源码控制、权限管理等多项技术,实属难得。下面笔者从前端、后端、API等角度介绍他使用的技术细节。概述让我们从ListenNotes项目的要求和功能开始。ListenNotes为最终用户做了两件事:为播客听众提供网站ListenNotes.com。该站点可以提供搜索引擎、播客数据库、“稍后收听”播放列表、音频剪辑和“收听警报”(当新播客中提到指定关键字时通知您)。面向开发人员的Podcast搜索和目录API。我们需要跟踪API使用情况、从付费用户那里获得资金、提供客户支持等等。一切都在AWS上运行。截至2019年5月5日,有20台服务器在运行:运行ListenNotes的服务器。读者可以通过其主机名轻松猜出每个服务器的作用。production-web为ListenNotes.com提供网络流量。production-api提供api流量。我们正在运行两个版本的API(截至2019年5月4日),v1api(旧版本)和v2api(新版本)。production-db运行PostgreSQL(主要和从属)production-es运行Elasticsearch集群。生产人员运行离线处理任务以保持播客数据库始终是最新的并提供一些魔力(例如搜索结果排名、剧集/播客推荐......)。production-lb是负载均衡器。为了方便,我也在这台服务器上运行了Redis和RabbitMQ。我知道这不是最理想的情况。无论如何我都不完美:)production-pangu是一个类似于生产的服务器,我有时会在其中运行一次性脚本并测试更改。“盘古”是什么意思?请自行搜索。这些服务器中的大多数都可以水平扩展。这就是为什么我将它们命名为production-something1、production-something2...很容易将production-something3和production-something4添加到其中。后端整个后端是用Django/Python3编写的。操作系统是Ubuntu。使用uWSGI为网络流量提供服务。NGINX被放置在uWSGI进程之前充当负载均衡器。主要的数据存储是PostgreSQL,我有多年的开发和操作经验——该技术经过了很好的测试,所以我晚上可以睡个好觉。Redis用于缓存、统计等很多地方。Elasticsearch用于为播客和剧集编制索引并提供搜索查询,就像大多数无聊的业务一样。Celery用于离线处理。而CeleryBeat是用来调度任务的,类似Cron作业,但是性能更好。如果将来ListenNotes变得更流行并且Celery和Beat导致一些扩展问题,我可能会转向我为我的前雇主所做的两个项目:ndkale和ndscheduler。Supervisord用于每台服务器上的进程管理。Docker/Kubernetes/serverless呢?不。有了经验,您就会知道什么时候不要过度设计。事实上,我在2014年为我的前雇主做了一些早期的Docker工作,这对于一家价值数十亿美元的中型初创公司来说非常棒,但对于一家小型初创公司来说可能有点像“大炮”。Beatthemosquitoes”。网页的前端主要使用React+Redux+Webpack+ES。这是相当标准的。当部署到生产环境时,JSbundle被上传到AmazonS3并通过CloudFront服务。在ListenNotes.com上,大多数网页一半是服务器端渲染(Django模板),一半是客户端渲染(React)。服务器渲染部分提供网页的样板,客户端渲染部分基本上是一个交互式Web应用程序。但是由于我懒于使事情变得完美和一些潜在的SEO好处,有些页面完全在服务器端呈现。网站、推特嵌入式播放器、第三方网站的嵌入式播放器中:第三方网站的嵌入式播放器PodcastAPI我们为开发者提供简单可靠的播客API,构建API类似于构建网站,使用萨我在后端使用Django/Python堆栈,在前端使用相同的ReactJs(例如API仪表板、文档...)。用于ListenNotes的API仪表板。ListenNotes的API文档。对于API,我们需要跟踪用户在当前计费周期内使用的请求数,并在周期结束时计费。不难想象,这里大量使用Redis:)DevOps机器供应和代码部署我使用Ansible进行机器供应。基本上,我写了一堆yaml文件来指定什么类型的服务器、什么配置文件以及需要什么软件。我可以用所有正确的配置文件和软件启动一个服务器,然后用“一键安装”来安装它。这是Ansibleyaml文件的目录结构:我本可以在命名方面做得更好。但现在已经足够了。我还使用Ansible将代码部署到生产环境中。基本上,我有一个在macOS上运行的打包脚本deploy.sh:./deploy.shproductionHEADwebdeploy.sh脚本具有三个参数:环境:生产或暂存;listennotesrepo版本:HEAD表示“仅部署最新版本”。如果指定了gitcommit的SHA,那么它将部署特定版本的代码——这在我需要从错误的部署中撤回时特别有用;服务器类型:web、worker、api或全部。我不必一次部署到所有服务器。有时我会修改Javascript代码,然后我只需要在不接触api或workers的情况下部署到网络上。部署过程主要由Ansibleyaml文件制定,当然也很简单:在MacbookPro上,如果要部署到web服务器,构建Javascript包,上传到S3;在目标服务器上,git将listennotesrepo克隆到指定文件夹的时间戳,检查特定版本,并安装新的Python依赖项(如果有);在目标服务器上,将符号链接切换到上述时间戳命名的文件夹,并通过supervisorctl重启服务器。我不使用那些花哨的CI工具。实际操作非常简单。监控和警报我使用Datadog进行监控和警报。我在一个简单的监控界面中有一些高级指标。在搞乱生产服务器时,这里的一切都是为了自信。ListenNotes的Datadog监控界面(截至2017年12月)。我正在将Datadog连接到PagerDuty。如果出现问题,PagerDuty会通过电话和短信向我发送警报。我还使用Rollbar来监控我的Django代码的健康状况,它会捕获异常并通过电子邮件和Slack通知我。我经常使用Slack。这是一家单人公司,所以我不使用Slack与人交流。我使用Slack来监控有趣的应用级事件。除了将Datadog和Rollbar与Slack集成之外,我还在ListenNotes后端代码中使用Slack来传递webhook,以便在用户注册或执行某些操作(例如添加或删除内容)时通知我。这是科技公司的普遍做法。当你阅读亚马逊或PayPal早期的一些书籍时,你会看到这两家公司都有类似的通知机制:每次有用户注册时,“叮”的一声通知办公室里的每个人。ListenNotes自2017年初上线以来,只出现过一次长时间的崩溃(大于5分钟)。我在这些操作中一直非常谨慎和务实。如果新闻事件或其他因素导致流量激增,Web服务器会大量增加。在旧金山的WeWork联合办公空间开发我的作品。有些人可能想知道为什么不在家或咖啡店工作。那是因为我非常看重效率,所以我愿意为此投资。我不相信靠时间的堆砌可以开发出好的软件。我很少一天工作超过8小时(不好意思,996啦)。我想把每一分钟都花在数数上。所以我需要一个花哨且相对昂贵的私人办公室:)与其花更多时间试图省钱,我选择花更少的时间赚钱:)我在WeWork的办公室。我使用的电脑是MacBookPro。我在Vagrant+VirtualBox中运行(几乎)相同的基础设施。我使用与上面相同的一组Ansibleyaml文件来配置Vagrant中的开发环境。我赞同monorepo哲学。所以,我只有一个包含DevOps脚本、前端和后端代码的listennotes存储库。listennotes存储库作为GitHub私有存储库托管。我在master分支上完成所有开发工作。我很少使用特性分支。我使用PyCharm编写代码并运行开发服务器(Djangorunserver和webpack开发服务器)。我知道这很无聊。它毕竟不是VisualStudioCode、Atom或IDE。但是PyCharm对我来说很好用。毕竟我是老派。我的PyCharm。其他我将ListenNotes作为一个产品和一家公司建立起来,拥有许多有用的工具和服务:用于获取终端内容的iTerm2和tmux。TODO列表、wiki、笔记和设计文档的概念...@listennotes.com电子邮件帐户、日历和其他Google服务的GSuite。MailChimp每月发送电子邮件时事通讯。AmazonSES用于发送交易和营销电子邮件。Gusto用于支付自己和非Upwork承包商的工资。Upwork用于寻找承包商。GoogleAdsManager管理直接广告并跟踪效果。CarbonAds和BuySellAds用于备用广告。Cloudflare用于DNS管理、CDN和防火墙。Zapier和Trello简化了播客工作流程。Medium是公司博客的媒介。域名的Godaddy和Namecheap。Stripe用于从用户那里获取资金(主要用于API)。用于语音转换的Google语音到文本API。KaiserPermanente提供健康保险。StripeAtlas被用来整合ListenNotesInc.Clerky为融资(SAFE)和雇佣非Upwork承包商生成法律文件。Quickbooks用于簿记。1password用于管理大量服务的登录凭据。Brex信用卡,还可额外赚取5,000美元的AWS积分,这些积分可用于WeWork或StripeAtlasAWS积分。BonvoyBusinessAmexCard-赚取MarriottBonvoy积分用于豪华酒店和航班。这是旅行的最佳信用卡积分:)CapitalOneSpark用于支票账户。大胆行动,如您所见,我们生活在创业的黄金时代。有许多现成的工具和服务可以节省我们的时间和金钱并提高我们的生产力。使用简单而乏味的技术,比以往任何时候都更有可能自己(或作为一个团队)创造对世界有用的东西。随着时间的推移,公司变得越来越小。你不需要雇用很多全职员工。您可以购买服务或外包工作来完成它。很多时候,创作和传播的最大障碍就是想得太多。该怎么办?那么该怎么办?小子,你太把自己当回事了。每个人都忙于自己的生活。在你证明自己值得关注之前,没有人会关心你和你创造的东西。即使你搞砸了原来的产品,也很少有人会注意到。“从大处着眼,把细节做好,并迅速做出反应!”只要您真正解决了问题,即使简单(甚至粗糙)的任务使用枯燥的技术也完全没问题。