弱智错误:我是如何毁掉一个网游公司的——How I Fired Myself.

2010年7月份,我22岁,在加州的一家网游公司工作。我刚毕业,这是我的第一份真正意义上的工作。我有了工资收入,有了自己的宿舍。我感觉长大了,头一次有这样的感觉。

有两个“工程师”在为公司的旗舰产品——一款RPG游戏——写代码,我是其中之一。我在大学里学的是哲学,这意味着,虽然我知道如何去思考、解决一个问题,但我对最佳实践方法、设计模式等方面的知识很缺乏。我完全倚仗基本的LAMP相关知识,对它们付出了极大的热情。

这款游戏的设计者(我们的老大)经常从暴雪公司出品的风靡世界的游戏“魔兽世界”中吸取灵感。在当时,魔兽世界里的“Raids”玩法在玩家中激起了前所未有的兴奋和热情。这个东西是我们特别想在我们的游戏中复制的功能。

我被分派去实现我们的游戏中的Raids。同事山姆被大量的重构工作纠缠住,于是我就幸运的有机会去开发一些新的令人兴奋的东西了。

我们的开发环境的一大特色是,我们开发代码直接连的是生产库。回想起来,这真是难以理解,我竟然没有询问这是为什么,真是一个笑柄。

我是使用一个MySQL客户端来查看数据库表,这个工具有个华而不实的OSXy接口的界面…远不如phpmyadmin。我的一部分测试工作涉及到手工的清除RAIDS表,然后用程序重建。

这种工作的单调让我精神恍惚,一个懒洋洋的下午,我发现自己昏昏欲睡,鼠标光标移到了USERS表达图标上,然后弹出右键菜单,点击‘clear’。

我的所作所为会带来的严重后果并没有立即击倒我。我起初只是感觉到一种灵魂出窍,好像是悬浮在黑暗的房间里,看见各位同事都勾着腰趴在发光的显示器上。

那么,究竟是什么后果呢?我们的游戏有上万个付费用户。用户花钱买装备,提升他们游戏中人物的能力。所有这些人物的数据都放在USERS表里,现在全没了。

大概一分钟之后,一个业务经理走了进来。“我感觉有什么地方出问题了”,她说。我回答说,“是的,我知道出了什么问题”。

我发现自己倚着一张桌子给数据库提供商Rackspace打电话寻求支持,耐心的听着他们的工程师解释说我们的数据库实例的备份两个月前就已经停止了。啊!

下午,一层又稠又密让人压抑的愁云充满了办公室的上空。大家知道有什么地方出来问题,但只有少部分人知道是什么问题。我被拽进了一个在会议室举行的“工程师+领导”的紧急会议。

CEO斜坐在桌子对面,看着我的脸,说,“你他妈干的好事!你让我们损失了数百万美元的收入”。他的合伙(通过Skype远程出席会议)插进一句话“你替自己祷告吧”。

整个公司在接下来的数天里都在做减灾控制。游戏开发运营上的工作全部停止。技术部员工试图通过其它数据表里的数据关系来尽可能的恢复USERS表。非技术员工来应付愤怒的客户,为那些声称记得自己游戏数据的人做记录。我这些天干脆就没回家。身上都发臭了。

一直都没有公开的信息表明我要为此全权负责。大家都收到了一份邮件,里面称这是一个“初级程序员”的责任事故。公司里只有我和另外一个人被看作是“初级程序员”。

不超过三天,很显然,所有人都知道了是我。大家开始用异样的眼光看我。少数几个人,对此表示同情。但大多数人,更多的是愤怒和不信任。对他们来说,是这个公司提供了他们这最好的工作机会。我把公司推向了困境,也同时把他们的幸福和生计推向困境。

我情绪低落,充满内疚和惭愧。在一个“全公司”的大会上我公开的进行了道歉。有人鼓掌。

一个月后,终于,我写了一封辞职信给CEO和项目经理。我离开了这个城市,头也不回的去了纽约。

[英文原文: How I Fired Myself ]

How I Fired Myself.

In July of 2010 I was 22 and working at a Social Gaming startup in California. I'd just graduated and this was my first real job. I had a pay check and an apartment. I felt grown-up, for the first time.

I was one of two 'engineers' writing code for the company's flagship product, an RPG. I'd studied Philosophy in college, and that meant that, while I knew how to think through a problem, my knowledge of best practices, and sensible design patterns was minimal. I wielded my basic LAMP knowledge, with incredible enthusiasm.

The game designers (my overlords) often took inspiration from World of Warcraft, the blisteringly successful MMO produced by Blizzard. At that time, WoW's 'Raids' feature, was being met by audiences with unsurpassed excitement and engagement. It was something that we wanted to emulate in our game very badly.

I was landed with the task of implementing Raids for our game. My team-mate (Sam) was stuck with an enormous refactor, and I felt lucky to be working on something new and exciting.

One of the peculiarities of my development environment was that I ran all my code against the production database. Looking back, it's baffling that we did this, and it's laughable that I didn't know enough to question it.

I would inspect MySQL tables using a client, that had a GUI with a slick OSXy interface .. a far cry from phpmyadmin. Part of my naive testing process involved manually clearing the RAIDS table, to then recreate it programatically.

The monotony of this task lulled me into a stupor, and one lazy Tuesday afternoon found me drowsy, cursor hovering over the USERS table icon, to then bring up its menu and click 'clear'.

The implications of what I'd just done didn't immediately hit me. I first had a truly out-of-body experience, seeming to hover above the darkened room of hackers, each hunched over glowing terminals.

So what were the implications? The game had tens of thousands of paying customers. Users who'd paid to buy special items within the game to enhance their character stats. All of these character stats were stored in the USERS table, now void.

About a minute later, one of the content managers walked into the room. "I think there's a problem", she said. I spoke up, "Yeah. I know what's wrong".

I found myself on the phone to Rackspace, leaning on a desk for support, listening to their engineer patiently explain that backups for this MySQL instance had been cancelled over 2 months ago. Ah.

By late afternoon, a greasy layer of uneasiness had settled thickly on top of the building. People knew that something was wrong, but only a few knew what was wrong. I had been pulled into an emergency 'engineers + higher-ups' meeting in the conference room.

The CEO leaned across the table, got in my face, and said, "this, is a monumental fuck up. You're gonna cost us millions in revenue". His co-founder (remotely present via Skype) chimed in "you're lucky to still be here".

As a company we spent the next few days doing damage control. All work on games ceased. The technical crew tried to stitch together a likely semblance of the USERS table, based on data in other tables. The non-technical crew dealt with angry customers, and did data entry, for those claiming to remember their stats perfectly. I for one didn't go home for three days straight. I stank.

At no point was it publicly announced that I was responsible for all this. An email was sent out claiming that a 'junior engineer' was responsible. I was one of two people who could be considered 'junior'.

Within three days, it was clear that everyone knew it was me. People treated me differently. For a select few, there was a new empathy. For most, there was anger and distrust. For those, this company represented simply the best job they'd ever had. I put the company in jeopardy, and thus their happiness and livelihood.

I found myself weighed down with feelings of guilt and inadequacy. I apologized publicly at a 'whole company' meeting one day. There was applause.

A month or so later I wrote a letter of resignation to the CEO and my PM. I left town the next day, headed ultimately for New York City.

标签: none