有用的涨知识网有用的涨知识网

有用的涨知识网
一起学习分享有用的涨知识网

两个PythonBug干倒了估值水平1.6万美元的子公司

整理 | 苏宓公司出品 | CSDN(ID:CSDNnews)

2011 年,金融投资家、原 Netscape 创始人 Marc Andreesen 的一句「应用软件正在毁灭世界」,深思众人。从此大部份人电子电路的大门渐渐开启。不过在百家争鸣应用软件驱动产品的背后,往往两个 Bug,极有可能崩解大部份。

近日,一位信息技术写手分享了一则奥尔奈真实发生的两个 Bug 事件,因为两个毁灭性的应用软件版本正式发布间接导致了曾可以与 Reddit 比肩的信息技术中文网站 Digg 四分五裂,最后让另一家曾经估值水平高达 1.6 万美元的子公司被以 50 万美元价格收购。

作为心路历程者,应用软件工程师 Will Larson 在 2018 年以《Diggs v4 launch: an optimism born of necessity.》该文,回顾了当初 Digg 子公司的发展情况与个人参与的整个遭遇。果真没想到的是,经历了两年更新改写,再到费时两个月的寻找 Bug,最后的难题竟是与 Python 的两个函数相关,不过由此可见再想复原,似乎大部份人已无计可施。借以,透过这篇该文也想给力战在一线的开发人员避一避坑。

背景

另一家名为 Digg 的子公司,成立于 2004 年,是两个以信息技术为主的新闻报道公交站点。与当时其它新闻报道中文网站略有不同的是,Digg 允许使用者把自己收集的新闻报道和其它网页内容汇集在一起进行提交,接着 Digg 透过外部演算法机制将新闻报道截取到中文网站的主页,用于展示。

来自维基

这样做有两个好处就是,Digg 将该文的甄选权利交给了使用者,可以让她们自己甄选出倍受关注和有用的该文,接着透过订户形式,订户数量高的就会自动被推荐上主页,由此让更多的人看到。在当下这种新奇的做法,也让很多使用者有了目的性,Digg 的规模也渐渐扩大。

当然,大部份事情也有反之亦然,也所谓「引火上身」。

Will Larson 在 2018 年正式发布的昌明里提到:过去一年里,Digg 过得异常艰难。她们的 CEO 在我加入的前一晚离开了;高级工程师们不声不响地离开了子公司,并丢下了她们剩在子公司的朋友们,降低了子公司的生产力;具有TNUMBERETDATE的犯罪团伙避免出现了她们的演算法,利用投票表决与订户的形式,出售她们中文网站头版头条的访问权,并威胁她们要及时修改演算法以防止她们的误用;她们的开发人员自然环境配置工具坏了,没有人知道如何复原它们,所以她们给新员工重新配置了近期离任同僚的丧尸软件包。

要说一家市场前景良好的子公司,为何会沉沦如此,一方面,必然有其外部的战略难题,另一方面,也与外部的竞争自然环境相关。Will Larson 称,受到外部的影响因素之一便是与 2011 年 Google 推出了 Panda 反垃圾中文网站演算法相关。

那时,Google Panda 的主要目的是将质量低、含有垃圾内容的网页或中文网站排名降低,使得高质量的内容得到应有的合理排名。

为了重振旗鼓,也为了改变现状。Digg 决定对中文网站的 v3.5 进行改写,将正式发布 Digg v4 版本。

改写 Digg v4 的办公现场,来源 Will Larson 博客

殊不知,这一仓促的决定也注定了其仓促的收场结局。

Python 函数的默认参数的一次失败案例

慢慢地难题开始显现。

由此可见的上午 10 点左右,有人问研发团队什么时候开始切换新版本,工程师回答称:"她们已经开始重新配置 V3 服务器了。" 不过,由于容量太小了,该团队决定重新映像大部份现有的服务器,接着在新的应用软件栈中重新配置。

她们也的确这么做了,两个小时后,当全部量切换完成,旧中文网站页面取而代之的是 Digg v4 版本,大部份人员也长舒一口气。

不过刚高兴没多久,大家发现多数的页面呈现无法加载的状态。初期,该研发团队将难题定位为 Cassandra 集群,因此她们扩大了对 memcache 的使用,作为保护 Cassandra 的两个写通缓存。

几个小时之后,访客页面没有难题,但是已经登录的使用者却仍然看到报错的页面,如 MyNews,该页面类似于个人中心,会呈现使用者与每篇该文互动的记录以及个性化的新闻报道页面。无奈之下,研发团队将登录使用者的默认页面改为 TopNews,这样使得使用者登录之后可以使用中文网站。

次日,MyNews 已经彻底无法访问,中文网站每隔四个小时之后就会出现故障。除此之外,还有几十个小难题也在不断出现。

于是,她们再次做了两个大胆的决定——从头开始写 MyNews 页面。起初,该团队以为 Cassandra 的缓存击穿了 memcache,破坏了相关功能。后来她们用 Redis 改写了,并实施了两个分片的 Redis 集群,并成功将原来的迁移到新开发上。

遗憾的是,研发团队还是需要每隔四个小时就手动启动每个进程。

简单来看,相当于难题的根源还是没有找到,只是用了一种麻烦的替代方案来短暂支持。没想到的是,这个 Bug 耗费了该团队两个月的时间来追踪。

好在最后还是发现了难题的所在。Digg 的 API 服务器是两个 Python Tornado 服务,它将 API 调用到 Python 后端层,即 Bobtail(前端是 Bobcat),其中两个最经常被访问的端点是用来透过使用者的名字或 ID 来检索使用者。因为它支持按名字或 ID 检索,所以它把两个参数的默认值都设置为空列表。

def get_user_by_ids(ids=[])

不过,Python 只在函数第一次被评估时初始化默认参数,这意味着每次调用函数时都会使用同两个列表。

在这种情况下,每次调用时,使用者的 ID 和名字都被附加到默认列表中。几个小时后,这些列表开始在每次请求中检索数以万计的使用者,甚至压垮了 memcache 集群,导致了页面崩掉。

透过两个简单的例子可以直接看出:

def f(l=[]): l.append(1) print(l)f()f()f()输出[1][1, 1][1, 1, 1]

最后

事情最后的结局是,Digg 团队复原了该漏洞,Digg v4 完全正常启动。而距离此事过去了一周后,Digg 迎来了最后一任 CEO;两个月后,Digg 开启第三轮裁员;一年后,Digg 子公司被 Chartbeat 的母子公司 Beatworks 以 50 万美金的价格收购。

谁曾想,Digg 也是互联网的宠儿,估值水平曾达到过 1.6 万美元,登上过《商业周刊》的封面,Google 也曾计划以 2 万美元将它收入囊中。殊不知,正是这一次的失败更新让 Digg 迅速损失了人气,以及外部一些管理难题,让竞品迅速超越。从此,一家创业明星子公司就此陨落。

Will Larson 在文末写道,「Digg V4 有时会被作为毁灭性正式发布的例子,隐含的教训是她们不应该正式发布它。我曾经一度同意这个观点,但现在我认为她们推出的决定是正确的。因为,她们的流量明显下降,每个月都在损失一大笔钱。如果她们能在推出伟大的东西和糟糕的东西之间做出选择,肯定会更倾向于推出伟大的东西,但她们却选择了最后一次挥棒。」

另外,他还表示,即使是现在,我也不确定当初那样两个有才干的团队是如何进行这种愚蠢的展示的。

归根结底,这是程序员一次技术失败导致的惨痛教训。也有不少网友评论道,「动态类型一时爽,代码重构火葬场」。

参考链接:

https://lethain.com/digg-v4/?continueFlag=0a23bc7c424c6abc75f97cbaaa2d55ff

https://weibo.com/u/1642628345

未经允许不得转载:有用的涨知识网 » 两个PythonBug干倒了估值水平1.6万美元的子公司
分享到: 更多 (0)

有用的涨知识网 带给你想要内容

联系我们