<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 5.另一條路   1995年的夏天,我和我的朋友羅伯特·莫里斯^決定創業。那時,正趕上網景公司的股票即將上市^^,各種公關活動如火如荼,媒體都在談論網絡商務。當時大約有30家左右的網上商店,全部是手工制作網頁。如果網絡商務真要大規模發展,必須用專門的軟件制作網上商店,所以我們決定動手寫這樣的軟件。 ^「Robert Morris(1965—),現任麻省理工學院計算機系副教授。1988年,寫出了網上第一個蠕蟲程序;2005年,與作者共同創立了風險投資公司YCombinator。——譯者注」 ^^「網景公司的股票于1995年8月9日上市,發行價格28美元一股,盤中最高價格為74.75美元,報收在58.25美元,漲幅高達208%。這直接促成了網絡創業熱,帶動了雅虎、eBay、亞馬遜的上市,開創了互聯網公司的上市熱潮。——譯者注」   第一周,我們打算寫一個傳統的桌面軟件。沒過幾天,我們就想了另外一個方法:可以讓軟件在服務器上運行,瀏覽器作為操作界面。我們試著重寫,讓所有操作都通過網絡完成。那時已經很清楚了,這就是我們的方向。如果軟件運行在服務器上,一切都會簡單得多,無論對于用戶,還是對于我們。   事實證明我們是正確的。我們的公司后來被雅虎收購,現在的名字是Yahoo Store。我們的軟件是最受歡迎的網上商店生成器,用戶超過2萬人。   創立Viaweb的時候,我們對別人說軟件運行在服務器上,幾乎沒人懂這是什么意思。直到一年后,Hotmail^開始運作,人們才有點兒明白這個概念。現在,大家都知道了這是一個可行的方法,而且我們還有了專門的名字:應用服務供應商(Application Service Provider),簡稱ASP。我認為,大量的下一代軟件都將采用這個模式。甚至最大的輸家——微軟公司,看來也明白了,部分軟件從桌面消失將是不可避免的。如果軟件從桌面移到服務器上,對于開發者來說,一切將發生根本性的變化。本文將站在先行者的角度,描述我們正在經歷的種種令人驚嘆的變化。由于軟件轉移到服務器的趨勢才剛剛開始,所以我下面所寫的是對未來的憧憬。 ^「Hotmail于1996年7月4日上線,是第一批瀏覽器界面的電子郵件服務提供商。它首創了用戶可以在郵件中使用HTML標記語言(因此Hotmail的原始寫法是HoTMaiL),并且每位用戶有2MB的免費存儲空間。——譯者注」 ### 下一個潮流?   回顧桌面軟件時代,我想我們會為人們忍受的種種不便驚嘆不已。這就好像汽車剛誕生的時候,車主忍受的不便會令現在的人們驚嘆不已一樣。汽車誕生的頭二三十年,你想當車主,非得成為汽車專家不可。但是汽車用處太大了,很多不是專家的人也想擁有它們。   計算機現在就處在這個階段。一旦擁有了桌面電腦,你就被迫不情愿地學習很多東西,了解它的內部運作機制。超過一半的美國家庭擁有電腦,我媽媽就有一臺,用來收發郵件和記賬。幾年前,她收到蘋果公司的一封來信,上面說她可以優惠購買新版的操作系統。老太太被這些術語嚇壞了。一個65歲的婦女,只用電腦收發郵件和記賬,卻被迫要和操作系統打交道,搞清楚要不要安裝一個新版本,這真是太過分了。普通用戶根本沒必要知道“操作系統”這個詞,更不要說“驅動程序”和“補丁”了。   現在,可以有另一種方法發布軟件,用戶再也不會被迫當上系統管理員了。互聯網軟件運行在服務器上,用戶界面就是網頁。對于普通用戶來說,使用這種新型軟件將更容易、更便宜、更機動、更可靠,通常也比桌面軟件更強大。   使用互聯網軟件,除了軟件本身,大多數用戶不需要知道別的事情。所有那些亂七八糟、經常變動的東西,都放在服務器端,由精通此道的專業人員維護。所以,大多數時候,你不需要一臺全功能的電腦(即本身可以運行軟件的電腦)。你所需要的設備只要有鍵盤、屏幕、瀏覽器就夠了,可能還有無線網卡。這樣的設備沒準就是指手機。不管它是什么,它肯定是一種消費類電子產品,價格大概在200美元左右,所以人們主要根據外觀選擇購買。你支付的上網費會超過硬件費用,就好像現在你的電話費超過電話機的價格一樣^。 ^「有些公司生產輕量級的消費類電子產品,它們意識到“服務才賺錢”以后,往往就會把在線服務與硬件捆綁在一起賣。這個模式效果不好,第一個原因是,消費類電子產品和在線服務是兩種類型的業務,需要兩種不同的公司來做;第二個原因是,消費者不喜歡硬件和服務捆綁在一起收費。吉列公司贈送刀架,只靠刀片賺錢,這個模式可能只對吉列公司有效,而且剃須刀是低值易耗品,對用戶承擔的責任遠遠小于一個可以上網的終端設備。手機制造商就很滿足于只賣硬件,不捆綁服務,不試圖分享電信公司的收入。這個模式應該也是互聯網終端設備的商業模式。如果某家公司生產出一個外觀精美的小型設備,里面包含了瀏覽器,可以通過任何ISP連接上網,那么全國的技術愛好者都會愿意購買的。」   數據在客戶端與服務器之間走一個來回大概耗時0.1秒,所以與用戶密集互動的軟件(比如Photoshop)仍然會把數據處理的部分放在桌面端。但是看看大多數人使用計算機的目的,你會發現0.1秒的時滯根本不成問題。我媽媽其實真的不需要一臺桌面電腦,完全可以用互聯網軟件替代。像她這樣的電腦用戶有很多。 ### 用戶的勝利   我家附近,一輛汽車的保險杠貼著一張粘紙,上面寫著“太麻煩,不如死”(death before inconvenience)。大多數人,在大多數時候,總是選擇最省事的做法。如果互聯網軟件能夠擊敗桌面軟件,一定是贏在更方便這一優勢上。無論從用戶的角度還是從開發者的角度來看都是如此。   使用那些純粹的互聯網軟件,你只需要一個能夠上網的瀏覽器即可。所以,它不受地域限制,在任何地方都可以使用。但是,如果你使用安裝在計算機上的桌面軟件,那么就只能在這臺計算機上使用。更糟的是,你的文件也存在這臺計算機上。隨著互聯網越來越深入人心,桌面模式的弊端也就越來越明顯。   最典型的例子就是網絡界面的Email。大家現在都認定,隨時隨地都應該可以收發Email。如果Email是這樣,為什么日程表不能這樣呢?如果你能看到同事的文檔,為什么不能編輯它呢?為什么你的數據非得禁錮在一臺遙遠寫字桌上的電腦里呢?   “你的電腦”這個概念正慢慢成為過去時,取而代之的是“你的數據”。你應該可以從任何電腦上獲取你的數據。或者更準確地說,在任何終端設備上獲取你的數據,終端設備不一定是電腦。   終端設備不應該存儲數據,它們應該像電話那樣。事實上,終端設備最后可能就會變成電話,或者反過來,電話變成終端設備。終端越做越小后,你可以每天把它帶在身上,就更沒理由把數據存儲在上面了,萬一遺失或者被竊就很麻煩。把PDA遺忘在出租車上無異于損失一塊硬盤,唯一的區別是你的數據現在掌握在別人手里,而不是被擦掉了。   有了互聯網軟件,你的數據和軟件本身都不保存在終端設備上,不用安裝就能使用。既然不用安裝,也就不用擔心安裝出錯了,再也不會有應用軟件與操作系統不兼容的問題了,因為軟件與你使用的操作系統徹底無關。   由于沒有安裝這一步,所以在“購買”之前試用互聯網軟件將變得非常普遍、非常容易。只要聯上網站,應該就能免費試用該網站提供的服務。Viaweb的整個網站處處都是鼓勵用戶試用的提示。   試用demo之后,就可以登記成為正式用戶了,只需要填一個很簡單的表單。這應該是用戶需要做的最后一點“多余的事情”了。使用互聯網軟件,你不需要為新版本付出額外的費用,或者做額外的準備工作,甚至可能你都不知道軟件已經升級了。   現在,升級不再對用戶形成大的沖擊。久而久之,軟件變得更強大了。這需要開發者付出一定的努力。他們必須正確地設計軟件,使得它能夠平滑升級,不讓使用者感到困惑。這就是互聯網軟件面臨的新問題,不過解決辦法是有的。   所有用戶都使用同樣版本的互聯網軟件,bug一發現就會立刻得到糾正。所以,它的bug應該比桌面軟件少得多。在Viaweb,我記得未解決的bug最多一次也總共只有十個,大部分問題都是一發現就得到了解決,不會遺留下來。這要比桌面軟件小一個或幾個數量級。   互聯網應用程序能夠同時被多人使用,所以非常適合團隊協作性的工作。大多數用戶現在還不了解軟件協同辦公,否則估計他們會強烈要求大部分應用程序都具備這個功能。舉例來說,允許兩個用戶同時編輯一個文檔是一項很有用的功能。Viaweb允許多個用戶同時制作一個站點,主要原因倒不是因為用戶要求,而是考慮到這是開發軟件的正確方式,但是最后發現大多數用戶都希望這樣。   如果使用互聯網軟件,數據會更安全。即使硬盤損壞的風險依然存在,但是與用戶沒有關系,他們可以從此不關心這件事。風險發生在機房。互聯網軟件的運營方會備份數據,不僅因為它們的系統管理員很關心這一類事情,還因為一且數據丟失,公司將面臨極大的麻煩。如果用戶自己的硬盤壞了,他們不會發狂,因為不能去責怪別人;如果一家公司丟失了他們的數據,他們會懷著超乎尋常的怒火,沖著這家公司發飆。最后,互聯網軟件不太容易感染病毒。如果客戶端只運行一個瀏覽器,病毒運行的概率就比較小,本機的數據不會遭到破壞。而專門攻擊服務器端的病毒比較容易防御^。 ^「安全問題的關鍵是不要有漏洞,而不是任何設計上的決策。服務器軟件的性質決定了開發者對漏洞會加倍注意。而且,服務器被入侵會使得運營公司遭受巨大損失,所以它們為了在行業中生存下去,可能也會對安全問題備加關注。」   對于用戶來說,使用互聯網軟件不會有太大的壓力。我覺得,大多數Windows用戶使用桌面軟件的時候都感到緊張,會有相當大的心理壓力。釋放這種壓力,對你的產品將是一種巨大的推動。 ### 代碼之城   對于開發者來說,互聯網軟件與桌面軟件最顯著的區別就是,前者不是一個單獨的代碼塊。它是許多不同種類程序的集合,而不是一個單獨的巨大的二進制文件。設計桌面軟件就像設計一幢大樓,而設計互聯網軟件就像設計一座城市:你不僅需要設計建筑物,還要設計道路、路標、公用設施、警察局、消防隊,并且制定城市發展規劃和緊急事件的應對方案。   Viaweb的軟件包括:與用戶直接對話的一些大型應用程序、被這些大型程序使用的程序、常駐后臺報告系統出錯的程序、重新啟動出錯部分的程序、生成統計報告或數據庫索引的程序(偶然運行)、回收資源或者移動及恢復數據的程序(手動運行)、偽裝成用戶的程序(為了測試系統和發現bug)、診斷網絡故障的程序、完成備份的程序、對外提供服務界面的程序、實時顯示服務器狀態和訪問數據的程序(很受用戶歡迎,對我們也是必不可少的)、修改后的開源軟件程序(包括修正bug)以及許許多多的配置和設定文件。在我們被雅虎買下以后,Trevor Blackwell寫過一個令人嘆為觀止的程序,可以在不關閉網站的情況下,將網上商店轉移到另一個機房的服務器上。此外,還有向系統管理員發出傳呼信號的程序,向用戶發傳真和電子郵件的程序,引導完成信用卡交易的程序,在套接字、通信管路、HTTP請求、SSH、UDP數據包、共享內存、文件之間互相通信的程序。一部分Viaweb服務器上故意不安裝某些程序,因為保證Unix系統安全的關鍵之一就是不運行那些不需要的東西,降低服務器被侵入的可能性。   光有軟件還不夠,我們還花了許多時間琢磨服務器應該如何配置。我們自己搭服務器,不僅為了省錢,也是為了讓機器完全滿足我們的需要。我們還考慮哪些ISP連接主干網的帶寬比較大。我們一直與RAID供應商保持聯系。   但是,硬件需要考慮的地方,不僅僅在于怎么才能避免出問題,還在于怎樣才能最大地發揮它們的作用。只要你控制了硬件,就能為用戶提供更多的功能。如果你的產品是桌面軟件,你就只能規定硬件的最低配置,無法為了某一個功能而要求用戶增加硬件。但是,如果你控制了服務器,你就能輕而易舉地增加功能,使用戶可以發出尋呼、發送傳真、通過電話操作網站、使用信用卡付款等。你所需要做的只是安裝相關的硬件。我們總是在尋找通過硬件增加新功能的方法,因為這可以贏得用戶,還可以讓我們超越那些不直接控制硬件的競爭者(他們要么出售桌面軟件,要么通過ISP分銷互聯網軟件)。   由于互聯網應用程序由多種軟件而不是單獨一個二進制文件構成,所以可以使用多種編程語言開發。如果你的產品是桌面軟件,一般來說,你總是被迫采用與操作系統一致的語言,也就是C和C++。所以,這些語言就被認為是“正統的”軟件開發語言(非技術人員尤其可能這樣想,比如經理層和風險投資家)。但是,這其實是一個偽信號(artifact),不能因為桌面軟件是這樣開發的,就認定所有軟件都是這樣開發的。對于互聯網軟件,你可以使用任何你想用的語言^。當今,許多頂尖黑客使用的語言與C和C++大相徑庭:Perl,Python,甚至還有Lisp。 ^「1995年我們創立Viaweb的時候,Java applet被認為是互聯網軟件的解決方案。但是我們覺得,applet采用的還是過時的概念,它還是要求下載軟件到客戶端運行。更好更簡單的方法,應該是所有的工作都放在服務器端完成。我們在applet上面浪費了一點時間,還好沒延誤什么,但是數不清的其他創業公司經不起引誘,掉進了這個泥潭,它們幾乎都沒有逃脫失敗的命運。」   對于互聯網軟件,沒人規定只能使用某些語言開發,因為所有的硬件都控制在你手里,你想要用什么語言,就能用什么語言。不同的語言適合不同的任務,你應該根據不同場合,挑選最合適的工具。尤其是在競爭者存在的情況下,“可以這樣做”就變成了“必須這樣做”(詳見后文),因為如果你不利用語言的優勢,那就會聽任對手超過你。   我們的大多數競爭者使用C和C++,這使得他們的軟件明顯不如我們,因為(不考慮其他原因)他們無法解決CGI腳本不能識別用戶狀態的問題。如果用戶想要修改表單的部分內容,你不得不把表單的所有內容都放在同一個頁面上,然后在最下面放一個“更新”按鈕。正如我將在第12章中解釋的,通過使用Lisp這種許多人眼中的教學語言,我們使得Viaweb編輯器更接近桌面軟件帶給用戶的體驗。 ### 軟件的發布   互聯網軟件帶來的最大變化之一,就是軟件發布方式的改變。對于桌面軟件來說,發布新版本是一個很痛苦的過程,整個公司不得不使盡全力,滿頭大汗地擠出一大塊巨型代碼。從過程和結果上來看,無異于一次分娩。   互聯網軟件則完全不同,就像你寫給自己用的程序一樣,修改起來很方便。軟件的發布過裎可以分解為一系列的漸進式修改,而不是猛地推出一個大幅變動的版本。常見的桌面軟件可能一年發布一到兩個新版本,而我們在Viaweb經常是一天發布三到五個版本。   一旦采用了這種新模式,你就會知道發布方式對軟件開發的影響有多么重大。桌面軟件開發之中的許多棘手問題,都是源自于它的那種災難性的發布方式。   如果一年發布一個新版本,你很可能會以打包方式處理bug,把它們留著,然后一次性全部解決。在發布新版本前,你可能會修改和更換一半的代碼,從而又引入無數新的bug。接著,質量監控人員(Quality Assurance)開始測試新代碼,逐一列出新發現的bug,你再按照這張清單把它們一個個消除。通常沒辦法把清單全部做完,它隨時都在增長,說實話,誰也不確定它到底會有多長。這就好像在足球場上撿小石塊一樣費勁,你永遠不知道為什么軟件內部會出這么多問題。最好的結果也不過是,你得到了一個統計學意義上“合格”的版本。   對于互聯網軟件來說,大部分的變化都是細微和漸進的,所以引入bug的機會比較小。而且,在發布前測試的時候,你知道應該最仔細地測試哪個部分——顯然就是你修改過的部分。這使得你對代碼的掌握變得牢固得多。一般來說,這時候你確實是對軟件內部的情況一清二楚。當然,這不是說你把所有代碼都裝在了腦子里,而是說你閱讀代碼的時候,非常自如流暢,不會像偵探破案那樣苦思冥想,而是像飛行員那樣,瞄一眼儀表板,就對飛行狀況胸有成竹。   桌面軟件導致了bug的宿命論。你很清楚,發布出去的軟件肯定有bug,你甚至早就準備好了應對機制(比如發布補丁)。既然如此,bug再多一點又何妨?沒過多久,你要發布下一個版本了,你明知其中某個操作完全不能使用,但還是照樣發布。蘋果公司前幾年就干過這種事。他們必須發布新版操作系統了,壓力越來越大,發布日期已經推遲了四次,無法再推了,可是有些部分還一點兒沒寫(比如CD和DVD操作的部分)。怎么辦?他們就把沒寫完的操作系統發布出去了,用戶必須日后自己動手安裝缺失的部分。   互聯網軟件的發布規則是:它運行不了,你就無法發布;一且它能運行了,你就可以立刻發布。   這個行業的老手可能會想:你說得好聽!軟件運行不了,就不發布,但是如果你已經對外承諾了明確的發布日期,到時卻沒有準備好,怎么辦?這個問題聽起來有道理,但是事實上,你不會對互聯網軟件做出這樣的承諾,因為它根本沒有“版本”這個概念。你的軟件是連續性漸變的,某些更新也許比較重大,但是“版本”這個概念不適用于互聯網軟件。   如果你還沒忘記Viaweb的舊事,你可能會覺得我這么說聽上去很奇怪,因為那時我們總是宣布將有新版本推出。這只是公關伎倆啦,我們知道媒體喜歡聽到版本號。如果你發布一個大的版本更新(版本號的第一位數發生變動),它們就會以大篇幅報道;如果你發布一個小的版本更新(版本號小數點后發生變化),它們最多只用一段話提一下。   我們的一些競爭對手的產品是桌面軟件,確實有版本號。對我們來說,這種發布方式只表明他們的落后,但是他們卻因此把媒體的目光都吸引過去了。我們不想做局外人,所以也開始為自己的軟件加上版本號。什么時候需要媒體宣傳了,就開出一張單子,上面總結了自從上次“發布”以來,我們新增的所有功能,然后在上面填一個新的版本號,發出一個新聞稿,宣布新版本已經準備就緒了。真是神奇啊,從來沒有人看穿我們的把戲。   到被收購的時候,我們已經這樣干了三次,所以已經到了第四版。如果我沒記錯的話,那時是4.1版。Viaweb變成Yahoo Store以后,媒體的曝光就沒有那么必要了。所以,雖然軟件一直沒有中斷開發,但是版本號卻悄悄地被放棄了。 ### 軟件bug   互聯網軟件的另一個技術優勢在于,你能再現大部分的bug。用戶的數據都在你的硬盤上。如果某個用戶使用軟件時出錯了,你就不必像開發桌面軟件那樣苦苦猜測到底發生了什么事情。一般來說,只要用戶通過電話向你描述一番,你就能把問題再現出來。如果你的程序中有自動偵測錯誤的代碼,那么不用等到用戶找上門,你可能已經知道哪里出錯了。   互聯網軟件每時每刻都在被使用。你的代碼一上線,就會經歷嚴酷考驗。bug很快就會浮出水面。   軟件公司有時會受到指責,因為他們竟然把發現bug的任務交給用戶去完成。說實話,我其實提倡這種做法。對于互聯網軟件,這樣做的好處很多,因為它的bug相對比較少,而且處理周期比較短。我們連續不斷地發布新版本,所以bug就比較少。我們能夠再現用戶遇到的問題,又能在修復后立刻發布,使得用戶不用等很長時間,所以大部分bug的處理周期都比較短。我們的bug數量一直不多,以至于沒有必要使用一個正式的bug追蹤系統。   當然,在發布之前,你應該對修改之處進行測試,避免出現重大的bug。難免會有一些bug成為漏網之魚,不過它們純屬罕見情況下才會發生的個案,在真正接到用戶投訴之前,幾乎不會影響到什么人。只要你能立刻解決bug,對于普通用戶來說,他們就會覺得你的軟件幾乎是亳無問題的。我覺得,普通的Viaweb用戶可能一個bug都沒遇到過。   解決新代碼的bug要比解決歷史遺留代碼的bug容易。在自己剛剛寫好的代碼中,找出bug往往會比較快。有時,你只要看到出錯提示,就知道問題出在哪里,甚至都不用看源碼,因為潛意識中你已經在擔心那個地方可能會出錯。如果你要解決的bug出自于6個月前寫好的代碼(假定你一年發布一個新版本,那么6個月就是發現bug的平均時間),那么就麻煩了,就要大費周章了。那時,你對代碼也已經不熟悉了,就更可能采用危險的方式解決問題,甚至引入更多的bug^。 ^「這個觀點引申自特雷弗·布萊克韋爾(Trevor Blackwell)的話,他說:“隨著軟件規模的增大,開發成本指數式上升。這可能是因為修正舊bug的原因。如果bug都能被快速發現,成本的上升形態就能基本保持線性。”」   早一點發現bug就不容易形成復合式bug,也就是互相影響的兩個bug。舉例來說,一個bug是樓梯很滑,另一個bug是扶手松了,那么只有當這兩個bug互相作用時,才會導致你從樓梯上摔下來。在軟件中,復合式bug是最難發現的bug,往往也會導致最大的損失^。傳統的方法是:“把軟件徹底拆開,將所有bug統統清理干凈。”這樣做難免產生一大堆的復合式bug。如果軟件是經常性發布,每次只有小幅度的變化,那么就不容易產生復合式bug。這就好比做掃除:你一直在打掃大廳,掉落在地板上的東西會被立刻清理,省得它們時間一長與其他東西粘在一起。 ^「復合式bug有一個子類型:兩個bug是互相彌補的,好比“負負得正”,軟件反而能正常運行。這種bug可能才是最難發現的bug。當你修正了其中的一個bug,另一個bug才會暴露出來。這時對你來說,你會覺得剛才修正錯了,因為那是你最后修改的地方,你就懷疑自己在那里做錯了,但是你其實是對的。」   有一種編程方法叫做“函數式編程”(functional programming),它對你會有幫助,可以避免一些副作用。函數式編程在學術文獻中研究得比較多,在商業軟件中用得比較少。但是,對于互聯網軟件,它卻很有用。很難用純粹的“函數式編程”完成整個程序,但是它可以用來編寫一些重要的部分,使得這些部分易于調試,因為它們不包含“狀態”(state),非常便于不斷進行小幅的修改和測試。我大量使用這種方法開發Viaweb的編輯器,我們自己的腳本語言RTML就是一種純粹的函數式編程語目。   桌面軟件行業的人可能很難相信,找出Viaweb的bug幾乎成了一種游戲。因為軟件發布以后,大多數bug都是罕見情況下才會發生的個案,受到影響的用戶往往都是高級使用者,他們喜歡試驗那些不常用的、難度大的操作。高級使用者對bug的容忍度比較高,尤其如果這些bug是在開發新功能的過程中引入的,而這些新功能又正是他們所需要的,他們就更能理解了。事實上,因為bug不多,你只有經過一些復雜的過程以后才會遇到它們,所以高級使用者往往因為發現了bug感到很得意。他們打電話給客服時,多半是一副勝利者的口吻,而不是怒氣沖沖的樣子,好像他們擊敗我們得分了一樣。 ### 客戶支持   當你可以再現錯誤時,你開展客服支持的方式就變了。大多數軟件公司將客戶支持看作提高客戶滿意度的一種方式。在這些公司看來,要么是客戶打電話來,報告一個已知的bug,要么是客戶執行了錯誤的操作,你必須判斷出他到底什么地方做錯了。這兩種情況對公司的知識積累都沒有太大益處。所以,你開始覺得客戶支持是一件令人頭痛的事情,決定將客服人員與開發人員盡可能分離。   Viaweb不是這樣。我們的客戶支持是免費的,因為我們希望知道用戶的反應。如果他們使用時遇到困難,我們希望立刻知道,這樣就能再現錯誤、解決問題、發布新版本。   所以,Viaweb的開發人員總是與客服人員保持密切聯系。客服人員坐在距離程序員只有9米的地方,知道自己可以隨時打斷程序員的工作,提交新證實的bug的報告。遇到重大bug,我們就算在開董事會,也會馬上回來修改程序。   我們的這種方法讓所有人都感到滿意。客戶很高興,撥打廠商服務熱線是免費的,而且還被當作通風報信的人,受到鄭重對待。客服人員也喜歡這樣,因為這使得他們可以幫助用戶,而不是對著用戶讀操作手冊;程序員喜歡這樣,因為他們能夠再現bug,而不是通過模糊不清的二手報吿了解bug。   我們的政策是當場修復bug,這改變了客服人員與黑客之間的關系。在大多數軟件公司,客服人員是低工資的邊緣人,黑客則是呼風喚雨的主宰者。這些公司有各種各樣的bug報告流程,伹是幾乎都是單向式的:使用者打電話給客服人員報告bug,客服人員填寫某種形式的表格,傳遞給程序員(可能會經質量監控部門之手),程序員把bug寫入待解決問題的清單。Viaweb不是這樣,在收到使用者的bug報告之后一分鐘內,程序員就會對站在身邊的客服人員說:“沒錯,你是對的,這是一個bug。”客服人員從黑客嘴里聽到“你是對的”,會感到歡欣鼓舞。客服人員告訴我們發現bug的時候,他們心里懷著期待,就好像小貓想讓別人知道自己抓住了一只老鼠一樣。這也使得客服人員在判斷bug嚴重性時格外小心,因為這關系到他們的聲譽。   我們被雅虎收購后,客服人員被移到離程序員很遠的地方。直到那時,我們才意識到客戶支持實際上就是質量監控,也是某種程度的市場營銷。除了記錄bug,客服人員還必須大概了解相關知識,回答與bug相關的一些問題、解釋令使用者迷惑不解的功能等^。有時,他們也扮演了使用者的代理人,我們會問他們哪個新功能是用戶更想要的,他們總是能做出正確的回答。 ^「我們在Viaweb舉辦過一個比賽,看誰能說出我們軟件中最差勁的地方。兩位客服人員并列第一,我至今想起他們的敘述都不寒而栗。比賽一結束,我們立刻修復了那兩個問題。」 ### 全身心投入   能夠即時發布軟件,對開發者是一個巨大的激勵。步行上班途中,我經常會想哪些地方還需要變動,然后當天就予以實現。一些重大功能也是這樣來的。即使某個功能要花兩個星期(或者更長時間)開發,我也很確定,一旦寫完就可以立刻看到效果。   如果軟件的新版本要等到一年后才能發布,我就會把大部分新構思束之高閣,至少過上一段時間再來考慮。但是,構思這種東西有一個特點,那就是它會導致更多的構思。你有沒有注意過,坐下來寫東西的時候,一半的構思是寫作時產生的?軟件也是這樣。實現某個構思,會帶來更多的構思。所以,將一個構思束之高閣,不僅意味著延遲它的實現,還意味著延遲所有在實現過程中激發的構思。事實上,將一個構思束之高閣,甚至會限制新構思的產生。因為你看一眼堆放在一邊、還沒有實現的構思,就會想“我已經為下一個版本準備了很多新東西要實現了”,你就懶得再思考更多的新功能了。   大公司的做法不是立刻實現新功能,而是先對新功能做一個計劃。我們在Viaweb就是因為這個原因而遇到了麻煩。投資者和分析家會問,你們對未來有何計劃。真實的回答是,我們沒有任何計劃。我們有改進的想法,但是如果我們想到應該怎么改進,就已經把它實現了。接下來六個月我們要做什么?所有能想到的最佳改進。我不知道自己是否有膽量公開這么說,但這是實話。計劃這個詞,只是將構思束之高閣的另一種表達方式。只要想到好的構思,我們就立刻著手實現。   Viaweb和其他許多軟件公司一樣,大部分代碼都有明確的負責人,而且只有一個。如果你負責某件事,那就真的是你負責。除了你以外,沒有人能批準(他們甚至都不知道)這部分代碼的發布。如果你出錯了,沒有人會提醒你,唯一的代碼保護機制就是你的羞恥心,你不想被同事當成傻瓜,這就足矣。我這么說或許會讓人誤以為Viaweb的代碼是漫不經心地編寫出來的。實際上我們的開發進度很快,但是把代碼放到服務器上發布之前,我們會深思熟慮。提高軟件可靠性的關鍵在于開發時全神貫注,而不是降低開發速度。正是因為飛行員全神貫注,他才能在夜間讓一架18噸重的飛機以225公里的時速平安降落在航空母艦的甲板上,做得比小孩子切面包還要安全。   當然,這樣寫軟件也有局限。它適用于小型的、由優秀可靠程序員組成的開發團隊,不適用于大型的、充斥大量平庸之輩的軟件公司,在那里不是程序員想出好的構思,而是一個委員會集體批準壞的構思。 ### 逆向的《人月神話》^ ^「《人月神話》(The Mythical Man-Month)是布魯克斯(Frederick Brooks)所寫的一本軟件項目管理名著。所謂“人月”就是一個人在一個月內所能完成的工作量。假如某個項目預估需要12個人月,那么派4個人處理這個項目,理論上需要3個月,派6個人則只需要2個月。但是,布魯克斯認為這種換算機制在軟件業行不通,是一個神話,因為軟件項目是交互關系復雜的工作,需要大量的溝通成本,人力的增加會使溝通成本急劇上升,反而無法達到縮短工期的目的。在本質上,軟件項目的人力與工期是無法互換的,當項目進度落后時,光靠增加人力到該項目中,并不會加快進度,反而有可能使進度更加延后。(該書英文版已由人民郵電出版社出版。)——譯者注」   幸好開發互聯網軟件需要的程序員比較少。我曾在一家中等規模的桌面軟件公司工作,那里的工程部規模就超過100人,但是其中只有13人負責產品開發,剩下的人負責軟件發布、軟件移植以及其他事情。開發互聯網軟件,你最多只需要那13個人,因為不存在軟件發布、軟件移植以及其他事情。   Viaweb的開發者只有3個人^。我一直在不停地招聘,壓力很大,因為我們要把公司賣掉。我們很清楚地知道,買家不愿花大價錢買下一個只有3個程序員的公司。(解決方法:雇更多的人,在公司內創設其他項目,讓他們去做。) ^「羅伯特·莫里斯寫了客戶下單的前臺訂單系統,特雷弗·布萊克韋爾寫了圖片系統和后臺管理系統(商家用來處理訂單、査看統計數據、修改設置等),我寫了站點生成器(商家用來搭建網站的外觀)。訂單系統和圖片系統的開發語言是C和C++,后臺管理系統主要是Perl,站點生成器是Common Lisp。」   開發軟件需要的程序員人數減少,不僅意味著省下更多的錢。正如《人月神話》一書中所指出的,向一個項目增加人手,往往會拖慢項目進程。隨著參與人數的增加,人與人之間需要的溝通呈現指數式增長^。人數越來越多,開會討論各個部分如何協同工作所需的時間越來越長,無法預見的互相影響越多越大,產生的bug也越多越多。幸運的是,這個過程的逆向也成立:人數越來越少,軟件開發的效率將指數式增長。我不記得我們在Viaweb開過討論如何編程的會議。步行去吃午飯的路上,我們就能把該說的話說完,從來沒有例外。 ^「這里的“指數式”(exponentially),我用的是口語中的表達方式。更合適的詞應該是“多項式似的”(polynomially)。」   如果要說有什么缺點,就是由于開發人員比較少,每個程序員都必須承擔一點兒系統管理的責任。當你在服務器上發布軟件時,必須有人監控服務器,但是由于人員太少,監控員只能由開發人員兼任。Viaweb有許多系統組件,變動非常頻繁,導致應用軟件和系統軟件之間的界線很難區分。硬性指定一條界線將限制我們的開發。所以,雖然我們總是安慰自己,公司運營很快就能走上正軌,一兩個月后就能平穩發展,那時就可以雇一個專職的系統管理員讓他專門負責服務器了,但是這個愿望一直沒有實現。   只要你還在很活躍地開發產品,就免不了要親自做系統管理,我認為沒有其他可能。如果你夢想寫完代碼,向服務器遞交(check in),然后就可以回家,一天工作結束,這在互聯網軟件身上肯定沒有實現的可能。互聯網軟件是活的,每時每刻都在你的服務器上運行。一個嚴重的bug影響的可能不是一個用戶,而是所有用戶。如果某個bug破壞了硬盤上的數據,更是必須馬上修復,諸如此類。我們的心得是,第一年之后就不必每分鐘都盯著服務器了,但是對新變動的部分一定要密切關注。不要在半夜里發布代碼,然后回家睡覺。 ### 關注用戶   互聯網軟件不僅把開發者與他的代碼更緊密地聯系在了一起,而且把開發者與他的用戶也更緊密聯系在了一起。財務軟件公司Intuit的銷售方式很出名,他們的銷售員會在軟件零售店里向顧客做自我介紹,然后請求顧客跟他們回公司,以便進一步了解軟件。如果你親眼見到某人第一次使用你的軟件,你就會知道軟件的哪個地方最打動他。   軟件應該做到用戶認為它可以做到的事情。但是,你不知道用戶到底怎么想,除非你親眼看到他們如何使用你的軟件,相信我,看到和看不到大不相同。互聯網軟件能夠讓你前所未有地了解用戶行為。你不必再人為挑選一個小型的用戶樣本,進行重點觀察。每個用戶的每一次點擊你都可以看到。所以,你不得不仔細斟酌到底要看哪些行為,因為你不應該侵犯用戶的隱私。但是,即使是最常見的統計項目,也能提供大量信息。   因為你能得到用戶數據,所以就不用依賴基準測試^了。基準測試不過是在模擬用戶,而你現在能看到真實的用戶。你想知道應該優化什么地方,那就登錄到服務器,看看什么程序最消耗CPU。你也會知道什么時候應該停止優化,當我們后來發現Viaweb編輯器的瓶頸是內存而不是CPU時,就知道可能應該停止優化了,因為我們沒辦法壓縮用戶數據的大小。(唉,其實是有辦法的,但是做起來很不容易。) ^「基準測試(benchmark test)指的是先設置一個基本的數據環境,測試應用程序的表現,然后把這個表現當作“基準”(benchmark),用來比較其他情況下應用程序的表現。——譯者注」   效率對互聯網軟件至關重要,因為硬件費用由你支付。你的資本支出成本除以服務器所能支持的最大用戶數量,就是你為每個用戶付出的成本。如果你的軟件效率高,你就能比同樣硬件配置的競爭對手多發展用戶,獲得更多的利潤。我們在Viaweb的時候,每個用戶的硬件成本大約是5美元,現在應該更低,可能比把第一個月的賬單寄給他們的成本還要低。如果軟件效率足夠高,每個用戶的硬件成本現在可以接近免費。關注用戶不僅有助于優化程序,還有助于指導你的設計。Viaweb的腳本語言RTML允許高級用戶自定義頁面風格。我們發現RTML有點像留言本,用戶通過它向我們提建議,因為只有當預設的頁面風格不能滿足用戶需求時,他們才會使用RTML。舉例來說,編輯器的工具欄原先是橫跨頁面的,但是許多使用RTML的用戶將它放在左下方,于是我們也就把工具欄的默認位置調整為左下方了。   最后,通過關注用戶,你可以知道他們在使用軟件的過程中什么時候遇到了麻煩。因為顧客總是對的,所以這表明你需要修正軟件。推廣Viaweb的關鍵,就是允許訪問者在線試用。這可不是僅僅展示幾張圖片,而是真的讓你使用我們的產品。只需要五分鐘,你就能自己搭建起一個真實可用的網上商店。   幾乎所有我們的新客戶都是通過在線試用發展起來的。我想大多數互聯網軟件都是如此。如果用戶堅持從頭到尾成功地完成在線試用,那么表明他們喜歡這個產品。如果他們感到很困惑或者很乏味,就不會堅持試用到底。所以,只要我們能讓更多的訪問者堅持完成在線試用,我們的用戶增長率就會提升。   我研究了用戶點擊行為,發現在某一個地方,在線試用的用戶會停止前進,改為點擊瀏覽器的“后退”按鈕。(如果你寫過互聯網軟件,你會發現“后退”按鈕是設計中最費腦筋的問題之一,很有意思。)所以,我就在那個地方加了一條提示,告訴用戶已經接近終點了,提醒他們不要點擊“后退”按鈕。這時,互聯網軟件的另一個好處就體現出來了,你做了修改,馬上就可以得到反饋。完成在線試用的用戶比例從60%立刻上升到了90%。由于新增付費用戶的數量是完成在線試用的用戶數量的一個函數,所以與修改前相比,我們的收入增長了將近50%。 ### 金錢問題   20世紀90年代早期,我讀過一篇文章,它稱應該讓用戶像訂報紙那樣按照使用時間長短訂購軟件的使用權。第一眼看上去,這種說話好像很滑稽。但是后來,我意識到這個觀點是對的,因為它反映了軟件開發的現實:軟件開發不是靜態的,而是一個持續不斷的動態過程。按照傳統的軟件銷售模式,廠商每推出一個新版本,就會強迫現有用戶重新出錢購買,然后安裝升級,只有這樣廠商才能持續不斷獲得收入。我認為,如果公開收取軟件的訂閱費,而不是讓用戶購買軟件的所有權,操作起來會更自然、更簡便。“訂報紙模式”正是互聯網軟件天然的收費模式。互聯網軟件不可能用自由軟件的模式經營,只能由商業性公司來經營。因為經營互聯網軟件要承擔很大的風險,會產生大量支出,沒有人會免費做這件事情的。   對于軟件公司來說,互聯網軟件是一個很理想的收入來源。你每個季度的銷售額不是從零開始,而是擁有一個持續的現金流。因為互聯網軟件每時每刻都可以升級,所以你不用擔心做錯什么事。事實上,你不可能真的做錯什么事,因為如果用戶痛恨你對軟件的修改,你馬上就會知道。你也不會有壞賬的煩惱,如果誰不付錢,你就停止對他的服務。此外,你也不可能遇到盜版問題。   沒有盜版是一種“優勢”,但也是一個問題。一定數量的盜版對軟件公司是有好處的。不管你的軟件定價多少,有些用戶永遠都不會購買。如果這樣的用戶使用盜版,你并沒有任何損失。事實上,你反而賺到了,因為你的軟件現在多了一個用戶,市場影響力就更大了一些,而這個用戶可能畢業以后就會出錢購買你的軟件。   只要有可能,商業性公司就會采用一種叫做“價格歧視”(price discrimination)的定價方法,也就是針對不同的客戶給出不同的報價,使得利潤最大化^。軟件的定價特別適合采用價格歧視,因為軟件的邊際成本^^接近于零。這就是為什么很多軟件的Sun服務器版本比Intel服務器版本更貴的原因,因為如果一個公司購買Sun服務器,就表明它很有錢,不在乎對設備的投資,那么為什么不向它開個高價呢?盜版實質上是一種價格歧視,只不過針對的是最底層的消費者。我覺得,軟件公司明白這個道理,所以故意對某些盜版行為睜一只眼閉一只眼^^^。由于互聯網軟件無法盜版,所以軟件公司必須想出其他策略推廣軟件。 ^「價格歧視無所不在,所以當我發現1936年的《魯賓遜—帕特曼法案》規定價格歧視在美國屬于非法行為時,不免感到震驚。這個法案看來并沒有得到嚴格執行。」 ^^「“邊際成本”是一個經濟學概念,指下一個單位產品的生產成本。軟件的邊際成本就是復制代碼的成本,所以接近零。這意味著,對軟件公司來說,增加一個用戶幾乎沒有增加生產成本。它與價格歧視的關系在于,邊際成本越低,廠商的定價空間就越大,它可以針對特定消費者定出很低的價格,從而達到擴大銷售、利潤最大化的目的。——譯者注」 ^^^「Naomi Klein在No Logo一書中說,有些服裝品牌的目標客戶是“都市青少年”這些品牌的專賣店對店內偷竊行為就睜一只眼閉一只眼,因為在它們的目標市場中,那些在店內行竊的“顧客”也是流行風尚的帶頭人,可能會帶動本品牌的銷售。」   相比桌面軟件,互聯網軟件賣得更好,因為它易于銷售。你可能認為,購買商品時,人們是先做出決定,然后再購買,好像這個行為分成兩個獨立的步驟。創立Viaweb之前,我也是這樣想的,不過我從未對這個問題進行過深入思考。事實上,第二步對第一步有反作用,如果某樣商品購買起來很困難,人們就會改變主意,放棄購買。反過來也成立,如果某樣東西易于購買,你就會多買一點。自從有了亞馬遜網上書店,我買的新書比什么時候都多。互聯網軟件提供的服務可能是世界上購買起來最方便的東西,如果你試用完demo再買,那就更是如此了。購買時,除了輸入信用卡號碼以外,用戶不應該再被要求做其他事。(要求用戶做得越多,你擔的風險就越大。)   軟件公司有時會采用分銷模式,讓ISP分銷互聯網軟件。這樣做很不好。服務器必須在你自己的控制之中,因為你需要不斷改進硬件和軟件。如果你放棄對服務器的直接控制,你就放棄了互聯網軟件的大部分優勢。我們的幾個競爭對手就采用分銷模式,那是作繭自縛。我常常想,這可能因為他們受到某些西裝革履、衣冠楚楚的家伙的壓制。后者只看到分銷管道的銷售潛力是多么令人興奮,卻沒有意識到這將毀了他們正在銷售的產品。通過ISP分銷互聯網軟件,就好比讓自動售貨機出售壽司。 ### 目標客戶   誰是互聯網軟件的目標客戶?Viaweb一開始就把個人和小企業當作目標客戶。我認為這是互聯網軟件的通行規則。這些客戶決策比較靈活,又需要低成本的新技術,所以他們更愿意嘗試新事物。   互聯網軟件往往也是大公司的最佳選擇。(雖然大公司反應遲鈍,不一定能意識到這一點。)最好的內部網(intranet)就是互聯網(Internet)。如果一家公司采用互聯網軟件,那么這家公司的軟件系統將表現得更出色,服務器將得到更好的管理,員工可以不受地域限制使用這個系統。反對者往往聲稱互聯網軟件不安全。如果員工可以很容易地登錄,那么壞人也可以很容易地登錄。一些大型批發商就不太愿意使用Viaweb,覺得不能把客戶的信用卡資料交給我們,而是放在自己的服務器上更安全。可能沒法很婉轉地向他們表達我們的觀點,但是事實上,他們的服務器就是沒我們的安全,我們對數據的保護幾乎肯定比他們好。想想看,誰能雇到更高水平的網絡安全專家,是一個所有業務就是管理服務器的技術型創業公司,還是一家服裝零售商?不僅因為我們有技術水平更出色的員工,還因為我們比他們更關心數據的安全。如果一家服裝零售商的服務器被入侵,最多只影響到這家公司本身,這件事也很可能在公司內部被掩蓋起來,最嚴重的情況下可能還會有一個員工被解雇。但是,如果我們的服務器被入侵,就有成千上萬家公司可能受到影響,這件事也許還會被當作新聞發表在業內新聞網站CNet上面,使得我們的生意做不下去,不得不關門歇業。   如果你想把錢藏在安全的地方,請問你是選擇放在家中床墊下面,還是放在銀行?這個比喻對服務器管理的方方面面都適用,不僅是安全性,還包括正常運行時間、帶寬、負載管理、備份等,都是我們占優。只有把這些事情都做對,我們才能保證自己生存下去。服務器管理對我們是生死攸關的大事,玩具制造商如何看待對人體不安全的玩具,或者食品制造商如何看待感染了沙門氏菌的食品,我們就如何看待有缺陷的服務器管理。   某種程度上,使用互聯網軟件的大公司就好像把它的IT部門外包出去了。雖然聽起來很激進,但是我認為這樣做很好。比起自己雇用系統管理員,外包可以讓這些公司得到更好的服務。非IT公司的內部系統管理員沒有行業競爭壓力,日久天長就會變得工作效率低下、不負責任。要讓員工表現優秀,必須有競爭壓力。銷售員必須面對消費者,程序員必須面對競爭對手的軟件,但是內部系統管理員就像老年單身漢,能夠激勵他的外部壓力幾乎沒有^。我們在Viaweb就有足夠的外部壓力,使得我們努力前進,不會被別人甩在后面。我們直接接到客戶的電話,而不只是同事的電話。如果服務器被入侵,我們會急得跳起來。即使過了這么多年,我現在想起當時的情景,腎上腺素還是會迅速上升。 ^「不少公司都很想知道,什么事情可以外包,什么事情不可以外包。一個可能的答案是,公司內部所有不直接感受到競爭壓力的部門都應該外包出去,讓它們暴露在競爭壓力之下。(我這里所說的“外包”,指的是聘請另一個公司來執行,而不是指把業務部門轉移到海外。)」   所以,互聯網軟件通常也是大公司的正確選擇。可是,大公司太遲鈍,不到最后一刻想不通這一點,就像以前他們遲遲沒有發現桌面電腦才是計算機發展的方向一樣。這也是大公司往往會購買很貴商品的原因之一,所以你高額投入,向大公司推銷你的商品,也就變得值得了。   有錢的客戶傾向于更貴的選擇,即使便宜的選擇更符合他們的需要,他們也不會買。這種現象普遍存在。原因就是,那些索要高價的人將更多的錢投入推銷。Viaweb不采用這種做法。互聯網咨詢公司從我們手里搶走了幾個高端商家。他們說服這些商家,讓他們相信更好的選擇就是,花50萬美元,將網上商店開在自己的服務器上。結果是意料之中的,當圣誕節購物高峰來臨時,服務器的負載陡然上升,這些商家一個接一個地發現,他們的選擇并不是那么正確。Viaweb的系統遠比大多數商家自己搭建的系統更高級更先進,但是我們付不起高額的宣傳費,無法讓他們明白這一點。我們的宣傳費每月只有300美元,無法派遣一個衣冠楚楚、言之鑿鑿的團隊到客戶公司做演示。   有一段時間,我們構思了一種新類型的服務,名叫“Viaweb黃金版”。它比我們普通類型的服務貴十倍,但是功能一模一樣,唯一的區別就是有專人穿著西裝面對面把它賣給你。我們從未把這個構思付諸實踐,但是我很肯定,要是真推出的話,一定會有商家購買。   大公司付出的高價之中,很大一部分是商家為了讓大公司買下這個商品而付出的費用。(如果國防部花1000美元買一個馬桶座圏,部分原因是要讓國防部買下它本身就需要花很多錢。)這就是為什么公司內部的局域網軟件明明不可取、但是還會繼續存在并且不斷發展的一個原因。這樣的軟件更昂貴,但是你對這個難題就是無能為力。所以,最好的安排就是把個人和小企業客戶放在第一位。其他的客戶該來的時候就會來。 ### 桌面電腦   在服務器上運行軟件并不是新鮮事。事實上,舊有的模式就是這樣,大型機的應用程序都是在服務器上運行的。如果這個模式真那么好,為什么以前沒有獲得成功呢?為什么隨著桌面電腦的興起,大型機變得黯然失色呢?   剛開始的時候,桌面電腦似乎對大型機不構成威脅。最早的桌面電腦用戶只是一些黑客或者業余愛好者(那時,別人就是這么稱呼黑客的)。他們喜歡微型計算機的原因只是價格便宜。有史以來第一次,個人擁有了自己的電腦。“個人電腦”(PC)這個詞現在是日常語言的一部分,但是當它剛出現的時候,聽上去簡直就是癡心妄想,就像今天我們聽到“個人衛星”(personal satellite)時的那種感覺。   為什么桌面電腦大獲全勝?主要是因為它們的軟件更出色。為什么它們的軟件更出色?原因可能是這些軟件是小公司寫出來的。   我認為,許多人沒有意識到最早的創業公司是多么脆弱和躊躇。許多創業公司的出現完全出于偶然。幾個朋友在一起,白天都要上班或者上學,利用業余時間做出一個產品原型,如果這個東西看上去有市場,那么可能就會開公司。在這個雛形階段,任何重大的阻礙都會把公司扼殺在搖籃中。為大型機開發軟件要求大量的前期投入。買一臺開發用機已經很貴了,而且因為客戶是大公司,所以你還需要一支看上去很氣派的銷售隊伍,這樣才能把軟件賣出去。創立一家公司專門開發大型機軟件是一項艱巨的任務,比你自己利用晚上的業余時間在蘋果電腦上寫一個東西艱巨得多。所以,只有很少幾家為大型機開發應用程序的創業公司。   桌面電腦的出現,帶動一大批新軟件紛紛涌現,因為對于初生的創業公司來說,開發桌面軟件更可行。桌面電腦本身相對便宜,客戶又主要是個人,通過電腦商店或者郵寄就可以銷售。   把桌面電腦推入主流市場的軟件是VisiCalc,它是第一個電子表格程序,是由兩個人在自家閣樓里寫出來的,它能做到大型機都做不到的事^。在那個時候,VisiCalc太先進了,人們為了能夠使用這個軟件,紛紛去購買蘋果電腦。這標志了一個新時代的開始,桌面電腦開始成為主流,因為許多創業公司為它寫軟件。 ^「VisiCalc的兩個作者分別是丹·布里克林(Dan Bricklin)和羅伯特·弗蘭克森。丹在幾天之內就先用Basic語言寫出了一個原型。接下來幾年,他們一起合作(主要利用夜間)用6502機器語言寫出了一個功能強大得多的版本。那時,丹在哈佛商學院讀書,羅伯特名義上的正式工作是開發軟件。“我們開公司其實沒有太大風險。”羅伯特對我說,“倒閉就倒閉了,沒什么大不了。”」   現在看上去,互聯網軟件也有這個趨勢,因為也有許多創業公司在做這件事。電腦的價格越來越便宜,你可以同我們一樣,用一臺桌面電腦當作服務器,開始自己的創業。廉價芯片正在侵蝕工作站(你現在甚至很少聽到這個詞)的市場份額,并且占領了大部分的服務器市場。雅虎公司的服務器能夠承受互聯網上最高的工作負載,伹是這些服務器的芯片與你的桌面電腦是一樣的,都是Intel公司低價的處理器。一旦你寫出自己的軟件,只要搭建一個網站就能銷售。幾乎所有我們的用戶都是聽了他人的推薦或者看了媒體的報道^。 ^「這件事沒我說的這么簡單。口碑效應發揮效果需要很長一段時間。報道我們的媒體也不是很多,后來我們以每月1.6萬美元(再加上一些認股權證)的代價,聘請了Schwartz Communications公司(他們大概是高科技行業中最好的公關公司),媒體報道才多了起來。但是,真正起到決定性作用的銷售推廣渠道只有一個,那就是我們自己的網站。」   Viaweb是一家典型的處于起步階段的創業公司。我們對開公司這件事都心存恐懼。開始的頭幾個月,我們安慰自己:就把這一切當作一個實驗,隨時都可以收拾攤子一走了事。幸運的是,除了一些技術問題,我們幾乎沒有遇到太大的障礙。寫完軟件,我們就把開發用的桌面電腦當作了服務器,插上電話線,就與外部世界連接在了一起。這個階段,我們唯一的支出就是食品和房租。   現在,創業公司有更多的理由選擇互聯網軟件創業,因為開發桌面軟件越來越乏味了。如果你現在開發桌面軟件,就不得不接受微軟公司的授權條款,調用它的API,為它那個bug百出的操作系統傷透腦筋。歷盡了千辛萬苦,你最終寫出了一個大受歡迎的軟件,這時你可能會發現,你所做的一切其實只是在為微軟公司做市場調查。   如果某家公司想要開發一個平臺,吸引他人在此之上創業,這家公司必須使得黑客本人愿意使用這個平臺。這意味著它必須是便宜的,而且有著良好的設計。蘋果公司的Mac電腦自從一問世,就在黑客之中很流行,許多黑客為它寫軟件^。你在Windows身上就很少看到這種現象,因為黑客不喜歡使用Windows。現在,善于寫軟件的那類人更喜歡使用Linux或者FreeBSD操作系統。 ^「你可能會問,如果Mac電腦真那么出色,為什么后來它的市場表現不佳?還是那個老生常談的原因:成本太高。微軟公司把所有精力都集中在軟件上面,所以很多廠商只要專攻硬件就可以了,把硬件成本降了下來。單單是微軟的軟件或者第三方廠商的硬件都不足以贏得市場優勢,但是它們結合起來,就在個人電腦出現后一段關鍵時期中主導了市場。蘋果公司同時做軟件和硬件,所以成本上沒有優勢。(但是,蘋果公司還沒有失敗,如果它能把iPod升級成手機,并且將網絡瀏覽器包括在其中,那么微軟公司就有大麻煩了。)(譯者注:這段話寫于2001年9月,蘋果公司的iPhone手機已于2007年6月上市。)」   我想,要是為桌面電腦寫軟件,我們就不會成立創業公司了。因為桌面軟件必須能運行在Windows上,要給Windows寫軟件就不得不使用它,可是我們對它并沒有興趣。有了互聯網就可以繞過Windows,直接在Unix系統上發布軟件,用戶通過瀏覽器使用。這種趨勢將會迅猛發展,很像20年前PC剛剛誕生時的情景。 ### 微軟公司   回想桌面電腦剛剛出現的時候,人人都對巨無霸IBM心存敬畏。現在很難想象那種感覺,但是我對此記憶猶新。現在,令人敬畏的巨無霸是微軟公司,我想它面對新技術的威脅不會像IBM那樣疏忽大意,自以為高枕無憂,畢竟微軟的成功就是利用了IBM的疏忽。   我在前文提到,我的母親并不真的需要一臺桌面電腦。大多數用戶都是如此。這對微軟是一個問題,它也知道這一點。如果軟件都在服務器端運行,就沒有人要用Windows了。微軟該怎么辦?它會利用對桌面電腦操作系統的壟斷,阻止或者限制這種新一代的軟件嗎?   我預計微軟會推出某種服務器和桌面電腦的混合產品,讓它的桌面操作系統專門與由它控制的服務器協同工作。至少它也會把文件放在服務器上,需要的用戶可以自己去下載。我覺得微軟不會把運算都放到服務器端,讓客戶只要有瀏覽器就行了,它不會走得那么遠,除非走投無路了。如果只需要一個帶瀏覽器的終端設備就能完成所有工作,你就不需要微軟了。要是微軟不能控制終端設備,它就只剩下一條路,就是把用戶推向它自己的互聯網軟件。   互聯網對于微軟來說,就像《一千零一夜》神話中被關在瓶子里的妖怪,我想微軟會有一段很艱難的時期,會千方百計防止妖怪從瓶子里鉆出來。未來會出現無數不同類型的終端設備,要想全部控制它們實在是太難了。如果微軟專攻某些終端設備,那么競爭者可以為其他終端設備提供應用程序,從而獲得擊敗微軟的機會^。 ^「一個優秀的開源瀏覽器會幫到互聯網軟件,防止它們被微軟扼殺。體積小、反應快的瀏覽器,本身就是好東西,會鼓勵廠商開發小型的互聯網設備。優秀的開源瀏覽器最大的優點則是,會推動HTTP和HTML繼續向前發展(就像Perl起到的作用一樣)。你還記得當年網景公司每推出一個瀏覽器的新版本,就會為HTML語言加上一些新功能嗎?這樣的好事為什么要停下來呢? 舉例來說,如果互聯網軟件能夠區分某一個鏈接是用戶主動點擊還是被動跟隨前往,那將極有幫助。要做到這一點,只需要對HTTP協議做一點小小的加強就可以了,允許在一個請求中包括多個URL地址就能解決問題。此外,HTML語言如果能支持級聯式菜單(cascading menu),也將很有幫助。 只要誰能寫出一個新的Mosaic瀏覽器,他就能改變世界。現在這樣做會不會太晚了?1998年,許多人認為再推出一個新的搜索引擎已經太晚了,互聯網世界已經定型了。谷歌證明了這種看法是錯誤的。如果新事物真的有重大改迸,那么它總是可以找到生存空間的。」   在互聯網軟件的世界,微軟并不會因為它在桌面軟件世界的成功而自動得到一席之地。也許通過努力它能為自己爭取到一個席位,但是我不認為它會主宰這個新的世界,取得桌面軟件領域那樣的地位。   除了微軟自己,沒有人能讓微軟遭受嚴重挫折。隨著互聯網軟件的崛起,微軟不僅要面對新的技術問題,還要面對它自己毫無根據、一廂情愿的舊思維。微軟需要把它現有的商業模式拆除,建設一個新模式,我看不到它有正視這個問題的任何跡象。它一心一意地堅持桌面軟件模式,固然把它帶到現在的地位,但是現在開始將成為它繼續前進的障礙。IBM曾經有過同樣的處境,它沒有正確應對。在很晚的階段,它才進入微機市場,并且三心二意沒有傾注全力,因為大型機是IBM的主要利潤來源,發展微機就等于扼殺這頭金牛,所以它感到很糾結。微軟也同樣感到糾結,因為它想保住桌面軟件。看來金牛也會成為沉重負擔。   我并不是說,互聯網軟件世界不會產生主宰者。最終,可能會有這樣一家公司誕生。但是,我想這需要相當相當長的時間,在此之前則是一段欣欣向榮的混戰時期,正如微機誕生的早期。這是創業公司的黃金時代,小公司競相爭艷,做出很酷的產品,使得自己快速發展起來。 ### 創業公司   典型的創業公司行動快速,看上去不是那么正式,只有很少幾個人,資金也有限。這幾個人勤奮工作,技術放大了他們的決策。如果他們賭贏了,那就是一場大勝利。   開發互聯網軟件的創業公司會把與創業有關的每一件事做到極致。只用更少的人、更少的錢,就可以把軟件寫出來,并且開始運作。你必須打破常規、快速行動,循規蹈矩不可能成功。你完全能夠在只有三個人的情況下讓產品開始運營,你們唯一的辦公場所就是一間公寓,里面放著一臺連著ISP的服務器。我們就是這樣做的。   級觀創業公司的歷史,你會發現它們變得越來越小,越來越快,越來越不像正規的企業。I960年,所謂“開發軟件”就是IBM公司的那種形式,滿滿一屋子的人,他們都戴著牛角質眼鏡架,系著細細黑黑的領帶,勤勉地埋頭寫代碼,每人每天可以完成十行。到了1980年,“開發軟件”變成了8到10人的一個小組,他們穿著牛仔褲上班,在VT100終端上打字。現在,“開發軟件”則是兩個人坐在客廳里,一人捧一臺筆記本電腦。(牛仔褲如今已經不能算是不正式的服裝了。)   創業公司的壓力很大,不幸的是,這一點在互聯網軟件業也發揮到了極致。許多軟件公司的開發者都有一段睡在桌子底下(或者類似經歷)的日子,尤其是在初創期。令人驚恐的是,對于互聯網軟件來說,這樣的日子沒有盡頭,什么都不足以阻止這種事情成為常態。對于桌面軟件來說,睡桌子底下的經歷經常可以告一段落,等到軟件發布了,我們就都回家睡上一個星期。互聯網軟件永遠沒有收工的那一天,如果你愿意,可以一直干下去,每天忙上16個小時。而且,你能夠做到這一點,意味著競爭者也能做到這一點,所以長時間工作變成了一種必需,不得不如此。因為你能做到,所以你必須做到。這簡直就是逆向的帕金森定律^。 ^「帕金森定律(Parkinson's Law)是英國作家諾斯科特·帕金森(Cyril Northcote Parkinson,1909—1993)在1955~1958年的一組系列文章的總稱。在這些文章中,帕金森諷刺了英國的官僚主義,總結了許多常見的官僚主義的表現形式。“帕金森定律”后來成為這些表現形式的代名詞,它包括很多內容,其中有一條就是“因為你必須做到,所以你能夠做到”。因此,本文作者稱“因為你能夠做到,所以你必須做到”是逆向的帕金森定律。——譯者注」   除了長期加班,更可怕的事情是沉重的壓力。傳統上,程序員和系統管理員有不同的工作職責。程序員關注bug,系統管理員關注系統的基礎設施。程序員可能一整天都在伏案編寫代碼,然后到了某個時間,就下班回家,不再去想代碼了。系統管理員則是永遠都無法把工作拋到腦后,可能凌晨4點就會被叫到機房,不過好在大多數時候他們的工作都不是很復雜。互聯網軟件的出現使得這兩種工作結合在一起,因此把它們各自不同的工作壓力也合在一起。程序員變成了系統管理員,但是工作職責的范圍卻沒有明確界定,使得工作壓力陡然增加。   我們創立Viaweb時,一開始的六個月都在編寫代碼。與其他創業公司一樣,在這個早期階段我們的工作時間也是很長的。換作桌面軟件公司,度過這個艱苦階段之后,一切就會變得輕松了,但是當我們結束這個階段、打開服務器迎接訪問者時,才發現與后來的日子相比,第一階段的編程簡直像在度假。雅虎收購Viaweb,我們第一位的收獲當然是金錢,第二位的收獲就是能夠卸下這些沉重的責任,讓一家更大的公司去承擔。   桌面軟件迫使用戶變成系統管理員,互聯網軟件則是迫使程序員變成系統管理員:用戶的壓力變小了,程序員的壓力變大了。這未必是壞事。如果你的創業公司正在與一家大公司競爭,這一點就很有利^。互聯網軟件提供了一種天然的途徑,使得你可以用較少的人力完成較多的工作,從而超過競爭對手。創業公司對這一點應該感到心滿意足。 ^「由于個人經歷的關系,特雷弗·布萊克韋爾對這一點的認識可能比其他任何人都深刻。他寫道:“我會進一步說,由于互聯網軟件的程序員非常辛苦,所以會使得經濟優勢根本性地從大公司向創業公司轉移。互聯網軟件要求的那種工作強度和付出,只有當公司是其本人所有時,程序員才愿意提供。軟件公司可以雇到能干的人,讓他們去干輕松的事情,也可以雇到不能干的人,讓他們去干艱苦的事情,但是無法雇到非常能干的人,讓他們去干非常艱苦的事情。因為互聯網軟件的創業不需要太多的資本,所以大公司可以與創業公司競爭的優勢就所剩無幾了。”」 ### 勉強夠用的網頁   有一件事可能會打消你通過互聯網軟件創業的念頭,那就是網頁作為用戶界面,功能實在是太弱了。我承認,這確實是一個問題。我們真的想改造HTML語言和HTTP協議,對許多地方進行加強。不過必須指出,目前階段的網頁剛好能滿足需要。   以第一代微型計算機作為類比。那些機器上的處理器,本來的生產目的是用在諸如交通信號燈這樣的電子設備上的,而不是用作計算機CPU。但是,像Altair^的設計者愛德華·羅伯茨^^這樣的人,意識到這些處理器剛好能滿足需要。你把一塊芯片、存儲器(第一臺Altair的內存是256字節)、前面板的指示燈和開關組合在一起,就有了一臺可以運行的電腦。能夠擁有自己的電腦是非常令人興奮的事情,所以許多人想買一臺,即使它的性能實際上非常低下。 ^「Altair指的是MITS公司在1975年推出的Altair 8800微型計算機,CPU為Intel8080。它是第一批微型計算機中最成功的產品,被認為是最早的個人電腦,上市第一個月就賣出了幾千臺。它所使用的總線,后來成為微機總線的第一個標準S-100,而微軟公司的第一個產品就是為Altair開發的編程語言Altair Basic,——譯者注」 ^^「Ed Roberts(1941—2010),美國工程師。1970年創立MITS公司,1975年設計出了歷史性的產品——微型計算機Altair8800,開創了個人電腦的時代,后來被稱為“個人電腦之父”。1977年,他賣掉了MITS公司,來到佐治亞州鄉下研究醫學,最后成為小鎮上的醫生。——譯者注」   網頁剛誕生的時候,也不是為了用作應用程序的界面,它只是剛好能滿足需要。對于相當一部分使用者來說,打開瀏覽器就能使用軟件本身,這已足夠吸引人了,用戶操作界面的丑陋和不方便并不是一個嚴重的問題。也許你使用HTML語言無法寫出最美觀的電子表格,但是你能寫出一個可以供多人在不同地點、不同終端設備上同時使用的電子表格,而且不用安裝任何軟件,只要有瀏覽器就可以。你還可以寫出數據實時更新,或者一且滿足某些條件就會自動發出傳呼信號的電子表格。更重要的是,你能用它創造出各種各樣甚至還沒有名字也沒有人想到過的新東西。VisiCalc可不是某個大型機軟件的微機版,而是完完全全的一種薪新的軟件。 ![](https://box.kancloud.cn/2016-01-12_5694ae0946ddb.jpg) 圖5-1 Popular Electronics雜志,1975年一月號^ ^「1975年一月號的Popular Electronics雜志的封面報道就是Altair8800型計算機,封面上的文字是:“突破性的項目。世界上第一臺可與商用型號媲美的微型計算機。Altair8800,為您節省超過1000美元。”這是歷史上第一篇對微型計算機的新聞報道,影響極大,標志個人電腦時代的來臨。當時,哈佛大學二年級的學生比爾·蓋茨就是因為看到了這篇報道,才決定和保羅·艾倫一起為Altair開發Basic語言的解釋器,并于1975年7月成立微軟公司,因此這篇報道直接促成了微軟公司的成立。——譯者注」   當然,互聯網軟件不一定非做成互聯網軟件,它也可以做成某種形式的桌面軟件。但是,我很肯定,這不是好主意。你自然可以輕易地假設所有人都會安裝你的桌面軟件,這樣就不用考慮很多麻煩問題了,沒過多久,你馬上就對這一點深信不疑了,所有人肯定真的都會安裝你的軟件。要是他們不安裝,你就慘了。   相比之下,互聯網軟件不需要做任何關于安裝的假設,只要能上網的地方,它就能運行。這個優勢已經很大了,隨著各種上網設備的迅速發展,優勢還會繼續擴大。你的軟件能用,又不必安裝,用戶就會喜歡你,你的日子也好過得多,因為你不會被各種各樣桌面端的問題煩死^。我感到,自己對互聯網的觀察不會輸給其他任何人,但是我也無法預料網絡終端設備會怎么發展。一個網頁制作比較規范統一的時代也許會到來,但是在什么時候呢? ^「如果我是你,我甚至不會考慮使用JavaScript,Viaweb就沒用。我在網上遇到的大部分JavaScript都是不必要的,其中很多都不能用。如果有一天你可以在手機(或者PDA,甚至烤面包機)上瀏覽網頁,天知道這些設備會不會支持JavaScript。」   一切最終會變成什么樣子?我不知道。如果你把賭注押在互聯網軟件上,你也不必擔心這個問題。只要人們繼續上網,互聯網軟件就輸不了。互聯網也許不是唯一的提供軟件的途徑,但是它現在就能發揮作用,并還將持續很長一段日子。互聯網軟件的開發成本低,即使是最小型的公司,也可以很容易地制作和發布。互聯網軟件做起來很辛苦,還有許多特別大的壓力,但是這樣只會使得創業公司成功的機會變大。 ### 為什么不嘗試一下?   E.B.懷特^曾經從一個農民朋友那里聽到一則趣聞。許多農場用電籬笆防止奶牛逃跑,但是不少電籬笆其實并沒有通電。不過奶牛們已經吃過苦頭,顯然學會了不去碰電籬笆,這時不通電也能起到效果。“奶牛們,行動吧!”他寫道,“趁著統治者打鼾時,奪回你們的自由!” ^「E.B.懷特(E.B.White,1899—1985),美國當代著名作家、散文家,常年擔任《紐約客》雜志的主要撰稿人,以優美的語體風格著稱于世。——譯者注」   如果你是一個黑客,并且夢想自己創業,可能會有兩件事情令你望而卻步,不敢真正開始采取行動。一件是你不懂得管理企業,另一件是你害怕競爭。可是實際上,這兩件事都是沒有通電的電籬笆。   首先,管理企業其實很簡單,只要記住兩點就可以了:做出用戶喜歡的產品,保證開支小于收入。只要做到這兩點,你就會超過大多數創業公司。隨著事業的發展,你自己就能琢磨出來其他的訣竅。   剛開始的時候,你可能入不敷出,但是只要虧損不持續太久,你就不會有事。如果初期階段缺少資金,這至少有助于你養成勤儉節約的習慣。開支越小,就越不會超支。幸運的是,編寫一個互聯網軟件是非常便宜的。我們的總支出就不超過1萬美元,現在應該更便宜了。其中,我們不得不花了幾千美元買了一臺服務器,又花了更多錢購買SSL。(那時唯一出售SSL軟件的公司就是網景。)現在,你可以租到一臺強大得多的服務器,上面已經安裝好了SSL,而費用比我們當時的帶寬費還要少。如今,開發一個互聯網軟件的費用比購買一把高級辦公椅還要便宜。至于如何做出用戶喜歡的產品,下面是一些通用規則。從制造簡潔的產品開始著手,首先要保證你自己愿意使用。然后,迅速地做出1.0版,并且不斷以改進,整個過程中密切傾聽用戶的反饋。用戶總是對的,但是不同的用戶要求不一樣。低端的用戶要求簡化操作和清晰易懂,高端的用戶要求你增加新功能。軟件最大的好處就是讓一切變得簡單。但是,做到這一點的方法是正確設置默認值,而不是限制用戶的選擇。如果競爭對手的產品很糟糕,你也不要自鳴得意。比較軟件的標準應該是看對手的軟件將來會有什么功能,而不是現在有什么功能。無論何時,你都要使用自己的軟件。Viaweb的主要功能是建立網上商店,但是我們也使用它建立自己的網站。不要只因為對方的頭銜是市場專家、設計師或產品經理,就盲目聽從他們的話。如果他們的觀點真的很好,那就聽從他們,關鍵是你要自己判斷,不要盲從。只有懂得設計的黑客,才能設計軟件,不能交給對軟件一知半解的設計師。如果你不打算自己動手設計和開發,那就不要創業。   其次,讓我們來看看競爭。你所害怕的大概不是與你一樣的黑客,而是那些像模像樣,有著辦公室、商業計劃、銷售員的公司,對不對?可是實際上,他們害怕你勝過你害怕他們,而且這一點上,他們并沒有錯。幾個黑客搞懂如何租用辦公室,或者如何雇用銷售人員,要比那些公司(不管大公司還是小公司)搞懂如何正確寫出軟件容易得多。我在這兩種地方都待過,所以知道這些。Viaweb被雅虎收購后,我突然發現自己在為一家大公司工作,那感覺就好像在齊腰深的水中艱難行走。我無意貶低雅虎。它擁有一些很好的黑客和頂尖的管理人才。對于一家大公司來說,它可謂是出類拔萃了。但是,它的生產效率僅僅相當于小型創業公司的十分之一。沒有任何一家大公司能做得更好。微軟公司的恐怖之處在于,它大到可以開發任何軟件,就像一座能夠行走的大山。 ![](https://box.kancloud.cn/2016-01-12_5694ae095cb88.jpg) 圖5-2 比爾·蓋茨,1977年   不要被微軟嚇到。你能做到它做不到的事情,正如它能做到你做不到的事情一樣。開發互聯網軟件不需要得到任何人的許可,沒有人能夠阻止你。你不需要去申請許可證,不需要在零售店的貨架上謀得一席之地,也不需要卑躬屈膝地求人家,將你的軟件與操作系統捆綁在一起。你能夠通過瀏覽器發布軟件,沒有人能在你和瀏覽網站的用戶之間插上一腳。   你也許不會相佶,但是我向你保證,微軟公司害怕你。它的那些目中無人的中層管理人員也許不是這樣想的,但是比爾·蓋茨肯定是,因為1975年,上一次發布軟件的新方式出現時,他也曾經跟你一樣白手起家。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看