程序員必須知道的電腦知識(3)
再講一個搜索引擎的故事:
很久以前,我要給一個程序添加搜索功能。剛開始使用sql查詢實現(xiàn),發(fā)現(xiàn)實在太慢了。后來找了開源的Lucene項目。它使用反向索引技術(shù),通過在文件中創(chuàng)建反向索引,大大提高了搜索速度。
Google的兩位創(chuàng)始人發(fā)現(xiàn)了html中l(wèi)ink的秘密,他們發(fā)現(xiàn)可以通過html頁面的link關(guān)系來為每一個html頁面設(shè)置權(quán)重。也就是PageRank算法。于是,Google的自動搜索引擎擊敗了Yahoo人工分類的搜索引擎。
OK,利用反向索引技術(shù)和PageRank,以及一個簡單的html爬蟲機器人,我們就可以創(chuàng)建一個搜索引擎了。但是,互聯(lián)網(wǎng)很大,每天產(chǎn)生大量新網(wǎng)頁,要為整個互聯(lián)網(wǎng)建立反向索引是很困難的。
若干年后Google又公開了三篇論文:Googlefs、Mapreduce、Bigtable。于是Lucene項目的開發(fā)者根據(jù)Google的Mapreduce論文開發(fā)了Hadoop項目。MapReduce就是使用大量計算機存儲數(shù)據(jù)并計算,最后匯總結(jié)果。使用Hadoop+反向索引+PageRank,就可以創(chuàng)建搜索引擎了。Yahoo,Baidu等公司紛紛基于Hadoop開發(fā)了自己的搜索引擎。
但是,其他公司的搜索引擎效果還是沒法和Google相比。這一點我們程序員最清楚。像我,就總是翻薔出去,只為了Google一下。
Google黑板報上發(fā)表了吳軍博士的一些文章,其中介紹了很多機器學(xué)習(xí)方面的知識。從文中可以知道,Google其實使用機器學(xué)習(xí)來分析搜集到的頁面。Google明顯不會把這個公式公開出來。即使有一天Google真的公開了這個公式,那么可以想見Google肯定又研發(fā)出了更加犀利的秘籍,山寨貨的搜索引擎效果還是比不上Google的。
山寨是通向創(chuàng)新的必由之路。在成為領(lǐng)域的領(lǐng)頭羊和領(lǐng)導(dǎo)者之前,必然要經(jīng)過學(xué)習(xí),模仿的階段。但要成為行業(yè)的老大,成為Champion,必須勇于彎道超車,勇敢地走上創(chuàng)新之路,成為真正的科學(xué)家,真正的大牛!
總結(jié)
編程能力可分為兩個維度:一個是編程技能水平,另一個是領(lǐng)域知識水平。
有些程序員可能把精力都花在提升編程技能上了,領(lǐng)域知識知之甚少,這其實在日常工作中也是極其有害的。有些需求可能早已經(jīng)有了現(xiàn)成、開源免費的解決方案,或者只需要組合幾個現(xiàn)有軟件就可以快速搞定,而他們卻不得不自己花大量時間去開發(fā)。另外,缺少領(lǐng)域知識,在程序出現(xiàn)非預(yù)期狀況時,很難快速定位到問題的根源,很難解決bug。