(點擊上方藍字,快速關注我們)
編譯:伯樂在線/精算狗
如有好文章投稿,請點擊 → 這裡了解詳情
【伯樂在線導讀】:2010 年 5 月 21 日吃豆人遊戲 30 周年,Google 首頁在上午 9 點上線了一個可交互的塗鴉遊戲。幾個小時內,這個遊戲就讓全世界都為之瘋狂。不過塗鴉團隊開始陸續收到一個詭異 Bug 的報告。作者在本文中分享了這個 Bug 背後的有趣故事。
2010 年 5 月 21 日的那個周五對大多數人來說,可能都只是一個普通的周五而已。但對我來說,那一天可以說是最不同尋常的周五了。
那天我的推特癱瘓了。那天我跟我父親說了最後一句話。那天我讓數億人體驗了我做的東西。但是這裡的故事跟所有這些都沒有關係。本文講述了我是怎樣讓一些人覺得他們瘋了的。
2010 年我在 Google 工作,並被拉進了吃豆人塗鴉遊戲的研究和編程工作中。吃豆人塗鴉遊戲是 Google 為了慶祝這款經典電子遊戲誕生 30 周年而推出的,而且會放在 Google 的主頁上。在那天之前,我花了幾個月時間從頭寫完了所有的代碼(沒有任何效仿)。周五早上,太平洋時間 9 點,我們像全世界揭開了它的面紗。
這是首款像樣的交互型塗鴉,也是第一個能真正跟 Google 搜索框爭奪注意力的東西。所以,在眾多設計決策中,我們需要注意的是如何在推廣這款塗鴉遊戲和便於人們完成搜索並繼續他們的生活之間達到平衡。
在一番深思熟慮之後,我們做出了以下幾個決定:
如果訪客打開 Google 主頁超過了 10 秒鐘就自動開始遊戲(當然啦,如果他們點擊這個塗鴉,或者按下特別的「投幣」按鈕就能提前開始玩了)
來勢洶洶?可能吧。我們主頁上的可是吃豆人啊!我們對此感到非常驕傲,而且希望人們——他們還不習慣可以玩的 Google 主頁——能注意到它,能玩得開心。
即使在發布之前,那天已經像個不尋常的周五了。我們之前從未做過像個塗鴉一樣的東西。我和團隊裡的一些人通宵拍了照,還準備了一個吃豆人的內部比賽版本。就我個人而言,我還是嚇壞了。我是用戶體驗團隊的一名設計師。誠然,我的代碼通過了所有適當的審查,但是我還是不敢相信它能——一字不差地——出現在 Google 最有價值的資產上。
我們在上午 9 點打開開關。幾個小時內吃豆人遊戲就讓全世界都為之瘋狂。很快,我收到了如山洪般的反饋,以致於我根本不可能跟得上收到反饋的速度。我還突然被要求去參加新聞採訪。上面提到「我的推特癱瘓了」,其實可能是我把事情自私地過度簡化了(如果沒有整個優秀的團隊支持著我,這一切都不會發生),但是我也不認為有誇張的成分在裡面。一個小時內,隨著越來越多關於 Google 吃豆人的推特消息湧進來,推特開始向我們發送這樣的消息:
「推特過載了」
但是在所有的興奮之中——興奮的感覺被缺覺加強了,我們開始收到一個奇怪問題的報告。即,即使有些人沒有在玩吃豆人,也能聽到它的聲音。
我們最初忽略了這些投訴——「告訴他們關掉 Google 主頁就好了」——但是這麼做並沒有用。在四處研究、絞盡腦汁之後,我們發現罪魁禍首比我們想像得複雜,而且更迷人。
2010 年是火狐最好的一年。使用火狐瀏覽器的一部分人安裝了一個叫 CoolPreviews 的擴展,這樣將滑鼠懸停在連結上就可以快速預覽網頁。
在火狐瀏覽器打開的同時,該擴展就會啟動。並且在用戶不知情的情況下,它會立即在後臺打開一個隱形網頁,也就是 Google 主頁。
你很可能已經把事情發生的經過串起來了。在那個周五,google.com 自動打開有聲音的吃豆人塗鴉遊戲。如果你使用了裝有 CoolPreviews 的火狐瀏覽器,該插件就會在你啟動瀏覽器的時候,消無聲息地在後臺打開 Google 主頁,10 秒鐘之後……會莫名其妙地出現遊戲聲音。
想像一下,你在周五早上坐下來,打開電腦。對你來說,這個周五本沒有什麼異常的地方。你打開遊覽器;但可能並不了解 CoolPreviews,甚至是插件或者擴展的概念;不需要使用 Google,或者根本不知道 Google;可能也不知道用了什麼瀏覽器——或者什麼是瀏覽器。事實上,你甚至可能都沒在用瀏覽器;有可能它最小化了,默默地縮在屏幕下方的工具欄裡。可能你正在查看郵箱,或者為今天的第一輪紙牌遊戲熱身。
你幹什麼都無所謂。十秒鐘之後,你會從電腦的揚聲器中——知道怎麼調整音量嗎?知道電腦有揚聲器嗎?——聽到聲音。
這是一個隱形吃豆人遊戲的警報聲,它以最不尋常的方式滲透到你的電腦裡了。
重複。
可能你經歷過被朋友或者家庭成員用電腦問題糾纏的情況。他們不如你懂技術,再簡單不過的方法都能解決這些問題。你可能會輕蔑地問「你確定連上滑鼠了嗎?」、「老天,試試關掉大寫鎖定。」
現在來想像一下:如果他們其中之一在那個周五告訴你,他們的電腦莫名其妙發出警報一樣的聲音,你會怎麼說?
你會告訴他們,他們瘋了。他們可能也想過自己一定是瘋了。這全都怪我的代碼。
我不太記得我們到底是怎麼弄明白的。但是一個小時內,我們編寫了代碼並立即發布了一個雙重修復:
我們添加了一個可見的聲音開關,允許隨意開啟或者關閉遊戲的聲音:
前後對比。注意左下角的聲音按鈕。
/**
* Process a new Pac-Man direction requested by player
* using arrow keys or touch.
* @param {number} newDir New direction.
*/
PacManActor.prototype.processRequestedDirection = function(newDir) {
// Enable sound as long as the user hasn’t previously
// disabled it by clicking the sound icon.
if (!pacMan.userDisabledSound && !google.pacManSound) {
google.pacManSound = true;
pacMan.updateSoundIcon();
}
無論什麼時候遇到 bug,試著回答以下四個簡單的問題是很自然的:
發生了什麼?
怎麼修復它?
怎樣避免它再次發生?
責任人是誰?
這一次,前三個問題很容易:我們弄清楚、打好補丁、把這次的快速修復作為未來每一個塗鴉的最佳做法。
就最後一個問題來說…「責任人是誰?」很少是個好問題,但是一起來考慮一下:
這是我們的錯。我們本應該預見到這個問題的,對吧?但是看看所有這些巧合的聯繫:一個特定的瀏覽器,一個特定的異常插件,音量開啟,要等 10 秒問題才會發生。要想預見到這個問題需要多少想像力?
顯然,CoolPreviews 有一些拙劣的編程做法!我其實不確定他們為什麼要通過在後臺打開 Google 主頁來啟動——可能僅僅是隨機的默認項?或者是一種檢測網絡連接的方法?但是再次聲明, Google 主頁能承受很大的流量;並且關鍵地是,它之前從來不會發出任何聲音。所以假設在後臺打開 Google 主頁沒有任何風險並不離譜。
一開始安裝 CoolPreviews 是用戶的錯。如果一個問題是由於插件導致的,那卸載這個插件是用戶的責任。但是,你覺得一個人能意識到,導致電腦發出聲音的罪魁禍首是一個隨機的預覽擴展嗎?
瀏覽器開發商不該允許插件做類似瘋狂的事情。最近一段時間,瀏覽器很可能都能做到這一點。但是當時,網絡要更開放一點……畢竟,這個 bug 並不會威脅到你的隱私或者數據安全。
針對「責任人是誰?」這個問題,我能想到的最好答案是:網絡的複雜性。網絡已經出現了一段時間,涉及了很多利益相關者。網絡的開放性和寬容性,以及它的某些特點就這樣……自然而然地產生了。
想要因為網絡的複雜性而懲罰它,就像 Xerxes 因為大海吞沒了他差勁的橋就鞭打大海一樣。遠離網絡轉向本國客戶可能就是用一組問題來交換另一組問題。想要降低網絡的複雜性……事實上,很多聰明人把它作為工作或者閒暇時的消遣。
無論怎樣,都需要修復 bug。
修復 bug 的一種方式是建立複雜的機制,來提前識別問題並避免它們發生。當然,有時候你別無選擇,這是唯一的方法。任何與用戶數據、隱私、安全或者金融信息相關的事物都是禁區——需要謹慎地檢查並控制它們,沒有商量的餘地。
但是還有我們正在討論的這類情況。我已經在 Medium 上寫過其他奇怪的 bug,比如消失的 Polish S,以及 25 歲的系統字體從它的像素化墳墓中復活……現在是在小部分電腦上出現吃豆人的奇怪噪音。你無法完全預見那些遠不是在你的伺服器上發生的 bug,那些後果不是很嚴重的 bug。你可以試著阻止這些 bug 發生,但是假設這些 bug 會發生,並把精力用在建設基礎設施來進行 bug 的捕捉和儘快修復上會更容易。
我認為,修復吃豆人 bug 的真正成就是兩個緊湊循環:第一,支持團隊和產品部門的交流……第二,有預見能力的「熱點推送」基礎設施能讓我們的修復在幾分鐘內迅速實施,這對 Google 這種規模的公司來說是非常驚人的。
2010 年的這個周五對我來說是非同尋常的,但是我也知道我的工作讓這一天對許多其他人變得非同尋常。有些人想起了他們在 80 年代早期玩吃豆人的時光。有些人對 HTML 的可能性感到興奮。有些人只是玩得很開心然後繼續生活。
我對那一天最喜歡的反應之一是——我們將我小時候喜愛的那種遊戲廳精神帶到了 2010 年的 48 小時當中。
「我在這個咖啡店裡同時聽到了三個吃豆人的聲音。我有點愛你, Google 。」
我希望你不是遇到這個 bug 的人之一。如果你遇到了,而且我的代碼把你嚇壞了,抱歉。但是只要我還在寫代碼,總會有 bug 需要解決,無論是我的還是別人的。識別 bug、將它們按重要性排序,以及在發布之前(需要時間)或者發布之後(對人們產生影響)排除這些 bug ,在這三者之中找到一個平衡點將仍然是我面臨的更大挑戰之一。
2010 年另外一個有趣的部分是,我還得重新介紹吃豆人原作代碼的一個 bug……不過那是另一篇完全不同的文章了。
同時,我也想聽聽你的 bug 故事。在你需要負一部分責任的 bug 中,最奇怪、最意外、最酷的是哪個?把這類事情當做最好要修復和忘掉錯誤或者失敗很難。但是他們也告訴了我們一些事實,關於我們所創造的這個世界的事實,以及加強了其基礎的、奇妙的、瘋狂的複雜性。
感謝 Ryan Germick 和 Kris Hom 在這個塗鴉項目上的合作。想了解 Google 吃豆人的更多秘密?請觀看 Google I/O 2011 的一個訪談。創造一個不可能預測的情景需要多少情形交織在一起?如果你想要閱讀一篇相關的好故事,看看 Stanisław Lem 傑出的小說《機會鏈》(The Chain of Chance)。
這篇文章裡的照片拍攝於發布前的那個通宵。感謝 Dan Pupius 和 Jamie Talbot 對這篇文章提供的幫助。
看完本文有收穫?請轉發分享給更多人
關注「程式設計師的那些事」,提升編程技能
淘口令:複製以下紅色內容,再打開手淘即可購買
範品社,使用¥極客T恤¥搶先預覽(長按複製整段文案,打開手機淘寶即可進入活動內容)