读贴有感。算法、数据结构和OO、设计模式,初学者的你还在怀疑吗?

其实我也是跟banq一条路的人,我开始弄算法,数据结构这些东西,在做软件发现一个软件不是什么循环、什么动规所能解决的问题,我自己不断地写子函数,不断的复用,原来自己正走向OO了,现在的软件设计不是一两个算法和数据结构所能解决的问题,其实是软件的复杂化做成的,虽全用算法实现可以,但那样是高代价的。当我不断地怀疑的时候,于是我找到了OO,接触了框架,然后遇上了设计模式。曾经因为OO而藐视算法,但不断的认识和经历使我知道两者虽然是对立的,但也必须并存。

一个不知恰不恰当的比喻:
城市规划,不需研究汽车排气来减少污染,只需知道越少越好,当有更少排放的车辆,就换进来。(不选用低排放汽车,城市污染)
软件设计,不需研究算法速度来加快响应,只需知道越快越好,当有更快速度的算法,就换进来。(不选用高速度算法,软件缓慢)

阅读帖子http://www.jdon.com/jivejdon/thread/31338后有感而发,我也是过来人,是一个从算法转过来的人,对于怀疑和迷惑也深有感触,于是对帖子中一些问题进行了讨论和回答,希望对迷惑和初学的人有所帮助:

1、之前有人说出一个什么公交问题,要我们用设计思想实现,我笑了,我看见下面的答复,更笑了(为啥总是要向着过程想呢,我第一件事想到的策略模式,这大概就是设计模式的思想不同之处吧,关于算法的反应第一个几乎就是策略):


class BS1 implements BusStrategy{
public int getResult(){
return x;
}
}

class Result{
private bs;

public Result(BusStrategy bs){//用IOC更是舒服
this.bs = bs
}

public int getResult(){
return bs.getResult();
}
}

int result = (new Result(new BS1())).getResult();

banq说的是OO是根本不需要经过BS1是“如何实现”的基础,也就是算法,对于OO来说上面这样就写完了,至于算法那部分,随便找个懂算法的人来实现他就行,算法效率不行也是算法的人的事,与我们OO设计没关,BS1算法不行就找个行的BS2换了就行,上面代码跟算法就一点关系——复制与粘帖,对不懂算法的人来说一样可以OO,一样可以实现软件。

当然也可以去探讨算法,但这样的做法就走向底层了,与OO是截然不同的路线,我们很多人都从JAVA\C和C\C++开始,这面临选择走向的问题,向上走向下走,为什么banq说是两条相克的路线就是这样的道理了(你同时走两条路,也不能说这是一条路)。(黑箱子和白箱子是两个心态,改变了就好了,当然不少人可以自由转换,但对于初学者还是不要为好,容易走歪路)

2、还有人说到JAVA代码和API实现,我只能告诉你那只是实现方式,我完全可以换一种,JAVA只是一门语言而已,是用来表达意思的,就像中文一样(API就行中文的语法规则一样),我记得一句话:OO的伟大在于它可以替换(其实就是抽象思想)。banq之前所说的XML实现数据库也是一个道理。注:别把JAVA和设计模式等同起来,我们只不过是用JAVA来表达设计模式而已。

那个Collection问题,Collection是具体实现而已,对于OO设计来说,我完全可以不知道里面在用什么数学结构,或者说完全不知道里面是干什么,我只需知道我给它什么,它就能给我什么(黑箱子),其实和策略模式道理差不多。

3、
>>对底层数据库,操作系统的研究是浪费精力和时间,但也不能说是能力不足的体现啊,我看能把操作系统研究通的程序员是最伟大的,最可敬的.不研究怎么能用活那,怎么能借鉴别人的技术来开发自己的啊!一大批人是不需要对这进行研究(包括我),可中科院和一些研究所的搞科研的人需要研究啊,不研究中国怎么在计算机界有质的飞跃啊!

<<看到这一句我首先笑了,我想问的是:你是在问OO还是问中国计算机发展呢?banq说的是若果你要走OO这条路(软件解决方案),就不要去看底层的东西(因为很多人都因为学了C后都很难转过头来,感觉很别扭),即使学了也要尽可能快的跳出来(我们学底层是借鉴思想,不是单单去看具体实现,当然我们要从具体实现得出思想),跳不出来就别走OO这条路。

4、
>>UML建模是很强,建再多的类,实现再多的对象,对象里面总要用到数据类型,算法,只不过类和对象组织的程序比以前的只用函数实现功能的面向过程的程序要好的多的多的.一个简单的链和数组也算是数据结构里面的吧!一个简单的for语句,递归语句也算是简单的算法吧!banq老师说的数据结构和算法就是符号,不懂算法和数据结构,用UML把类图完美的画好,可怎么实现啊(因为人都学模式设计,框架去了,没人懂算法和数据结构了,连进程和线程也不懂了,就知道一切都可以用对象实现,可怎么实现啊?

<<我们怎么实现也是对设计模式(或者说方案更加准确)的实现,不是对针对算法的实现,这里衍生出一个观点就是——方案解决项目,技术解决问题。虽然这两项并不是排斥的,但方案里面最多就包含“选择”什么技术,但不会去想怎样去实现技术。初学者可能就是想不通这点:包含技术为什么可以不深入认识?其实就是“选择”技术而已。要是用黑箱子也要知道里面的怎么工作的话,黑箱子还有用吗?链和数组也是同样道理。

5、
>>深入技术内部就是向下思维,向上思维和向下思维有这样说的吗?就象windows一样,大家只管用它,不需要管它怎么实现,对大部人来说真是这样(包括我),为什么好多公司,好多研究人员千方百计的想让盖茨公开源代码啊!要是windows真公开了,肯定他们会好好的研究一下,争取在windows的基础上做出比它更好的系统,难到这些公司和研究人员也是向下思维吗?

<<这只是大众定义而已,向下并不是说向低级的意思,只是我们纵列地划分几个层然后说向上向下而已,就像说兼容的说法一样,你反过来说也可以,不过就不能和大众沟通了。那些公司和研究人员也是向下思维,因为系统不像应用软件,系统需要底层支持,它和硬件是密切相关的。但系统没有逻辑业务,因为它只是应用软件的载体。搞系统和搞应用软件不一样。

6、
>>哲学中有这样几句话:"事物之间都是相互联系的","一切事物都在变化之中",怎么能说OO是和这些传统基础知识是水火不容的啊!

<<看到这句话,我首先问一句:“矛盾不是联系吗?”

7、
>>只是java帮你封装了,你觉得也够用了
>>如果真的有一天你需要自己来处理内存中的数据
>>建立自己的hash函数,这就很重要了。
>>
>>框架永远脱离不了算法与数据结构的

<<我只能说你现在不是在做应用软件了,你是为做应用软件提供条件,OO和设计模式这些只是思想,跟具体API没有关系,有人帮你实现能用的API就行,没有就自己设计API(这是就是一种向下妥协的做法,没有好与不好,只是没有条件而必须要做而已,一点也证明不了“OO等思想需要底层技术支持”),但这跟OO和设计模式的存在地位没有任何改变。

8、
>>如果你打算当蓝领工人,那么请努力学习那些framework,因为你的公司需要它们,需要他们来做项目。但是如果真的想发展,走入软件的核心,进入ibm,microsoft,google,去进入到核心,请仍然回到算法与数结构上。

<<系统有系统的架构师,应用系统有应用系统的架构师,谁说不一样了,别以为一知半解就可以妄下定论。学现成的框架是为了降低成本和快速开发而已,一个系统建立一个基础架构,这个成本你花得起?。架构师跟coder不一样,架构师是脑力活,coder才是体力活,只要在计算机领域都有他们的存在。即使是windows也有架构,只不过是一个不为认知的架构罢了。

9、
>>他现在有两种选择,一种是学习struct,学习hib,学习spring,可能三个月,他不明白为什么,但是他能作项目了,可是他被绑定在>>java,struct,hib上了,因为下一个项目的时候老板会觉得他已经熟练使用这些了,下次你还要用这个。如果跳槽的时候他的简历也>>一定是熟练掌握XXXX,我想现在中国大多数的程序员的生存状态就是这个样子的。
>>
>>另外一种方式你,学习数据结构,学习算法,可能需要一年的时间,你可能做不出任何像样的东西,但是,当你真的对算法与数据结>>构真的成竹在胸的时候,你可以去ibm,micorsoft,google这些公司去,他们真的能拒绝这样的高手么??

<<这就是banq所说中国的病态教育造成的,明显是缺乏了思考,那些架构都是大部分包含设计模式的,那个架构师不懂设计模式,那我真怀疑他水平?(当然我永远不会只说23种的,因为时代在进步的,但肯定少不了设计思考)这也出现了一个现状:中国得到国际认可的框架如牛毛一般。(现在我只知道1)
<<设计模式是独立于语言以外的,是一种思想,是要靠抽象思考的,我很幸运大学里有一门“面向对象分析与设计”的冷门选修,而且新开的,至少我感到这个病态应该开始医治了。

10、
>>struct能活多少年,你知道么??spring能流行多长时间你知道么??三年前J2EE被吹上天,现在又被贬的一败图地,那么你是不是感到彷徨与徘徊??现在流行ajax你学一下,明天流行spring你学一下,人的精力有多少??

<<因为“只用不想”的人,是跟不上潮流的,因为思想是长期的,应用是短暂的。若果只跟随具体struts和spring这些具体的东西,迟早会被潮流打败。struts、spring这些东西看起来学一样已经够累了,但从过去到现在的例子中,只有思想是稳定,他们都包含设计模式的思想,懂了这些思想,学一个新的架构,何来难呢?精通后还干脆加入几个包,就自己架起架构了(其实大多框架就是几个包加配置文件)。学其精吧。

11、
>>总不能一开始就从模式和框架学编程吧!

<<就是可以,不过最好有学一门语言来表达那样就更具有表现力。就像“三次握手”,这是一个思想,难道这一定要和JAVA拉上关系?要和电子硬件拉上关系?在设计模式中的表达完全可以用不同的语言去表达,那就表明他跟语言完全没关系。学一种语言只是为了表达而已。

---------------------------以下个人想法------------------------

其实我看了那些帖子后也深有感触,是企业导致教育扭曲,还是教育把企业推错了方向,还在纳闷的是招JAVA程序员,考验的是快速排序算法。若果是智力考察就算了,但居然是技术考察···是我想错了,还是他们做错了。教育教歪了?还是企业不明确真正的需求呢?可能对于企业,他们觉得做出来用到就行,对于教育,教出来的有企业要就行(猜想,猜想而已)。若果真是这样,中国软件行业崛起?何时呢?

1、思想方向已经不一样了;
2、别把JAVA和设计模式等同起来,我们只不过是用JAVA来表达设计模式而已;
3、单靠底层技术发展速度已经不能满足需求,以前小软件还可以,现在以业务主的项目,基本不能过多考虑技术了;
4、实现也是对设计模式(或者说方案更加准确)的实现,不是对针对算法的实现。方案里面最多就包含“选择”什么技术,但不会去想怎样去实现技术;
5、系统不像应用软件,系统需要底层支持,它和硬件是密切相关的。但系统没有逻辑业务,因为它只是应用软件的载体。搞系统和搞应用软件不一样;
6、矛盾不是联系吗?他们这种矛盾正可以互相补充;
7、OO和设计模式这些只是思想,跟具体API没有关系;
8、即使是windows也有架构,只不过是一个不为认知的架构罢了;
9、中国的病态教育造成的,明显是缺乏了思考。设计模式是独立于语言以外的,是一种思想,是要靠抽象思考的;
10、思想是长期的,应用是短暂的。
11、学一种语言只是为了表达而已。

大概归纳以上的观点吧。


看那帖子挺多讨论的,以前的一个说的十个人信了,现在多点怀疑是好的表现,就是怀疑了才会发现缺点,然后进步了。

欢迎各位来怀疑,来讨论。
[该贴被SpeedVan于2010-10-06 17:37修改过]
[该贴被SpeedVan于2010-10-06 17:43修改过]

>>>城市规划,不需研究汽车排气来减少污染,只需知道越少越好,当有更少排放的车辆,就换进来。(不选用低排放汽车,城市污染)
如果有一个城市关于尾气污染的规划没做好,很可能搞规划的就这思想。
没有这么简单。规划,没有这么简单,其它随便什么事,都没这么简单。
别扯这个啦,算法、数据结构和OO、设计模式,根本不是一个层面的东西,你不能让张飞和李逵来PK一下。

算法解决的是效率和性能,是局部问题;而管理软件解决的是业务过程,是全局问题,这根本就是两个层面的事情。模式是解决某类业务过程场景的经验套路,而OO是分析业务过程的设计思想。
[该贴被flyzb于2010-10-08 12:53修改过]

有些一味推崇算法的人,往往拿数据库和操作系统做例子。
实际上数据库和操作系统也有自己的架构设计,相当于一个十分庞大的通用性很高的应用软件,设计方式也许跟一般应用软件有差别,但肯定也有自己的设计模式,绝对不是算法的堆砌!。
OS用到的算法并不高深,国人在算法方面也不落后,做不好好的OS,主要是设计水平和过程管理不行,而非算法不行。
[该贴被cxz7531于2010-10-08 13:20修改过]

2010年10月07日 15:52 "beepbug"的内容
别扯这个啦,算法、数据结构和OO、设计模式,根本不是一个层面的东西,你不能让张飞和李逵来PK一下。 ...

其实我意思跟你一样,但我面对的是新手和刚接触的人,还是一些误解的人,如我文中提到的那个帖子。

举个例子:
文中有人提到“框架永远脱离不了算法与数据结构的”,框架只是上层(设计)与下层(算法,内存缓存等具体技术)的一个粘合剂,与banq老师说软件设计的基础是设计模式,是完全对不上的。框架只是支持设计而已,受框架限制的“设计”(如框架不支持DDD设计),犹如受到地质,气候等因数限制的“规划”一样。

为了拨开新手的云雾,再举一个例子:
文中有提到“如果没有数据结构,操作系统,编译原理,数学等方面的基础知识,懂再多的设计模式又有什么用的,那还能称得上是个程序员吗?”

树形,这个对学过数据机构的人来说再熟悉不过了,对,首先想到的是,数据结构的树形模型。然后设计上也有树形,简单的就是组合模式,高级点就是Composite+Visitor,banq曾经介绍和讨论过(忘记地址了)。

根据国家的教育过程呢(先教数据结构的,能跳出来看就没关系,问题很多人都跳不出来),很容易让刚接触的人误解为:

树形->数据结构树形->设计模式树形(错误的哦)

为什么错误?因为设计模式树形不依赖数据结构树形而存在。(即使不知道,或不存在数据结构树形,只要树形这个模型存在,设计模式的树形就存在了,只是认识有先后而已,而且相似的东西可以类比地更好理解)

··················|->设计模式树形(设计模型)
树形(模型)-|
··················|->数据结构树形(数据模型)

注:·=空格(居然过滤了空格T T)

以上才是正确的,设计模式中的树形是通过数据结构树形的中升,抽象,类比等手段得到的,但他们并不是一个层面的东西,所以说banq说软件设计(向上走)的基础是设计模式也就是这个意思(可能还有其他基础,但这个是绝对重要的),向下走的?当然是数学、算法等啦(具体是什么我不知道)。

至于为什么学JAVA,还是那句话:只是一种表现形式而已。

“对小孩也知道飞机是交通工具的一种,交通工具是飞机 火车 汽车的一个抽象概况,如果小孩没受过教育他们能知道这些东西吗?”

回答:不知道飞机 火车 汽车,但知道苹果 雪梨 香蕉,是一种水果,设计就如这个抽象的思考过程,是一种举一反三的过程,把认知的抽象化,也是一种设计思想——继承或接口(OO思想),当然这是对模型的提取,对领域上(包括模型,业务等),就会出现设计模式。

所以新手不用迷惘了,答案在上面已经说的很明了了。
[该贴被SpeedVan于2010-10-08 13:49修改过]
[该贴被SpeedVan于2010-10-08 13:49修改过]

2010年10月08日 10:46 "flyzb"的内容
模式是解决某类业务过程场景的经验套路,而OO是分析业务过程的设计思想 ...

前者略认同,后者不敢认同,对我的认识,OO是只是一种思维,并没有具体到设计上面,因为并没有说“OO设计”的,只有“OO程序设计”,“OO软件设计”,OO只是思维,与设计无关。

为什么说前者略认同,我理解模式是一种从解决项目的经验中提出出来的抽象认知,对“经验套路”这个词略不同意(你的整体意思感觉是对的),经验套路是可以各自一方(也就是一间公司一套经验套路),但模式应该是这些大家套路中再次抽象出来的认知。以上个人理解而已,若错望指正。

2010年10月08日 11:57 "cxz7531"的内容
有些一味推崇算法的人,往往拿数据库和操作系统做例子。 ...

因为这些人不知道,操作系统和数据库是用来支持应用的,与应用不是同一层上的,当他们理解了,就会恍然大悟。

一切都good -_-
你good,我good.你happy 我happy.
其实大家都进入了一个误区.
软件设计, 追求快乐 才是真真的对.

我感觉好像把算法和面向过程的开发搞混了。

怎么叫“其实是软件的复杂化做成的,虽全用算法实现可以,但那样是高代价的”

算法和面向对象似乎不是互相独立和排斥的吧。

2010年10月08日 16:25 "nkhanxh"的内容

怎么叫“其实是软件的复杂化做成的,虽全用算法实现可以,但那样是高代价的”

算法和面向对象似乎不是互相独立和排斥的吧。 ...

感谢你的提出,的确这句话看起来,我自己也感觉很别扭,但是是为了对上文中提到的读贴的话语而导致的,他们再三强调软件设计的基础还是算法和基础结构等,以前算法的确可以主导软件,尽管不是全部,以前为了效率,不得不把算法作为核心(逻辑),然后通过一些方式表示出来。现在软件是以业务构成,当OO思维出来后,算法已经不能主导软件了,但OO思维并不能有效开发,于是设计模式啊,框架啊(更好地支持设计)就出来了。

不过我那里表述还是不对,应该改成“用算法实现业务逻辑可以”或者“全以面向过程实现可以”,先在这谢了

个人认为
算法是抹平机算机和实际问题间的距离。
具体体现为,如果你不知道算法,那么你就解决不了某个问题。


oo是抹平算法和人类思维模式之间的距离,

因为人脑袋不适合那样去管理和理解代码。

实际上如果有人真的脑袋和计算机差不多,那么oo就没太大必要。

实际上我还真听说华为有些人读汇编和高级语言速度差不多的,
我以前同宿舍的一个哥们也是一天写个1000行汇编没啥问题。
不过这不能普及的,尤其是开发应用领域程序,绝对是oo+领域模型比较好。


2010年10月08日 17:09 "nkhanxh"的内容
具体体现为,如果你不知道算法,那么你就解决不了某个问题。 ...

我在论坛上几个帖子都提到“方案解决项目,技术解决问题”,正因为项目里面包含问题,所以需要技术支持,但现在的项目集中体现为业务逻辑,问题也就成为次要了,经过长期发展,技术就被独立出去,在项目中,程序员就可以集中思考业务逻辑的实现,也就是问题交给别人去解决,对于项目就是引用解决办法(并不知道什么办法)来“有机合成”解决方案。
注:个人认为,算法算是技术中的一种,同时它也在解决技术问题,但技术不够用来解决项目。

其实就是软件性质发生变化,现在需要解决方案,而并非解决问题(已经独立出去了)。对于这种变化,还在抱着算法书说这是软件开发基础的话,已经不科学了。

2010年10月08日 14:30 "32647908"的内容
2010年10月08日 11:57 "cxz7531"的言论
有些一味推崇算法的人,往往拿数据库和操作系统做例子。 ...


因为这些人不知道,操作系统和数据库是用来支持应用的,与应用不是同一层上的,当他们理解了,就会恍然大悟。 ...

严格来说,操作系统和数据库也是应用,跟应用软件开发遵守同样的规律:
需求分析、建模、架构设计、编码,没啥不同的。甚至整个软件行业就是个应用行业,OS和DB还够不上让顶尖数学大师来搞的程度,何况数学大师也未必能搞软件。
区别只是数据库对速度要求很高,但数据库的速度也不能仅寄希望于算法的改进,如果架构设计不合理,牵一发动全身,再好的算法也无用武之地。。
把算法推崇到变态和夸张的地步的人,大多数是刚毕业或者在校的学生。很多人甚至把物理学原理也混同于算法。
[该贴被cxz7531于2010-10-09 09:11修改过]

2010年10月09日 09:08 "cxz7531"的内容

严格来说,操作系统和数据库也是应用,跟应用软件开发遵守同样的规律 ...

操作系统无论严不严格来过都应该不是应用软件,可能以前系统(非操作系统)带有部分应用,而且当时应用软件并不广泛,而让人误解而已。何为操作系统,应该不用我解析吧,准确的描述上网查查,其实可以从“系统”的定语“操作”来想就行,简单易记为“为解决外界(人类)和机器(电脑)交互的软件”,操作系统只能解决交互问题而已,而windows,linux这些系统只不过是“操作系统+绑定软件”而已(绑定的软件类似那几个游戏,那几个计算器和player,是可卸载的,不可卸载的话MS就出事了,相当于捆绑销售,恶意竞争了,嘛,当年的事了),所以对于操作系统,无论严不严格来过都应该不是应用软件。

数据库其实通过它的发展可以了解到,数据库从开始仅仅是存储和管理数据,到现在用户所需要的各种数据管理的方式。它的确是经历过应用软件这个身份(如Orcle)。
(因为没有相关说明,所以下面这段是属于个人认识)
但软件的发展由重新把数据库打回到存储和管理数据,从软件的设计种可以看出,现时已经不提倡把业务逻辑放在数据库了,数据管理方式更是这样(你还交给存储过程?那当我没说)。而NOSQL更是印证了这一发展。

J.Martin给数据库下了一个比较完整的定义:数据库是存储在一起的相关数据的集合,这些数据是结构化的,无有害的或不必要的冗余,并为多种应用服务;数据的存储独立于使用它的程序;对数据库插入新数据,修改和检索原有数据均能按一种公用的和可控制的方式进行。

所以数据库严格来说也不算应用软件,它是服务应用的。可能你会想到,数据库不是数据管理的应用领域吗?可能是独立使用数据库时,所带来的误解。数据库是没有管理,只是在外面增加了一层“管理壳”(其实Orcle外加了一个壳方便管理而已,包括MYSQL用CMD来使用管理也是一个道理,只是用CMD是过分的累而已),它就能变成管理数据应用的软件。还有,你可能会想到数据库不是软件上仓储吗,仓储不是一个应用领域吗?软件的仓储摆明是软件一部分而已,而且是一个可选部分。

大概就是马达永远成不了驾驶工具一样,它只是服务于驾驶工具的驱动部分,而这个驱动部分可以换成喷射驱动,就像用XML来代替数据库一样。

发现偏题了,如需讨论,可另发帖子,我乐意参与~
[该贴被SpeedVan于2010-10-09 12:11修改过]

数据库和操作系统服务于应用,相当于它的需求是许许多多应用提出来的,或者说是总结出来的。在这个意义上,数据库和操作系统也是应用。
应用软件服务于一般人,数据库和OS服务于程序员、同时也服务于一般人(OS中的很多人性化功能是为一般人开发的,而不是为程序员)
数据库和OS的开发过程必定也是设计为主,算法和数据结构之类只能居于次要地位,而且数据库和OS非常复杂,其对设计(而不是算法)的能力要求更高。