《算法的乐趣》作者王晓华访谈:多看、多做、多想是秘诀
王曉華是一位熱衷于算法研究的程序員,他是CSDN算法專欄的超人氣博主( 博客),也是《算法的樂趣》一書的作者。2005年畢業(yè)于華中科技大學(xué),目前在中興通訊上海研發(fā)中心從事光纖接入網(wǎng)通訊設(shè)備開發(fā),擔(dān)任EPON(以太網(wǎng)無源光網(wǎng)絡(luò))業(yè)務(wù)軟件開發(fā)經(jīng)理,參與開發(fā)的PON設(shè)備在全球部署過億線,為數(shù)億家庭提供寬帶接入服務(wù)。?
日前,筆者對(duì)王曉華進(jìn)行了采訪,請(qǐng)他分享專研算法的樂趣之道。
王曉華
CSDN:請(qǐng)先做個(gè)自我介紹、所在公司以及目前所負(fù)責(zé)的領(lǐng)域。
王曉華:我目前在ZTE上海研發(fā)中心從事軟件開發(fā)相關(guān)工作。我們開發(fā)的產(chǎn)品是無源光網(wǎng)絡(luò)(PON)設(shè)備,在網(wǎng)絡(luò)設(shè)備領(lǐng)域中,我們開發(fā)的設(shè)備屬于接入網(wǎng)設(shè)備,也就是常說的“網(wǎng)絡(luò)的最后一公里”。光接入技術(shù)目前已經(jīng)是接入網(wǎng)的主流技術(shù),未來的家庭寬帶建設(shè),比如FTTH、FTTB,都依賴于光接入技術(shù)的不斷發(fā)展和革新。當(dāng)前,下一代PON技術(shù)(NG-PON2)的標(biāo)準(zhǔn)正在制定過程中,NG-PON2標(biāo)準(zhǔn)將提供單纖40G bps的下行帶寬,千兆光纖入戶將成為現(xiàn)實(shí),到時(shí)候只有百兆接口家用路由器將被淘汰,無線傳輸?shù)乃俾室矊⑺疂q船高。
CSDN:是什么原因促使你對(duì)算法感興趣的?又是什么原因讓你堅(jiān)持把算法做下去的?
王曉華:剛開始我對(duì)算法和軟件沒有概念,覺得編程序就是為了應(yīng)付作業(yè)。后來因?yàn)閷W(xué)習(xí)表形碼輸入法,就寫了一個(gè)程序把Windows格式的表形碼碼表文件轉(zhuǎn)換成UCDOS支持的碼表文件格式,這個(gè)程序只用了幾分鐘就完成了十幾萬條記錄的轉(zhuǎn)換,給我很大的震撼,讓我覺得這東西不只是交作業(yè),還可以做一些有用的事情,從而開始對(duì)編程感興趣,從簡(jiǎn)單的排序算法開始,逐漸接觸了更多有用的算法,進(jìn)而對(duì)設(shè)計(jì)算法產(chǎn)生興趣。
研究算法其實(shí)是一個(gè)很枯燥的過程,常常一個(gè)人在計(jì)算機(jī)前面一坐就是一天,其他人都很難理解這種行為,沒有興趣是堅(jiān)持不下來的。上學(xué)的時(shí)候也熱衷于參加各種算法比賽,填鴨式的背很多東西,記算法的模式,搞得很辛苦,也沒取得很好的結(jié)果。當(dāng)時(shí)以為這就是算法的意義,搞得幾乎對(duì)算法失去了興趣。讀研究生的時(shí)候想做一個(gè)MP3播放器,為了實(shí)現(xiàn)均衡器和頻譜的功能,找了很多資料,最后發(fā)現(xiàn)了離散傅立葉變換算法,小小的算法蘊(yùn)含了這么多的意義在里面,于是對(duì)算法又燃起了興趣。后來有學(xué)習(xí)了一些很有意思,但是都很實(shí)用的算法,比如A*尋徑算法、棋類游戲的博弈樹算法等等,漸漸地開始把興趣放在更有實(shí)用意義的實(shí)用類算法上,開始研究針對(duì)各種現(xiàn)實(shí)問題的算法設(shè)計(jì)和實(shí)現(xiàn)。解決的實(shí)際問題越多,分析問題、解決問題的能力就越強(qiáng),“玩”算法的興趣就越大。
CSDN:?《算法的樂趣》這本書的思路是怎樣的?對(duì)讀者而言如何學(xué)習(xí)這本書,你有什么建議?
王曉華:這本書從一開始就順著培養(yǎng)興趣的思路來策劃的。市面上已經(jīng)有很多算法設(shè)計(jì)的書了,或淺顯易懂,或深不可測(cè),如果沿用類似的討論再寫一本完全沒有意義。而我的“算法系列”專欄中剛好已經(jīng)介紹了很多有意思的算法,于是就以此專欄為基礎(chǔ),補(bǔ)充了一些有趣的專業(yè)類算法和實(shí)用類算法,構(gòu)成了本書的主要結(jié)構(gòu)。每一個(gè)有趣的算法都展示了從問題的提出,到設(shè)計(jì)模型,最后得到能解決問題的算法實(shí)現(xiàn)的完整過程,將算法設(shè)計(jì)的三個(gè)關(guān)鍵問題融入到整個(gè)過程中,使得讀者在得到一個(gè)趣味算法的同時(shí),也學(xué)習(xí)了算法設(shè)計(jì)的整個(gè)過程。
本書各個(gè)章節(jié)之間沒有前后關(guān)系,可以從任意一個(gè)感興趣的章節(jié)開始看這本書。對(duì)讀者而言,我建議先系統(tǒng)看完前三章,然后再挑選感興趣的章節(jié)開始。在圖靈社區(qū)可以下載本書的全部源代碼,任何問題都可以在源代碼中找到答案。
CSDN:什么是算法?最常見的算法有哪些?可否就其中一個(gè)給大家舉個(gè)示例。
王曉華:我理解的算法的意義就是解決問題,從這個(gè)角度看,我將算法分為專業(yè)類算法、通用類算法和實(shí)用類算法三類。專業(yè)類算法通常都有一些堅(jiān)實(shí)的數(shù)學(xué)理論、物理理論或其他理論作為理論支撐,比如離散傅立葉變換算法、RSA算法、AES加密算法、各種曲線擬合算法、插值算法、牛頓迭代法以及計(jì)算機(jī)圖形學(xué)中的各種圖形生成算法、消隱算法等等。專業(yè)類算法通常在一些專業(yè)領(lǐng)域內(nèi)廣泛應(yīng)用,經(jīng)過多年的研究和技術(shù)積累,普遍形成了各種固定的高效算法實(shí)現(xiàn),很多情況下都可以像函數(shù)庫(kù)一樣直接拿過來用。
通用類算法也有相應(yīng)的理論支撐,算法的套路是固定的,但是算法的實(shí)現(xiàn)要視具體的問題而定。此類算法的例子也比較多,比如退火算法、蟻群算法、遺傳算法、BP神經(jīng)網(wǎng)絡(luò)模型學(xué)習(xí)算法(誤差反向傳播算法)等等。此類算法雖然套路固定,但是不同的問題有不同的實(shí)現(xiàn)方式。以遺傳算法為例,針對(duì)不同的問題要設(shè)計(jì)不同的遺傳編碼格式,遺傳編碼格式不一樣,對(duì)應(yīng)的基因交叉和變異算法的具體實(shí)現(xiàn)自然也不一樣,但總的來說,還是按照遺傳算法的套路進(jìn)行。通用類算法應(yīng)用領(lǐng)域更廣泛,上面提到的幾種算法都是常用的最優(yōu)化求解算法(隨機(jī)搜索算法),在機(jī)器學(xué)習(xí)、人工智能和虛擬現(xiàn)實(shí)等領(lǐng)域都可以看到這些算法的身影。
實(shí)用類算法往往是針對(duì)特定的問題設(shè)計(jì)的算法,用于解決某個(gè)或某種類型的問題。有時(shí)候解決問題的算法很多,但是受重視的往往是公認(rèn)的效率最高的算法。比如穩(wěn)定匹配問題,Gale-Shapley 算法就是公認(rèn)的最好算法。二分匹配問題,大家會(huì)首選匈牙利算法。Pierre Dellacherie 算法是俄羅斯方塊游戲中最好的One-piece評(píng)估算法。除了這些著名的算法之外,任何人為解決某個(gè)問題而設(shè)計(jì)的算法也可以歸為實(shí)用類算法,比如本書提供的求解“三個(gè)水桶等分8升水問題”的算法和“愛因斯坦的思考題”的算法。設(shè)計(jì)針對(duì)具體問題的實(shí)用類算法是衡量一個(gè)程序員水平高低的重要因素,也是程序員需要重點(diǎn)關(guān)注的問題。
CSDN:目前中興通訊用到了哪些算法?能不能向讀者詳細(xì)介紹下該算法?
王曉華:中興通訊的產(chǎn)品線很長(zhǎng),甚至包括太陽(yáng)能發(fā)電和無線充電,我還真不知道這些產(chǎn)品中到底都用到了哪些算法。就我所涉及的產(chǎn)品來說,很多基本的算法都會(huì)用到,既有各種專業(yè)算法,也有為解決特定問題而設(shè)計(jì)的通用算法。比如線性表的排序和查找就用到了快速排序算法和二分查找算法,數(shù)據(jù)一致性校驗(yàn)用到了CRC算法,還有本書中提到的環(huán)形隊(duì)列算法。PON網(wǎng)絡(luò)的特點(diǎn)是下行數(shù)據(jù)是廣播到所有終端設(shè)備上的,為了數(shù)據(jù)安全,標(biāo)準(zhǔn)定義了一套密鑰交換算法,同時(shí)規(guī)定了實(shí)際加密數(shù)據(jù)采用了三重?cái)_動(dòng)算法和AES加密算法。
CSDN:從一名資深程序員到《算法的樂趣》的作者,你的學(xué)習(xí)秘訣是什么?會(huì)通過哪些方式來提升自己的專業(yè)技能?
王曉華:其實(shí)沒有什么秘訣,就是多看、多做和多想。多看就是多看書,多看各種優(yōu)秀算法的實(shí)現(xiàn)代碼。多做就是多寫代碼,看懂算法的實(shí)現(xiàn)原理和寫出正確的算法實(shí)現(xiàn)之間還是有一道很寬的檻兒,研究一個(gè)算法,要到能正確寫出算法實(shí)現(xiàn)為止,而不是看懂就算了。多想就是多思考,為什么這個(gè)算法比那個(gè)算法高效?這個(gè)啟發(fā)函數(shù)為什么要這樣設(shè)計(jì)?多思考可以培養(yǎng)舉一反三的能力。
CSDN:未來的下一步計(jì)劃是什么?有哪些難點(diǎn)需要去克服?
王曉華:這個(gè)還真一時(shí)不知道從何說起,先不回答了,抱歉。
CSDN:?目前,你常用的編程語言有哪些?在你看來還有哪些語言比較熱門?
王曉華:我目前用的編程語言是C/C++和Lua,偶爾用用Java。2008年聽I(yíng)var Jacoson的演講,他講了個(gè)笑話,形容軟件行業(yè)就像是時(shí)尚業(yè),一天一個(gè)潮流:十五年前我們都討論OO,十年前我們追的是組件、UML和UP,五年前變成了RUP和CMMI,兩年前流行XP,現(xiàn)在是Scrum。但是他的一句話我很認(rèn)同,那就是這些都是好東西,但是沒有任何一種是可以解決你的全部問題的銀彈。我對(duì)當(dāng)今比較流行的編程語言的看法也是這樣,存在就是有道理,這些編程語言沒有好壞之分,但是有各自擅長(zhǎng)的領(lǐng)域,要合理的使用它們。
CSDN:你是從什么時(shí)候開始接觸CSDN的?對(duì)CSDN有什么建議嗎?
王曉華:我從2001年開始就是CSDN的注冊(cè)用戶了,剛開始是泡論壇,后來寫博客。建議的話我覺得CSDN要讓博主們能夠通過博客獲得收益,無私的奉獻(xiàn)是一種熱情,但是熱情過后就什么都沒有了。之前CSDN的博客是可以嵌入廣告的,我就從嵌入廣告中獲得了十幾美元的收益,后來都取消了,我看到很多人就把博客遷走了,或者申請(qǐng)了獨(dú)立的域名。CSDN的博客和技術(shù)文章要繁榮,就要有一個(gè)共贏的模式。
總結(jié)
以上是生活随笔為你收集整理的《算法的乐趣》作者王晓华访谈:多看、多做、多想是秘诀的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《钢铁之师诺曼底44》战斗及游戏性深度试
- 下一篇: 安卓EditText