paulwong

          為什么淘寶需要大量頂尖高手來開發(fā)?

          為什么很多看起來不是很復雜的網站比如 Facebook、淘寶,需要大量頂尖高手來開發(fā)?

          就拿淘寶來說說,當作給新人一些科普。

          先說你看到的頁面上,最重要的幾個:
          【搜索商品】——這個功能,如果你有幾千條商品,完全可以用select * from tableXX where title like %XX%這樣的操作來搞定。但是——當你有10000000000(一百億)條商品的時候,任何一個數據庫都無法存放了,請問你怎么搜索?這里需要用到分 布式的數據存儲方案,另外這個搜索也不可能直接從數據庫里來取數據,必然要用到搜索引擎(簡單來說搜索引擎更快)。好,能搜出商品了,是否大功告成可以啵 一個了呢?早著呢,誰家的商品出現在第一頁?這里需要用到巨復雜的排序算法。要是再根據你的購買行為做一些個性化的推薦——這夠一幫牛叉的算法工程師奮斗 終生了。

          【商品詳情】——就是搜索完畢,看到你感興趣的,點擊查看商品的頁面,這個頁面有商品的屬性、詳細描述、評價、賣家信息等等,這個頁面的每天展示次數在 30億以上,同樣的道理,如果你做一個網站每天有10個人訪問,你絲毫感覺不到服務器的壓力,但是30億,要解決的問題就多了去了。首先,這些請求不能直 接壓到數據庫上,任何單機或分布式的數據庫,承受30億每天的壓力,都將崩潰到完全沒有幸福感,這種情況下要用到的技術就是大規(guī)模的分布式緩存,所有的賣 家信息、評價信息、商品描述都是從緩存里面來取到的,甚至更加極致的一點“商品的瀏覽量”這個信息,每打開頁面一次都要刷新,你猜能夠從緩存里面來取嗎? 淘寶做到了,整個商品的詳情都在緩存里面。

          【商品圖片】——一個商品有5個圖片,商品描述里面有更多圖片,你猜淘寶有多少張圖片要存儲?100億以上。這么多圖片要是在你的硬盤里面,你怎么去查找 其中的一張?要是你的同學想拷貝你的圖片,你需要他準備多少塊硬盤?你需要配置多少大的帶寬?你們的網卡是否能夠承受?你需要多長時間拷貝給他?這樣的規(guī) 模,很不幸市面上已經沒有任何商業(yè)的解決方案,最終我們必須自己來開發(fā)一套存儲系統(tǒng),如果你聽說過google的GFS,我們跟他類似,叫TFS。順便說 一下,騰訊也有這樣的一套,也叫TFS。

          【廣告系統(tǒng)】——淘寶上有很多廣告,什么,你不知道?那說明我們的廣告做的還不錯,居然很多人不認為它是廣告,賣家怎么出價去買淘寶的廣告位?廣告怎么展示?怎么查看廣告效果?這又是一套算法精奇的系統(tǒng)。

          【BOSS系統(tǒng)】——淘寶的工作人員怎么去管理這么龐大的一個系統(tǒng),例如某時刻突然宣布某位作家的作品全部從淘寶消失,從數據庫到搜索引擎到廣告系統(tǒng),里面的相關數據在幾分鐘內全部消失,這又需要一個牛叉的后臺支撐系統(tǒng)。

          【運維體系】——支持這么龐大的一個網站,你猜需要多少臺服務器?幾千臺?那是零頭。這么多服務器,上面部署什么操作系統(tǒng),操作系統(tǒng)的內核能否優(yōu) 化?Java虛擬機能否優(yōu)化?通信模塊有沒有榨取性能的空間?軟件怎么部署上去?出了問題怎么回滾?你裝過操作系統(tǒng)吧,優(yōu)化過吧,被360坑過沒,崩潰過 沒?這里面又有很多門道。

          不再多寫了,除了上面提到的這些,還有很多很多需要做的技術,當然并不是這些東西有多么高不可攀,任何復雜的龐大的東西都是從小到大做起來的,里面需要牛叉到不行的大犇,也需要充滿好奇心的菜鳥,最后這一句,你當我是別有用心好了。

          功能上面雖然不復雜,但是要完成的細節(jié)卻很多. 比如news feed里面的推薦算法就很重要,要根據用戶之前的記錄和與好友的關系來生成. 另外就是根據用戶的信息和行為,要做機器學習和數據挖掘,從而來挑出最匹配的廣告.這也是比較花人力的事情.

          另外Facebook的用戶量奇大無比. 假設你只是做一個學校內部用的社交網站, 那肯定很簡單. 但是如果考慮到上億人在上面用. 你首先服務器就必 須是一個分布式的機群,還要保證能抗住那么大的流量. 同時為了性能夠好,不得不加上mem cache和網頁分塊加載等功能. 還有就是每天用戶產生的總數據量(狀態(tài),留言,照片,分享等)有TB的數量級,你數據庫是否撐住等等.

          另外樹大招風,你要一個很強的安全小組來保證網站在受攻擊的時候能防御好,還有要防止垃圾信息和惡心廣告或者程序的散播. 另外還有為了全球化而帶來的多語言問題.

          總之,一個網站做大了之后,很多問題就會產生,不是在校園里面做一個學期作業(yè)那么簡單.狼大人,休,行。

          某個歷史上的大神曾經說過一句話:

          要判斷一個算法的好壞,只要給它足夠的數據。

          當用戶、數據和系統(tǒng)規(guī)模上到一個程度之后,所有曾經可以忽視的問題都會變得必須用從來不可想象的精力和技術去解決。

          來來來 看看這個 剛看到的《當用戶點擊“舉報”后,Facebook在后臺會做哪些事情

          很多東西并不是表面看到的那樣簡單

          身為前端攻城師,就這方面說一下這樣一個Facebook看起來“很簡單的網站”需要頂尖高手來開發(fā)和維護

          寫前端程序要考慮很多,如下:可維護性,JS的執(zhí)行高效性,JS文件的大小,用戶體驗等等

          1. 可維護性
          并不是所有人寫的程序都具有可維護性,清晰易懂的,這個區(qū)別在剛接觸編程和高手直接的差異體現的特別明顯
          2. JS的執(zhí)行高效性
          一個網頁加載JS并執(zhí)行,瀏覽器執(zhí)行并渲染了半天還在渲染,相信很多用戶都不想看到吧?非常上海用戶體驗。
          如何提升JS的執(zhí)行速度呢?相信我,初學者大部分都是不知道的(排除寫過瀏覽器內核的同學),了解瀏覽器如何執(zhí)行JS,如何渲染DOM能幫助開發(fā)者提升執(zhí)行速度
          3. JS文件的大小
          JS文件或者HTML或者CSS文件過大,有很多缺點
          第一,受網速影響,文件大,加載速度慢
          第二,Facebook的用戶量非常巨大,每個人訪問就算多加載1KB(即使有cache,第一次總需要加載吧),可想而知,這個流量非常巨大,流量都是要錢的啊
          4. 用戶體驗
          略之

          高手往往比非高手要注意的東西要多很多,這點相信大家不會質疑吧,只是就前端方面發(fā)表一些建議

          如果要把一件簡單的事情搞復雜,你需要的是市場總監(jiān)
          如果要把一件簡單的事情搞簡單,你需要的是產品經理
          如果要把一件復雜的事情搞復雜,你需要的是一堆碼農
          如果要把一件復雜的事情搞簡單,你需要的是頂尖高手

          明白了吧,頂尖高手的意義就在于讓你覺得這個東西看起來很簡單。

          學“懂”計算機系統(tǒng)結構之后,理解這個問題比較容易點吧。
          比如,你打開知乎,簡單的敲下幾行字,點擊提交,然后你看到了你的評論,這復雜嗎?不復雜。
          1、為什么知乎要用瀏覽器才能打開呢,記事本不能訪問知乎?為什么用輸入自己的知乎用戶名和密碼才能訪問呢,我QQ密碼為嘛不能用?為什么我只能看到我關注內容,而不是網站所有用戶的所有內容呢?
          2、當敲下鍵盤時,電腦是如何識別按下的具體哪個字符呢?是如何經過到達的CPU呢?CPU進行了如何的處理操作呢?顯示器為什么可以顯示相應的字符呢?
          3、當點擊“提交”時,發(fā)生哪些變化呢?顯示的內容是保存了在本地電腦上了,還是保存在了知乎服務器上了呢?從本地的數據是如何傳輸到知乎服務器呢?從物 理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層這一系列的過程提交的評論內容傳輸形式是經過一系列的如何變化過程呢?
          PS.對于一個字符從輸入到最后結果輸出的處理流程我也沒搞徹底清楚。隨便說說。。。希望有高手能具體解釋下啊。



          手上沒有網站的結構層次示意圖,隨便拿張圖說明下原因吧。像計算機最初問世的時候,操作計算機的用戶既是設計者也是維護者的時代已經過去。每個節(jié)點都應該 是一個屬于一個節(jié)點的專屬內容,對個每個節(jié)點都應該是更清晰化更簡單化的:用戶的操作的應該簡單化,網絡的傳輸應該簡單化,數據的存儲也應該是簡單化。因 此對于用戶來說只需要用戶界面操作就足夠了,沒必要把數據庫之類的東西也交給用戶處理的。

          posted on 2012-10-31 21:05 paulwong 閱讀(1624) 評論(0)  編輯  收藏 所屬分類: 分布式性能優(yōu)化

          主站蜘蛛池模板: 武山县| 台北县| 开化县| 安阳县| 涟源市| 西平县| 全州县| 晋宁县| 墨玉县| 营口市| 衡山县| 镇巴县| 黔南| 高雄县| 海盐县| 章丘市| 泰宁县| 周宁县| 阿克| 天全县| 江都市| 曲阳县| 麻栗坡县| 资兴市| 肃宁县| 家居| 郸城县| 瑞安市| 平昌县| 海伦市| 天水市| 柳河县| 大新县| 华池县| 闸北区| 丰城市| 平邑县| 襄樊市| 鹤峰县| 米易县| 鲁甸县|