作者:卢彦 来源:agilelabs.cn 酷勤网收集 2007-09-20
昨天周会上,包子在做自我介绍的时候谈到他对算法比较感兴趣,平时喜欢研究人工智能什么的。引起了我对这个问题的一些回忆和思考。
在网上,很多声音说学编程主要是学习算法,而不要死钻编程语言,API函数什么的。并认为算法是不变的东西,是根本。而编程语言,API什么的很容易变,只是皮毛。我觉得这里面要看场景的,占绝大多数的应用软件的开发,最影响开发效率和软件质量的,并不是因为算法太差。而恰恰就是因为对语言,平台,类库的不熟悉导致的。而开发企业软件最大的问题,则是因为软件规模庞大而导致的整体复杂性问题。这也不是通过优秀的算法可以解决的,而是利用良好的结构设计来化解的。
在学校的时候,我也是比较喜欢研究算法,什么生成树,最短路径等等,五子棋程序也开发过,虽然棋力很差。但工作后基本上就再没有时间去思考这些方面的问题,整天的修改重复的代码,解决一堆因为代码复制遍布各处的BUG。完全感觉自己就是一个机械工,整天做一些不需要动脑筋的体力活。说实在的,这些东西好像跟算法没什么太大的关系。
研究算法,我觉得分为两种类型,第一种是设计算法,我认为这个工作其实已经不属于计算机行业,是属于数学专业方面的问题,需要非常高深的数学知识才能设计出新算法,或对以前的老算法进行改良,真有这个能力的人,也就是数学家,一般来说可以不用在计算机行业混了。另一种是实现算法,也就是编写计算机程序来实现已经设计好的算法。一般来说,实现其实并不困难,只是运行速度上的问题。而对大多数常用算法,比如加密,压缩等等,已经有很多非常高效现成的免费函数库供你使用。即使是对一些并不常用算法,到网上去搜索一下一般也都能找到实现代码。比如图像、音频的识别等等,我已经在网上看到好多文章介绍和示例。并且算法的问题域很狭窄,某种算法一般只解决某一种特定的问题,比如说围棋和象棋的算法,虽然都是下棋,但是基本上不能通用。所以没有什么灵活性,一般不需要知道算法原理,只要根据其规范调用接口即可。不像设计模式这样很灵活的东西,需要根据不同的场景来分析选择。
说了这么多,我主要的意思并不是说算法不重要,而是说对目前我们面临的问题来说,算法并不是最重要的。如果把研究算法的精力挪到架构设计,对语言,API的熟悉上来说,可能会有更好的效果。虽然这些只是"皮毛",但是的确能解决实际问题。
另外,编会下棋的程序并不属于搞人工智能研究。即使你的程序能下赢世界冠军,但是计算机和人的思维方式有本质的不同。这和计算机会算四则运算,人也会,但不能说计算机就具有有人的思维是一样的道理。本质上来说,计算机下盘象棋和做一个超级复杂的算术题没有区别,这其实是人对象棋的规则进行抽象,事先建立好数学模型,设计好程序,然后再让计算机来傻乎乎的求解而已。而人工智能指的是用计算机来模拟人脑对信息的一种抽象处理方式。就像深蓝的创造者所说的,计算机再会下象棋,他也无法设计出象棋。
来自:http://www.agilelabs.cn/blogs/linkin/archive/2007/05/15/3337.aspx

