文章轉載自「開發者圓桌」一個關於開發者入門、進階、踩坑的微信公衆號html
拿google、百度的搜索服務舉例來講,就是提供一個輸入框, 提供一個按鈕,用戶在輸入框裏輸入關鍵字,按了按鈕之後,能夠搜索出相應結果。算法
拿淘寶、京東這類電商服務來講,無非就是搜索商品、選擇商品、購買下單這幾個簡單的功能。數據庫
可是,就是這樣簡單的功能,卻須要大量頂尖高手才能開發出來,爲何?編程
拿淘寶這類電商來講緩存
搜索商品服務器
若是你有幾千條商品,徹底能夠用select * from tableXX where title like %XX%這樣的操做來搞定。可是,當你有10000000000(一百億)條商品的時候,任何一個數據庫都沒法存放了,請問你怎麼搜索?這裏須要用到分佈式的數據存儲方案,另外這個搜索也不可能直接從數據庫裏來取數據,必然要用到搜索引擎(簡單來講搜索引擎更快)。微信
好,能搜出商品了,是否大功告成能夠啵一個了呢?早着呢,誰家的商品出如今第一頁?這裏須要用到巨複雜的排序算法。要是再根據你的購買行爲作一些個性化的推薦,這夠一幫牛叉的算法工程師奮鬥終生了。網絡
商品詳情數據結構
就是搜索完畢,看到你感興趣的,點擊查看商品的頁面,這個頁面有商品的屬性、詳細描述、評價、賣家信息等等,這個頁面的天天展現次數在30億以上,一樣的道理,若是你作一個網站天天有10我的訪問,你絲毫感受不到服務器的壓力,可是30億,要解決的問題就多了去了。運維
首先,這些請求不能直接壓到數據庫上,任何單機或分佈式的數據庫,承受30億天天的壓力,都將崩潰到徹底沒有幸福感,這種狀況下要用到的技術就是大規模的分佈式緩存,全部的賣家信息、評價信息、商品描述都是從緩存裏面來取到的,甚至更加極致的一點「商品的瀏覽量」這個信息,每打開頁面一次都要刷新,你猜可以從緩存裏面來取嗎?淘寶作到了,整個商品的詳情都在緩存裏面。
商品圖片
一個商品有5個圖片,商品描述裏面有更多圖片,你猜淘寶有多少張圖片要存儲?100億以上。這麼多圖片要是在你的硬盤裏面,你怎麼去查找其中的一張?要是你的同窗想拷貝你的圖片,你須要他準備多少塊硬盤?你須要配置多少大的帶寬?大家的網卡是否可以承受?你須要多長時間拷貝給他?這樣的規模,很不幸市面上已經沒有任何商業的解決方案,最終咱們必須本身來開發一套存儲系統,若是你據說過google的GFS,咱們跟他相似,叫TFS。順便說一下,騰訊也有這樣的一套,也叫TFS。
廣告系統
淘寶上有不少廣告,什麼,你不知道?那說明淘寶的廣告作的還不錯,竟然不少人不認爲它是廣告,賣家怎麼出價去買淘寶的廣告位?廣告怎麼展現?怎麼查看廣告效果?這又是一套算法精奇的系統。
BOSS系統
淘寶的工做人員怎麼去管理這麼龐大的一個系統,例如某時刻忽然宣佈某位做家的做品所有從淘寶消失,從數據庫到搜索引擎到廣告系統,裏面的相關數據在幾分鐘內所有消失,這又須要一個牛叉的後臺支撐系統。
運維體系
支持這麼龐大的一個網站,你猜須要多少臺服務器?幾千臺?那是零頭。這麼多服務器,上面部署什麼操做系統,操做系統的內核可否優化?Java虛擬機可否優化?通訊模塊有沒有榨取性能的空間?軟件怎麼部署上去?出了問題怎麼回滾?你裝過操做系統吧,優化過吧,被360坑過沒,崩潰過沒?這裏面又有不少門道。
再也不多寫了,除了上面提到的這些,還有不少不少須要作的技術,固然並非這些東西有多麼遙不可及,任何複雜的龐大的東西都是從小到大作起來的,裏面須要牛叉到不行的大犇,也須要充滿好奇心的菜鳥。
看看排序這點事兒
我有 20 個整數,一把全裝進內存,調用個 sort,完事了。我有 2GB 那麼多的整數,一把全裝進內存……嗯嗯,若是機器不那麼破,勉強也完事吧。
那我如今有 200GB 那麼多的整數……看你丫的怎麼裝內存,哈哈哈哈哈哈!
嚇尿了吧!?寫外排序?你寫啊!It's only the beginning!不少人但是連內存裏的快排都寫不出的哦~
好,如今有 200GB 的整數,排個序吧……呃,給你 10 臺機器吧。這 200GB 的整數,如何分配?這 10 臺機器之間如何通信?沒錯,我不止坑了你去寫外排序,我還得坑你去玩網絡編程。
假設每一臺機器上的數據都已經徹底排好,如何多快好省地把各自排序好的結果 merge 在一塊兒?如何設計有效的 merge 邏輯減小 10 臺機器之間的網絡IO。
別覺得 10 臺機器不須要維護,萬一在排序的時候其中一臺機器掛了,怎麼辦?具體包括但不限於:他在掛以前有響應其餘機器發給他的 request 嗎?他在掛以前自身的任務完成了多少了?假設這臺機器在掛的時候正在跟隔壁的機器互相傳輸數據腫麼辦?
若是數據不是 200GB,而是 2TB,2PB……,排序簡單麼?簡單。可是給不少數字排序就不簡單了。
技術優化的經濟效益
當你有一百億件商品要檢索的時候,一臺計算機的計算能力確定是不夠用的。因而Facebook,淘寶就須要建一個大車間,裏面裝滿了各類性能強勁的電腦來作計算。這些電腦能耗是多少?Google有3億瓦,Facebook 6000萬瓦。其實這些能源有不少都在CPU空轉的時候被浪費了。假若有一種方法能讓數據中心的能耗下降10%,你願意花多少錢配多少人員去研究這個方法?
問題規模大到必定級別,任何微小的改進都能帶來巨大的回報。可是這樣的改進每每不是那麼容易作到,因此這樣「簡單」的網站須要大量高手來開發。
行動的誤區
看到這裏你可能以爲優秀的開發者就是寫出更優的算法,正要摩拳擦掌去征服高深的xx算法,這樣的理解是很是片面的,像google這種看起來簡單的服務卻須要大量頂尖高手來開發的產品並不算多,大部分是不須要大量頂尖高手參與的複雜的功能性的產品。
任何複雜的龐大的東西都是從小到大作起來的,不要一上來就要求這樣那樣的算法,不少開源的組件或者工具已經很是優秀,拿來應用是個不錯的選擇,解決當前面臨的問題纔是正道。
「小公司沒有發展前途,各類工做比較雜,沒有高手帶領,而大公司一般只讓你作模塊,你根本接觸不到核心,那算法優化方面怎麼提升?自學?」這些問題不少開發者都會遇到。
在以前的文章「什麼纔是真正的編程能力?」中咱們討論過計算機科學有兩類根本問題。一類是理論:算法,數據結構,複雜度,機器學習,模式識別,等等等。一類是系統:操做系統,網絡系統,分佈式系統,存儲系統,遊戲引擎,等等等等。
這兩類工做沒有孰優孰劣的問題,若是不能應用到現實中,即便算法再強大,也沒有任何意義。同理,你要爲用戶提供好用的服務,若是沒有好的算法支持,提供的服務可能會大打折扣,它們是相互依存相互制約的。理論也好,系統也罷歸根究竟是要解決現實問題或者改變不盡人意的現狀。
怎麼選擇,理論?系統?
我的因素
從我的擅長的點出發,若是你溝通能力較強,擅長現實業務與虛擬數字產品的映射,需求分析、功能設計等等,可是不太擅長複雜的算法分析,徹底沒問題,你更適合系統而非算法研究。
若是你自身溝通能力較弱,邏輯思惟較強,數學不錯,工科科班出身,同時本身很是喜歡研究算法,那麼你能夠去阿里或谷歌這類科技公司應聘算法工程師或者數據結構工程師崗位。
環境因素
人總會受到環境的制約,你所處公司的業務方向2B仍是2C都會影響你接觸的技術或者工做崗位,固然如今的人才流動性很大,能夠在流動中彌補本身的不足。
小公司,大公司也會不一樣,小公司更多的要求綜合應用能力,大公司分工很是明確,更多的要求深刻能力。
國內不多是根據我的興趣進行技術研究,更多的是注重現實收益,因此即使是算法工程師崗位,大部分是對已有算法的應用和改進,對開源產品的應用和微調,而非從頭研究新的算法或者算法工具。這也就是爲何Hadoop等技術源於國外而不是國內的緣由。
固然,國內的技術起步較晚也是一個不爭的事實,開源作的也不夠好,相信將來會更好,這須要一個不斷髮展的過程。
互相轉換
固然,人是能夠去改變本身的,一輩子不可能只從事一個方面的工做,關鍵看你的職業規劃。
從事系統研發工做也是一種不錯的積累,培養本身把現實問題映射爲虛擬數字產品的能力,系統研發遇到瓶頸,你可能會轉向算法等理論研發工做;一樣算法等理論研發工做也是要以現實存在的問題做爲出發點,否則就是本末倒置。
最後的話
看起來簡單的服務並不簡單,越是簡單的服務工做越艱鉅;算法研究與系統研究統一於對現實問題的解決,二者相互依存,而非誰優誰劣。
這些是個人一點淺見,但願能夠幫助站在十字路口的你。