cover of episode 程序员必须要会算法吗?

程序员必须要会算法吗?

2016/6/11
logo of podcast 一个程序员

一个程序员

Frequently requested episodes will be transcribed first

Shownotes Transcript

程序员必须要学会算法吗?这是一个永恒的话题。程序员对算法通常怀有复杂的感情,算法很重要是大家的共识,但是是否每个程序员都必须学算法是主要的分歧点。“很多人可能觉得像人工智能、视频与音频处理以及数据搜索与挖掘这样高大上的内容才能称为算法,往往觉得算法深不可测。但是这些其实都不是具体的算法,而是一系列算法的集合,这里面既有各种大名鼎鼎的算法,比如神经网络、遗传算法、离散傅里叶变换算法以及各种插值算法,也有不起眼的排序和概率计算的算法。”聊一聊你对这个问题的看法,你的工作中主要用到什么算法?编程之路自己是在大学的课堂上开始学习编程的,最早学习的是C语言,全系英文授课,而且常有上机实验,过程极为痛苦。到学期中的时候,自己还是学的一塌糊涂。感觉到这样下去期末肯定挂,于是便到图书馆借了几本经典的书连同教材一同钻研。那个时候自己还没有笔记本,因此需要经常到学校的机房去练习。写完的程序就存在邮箱里,自己给自己发一封邮件。一直到现在,自己的邮箱里都保存着数十封的邮件。慢慢的开始觉得无聊的编程开始变的有意思,因为它是有规律的,一组输入就必然有着严格的运算结果与之对应。但现在看来,那时学会的基本都是如何查找字符串、斐波那契数列的递归实现等等,只求实现,不求效率。到后来,又学习了VB的课程,有界面的程序比起黑洞洞的控制台程序看起来要高大上的许多。于是按钮、编辑框、文本框、复选框……等等,这些在当时认为“极先进”的东西不断的出现在自己的程序中,成为了自己编程时的标配。也是从VB开始,Java、Python、LabView、JS、C#也都学习过,但大多都是工程需要,属于蜻蜓点水般的学习,而且大多伴随着”哪种编程语言强大好用的选择恐惧症中”。但真正学的比较多也应用的比较多的是MFC的编程,这主要是在《VC++深入详解》的指导下进行的自学。这本书虽说是针对VC6.0的老书,内容有些过时,但细致的分析使得写起程序来容易,边写边操作,让自己很受益。学(jie)习(chu)了这么多编程语言,得到的结果却是更加迷惑的自己。每学一门语言,试验着别人的代码,大量的做着重复的事。自己编程的目的这是这样吗?另一个世界最近面临着找工作的压力,开始读有关数据结构、算法设计之类的书,并在Leetcode上刷题。在这个过程中,我像发现另一个世界般,学到了不一样的东西——链表、栈、队列、树的遍历、图的连通、字符串查找……等等。特定的结构,高效的算法时常让自己感叹“神奇”。但同时自己也有着疑问:这些都是一名程序员所应学的吗?哪一门语言没有提供现成的经过千锤百炼、无数次优化的数据结构?哪一门语言没有提供性能优良的基础算法?为什么我们要去学习如何设计数据结构和基础算法?就是这“为什么”让自己很苦恼。在网上搜索,见过的最有意思的一个回答来自知乎——程序员要不要会算法等同于搬砖要不要学物理。说的好有道理,我竟无言以对。因为很形象,让我记忆深刻。在贺利坚老师的博客下写了自己的疑惑,第二天的回复如下——一条一条的汽车生产线,在各个厂家都已经建好了,是否我们都只去学开车,而不需要有人去学造车了?一样的道理,学习算法设计,(1)有人就要去为算法大厦添砖加瓦的,尽管这座大厦永无完工之日;而(2)有些人,会发明新的语言,为这种语言中配备算法“基础设施”;(3)有些人,深谙算法之道,借此理解函数接口中能体现出的道道,将别人提供的算法库用得恰到好处。而对算法一无所知的人,宝藏就在那里,却总是牵是附会地使用,做出漏洞百出的系统。所以,如果在求学阶段,不要放弃对算法修养的追求。之前的所有自认为的“编程”只不过是在完成某个特定的任务,而不是着眼于一类问题。而数据结构和算法设计的目的在于解决一大类的问题。你写一个for循环、swith case 语句等,是在编程;你写一个树的遍历、图的连通判断算法等也是在编程。不同的是前者对一个具体的问题是适用的,而后者对一类问题是适用的。对于具体的任务,你可以用不同的语言来实现;但对于一类问题,总有着近乎相同的核心结构或者算法来应对。最近这段时间读到的这些书、学到的这些算法才使我真正的感觉到编程的博大,而不是几个按钮、几个控件那么简单。真正高大上的是简洁高效的源代码。避免陷入编程语言的纷争,立足于当前掌握的C++,去接触学习弄通所有相关的算法。这是自己的思考结果,也是将来的方向。算法之大,大到可以囊括宇宙万物的运行规律;算法之小,小到寥寥数行代码即可展现一个神奇的功能。算法的应用和乐趣在生活中无处不在:历法和二十四节气计算使用的是霍纳法则和求解一元高次方程的牛顿迭代法;音频播放器跳动的实时频谱背后是离散傅立叶变换算法;DOS时代著名的PCX图像文件格式使用的是简单有效的RLE压缩算法;RSA加密算法的光环之下是朴实的欧几里德算法、蒙哥马利算法和米勒-拉宾算法;井字棋、黑白棋、五子棋和俄罗斯方块游戏背后是各种有趣的AI算法;华容道游戏求解的简单穷举算法中还蕴藏着对棋盘状态的哈希算法;遗传算法神秘不可测,但用遗传算法求解0-1背包问题只用了60多行代码……一本书带你走进色彩缤纷的算法世界,让你尽享算法的乐趣。更多节目请下载荔枝FM收听!微博:程序员之路FM微信:FM670795网站:www.qiefm.com