王晓华是一位热衷于算法研究的程序员,他是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的博客和技术文章要繁荣,就要有一个共赢的模式。