两年的时间似乎在瞬间就过去了,当我要开始写些什么时,头绪太多,却突然不知道该从哪里开始。但是,有一点是确定的,这个故事,开始于 2010 年的 4 月 25 日。

两年前的这个时候,我在昆明,正在做一个对当时的自己来说,非常有挑战的项目——iPad 上的 Twitter 客户端。那个项目的代号叫 Toruk,这个名字来源于电影 Avatar,也就是里面那只最大的鸟的名字。那个时候的自己对于 iOS 开发的经验还只能算是刚刚开始,所以那个项目的进展并不是特别顺利。那段时间 Twitter 本身也刚刚将验证方式彻底切换到 OAuth,虽然那时我已经申请到了 xAuth 特权,但是还并没有完全弄明白整个过程。

4 月的某一天,发生了一件让整个 Twitter 生态圈震惊的事情,那就是,Tweetie,这个最优秀的第三方客户端,被 Twitter 收购了,并且变成了一款免费软件。大家都为 @lorenb 感到高兴,可是却也需要重新思考自己正在进行中的项目。

那时,我的结论是:

在一个自己不熟悉的平台上开展项目,是有风险的。所以,如果想控制风险,那么,要不自己做一个这样的平台?

那个时候我和 Olivia 刚刚签下两台国行 iPhone 3GS,生活中每天的相当部分的乐趣就是用手机上网。但是那个时候,除了 Tweetie 之外,并没有太多让我们想每天在手机上刷的东西。那个时候 Instagram 和 Path 应该都还只是他们创始人的模糊 idea 和频繁崩溃的 prototype。

所以,我最后决定,做一个只能在 iPhone 上刷的在线社区,同时借此机会,复活一个已经冰封 2 年的 idea——V2EX。

V2EX.com 是我在 2005 年夏天注册的一个域名,灵感来源于某个晴朗的在昆明的下午,当我靠在床上做白日梦时突然闪过的 4 个字母。而我后来为这 4 个字母找到的合理解释是——way to explore,我们探索这个世界的好奇心,及 way too extreme——当决定做一件事情时,就将其做到极致的态度。这两句话在后来 2006 年末被《三联生活周刊》的 Chen Sai 采访后,登到了杂志上。我一直保留着那本杂志,那是 2007 年初的一段温暖回忆。

但是,2010 年之前的 V2EX.com,其实发生了很多复杂的故事,最后的结果就是这个 idea 被我在 2008 年 2 月的时候,冰封。这些复杂的故事,我想我会在将来另外找一个机会,用另外一种方式讲出。而我现在想说的故事,是关于 V2EX 2.0 的。

V2EX 2.0

V2EX 2.0,在 2010 年 4 月 25 日晚上,上线。这个版本当时花了我两天时间,如果那个时候我能够提前预知后来要发生的许多事情的话,或许我会花更长一些的时间去做准备。可当时的想法就是那么简单,在昆明顺城的 Charlie Brown 咖啡花了两天时间之后,就上线了。

这个版本的 UI 设计只为 iPhone 进行了优化,因为当时我只打算在 iPhone 上用这个网站。而至于后台,则搭建在了 Google App Engine 上。因为在当时,这是一个简单、还算好用、并且,完全免费的 Python app hosting 环境。我从 2003 年开始就爱上了 Python,所以总是找机会在项目中使用 Python。

上线第一天,大概有几百人注册了 V2EX,这是第一天上线时的那个 launch 主题:

https://www.v2ex.com/t/1

上线之后不久,我在 GitHub 上分享了这个版本的源代码,代号 PB2,即 Projet Babel 2.0 的缩写。

桌面版本

上线大概两个月之后,女儿的出生,让我在回忆那段时间的时候,只想得起那个时候她可爱的小样子,却想不起那段时间我还做了什么。

在她满月之后,V2EX 2.0 的 desktop 版本才终于上线,在那之前,网站只有一个单栏结构的简单设计。而桌面版本的上线,让这个项目的增长开始发力,也终于可以在 Alexa 中看到一些数据了。

REWORK

Olivia 在怀着我们孩子的这 10 个月期间,和我一起做了一件很有意思的事情,那就是一起翻译了一本我们都很喜欢的书——37signals 的 Rework。在 2010 年 9 月初,我们终于完成了整本书的翻译和订正,并且把翻译过程放到了 V2EX 上。

然后,这本书在互联网上开始了一些让我们始料未及的传播,被 @Fenng 和 @hecaitou 在微博和豆瓣上介绍,然后我们的网站也终于迎来了第一次 down 机——503 Over Quota。当然,因为 Google App Engine 是不可能 melt down 的,只是我们不可能再在 GAE 的免费额度内运行了,于是,从 9 月开始,我们开始每个星期付费给 Google,以保证 V2EX 能够持续运转。

V2EX DNS

2010 年 10 月到 11 月,我在北京待了两个月,见了很多人,那是非常愉快的两个月。

我相信,人的思想,在受到触动之后,才会产生更多更有质量的思考。而 2010 年末的那两个月,自己真的受到了不少触动。

V2EX DNS 是在我从北京回到贵阳之后上线的一个小功能。这是一个公共 DNS 服务,除了可以提供 DNS 解析之外,还有几个特别功能:

  • 加速 App Store 下载,让你在使用 Wi-Fi 网络从 App Store 下载时,可以跑到满速
  • 加强你访问 Google 的某些服务时的稳定性
  • 设定 DNS 快捷方式,比如输入 v 就直接访问 www.v2ex.com

我为什么要做这个东西?可能真的就只有两个原因:

  • 大部分时候,从 App Store 下东西太慢了
  • 我喜欢折腾和基础网络协议有关的应用,这里面有很多乐趣

V2EX Workspace

我在 2010 年 12 月初的时候搬去了上海,不久之后 Olivia 带着小朋友也来到了上海。于是,2011 年整年的故事发生在了 3 个城市:上海,北京,纽约。

但是这一年间的故事实在是太过于复杂,我打算只回忆其中和 V2EX 有关的部分。

我在 2011 年 2 月的时候,开始构思 V2EX Workspace。构想中的 Workspace 是一款既能自用也可以服务于小团队的信息分享和整理工具。我在大概 8 张 A4 纸上画出了 Workspace 的原型,并且最终在 2011 年 10 月 10 日的时候上线了 V2EX Workspace

于是到了 2011 年末时,V2EX 相比最初的那个只能用 iPhone 访问的简单网站,已经变成了一个每天有 5000 独立访客,50000 以上 PV,同时带有工具属性的,创意工作者社区。

我希望 V2EX 成为一个创意工作者的社区。这个像直觉一样的想法对于现在的自己来说,直觉到甚至都不需要任何解释。

这其中还发生的一个小故事是,在 2011 年 3 月的那场地震后,我在网上看到了一篇关于核电站的英文文章,觉得其中的一些观点,可以用于解答当时很多人的很多疑问,于是我翻译了那篇文章,然后那篇文章被几乎全国的所有中文网络媒体转载,那几天,也成为了 V2EX 在 2011 年期间,访问量最高的几天。

Google App Engine

2011 年 11 月初,一件让我担心已久的事情,终于成为了现实——Google App Engine 的新定价模型生效。虽然我们很早就已经成为了 Google App Engine 的付费用户,但是新旧定价模型之间的巨大差异,还是让我感到非常——失望。

在旧的模型下,GAE 按照时间收费。概念就是,假设一个动态页面的生成需要 200 毫秒,那么也就是意味着,一个小时的 CPU 时间,可以足够生成 3600 * (1000 / 200) = 大约 18000 个动态页面。而 GAE 每天的免费配额是 6.5 个小时,超过的话,就需要花钱买。但是很便宜,只要花 $0.10 即可买到额外的一个 CPU Hour,足够服务 18000 个动态页面的时间。作为付费用户,旧模型并没有让我感到有什么特别大的问题。而从程序上来说,我需要优化的,就是页面的生成时间。

但是在新的模型下,除了按照程序的 Instance 启动运行时间收费外,对于数据库的读写也要按次数收费。具体的定价是,每 100 万次读 $0.70,每 100 万次写 $1.00。

这样的新定价模型带来的几个问题:

  • 对程序的优化重点,从优化时间变成了优化数据读写次数
  • 具有大量动态交互的应用,天然地就需要大量的读写,而不仅仅是 CPU time,因而在新定价模型下,代价就会非常巨大
  • 对于很多在初期需要 quick and dirty 验证想法的应用,为了省钱,不得不开始提早过度优化

我会在想,Google 为什么要对 App Engine 做那么巨大的一个改变呢?这个改变让很多人的账单翻了 10 倍不止。或许,他们如果不做这个改变,这个项目就会像 Code Search 一样被关闭?

Google 现在的主要策略是,要做一个能够和 Facebook 正面竞争的产品出来,也就是 Google+。而讽刺的是,如果当时 Mark Zuckerberg 的第一个版本的 Facebook 是运行在 Google App Engine 上的话,恐怕 Facebook 就永远都不会长到这么大了。

所以,V2EX 必须彻底离开 Google App Engine。

我后来在 Google 的一次活动中见到了 Bill Luan 栾跃,他是 Google China 的开发者关系负责人,我向他问起了 Google App Engine 的新定价问题,他问了我 3 个问题:

  • GAE 在国内是被墙掉的,你们怎么做到让用户可以访问的?
  • 你有多少用户?
  • 你为什么不向他们收费?

谢谢你,Bill。你的提问真的触动了我的很多思考。

V2EX 3.0

2011 年的 7 月中旬的时候,我在纽约待了一周,那是一段奇幻的回忆,在上海,我拿着一封介绍信,不用排队,在外交窗口答了 4 个问题之后拿到了签证,然后,去到了 New York Times 的总部,见到了他们的第四代传人 Arthur,向他演示了我做的东西。然后的然后,我去了 MoMA,在 top of the rock 看了日落,然后坐在第五大道路口的一个喷水池边座椅上,吃了一个 $2 的热狗,用 Apple Store 的 Wi-Fi 和 Olivia 通了 Facetime。

我感谢带给我这段奇幻回忆的 MMG,但最后还是在 2012 年 3 月末,离开了这个传统媒体集团。

然后,从 2012 年 4 月 1 日开始,和 Kai 一起,花了 20 天时间,我们从 0 开始,用 Tornado + Storm + Jinja2 完成了一个在功能上 95% 覆盖 PB2 的新程序,我们将这个项目取名叫做——PB3。

然后,我们在 4 月 22 日这天,从下午开始,花了整整 15 个小时,敲了 15 个小时的键盘,将一台 16G 内存 4 核的顶配 iMac 用到满,将 PB2 驱动的 V2EX.com 在 GAE 上的全部数据,通过 bulkloader 转换成了数百兆的 XML,再用程序将这些 XML 变成 SQL 和 PNG,然后解决和排除其中遇到的由 datastore 缺省值,和莫名其妙的控制字符导致的错误,然后在 4 月 23 日早上,由全新程序 PB3 驱动的 V2EX.com 上线。

PB3

很多时候,回忆过去并不是一件轻松的事,反而是既过不恋,未来不迎,当时不杂这样的人生态度却更让我感到轻松。所以,现在:

  • V2EX,一个开始于 2005 年我 20 岁时候的 idea,在 7 年之后,这过去的许多年中的一切意义,会让它变得更强大
  • 我们,已经有足够多的已经开始的,让我们兴奋和真正热爱的事物,周遭的世界没有变得更加复杂,只会更加简单和低熵
  • 我爱这个世界,我爱所有爱我们作品的人们,我们希望,V2EX 将能够成为那些怀着创意的人们的创意的一部分,帮助他们实现想法,找到自己真正的热情之所在,并坚持下去