[翻译] Candy Japan有多少行代码

原文链接

How many lines of code is Candy Japan?

湾区日报短评

这是每月交$29,寄一盒日本零食给你的电商。Python + App Engine,集成 PayPal 与 Recurly 收钱,还有一些自动化的代码用来优化打印送货地址、退货的流程等。总共 8000 多行 Python 代码。
他是 2011 年开始做的,本文写于 2016 年。如果是 2018 年从头开始做的话,可以不用写这么多代码,有很多现成的 API 几行代码就能搞定了。

Candy Japan 有多少行代码?

在日本, 有很多非常特别的糖果并没有对日本以外的国家发售, 所以我创立了一个网站叫”Candy Japan”. 我们美两周就会向用户发送一些仅在日本出售的糖果.

在我创立这个网站之初, 并没有”盒子订阅”这种服务, 所以我需要自己来写所有代码. 这篇文章讲的就是我究竟谢了多少东西..

如果你不愿意听我讲, 这里有一个14分钟的视频

技术栈

回到2011年时候, 市面上没有订阅平台, 甚至”订阅”这个词也没什么人在用. 为了写这个网站, 我把网站建立在Google App Engine 上, 语言是python. 这个网站还集成了Paypal和Recurly (一个信用卡支付的中间件). 除了 MixPanel和 Google Analytics之外没有别的依赖包.

界面

网站的登陆页104行代码. 你们觉得Candy Japan有多少行python代码? 找个地方写下你的答案吧, 等你看完文章后核对一下看你离答案有多远. HTML 和 CSS代码不计算在其中, 仅仅是python代码

除了登录页, 用户还能看见一些别的页面, 比如说 FAQ, 之前发送过给用户的糖果列表以及他们的图片. 这些图片存储在 App Engine BlobStore. 加起来一共377行代码.

界面之下

如果说登录页和其他用户可见的页面是冰山一角的话, 那么水面以下有一些什么呢?

Paypal集成

网站有一些代码用于和paypal通信. 在我实现这个的时候, 我当时使用的API叫做 “Paypal Payments Standard NVP API”. NVP代表着”Name-Value Pair”, 是一种比JSON格式更为痛苦的通信方式. 这个集成一共有712行代码.

Recurly集成

Recurly是一个中间件, 负责用户和信用卡付款付关口的. 由于它的设计比较容易集成, 所以这个集成只有222行代码.

诈骗检测

互联网上总会有坏人. 有时候一些信用卡泄漏或者有商家的数据库被拖库都会造成一批可用的信用卡信息泄漏. 坏人会使用这个偷来的信用卡信息在网上消费.

礼品卡是具有很强吸引力的诈骗目标. 因为不仅仅犯罪分子会检查卡号是否可用, 而且还可以获得可能具有一定转卖价值的礼品卡. 诈骗犯们可以在ebay上卖他们的卡, 然后让我退款. 我所面临的情况非常糟糕, 因为ebay会认为他们正在购买一张合法的卡.

很长一段时间内, 网站上是没有礼品卡的, 但是当年底节假日来临时, 我觉得重新使用礼品卡, 但可能仅仅是Paypal可用, 因为paypal有很好的反诈骗手段.

为了能分辨好人和坏人, 我写了587行诈骗检测代码.

购物车

体会过诈骗的为题之后, 我不得不停止使用recurly的购物车插件, 因为这个插件的发诈骗手段不够.

为此, 我开发了自己的购物车流程来获取所有可能产生的信号, 这样也可以让我更好的实现反诈骗. 这里有510行代码.

发货

在接受订单之后, 我需要把包裹准确的发送到客户的地址. 如果只有几个订阅, 那么手工操作会很容易. 当你有几百个订阅用户之后, 你会需要一套系统来帮你实现这个事情.

我写了一些代码来过一遍所有的账号, 尝试去找到所有的收获地址. 但是, 这个过程也不是永远顺利的, 因为存在有很多corner case. 例如, 账号可以被暂停, 所以我需要手工去调整. 还有一些情况是, 我会给一些并没有付款成功的用户发货, 因为我相信这部分潜在用户会成为正式用户的.

当你每月制作超过1000张运单时, 你的结果是你每月会花费不少的金额在运单上. 我写了一些代码尝试将运单压缩成小的pdf格式, 然后在原来的运单纸上同时打印多张. 与原来的情况相比, 这样子做能够更快, 而且费用会降低.

跟发货相关的代码有1165行.

退货

有时候, 邮局会给我们退货. 地址可能是错的, 或者用户搬家了, 没有人接受包裹, 又或者是没有人在家接受包裹.

人工寻找出这些退货的盒子属于哪个账号, 并发送邮件通知用户和调账账号是需要额外的经历的. 为了减轻工作上的负担, 我在盒子上会打印一个条形码, 当邮局退货时, 我只需要扫描一下条形码就可以了. 以往需要10到15分钟来处理退货包裹的流程现在只需要10秒就可以完成.

这个功能一共有505行代码.

后台工具

后台管理工具其实有很多种. 比如说, 可以直接看数据库的数据,这可比看账户信息的工具要方便很多. 你还可能会需要根据名字, 地址, 或者订阅号来搜索账户.

另外, 实现这个功能也是为了生成一些报告, 比如说税务报表之类的. 这个后台管理工具有634行代码.

市场营销相关

当你上线了一个网站时, 通常来说, 人们并不会发现你这个网站的存在. 在创立之初, 拉拢客户其实不是特别困难. 只需要在类似于”Product Hunt”这类型的网站上发一些帖子. 有一些博客主(网红)也会关注你的网站, 因为这是一个新网站.

但是, 当你的网站存在了一定时间之后, 你的网站已经不是”新”网站了, 热度下来之后不会再有新用户会听说你的网站了, 除非你持续不断地发广告. 这其实非常耗费精力和钱财, 你最后还是会选择去写一些代码来测量你的市场和广告效果.

首先, 因为我需要知道我的目标客户是什么样子的, 我会在订阅时加入一个调查问卷.

你还需要知道你有多少预算可以花在广告上, 因此你会去计算保留率之类的一些数据. 有一些方法可以让更多的访客变成用户, 比如说A/B测试或者给放弃购物车的访客发送提醒等等.

另外一种营销方式是给博客主(网红)们提供免费的小样, 但是这个需要手工修改数据库, 有一点点麻烦, 因为每周我都会收到好多好多问我要小样的请求. 为了减少在这上面花的时间, 我为博客主(网红)们准备了特别的注册通道. 在这个过程中去掉了付款这一步, 取而代之的是我会审查每一个请求, 同意或者拒绝.

所有市场营销相关的功能一共需要1219行代码.

邮件功能

当一个新用户注册后, 他会收到一个欢迎邮件. 当博客主(网红)们的申请被同意后, 你会需要发送邮件通知他们. 还有你会需要发送一些提醒给用户, 让他们收到盒子之后去评价.

有时候亲自联系用户是一个比较好玩的事情, 但是整套系统也可以是全自动的.

这个功能花费了253行代码.

代码总量

一共有8341行代码.

你猜得怎么样? 如果你的答案是 5000 - 15000之间, 我会说这个猜测是个优秀的猜测. 不错的猜测应该是3000 - 30000这个范围. 还行的猜错是 1000 - 50000 之间. 如果你猜1000行一下, 我会觉得受宠若惊. 如果你猜50000以上, 这又不是汇编程序.

学习到什么

我用了几个月来开发这个网站, 然后接下来的5年不断地往网站上添加功能.

如果你现在想创立一个订阅盒子服务, 我会推荐你使用一些现成的平台, 例如Subbly 或者 CrateJoy.

将我的网站拆分为CMS(可能是WordPress)并将订阅部分分开是有意义的。可以通过CMS管理网站上可见的所有内容(常见问题解答,糖果图片,登录页面,博客)。这会减少一些尝试成为CMS的代码,但在增加不必要的复杂性的同时做得很差.

应用引擎NoSQL数据存储不适合运行报告.您最终编写的Python代码可以在SQL中更好地表达. 否则我很高兴选择App Engine.