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