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