這里有一份我覺得值得推薦給大家的幻燈片(下載鏈接)。這個幻燈片是不久前舉辦的WordCamp China 2009上微軟王超群的演講,演講主題是《熟悉的陌生人:微軟對PHP的新支持使WordPress在IIS7上雄起》。WordCamp是業界著名的PHP大會,不過我這里推薦這個幻燈片不是為了為了推廣PHP,而是為了說明一些其他問題——當然也有關于技術的有價值的內容,這些您看了幻燈片和我的文章之后就會明白了。
對了,之前我已經在InfoQ上寫了一篇新聞報道了這次事件。不過新聞歸新聞,目的是客觀說明情況而不是發表個人觀點。不過博客是個人地盤,我就打算在此暢所欲言了。
說到PHP,可能最容易讓人想起的就是著名的LAMP架構(Linux + Apache + MySQL + PHP),而這全開放的平臺似乎和“封閉”的微軟技術距離比較遠。不過微軟其實一直沒有放棄對PHP的“追求”,這次演講談的就是微軟在這方面的努力,以及取得的成果。我推薦這個幻燈片的主要原因之一,便是它寫的非常有水平,尤其是開頭一部分。在幻燈片一開始闡述了微軟對待開源的態度,希望和PHP的同志們拉近一些距離:
點擊查
嗯,就是這個觀點:“微軟已經不是當年的微軟了”,它變了,變得怎么樣了呢?變得擁抱開源了:“開源的朋友們,不要看到“微軟”兩個字就心生厭惡,來,抱一個”。此外還引用了微軟首席軟件架構師Ray Ozzie(如果我沒有認錯的話)的言論:
I think any company these days, any technology provider, even Microsoft, has to find the right balance of being a contributor and user of open source.
我認為如今任何的公司及技術提供商,即使是微軟,也必須在開源的用戶和貢獻者中尋找一個合適的平衡點。
如果說Ray Ozzie可能還是在“王婆賣瓜”的話,那么Linux創建者、開源領袖Linus Torvald最近發表的話語應該更有“參考價值”:
Oh, I’m a big believer in “technology over politics” 。.. There are “extremists” in the free software world, but that’s one major reason why I don’t call what I do “free software” any more. I don’t want to be associated with the people for whom it‟s about exclusion and hatred.
哦,我強烈認為“技術高于政治”……自由軟件世界中有一些“極端主義者”,這也是我不再把我做的事情稱作“自由軟件”的主要原因。我不想和那些有排斥和憎惡心態的人產生關系。
這句話在有人反對“微軟為Linux提交GPL代碼以提高Hyper-V的兼容性”時說的。Linus的意思再明確不過了:“技術就是就是技術,不要有門戶之見”。順便一提,開源軟件(Open Source)和自由軟件(Free Software)是有很大區別的,不應該混為一談。就我個人而言,我喜歡“開源”而不喜歡“自由”。我也不喜歡FSF覺得微軟永遠是錯的,不喜歡它搞某些東西的方式。不過肯定也有人喜歡,每個人都可以有自己的觀點。
好像有點說歪了。其實我也不知道微軟是不是只是“口頭”上討好開源界,但是我至少看出,微軟在想辦法證明自己——不管這個證明是不是有什么陷阱,有什么“不可告人的秘密”。在這方面,微軟至少在擺事實,講道理,而不是隨口說“我就是擁抱開源”。我覺得,在中學里學寫議論文的時候,大家都應該已經知道就被告知論述的基本方式是“擺事實”,“講道理”。可是從平時討論的時候,我卻又覺得根本不是那么一回事情。說句得罪人的話,我覺得許多朋友缺乏必要的邏輯思維能力,會產生非常多的邏輯謬誤出來,但是卻都還堅持自己是正確的。搞到最后,吵起架來彼彼皆是。而且往往在這個時候,無數匿名兄弟就跳出來發揮自己的聰明才智,各種諷刺挖苦謾罵的奇思妙語一個接一個,令人宛如置身于天上“貓撲”,人間“天涯”。
其實堅持自己是正確的不要緊,我也喜歡堅持自己的意見,誰不希望自己是正確的呢?但是要拿出理論根據來。其實作為技術從業人員,在許多問題上拿出根據來非常簡單,例如寫一個程序便知泛型會不會降低性能。如果有些問題很難用數據說明問題(如數據獲取太難),那么至少也要找出一些別人的看法來支持自己的觀點。如果一味地“我認為”,“我覺得”效果自然就大打折扣了。因此,我現在也經常會有意地在文章中引用自己或其它的人的說法,至少可以讓自己有“底氣”一些,而不會感覺像是在扯淡。
我個人比較反感“光說不練”的人,我希望看到的不是“個人說法”,而是多個人的觀點,或者是實際效果。例如前幾天有個匿名朋友在我博客上留言,偏要堅持“靜態方法的調用會阻塞其它線程訪問”,我說“你試試看就知道了”,他也原樣復制一遍發回給我,針鋒相對,不屈不饒。不知道他最后是否認為他達到了論證“我在誤導初學者,為自己的書作廣告”的目的(我寫過書嗎?),至少我當時,既無奈,又窩火。
既然談到了技術,那就再談遠一些。這位認為“靜態方法的調用會阻塞其它線程訪問”的朋友證明了他自己在某個方面學的有問題,而我前幾天發表的Double Check文章中,有許多朋友提出“怎么能lock在一個實例字段上”,“應該lock在一個靜態字段才能產生效果”。換句話說,在這些朋友看來,一個實例方法是不會產生線程安全問題的——雖然ASP.NET MVC框架的DefaultControllerFactory就出現了這樣的毛病。這說明了在多線程開發方面,社區的整體意識還處于一個非常薄弱的程度——希望我這么說不會引起各位的不滿。
此外,昨天我意識到原來很多朋友用了很久的for卻無法寫出其等價的while寫法,又想起之前發現公司里的大部分同事不知道C#中使用@開頭的字符串表示法中如何包含一個雙引號。這應該都是基礎中的基礎,應該人人知道,不是嗎?但事實就是讓我感到驚訝,許多朋友認為自己不停地在學東西,ASP.NET MVC、Sliverlight,WPF一個一個地學,但是最后最普通的東西卻不知道。結果工作找不好,薪水拿不高,最后一崩潰又開始叫嚷著這個行業沒前途。那么,有沒有想過換一種思路來學習,例如,不要隨意輕視一些東西?
說到這里,我又想起其它一些事情,那就是我覺得如今社區里的“風氣”出現了比較嚴重的問題。例如最近不止一次發生圍攻面試者的“群體性事件”,每次有人發表面試對方的題目之后,就有大量朋友上前表示不滿,對于簡單的題目認為太基礎了,考不出能力。對于困難的題目,就認為它太難,鉆牛角尖,“又不是在招算法研究人員”。總之我發現,似乎只要是遇到了回答不出的問題,都會遭到許多人的反對。似乎社區中許多朋友都認為自己懷才不遇,“我來面試你,你也過不了”,都認為“千里馬常有,而伯樂不常有”。有朋友問我,你面試別人時問些什么?我難以啟齒啊,因為我問的往往也是那些問題,可是一下子就被鄙視了。其實沒有什么東西是簡單的,有時候問問題并不是要得到結果,而是想從中看出一些細節來,例如一個人的思考方式和深度——我問某某和某某在寫法上的區別,不是在搞“茴香豆”,是由其他目的。不知您是否相信,我在面試時會讓對方談一下最喜歡的體育運動的規則?
最近似乎認為我“無聊”的朋友也多了起來,認為我寫的東西沒有什么實際意義,認為我寫這些東西都是在“炫耀”。其實,我的文章都是源于實際工作中的想法,我認為對于實際工作是非常有幫助的。我不喜歡《XX編程三百例》式的文章,我認為那是“魚”而不是“漁”。我不知道那些朋友希望我寫什么樣的文章才算有實際意義,但是我想最有意義的應該是提高您的能力,而正是如此,我認為您更應該關注我在成長過程中想到的這些問題。輕易鄙視這個鄙視那個,就好像鄙視面試者那樣,這可不好。鄙視一個東西不要緊,但關鍵是,你思考了沒有?不要鄙視了半天,但是到最后也不知道發生了什么事,盲目地忙碌。
思考很重要,例如換一種思考方式就會得到不同凡響的結果。至少,這也是鍛煉邏輯的一種有效方式。想要驗證自己想清楚了沒,我認為最好的方式就是寫一篇文章。如果您想明白了,一定能把它說清楚。反過來說也一樣,如果您說不清楚,基本上就是因為您沒有想明白。
說了好多,越扯越遠,喝口水,回來繼續吧。
PPT的正題自然是講述微軟在PHP平臺上做出的努力和取得的成果,其中列舉了之前與康盛創想合作進行的性能評估結果,證明在Windows Server 2008 + IIS上運行PHP,從平均相應時間,每秒處理的請求數,以及數據吞吐量等多方便均顯著優于Linux + Apache的托管方式。當然,這個結果也受到了一些質疑,例如為什么在Apache中使用了mod_php而不是在大多數情況下性能更好的FastCGI。關于這點我沒有測試過,我不清楚,不過這并不要緊。我只想說:Windows的性能真的不差。
這也是PPT的截圖之一。從中可以看出IIS 7的吞吐量完全可以達到靜態文件請求20K,ASP.NET請求5K RPS(每秒請求數)的吞吐量。這是100%的事實,我可以擔保,因為在我07年在微軟的時候,曾經在自己工作用的普通 32位workstation上試驗過,請求靜態文件輕松超過了10K。算上IIS 7的性能增強,以及測試機的性能因素,得到上圖的結果完全沒有問題。至于ASP.NET動態請求的性能,5000多完全就是一個沒有意義的數字了——我不是說它假,我只是說它沒有意義。因為對于動態請求來說,純粹比這種“空請求”的吞吐量,幾乎沒有任何實際參考價值。因為,我們有其它的性能瓶頸,根本達不到IIS本身的性能限制。
對于普通Web應用程序來說,如果在實現上沒有大的問題,幾乎不會讓Web服務器(指IIS這種,不是指“機器”)成為性能瓶頸。性能瓶頸往往是在外部服務器調用,或者外部數據訪問上。例如耗時的SQL查詢一多,應用程序整體性能自然就下來了。因此,業界最為熱烈的討論往往是基于“緩存”和各種數據存儲方式的,因為到目前為止它們都是最有可能成為性能瓶頸的。對于Web服務器本身性能的討論也不是沒有,只是相對就少很多了,要有,大部分也是基于靜態請求的性能比較。
對于Web 2.0的網站來說,由于變化太多幾乎無法生成靜態頁,因此這樣的Web應用程序在一臺機器上的吞吐量根本達不到5K,即時是1K也幾乎不可能達到。在一臺目前普通配置的服務器上,如果可以達到每秒100多的動態請求,基本上已經做的相當不錯了,甚至50、60多也已經基本“夠意思”了——像當年豆瓣鬼神般的5、600(如果我沒有記錯的話)幾乎難以再現了。不過100 RPS也已經是一個很了不起的數字了,如果按6小時的密集請求來算,這樣一個動態站點的日訪問量是多少呢?
當然,Windows不是沒有性能問題,我只是說在IIS,Web開發等方面不會出現性能問題。有人說Windows的文件系統,也就是NTFS的性能很差,尤其是在處理零碎地文件時候。這我也有所耳聞,平時也有類似的感覺,但是沒有經過這方面的實踐,所以并無法說出準確的結論。不過真的性能差,也要去好好了解它,這樣我們就可以設法避免一些薄弱的環節。隨意舉個例子,我們可以優化自己程序的存儲方式,盡量讀取連續的數據,讓文件系統的性能問題可以緩解一下。SQL Server不也是在NTFS上構建出高效數據應用的嗎?
使用Windows系統的另外的問題,也是被人提及很多次的問題,便是授權協議。Linux使用是不要錢的,而Windows是要花錢買的,這個自然應該算入成本。不過在我看來,其實Windows并不貴。為什么呢?您可以去Dell的網站上看一下一臺預裝了Windows Server的服務器的價格,一個Web Edition的Windows Server操作系統的價格大約是3000多元,這也就相當于一個普通程序員1個月的薪水而已,更何況操作系統可以算作是一次性投資。對于一個公司來說,每天開一次門就相當于幾千幾萬的錢花出去了,購買一個Web Edition的Windows Server價錢根本算不了什么。至于開發成本,這是一個太“虛”的東西,暫時就不討論了吧——我想,應該也沒有什么理由可以有力證明使用ASP.NET會加大開發成本。
事實上,Web Edition已經足夠部署ASP.NET應用程序了,Enterprise Edition自然要貴上十幾倍甚至更多,但是您根本用不著。用盜版操作系統時帶來的壞習慣“要用就用最好的”,在產品環境中一定要改一下。哦,對了,微軟對于年收入低于100萬的公司,或是非盈利機構都有非常大的折扣,甚至免費的策略(如BizSpark計劃)。您不應該錯過。
因此我認為,在Windows平臺上使用ASP.NET,是一個非常合適的Web應用程序開發/運行平臺。即時是對于創業型小公司來說,我也會選擇使用Windows + ASP.NET。
但是……微軟平臺上的授權價格并非總是個可以忽視的問題。因為SQL Server實在是太貴了,而免費的Express版本是不可以用于商業應用的。如果我們想要使用SQL Server,那么成本的確會嘩嘩地上升,尤其對于創業公司來說這是比不可忽視的支出(當然如果加入了BizSpark計劃……)。因此可以這么說,運行ASP.NET的Windows很便宜,但是SQL Server,以及運行SQL Server的Windows會非常昂貴。因此,對于數據存儲來說,我會選擇Linux下的免費及開源的產品。而且我可以有更多的選擇,無論是關系型數據庫,鍵/值存儲方式,還是現在慢慢再興起的如MongoDB那樣的無架構,文檔型數據庫,都可以合理組裝使用。
所以我現在越來越推薦Windows + *nix的合作關系,至于在Windows和*unix項目的通訊問題上,其實絲毫不用擔心。如今各個項目都是基于標準的通訊協議(如TCP/IP,甚至HTTP),使用通用的或自定義的格式進行數據交換的。對于一個Linux下的數據庫來說,它根本不會關心與它連接的是Windows還是Linux,也不會關心發起調用的是.NET還是Java,Python,Ruby平臺。大家根據協議辦事即可。
那么為什么業界總是認為Windows性能差呢?原因可能是因為微軟的“聲譽”不太好,而業界聲音最響,最為活躍的大都是開源工作者或自由人士,他們自然會不遺余力地支持自己的環境——這很正常,優秀的程序員一定是有信仰的,我一直這么認為——當然也會產生一些不客觀的FUD行為。還有便是,Windows進入服務器領域時間比較晚,而且在IIS 5那些年代時,Windows在服務器領域的表現的確不怎么好。因此,那時候留下的負面印象自然也會產生不好的影響。但是微軟是在發展的,微軟牛人非常多,微軟研究院的論文年年占據各大會議相當比例,而微軟的產品的質量也已經足夠了得了。如果繼續用10年前的印象來判斷如今的微軟是不正確的——當年微軟系統在服務器這塊沒有絲毫占用率(幾乎都是Unix,Oracle的天下),現在已經占據中小公司80-90%,世界五百強50%的份額,這還不夠說明問題嗎?
關于這點,作為Windows平臺下的程序員,我們應該有足夠的自信,管別人怎么“懷疑”我們呢。
對了,還有一個可能的原因是由于微軟的技術太容易入門,導致給人不夠“牛逼”的感覺。這也是沒有必要的,就好比說,一個國家的初等教育水平高,能證明它的高等教育水準不行嗎?這只是定位的問題,當然這也是微軟的策略——但是這不是微軟的錯,也不是微軟技術沒有價值的證據。當然,作為Windows平臺上的程序員,提高自己的能力是沒有錯的。不光沒有錯,是一定必須這么做的!
不過必須承認的是,Windows有個硬傷,就是您無法在上面搗鼓東西,例如換一個文件系統,改一改內核。如果你是熱衷于這方面的Geek,那么自然不應該使用Windows。
最后,還是用PPT上的內容收尾吧。在這份PPT的末尾附有30多頁的IIS Web應用程序配置最佳實踐,是一個非常不錯的參考,您一定要看一下。
新聞熱點
疑難解答