我觉得,面试官大多出算法题,可能有两个原因:
1 他自己也不怎么懂OO和设计模式,对模式的理解需要一定的天赋,不是任何人经过努力都可以掌握的。我在的公司,大多数程序员项目负责人都不会用设计模式。说明对模式的掌握很难,不是像bang描述的那么容易。
2 大多数应届生是不懂模式的,出这种题对他们有些不公平
做软件不管是应用软件和基础软件,模式的重要性都大于算法,模式使得代码成为一种艺术。算法是点,软件是面,模式是解决面一级的问题。好比一个屋子,善于整理的人搞的井井有条,不善于整理的人弄得像一个垃圾堆,什么东西都找不到。软件也一样,如果组织的不好,很容易搞得像垃圾堆储藏室,代码都乱七八糟堆在一起,找什么都找不到。用模式来组织代码,相当于一种艺术,让代码优雅艺术化,一切都井然有序,这样的代码才有生命力,能够经得起需求的改变。

一个是计算机科学。一个是软件工程。

大学里分了门类的。请大家搞清楚,不要再“算法vs模式”

牛人话两个都学,不牛的话闭嘴。

2009年10月20日 17:05 "netroby"的内容
算法真的是一切吗? ...

不是算法是一切,而是一切事物里面都含有算法。

我也来吼两句凑凑热闹
我认为OO就是以一个正常人来思维 这是人与计算机交流比较的方法
对象就是有属性和行为的而对于行为上的实现还是得用到算法
算法使得代码与计算机交流表较好
所以算法还是要的 OO和算法两者缺一不可
纯属个人愚见

2008年12月25日 09:11 "banq"的内容
我说一句来自我的世界观点:
1. 算法就象任何一门科学都很重要,人类所有科学都很重要,但是在解决软件的灵活性 扩展性和维护性,算法起不了作用,这是基本常识,就象你写诗词,物理就没有用处,如果这个基本常识都没有认识,还搞什么软件?都是业余滥 ...

banq前辈的观点,小辈拍手赞成。前辈的观点,如当年的老毛:借马列主义,在中国这片烂泥地里再改造。

嗯,看到这篇扯皮贴, 特意注册一个账户, 发个贴
算法和OO,设计模式等等的区别,一个在于对CPU,一个在于对人;
算法是CPU的语言,告诉CPU怎样做一件事, 怎样做才优质(空间时间等);
OO,设计模式等待是对人,软件开发人员而言的,也就是告诉"人"应该怎样做一件事,怎样做这个项目才利于和团队沟通,才利于扩展维护等等;
跟beyondye的观点相似,出发点完全不同的东西,硬是扯出鼠标没有方向盘重要这种废话来了....
估计beyondye 也跟我一样,随手注册一个转头就忘的垃圾号,回个小帖打发时间的

似乎有些同学把学算法理解为学习经典算法的具体写法,例如快排、网络流什么的
其实学算法的重点在于理解算法的思想,例如分治
《算法导论》和《C算法》貌似很权威,但里面全是经典算法,相当于算法学习的入门书(就像学C语言时谭浩强那本入门书)。我对经典算法的理解力比较低,至今没证明波利亚计数定理(虽然用这个定理写过不少题目了)。
稍微高一点的是《算法艺术与信息学竞赛》,里面没有提到任何经典算法,而是根据每一个题型(相当于项目设计书里的例题)给出怎么用算法。例如,一个地方要排序,至于用什么算法排序不重要,重要的是怎么想到要排序这件事。这可不是那么显而易见的。至于DP,我用了1年多才运用得稍微熟练一点。
再高一点的是《具体数学》,经典算法已经到了“无”的境界了。这才叫“学算法”。

ZOJ、POJ上的AC数就是“学算法”的成绩单。会写出个qsort不算什么。

现在大学里对算法的教学力度是不够,但实际上是对编程的教学力度不够,例如有些同学毕业了连个冒泡都写不出来。

软件里的算法和架构,一个是技术,另一个是使用技术的技术。就像科学,数学是技术,物理化学是使用技术的技术。都是技术,哪个更好,取决于个人需要。如果赚钱多就是好,目前算法牛的(在企业里靠算法知识工作的)赚钱更多,但门槛高,一般水平的别想。一般水平的架构师赚钱多一些,也比较好找工作,这是当前中国软件业结构特性决定的。类似于“做原子弹的不如做茶叶蛋的”。搞算法,必须挤到顶尖企业里去搞底层才有前途。

在我的眼中,应用级开发和系统级开发是两个交集不大的领域。

算法在应用开发中不能说完全没用,但我以为对于一般开发来说,熟练的掌握到分治递归的级别已经差不多了。

正确的看待客观世界的方法,良好的事物抽象能力,最牛逼的是写出初级程序员看了都觉得干净的程序,方是应用开发的王道。

我做.net的,最近.net社区出了朵奇葩,用c和c++比性能,殊不知应用开发的核心价值是与人交流,而不是机器。

问太多算法的地方,我是去不了了。


[该贴被FredWang于2010-06-23 20:16修改过]

公司的核心力量来自 架构+算法?
难道好的架构不需要算法。软件开发中算法是非常重要的,特别是用C语言开发,及其重要。
而相对在java这个领域,设计模式及架构要比算法重要一些,因为java中需要用到的一些精妙算法,已经由jdk,或则其他的一些API提供。
关注这个网站差不多半年时间,感觉Banq老师在某些方面显得有些偏激,当然不乏有很多独特的见解。软件行业非常的广,就拿用C语言编程来说,就是 数据结构+算法,因为要追求效率。而java用到的数据结构估计也就 array,list,map几种,很少用到二叉树之类的。而相对来说无论是插入还是筛选,二叉树的效率是最高的。
另一方面,这个网站极力推荐NoSQL数据库,其实目的也是在追求效率。而SQL数据库与NoSQL数据库在本质上还是算法的不同,在数据量非常大的情况下,后者的效率要高一些。如果只是存储的方式不同,NoSQL是通过key-value存储,然后根据value值通过计算获得相应的记录,那SQL数据库完全可以通过拆分,将大量数据存储在不同的的库中,然后建立索引,效果完全可以做的和NoSQL一样。所以重点还是算法。当然采用什么样的数据结构也非常重要。
而java为什么不重视算法是因为大部分写java的程序员根本就不重视效率。我所在的公司有两个写java的程序员,我看过他们写的代码,每次要用到DAO去save数据的时候都是通过new XXXDAO().save(Object o);这样来实现的。

其实,个人认为百度,谷歌这些公司考的不是算法,而是逻辑还有分析问题的能力.
就个人这2年的程序员工作,感觉OO和算法这些东西都是为了相同的一个目的:怎样在客户满意的情况下,交付相对来说方便开发公司维护,相对来说容易扩展(个人认为接触过的公司这点都做的不怎么好)的可工作的系统。
公司用的也就是那几个常用的技术框架,最多在按照自己的业务经验包装下,除非你是公司的技术高人,否则一般都是以怎么样解决你的业务为出发点,没人在乎你是怎么实现的。
上面是个人工作感想。
[该贴被yy123于2010-09-08 11:08修改过]

懒得说了,我不知banq是何许人物,但我只看到两个字,肤浅。。。

你们若果还以为算法能够主导一切的话,你们继续在中国做所谓正确的算法吧,国外设计模式思维已经领先我国多少年了?别人多少个系统,已证实良好的设计如何带入好的扩展性和伸缩性了。一个系统不是做完就了事,不是一个算法写完就了事,我们需要考虑获取准确,分工,可重用,可管理,可维护,可伸缩,可整合,更重要一点是以更准确而且更低成本的方式去实现系统整改和扩张。正因为算法不能带给我们这些,所以出现OO,它把算法和数再一次抽象,变成可调整,可管理的Object,当然OO还有很多缺陷,但正在不断靠近人类思维而努力(语言特性),算法再怎么做,也难以靠近人类思维,为啥,因为人天生有直接接触实体的五官,而且通过思考获得的是逻辑,而非算法。可能有人拿出什么操作系统出来说算法,那我告诉你,操作系统一样有自己的设计。还有架构!=算法,若果你认为是,你就大错特错了,架构是为设计而服务的,为啥windows加动态链接库就可以实现很多扩展,为啥是加DLL?因为设计,在设计中早就把这个决定好了,为啥按照一定规则就能加入软件,一定的协议就可以通信?这些都是设计。只要是庞大的系统一样有设计,而且往往设计是走在算法之前的。若果算法包含设计,为啥还会存在“算法设计”一说?设计是一种思维居多的知识,而具体实现是为了落实所必须的。

为啥说现在设计模式更重要,因为中国一向只重视算法,根据水桶原理,所以再强的算法,也不能适应变化多段的业务环境,而且获取准确,分工,可重用,可管理,可维护,可伸缩,可整合,还有低成本,单靠算法不能实现。现在即使用较差的算法,有良好设计的系统一样可以跑起来(GC除外,内存占光了,再好系统也是废物),但反过来,看到的是什么?设计模式绝对不只23种那么简单,很可能你自己都不自觉用上了,而且MVC是架构上的一种模式,MVC就够用了吗?不是,还有很多,思考角度不同,得出的设计也是不同。23种设计模式是一种外人总结性知识(实际上从设计到架构,设计模式还不止这些),学了是为了更好的深入,让你更多的了解设计待地是什么和带来什么——小的让你的众多数据和算法拥有可组织、可管理的效果,大的到达可以用哲学指导设计的程度。

算法发展日趋缓慢,但设计却日日升温,若果你想做断边的水桶,没人拦你,你做好的算法我拿过来用就是了,因为我想要的是系统,而非单单一个程序。
[该贴被SpeedVan于2011-01-11 14:50修改过]

算法还是很重要的,
设计也是很重要的。

具体,看项目,看目标,看需求!

顺便:你们真能喷……犯得着谁瞧不起谁么。说的那个话……唉

08年写的。。。写的真好,banq 大师...

2014-09-19 17:26 "@edison87915"的内容
写的真好,banq 大师 ...

请称呼banq大叔,时隔这么多年,这里有一个更正,算法不能归结于数学,应该归结于逻辑领域,一段逻辑算法也是算法,不能因为“算法”里面有一个“算”就只是数学,数学可以用算法表示,但是不是所有算法都可使用数学公式表达的。

这里引出一个问题,我们训练逻辑是从数学开始还是编程开始?从我多年编程经验来看,虽然因为工作经历关系,需要数学的机会比较少,但是我的逻辑能力还是在不断加强,所以,从我个人经验来看,好像数学不是训练逻辑的唯一手段,因此,如果需要训练逻辑能力,我认为从小可以从编程开始,然后再学习数学,因为编程比较适合小孩起步,实践性操作性强,小孩对电脑兴趣也比较高。

从理论上看,软件和数学都属于形式逻辑,特别是函数式编程更等同于数学,但是函数式编程确实难以普及的问题,因此,这里存在人体工程和数学之间的平衡问题,不能过分强调数学重要性而忽视人性化,也不能强调人性化而不愿意用理性去思考。

台大的逻辑学课程:按这里

另外,也请注意“程序”和“软件”的区别,程序中有“序”这个词语,CPU是按时序执行的,程序是写给CPU执行的,因此,程序是一个基础概念,而软件中有“件”的概念,是组件 构件的意思,也就是说,程序多了就需要软件概念了,软件不只是让CPU执行,也要让人可以维护和拓展。

所以,程序员和软件工程师(软件开发人员)这两个概念是不同的,在程序员世界里,也许算法是最重要,但是在软件工程师眼里,我们要让算法变得可管理,我们将算法看成是聚合体,比算法更重要的是业务逻辑以及模式框架和架构。这是方向和途径的区别。战略和战术的区别。

软件的复杂性与构造定律

[该贴被banq于2014-09-23 08:47修改过]