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

10-10-06 SpeedVan
其实我也是跟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();
<p>

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修改过]

         

8
beepbug
2010-10-07 15:52
>>>城市规划,不需研究汽车排气来减少污染,只需知道越少越好,当有更少排放的车辆,就换进来。(不选用低排放汽车,城市污染)

如果有一个城市关于尾气污染的规划没做好,很可能搞规划的就这思想。

没有这么简单。规划,没有这么简单,其它随便什么事,都没这么简单。

别扯这个啦,算法、数据结构和OO、设计模式,根本不是一个层面的东西,你不能让张飞和李逵来PK一下。

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

[该贴被flyzb于2010-10-08 12:53修改过]

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

实际上数据库和操作系统也有自己的架构设计,相当于一个十分庞大的通用性很高的应用软件,设计方式也许跟一般应用软件有差别,但肯定也有自己的设计模式,绝对不是算法的堆砌!。

OS用到的算法并不高深,国人在算法方面也不落后,做不好好的OS,主要是设计水平和过程管理不行,而非算法不行。

[该贴被cxz7531于2010-10-08 13:20修改过]

SpeedVan
2010-10-08 13:46
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修改过]

猜你喜欢
5Go 1 2 3 4 ... 5 下一页