不要总是以偏盖全,有一天你会后悔的。譬如你总是只能吃农民伯伯的饭,你永远摆脱不了农民伯伯的影响,但你也没必要因此非得想学会种田。

算法领域不才我从接触计算机第一天开始就孜孜不倦地研究(当然是我感兴趣的),有例为证:1995年我就写了自己的第一个编译程序以在DOS/VMS/OSF/1/AIX上同时运行我的一套企业应用系统。但现在我对OO更感兴趣!我向别人指出OO的重要性纯属个人经验,不想说服任何人。

到此为止。

banq的想法很难让初学者接受,这主要的原因在于初学者的知道老师其实也是初学者!!

这就是国内程序员的命运!!初级应用第一!!

记得有一次参加某个群的交流会,当我提出建立OO型的数据库时还没说完话,竟然全场的人反对说一定要用关系数据库!!唉!!初学者就是初学者!!理解不到那么深的东西!!!

如果说初学者不理解OO的重要性那也就算了,关键是一些老人还是不能理解,这个有点不可思议了.难道做了那么多项目都成功了?没有一点变化?

这里的成功不是收到钱了就叫成功,后期维护也成功了吗?如果有扩展怎么做的?
这些都成功了,那项目才能叫成功.

反正不理解,为什么有些老人还要说算法多么多么重要,

现在就应该强调OO比算法重要,比语言重要,初学者更加应该意识到OO的重要性,否则一旦形成了面向过程的思维,又将很难在跳出来了.

我是一名在校的大学生,这个学期刚刚开始接触JAVA的学习
对JAVA懂得只是些皮毛,所以对与上面各位的争论我没有资格发表我的意见,但是我知道老师在课堂上教我们的是J2SE,是最基础的东西
虽然我觉得很枯燥很难懂,但是我知道任何东西都要从基础学起,一座大楼的建设不可能没有地基,学习英语不可能不学习字母ABC....
所以我认为基础的J2SE还是很有用的

也许有些人认为OO是最基础的东西
就像家里买了电器当然是先学会怎样使用再去了解他怎样工作的一样。
但是我认为这是生活中的现象,应用到初学JAVA,或者说是编程真的行得通吗?要是真的行的通到也好了,我们就不用在去学习枯燥无味的J2SE
和数据库了,但是为什么现在国家的计算机二级三级包括四级考试还是会考数据库?我想这是针对大多数的计算机初学者的,也是最基础的

在设计模式的引领下,研究算法和数据结构等等。

大家忽略了banq的另一个重要身份特征:搞java培训的

搞java培训目标是什么?赚钱不用说了,是未了给软件行业提供开发人员,当然也要为学生以后事业顺风饭碗捧得牢打基础。各位都是行业从业人员,都清楚软件行业需要什么什么样得人员(注意:不是说稀缺),而具有什么样的知识体系的人员在这个行业更容易混以及更容易培养?以及现在搞java开发的公司是不是多数都在作企业项目?作企业项目需要什么样的基础?如果你从企业项目这个角度出发,应该可以认同banq所说的面向对象的基础。

这其实跟大学计算机软件专业的教育目标根本不一样!我的老师曾经说过:“大学不是培养工人的,是培养科学家的”。我是深以为然阿,也难怪那么多大学生毕业就失业了。从这个如果说大学培养的是科学家这个角度出发,banq想来会收回传统腐化教育的说辞了。

楼主就不说了,帖子中名词搞混了跟coolyu兄都应该是科班出身吧?请问个问题,真正在开发中,两位都会自己实现LinkedList、Hashtable之类的么?我想都不会是重复发明轮子的人吧?banq前面好像也曾经说了数据结构算法拿来用就是了这样的话,我个人认为在软件开发中知其然即可,不必知其所以然。考虑性能问题选对是用ArrayList还是LinkedList知道他们性能优劣就可以了,不用让程序员们都得自己会实现这两个东西吧?用coolyu兄的话来说明一下

》》小孩儿先学走,再学跑
咱们就说爬,小孩儿不用去理解大脑怎样发射电信号,又怎么通过神经传送给四肢肌肉,肌肉又怎么收缩舒张运动,大脑又怎么协调全身保持平衡的。这一系列活动在编程中才体现为数据结构和算法吧?而这应该是生物学专家们该研究的东西,小孩儿只需要明确他要往前可以用爬的就好了。慢慢的小孩儿往前的方法多了,可以走了跑了跳了,也可以作别的事情了说话思考阿什么的。可以表现为对OO的掌握更多了,而他直到成年恐怕也未必想过他怎么就能说话了为什么困了就得睡觉,睡好了就又精神等等。。。后来这个小孩要是运用自己能力为社会作出贡献,那他就成了一个程序员,要是小孩儿去研究自己为什么能干到这些事,其中原理是怎么怎么回事儿的,那他就成了一个计算机科学家


当前中国缺少好的程序员,也缺少科学家。都需要培养,出发点侧重点都不同

大家忽略了banq的另一个重要身份特征:搞java培训的

搞java培训目标是什么?赚钱不用说了,是未了给软件行业提供开发人员,当然也要为学生以后事业顺风饭碗捧得牢打基础。各位都是行业从业人员,都清楚软件行业需要什么什么样得人员(注意:不是说稀缺),而具有什么样的知识体系的人员在这个行业更容易混以及更容易培养?以及现在搞java开发的公司是不是多数都在作企业项目?作企业项目需要什么样的基础?如果你从企业项目这个角度出发,应该可以认同banq所说的面向对象的基础。

这其实跟大学计算机软件专业的教育目标根本不一样!我的老师曾经说过:“大学不是培养工人的,是培养科学家的”。我是深以为然阿,也难怪那么多大学生毕业就失业了。从这个如果说大学培养的是科学家这个角度出发,banq想来会收回传统腐化教育的说辞了。

楼主就不说了,帖子中名词搞混了跟coolyu兄都应该是科班出身吧?请问个问题,真正在开发中,两位都会自己实现LinkedList、Hashtable之类的么?我想都不会是重复发明轮子的人吧?banq前面好像也曾经说了数据结构算法拿来用就是了这样的话,我个人认为在软件开发中知其然即可,不必知其所以然。考虑性能问题选对是用ArrayList还是LinkedList知道他们性能优劣就可以了,不用让程序员们都得自己会实现这两个东西吧?用coolyu兄的话来说明一下

》》小孩儿先学走,再学跑
咱们就说爬,小孩儿不用去理解大脑怎样发射电信号,又怎么通过神经传送给四肢肌肉,肌肉又怎么收缩舒张运动,大脑又怎么协调全身保持平衡的。这一系列活动在编程中才体现为数据结构和算法吧?而这应该是生物学专家们该研究的东西,小孩儿只需要明确他要往前可以用爬的就好了。慢慢的小孩儿往前的方法多了,可以走了跑了跳了,也可以作别的事情了说话思考阿什么的。可以表现为对OO的掌握更多了,而他直到成年恐怕也未必想过他怎么就能说话了为什么困了就得睡觉,睡好了就又精神等等。。。后来这个小孩要是运用自己能力为社会作出贡献,那他就成了一个程序员,要是小孩儿去研究自己为什么能干到这些事,其中原理是怎么怎么回事儿的,那他就成了一个计算机科学家


当前中国缺少好的程序员,也缺少科学家。都需要培养,出发点侧重点都不同

算法是为了解决问题的,OO也是为了解决问题的,有什么可争的呢。
对这里的大部分人来说,算法和数据结构的作用和OO一样,都是把前人总结的精华拿来用,谁理解的深,谁用的就好。
就拿leebai 说的这个题来说,一个真正的程序员应该首先想到用个什么样的数据结构来模拟这个模型,自然很容易想到用循环链表,而想到这基本上问题就已经解决了。链表是自己发明的?结果还不是一样,把人家的拿来用而已。
有人想到效率,可能会用数组实现的线性表来模拟环型,其实都是一样的。
最后再看看问题,连题目都是前人想过的,不就是约瑟夫环吗。

to murderer1234:

谢谢,刚知道这叫“约瑟夫环”。

老兄的观点好象是:什么东西前人都想过了,我们只要找答案就行,用不着再想了。

我看不见得,人类文明的发展远没到头。比如这个题,我可以有N种改进法,而且保证能改得你找不到现成答案。

只会copy/paste的程序绝对不是好程序员,更不会是真正的程序员。中国人在科技领域缺少的不是模仿能力,而是原创能力。

说算法为什么会牵连到面向对象呢?可能是个人见识短浅,面向对象这样已经牵扯到具体实现了。
楼上wind13这位兄台你能分析一下你自己想法的时间复杂度和空间复杂度吗?假设总数为m,间隔为n,其实单论想法来说其时间复杂度(m*n吧,呵呵大概想了一下不保证正确性)是低于那个你所找的圆桌数数的算法的(这个的时间复杂度暂时想不出来)...但是为什么最后反而花的时间多,先有算法还是先有实现不言而喻...

to murderer1234:

谢谢,刚知道这叫“约瑟夫环”。

老兄的观点好象是:什么东西前人都想过了,我们只要找答案就行,用不着再想了。

我看不见得,人类文明的发展远没到头。比如这个题,我可以有N种改进法,而且保证能改得你找不到现成答案。

只会copy/paste的程序绝对不是好程序员,更不会是真正的程序员。中国人在科技领域缺少的不是模仿能力,而是原创能力。
----------------------------------------------------------------
程序员==计算机科学家?
工作没有高低贵贱之分,能够真正把前人的研究成果摸透的程序员,把应用做的比人家好就不是创新?这个帖子的出现本身就说明了国内轻应用重研究的思想。结果呢,应用做的也不好,研究做的也比人家差。
就象你说的,你可以做N种改进。那么你能不能好好的理解前人的算法?能不能该进前人的算法?你能改进的更好,就说明你应用做的好。
垃圾回收算法讨论了几十年了,SUN和IBM理解的好,应用的好,改进的好,人家就出了好的产品。
中国的程序员呢?口口声声的看不起应用,API都用的嫌烦。那你给我精通算法,精通数据结构。什么叫精通?自己发明算法就叫精通?我看能熟练运用算法和数据结构就算精通。
有的人口口声声研究框架累,老喊跟不上框架更新。你是研究框架还是使用框架?你是想把他的框架研究透了自己发明?连为什么使用框架都没搞明白能不累吗?

平时在公司做的项目,业务都写在EJB的无状态session bean里。现在我接了新项目,项目不大,不需要集群,没有高负载,用户只想稳定运行。表现层就用平时公司改进过的struts就可以了,用着还顺手。那么我把业务写在哪里?找来找去找到可JDON。JDON保证我按照他配置一下POJO的业务类就能保证性能稳定,ECLIPSE运行了一下JDON成熟运用的JLIVEJDON,看了下它的配置特点。OK,都符合我的要求。再花一上午时间搭好工程环境,就等着分给其他人写业务了。

个把月之后,JDON可能就在记忆中了。使用框架累吗?一共花了多少时间?
也许这次用的好了,下次会再用,那么可能会根据项目进展需要研究一下,改进一下,改的更适合自己的业务需要。这时就是为了更好的应用。

论坛里有人大呼:“JDON怎么才能跑起来?”。呵呵,真为BANQ感到累。连为什么应用都不知道,没有目的的瞎“研究”,这就是中国程序员该做的吗?

to murderer1234:

也许站在不同位置的人,有不同的追求。

我倒不认为程序员和计算机科学家有什么天然界限,比尔盖茨、James Gosling、Martin Fowler不是天生就是计算机科学家,也不是哪天早上醒来突然成了计算机科学家;求伯君、袁红岗,甚至本站的Banq,算不算计算机科学家?你能不能给下个定义?

反正我的思维习惯是不喜欢给东西画条条框框,规矩是要的,局限于规矩就不应该了。如果外国程序员可以---没有目的的瞎“研究”---,为什么中国程序员就不可以?如果中国程序员没有---瞎“研究”---,你怎么有机会用Banq兄的JDon?你不觉得自己的观点很矛盾吗?

没想到这个帖子会有这么多人喜欢参与讨论
那么我说说我的想法

首先来讲,我们做项目,大家觉得应该都是什么样子的组成比较合适那??水平都一样还是有低有高那??可能从结对编程的情况大家喜欢都差不多的,但是我觉得一个项目组应该有一部分剧本攻关能力,去做最难的部分,一部分人去设计,一部分人负责写那些相对简单的代码。可能一个项目用到算法的地方真的不是很多,但是用到的必定是瓶颈部分,也就是用在刃上的好钢。比如项目中可能可能经常对一个数据进行排训,你在测试中可能发现该部分是你整个项目中效率最差的部分,这个时候就需要攻关人员出现,他们负责对最差部分进行调整,以达到程序的最高水平,而不仅仅依赖于去购置硬件。

我这里也想说一下中国软件的问题,现在大部分的我们所说的企业应用,或者大家思维中认为的企业应用就是把别人输入的东西展现给别人看,比如一个ERP,我们会告诉它你的库存有多少,你的资金情况,你的收益情况,但是这对企业益处有多大那??只是把原来需要人手工做的变成了电脑处理,从现状而言,老板很少进入系统,处理人员还是那些人,他们从系统中打印报表给老板看,从老板的角度而言我花钱买了个系统,好像是提高了生产效率,但是我要是让员工加加班也可以啊(因为中国的人工成本实在太低了),对他的吸引力太低了。那么如果你的ERP对企业真的能起到知道作用,比如结合物流与仓储情况进行指导,实现零库存(很多日本企业就是这样的),那么让他省下这个钱,他就觉得你真的为他解决了问题。为什么数据仓库等一些概念都源于国外的,因为他们始终在研究效益最大化,在国内相对对这些问题考虑会少很多,大家习惯于把问题select化,问题简单化很多,所以软件经治力不足,同治化很严重,软件企业的竞争大多依靠价格、人际关系来处理,消弱了竞争力。

然后说中国的教育问题,大学本身交算法没有错,但是大多只是告诉学生这是什么算法,如何来实现,但是很少提及什么时候使用该算法,该算法可以解决什么样子的问题。比如排序问题,书里最起码有五六种算法在那里,但是冒泡与快排序有什么区别,比如我们空间不足(手持设备开发),那么这时候应该优先考虑什么算法,而速度优先的时候应该优先考虑什么算法,这些都是大学教育缺乏的,却是学生走入社会最需要的。

接着说一下有些人的思想问题,现在一提及企业应用,大家马上的反映是一个数据库,多层架构的OO。这是一种狭隘的企业应用概念,言必提及数据库,谈必是多层架构,其实很多企业并不是这么简单的。比如中国移动短信的CMPP协议,难道就不是企业应用么??这个企业比那些企业是不是大很多那,里面虽然有数据库,但是数据库并不是协议的主体部分,而只是为了计费的辅助部分。只是现在很多企业依靠这种狭隘企业应用生存,而且需求可能也比较大,只是比较流行罢了。

最好说一下我对于软件设计的看法,设计非常重要,面向对象的设计也非常好,它较好的解决了软件复用的问题。包括现在的AOP。DI都是为了解决该问题的。但是每个软件都有不同于别的软件的地方,那么这个地方就是该软件的魅力所在,这个地方也就是通常需要算法与数据结构的地方。软件,特别是产品类软件应当尽量减少同质化情况,应当具备软件的魅力。