BAIDU上无意看到这篇帖子,只看了第一页就看到了这么多针锋相对的论证,呵呵。
我也是软件专业毕业的一名学生,不过由于各方面的原因(兴趣是关键)学的很烂,在挥霍掉大把青春后才重新找准自己的方向——数理,可惜醒悟太晚,也只有暂时寄居在一家搞企业级应用的软件公司。的确,如果在大项目中忽视OO思想,而只关注局部方法的精妙实现,就像没有蓝图去修房子一样。但像我这样连语言都没掌握得很糟糕的人,即使归纳演绎能力很强,编写代码也是能力薄弱。不过仅就项目开发来说,的确一个人没必要也没精力去扒开API的衣服来看个究竟。。。

由于从小就对世界的本原这类问题特别着迷,所以20岁之前我从来都不自觉的有科学有等级之分这种意识,所以学软件感到很不情愿。但随着年龄的增长,也就渐渐改变了那种不成熟的看法,如果人都去搞理论了那大家都通通饿死吧。Coolyu0916这位兄弟的观点太偏激了,如果你和一个同样狭隘的数理哲大家在一起,在计算机理论这种相对应用型领域工作的人在他眼中可能也会是蓝领。况且白领蓝领这种分类方式在大多数人心里就是不健康的。

至于zjlzjlzjl和banq的争论,其实本没有矛盾,只是双方都想把自己代表的领域概括为整个软件的领域才导致了争论,wind13的比方很贴切了。概括来看,OO思想和算法可以看做是 概念和推理两种思维方式,有点像数学中的集合论与函数论的差异,这都是在我们生活中无处不在的。只不过企业级应用关键要很好的运用OO,算法关键时逻辑。

PS:有人说编程是门艺术,与数学关系不大。其实很多搞数学的认为数学也是门艺术,这只是浪漫的说法,意思是投身其中并不会像外行一样的感觉枯燥。实际上,假如艺术不包括逻辑的范畴,那么这些科学都不是艺术
[该贴被Narciss于2007年08月09日 13:39修改过]
[该贴被Narciss于2007年08月09日 13:53修改过]

什么OO思想,谁给出了明确的定义,简直是扯淡.人类天生就有分类的思维,还在这里扯.JAVA名堂确实太多,主要是打着开源招牌的问题.而且好多都是在做产品卖点宣传.名名两种东西一个样的功能,要在这里东拉西扯,一大堆文字不着边际,冲什么了不起.
什么OO思想,谁给出了明确的定义,简直是扯淡.人类天生就有分类的思维,还在这里扯.JAVA名堂确实太多,主要是打着开源招牌的问题.而且好多都是在做产品卖点宣传.名名两种东西一个样的功能,要在这里东拉西扯,一大堆文字不着边际,冲什么了不起.
呵呵,美国的一招调虎离山之计,你们吵吧,等你们把这些JAVA概念读完了,他们又出新概念了.你们就永远在这里吵这些概念吧.这帮刁民程序不好好写,知识面不去扩大,硬要在这里搞什么框架,什么架构,还永动机呢.不要人写了...,一门活东西,到了中国人手里就成了死东西了.哎,可悲...
其实bang老师说的也有道理,我们部门现在的主管以前就是化学系,他只上过C,不过他的C基础也不好,后来才花三个月就开始工作了,现在写程序也很牛B的,所有我觉得不一定非得把大学里的所有课程上软件工程,汇编什么的全部学完才行.
其实bang老师说的也有道理,我们部门现在的主管以前就是化学系,他只上过C,不过他的C基础也不好,后来才花三个月就开始工作了,现在写程序也很牛B的,所有我觉得不一定非得把大学里的所有课程上软件工程,汇编什么的全部学完才行.
看了benq老师的精彩回复,受益良多,忍不住小说两句:

1、OO思想看重 “它”能干什么,而不强调“它”怎么干的。所以,这就造成了“你可以在不完全了解他是怎么实现的情况下而去使用它”——拿来主义(不管黑猫白猫,能抓耗子就是好猫)。

2、OO是高一层次的东西或者说是相对先进的东西,OO的Java把很多相对底层的东西包装了起来,你可以去研究它也可以不研究它。

3、企业是企业,研究院是研究院,两个地方,两个方向。而Java的优势正是“企业级应用”。对于企业应用而言,它是拿来用的,而不是拿来研究的。“有用即真理”——实用主义。

4、OO是一种思想,先进的思想和理念,是方向,但不仅仅局限于Java。

5、现在的大学,仍然在培养研究型人才,而不是应用型人才,这就注定了学的东西要和以后要用的东西差的十万八千里。

6、在专业领域的软件开发,算法设计是很抢手的,这就需要数学专业人才或者数学NB的人才。但,很多企业级的应用,不需要这个。

7、如果把自己完全投身于JAVA,则应该按照benq的想法去做。因为企业老板不是让你搞研究,而是让你出产品。既然是产品,就不需要完美,不需要面面俱到,他只要“符合设计要求”即可。这样,谁用的快,谁用的好,谁用的恰到好处,谁就NB。“用”才是核心。

支持banq老师观点,我在清华校搞了三年的算法,还拿过国际算法大赛,暑假刚接触java主要感兴趣OO思想,这两种有思想确实有很大的冲突,我很难跳出来,自认为计算机不错,但看到一些同学,他们理解起来确明显比我容易多。
我一直很苦恼,偶尔撞进来。我觉得完全是两种思维模式,个人感觉应该在不同的领域发挥不同的作用。
至于哪个重要,应该相对而言的,看所从事的专业行业,站在企业应用角度来看数据结构,算法学多了,理解OO思想,确实很难跳出来。难以想通。就象很难理解霍金思想一样,完全是思维上的冲突。你觉得我这种搞底层研究的人应该跳出来转OO思想吗?不过我保送斯坦福时看重的就是我的基础和算法设计。这说明美国优秀的大学更注重基础,我不赞成大学取消基础教育,你这等于是将企业的抱怨和压力转到学校了,大学本来就是大众化的基础教育,可能学的东西对于大多数人来说将来没用,主要是培养他们的学习能力,重视基础教育,以及爱思考。至于企业需要的学生应该自己主动学习。强烈反对废除基础教育,而去搞什么最新的那个这个的。
好多牛人啊,在这里开口讲OO,闭口讲OO的,我想问一下那些人,OO是啥?
我想绝大多数人都是跟着大师说OO好,OO妙。OO是啥说来听听


不好意思,看这大多数人的回帖,冲动了一下就语无伦次了


[该贴被weststorm于2007年09月02日 13:01修改过]

呵呵。。我觉得数据结构以及算法与OO思想没有什么冲突的。打个比方:数据结构和算法主要是用来生产盖楼用的砖头的,而OO是如果把砖头组织起来构建成一个完整的楼。学习算法可以提高逻辑思维,而学习OO可以提高抽象思维。学习OO的时候再兼顾一点算法很好的。不要因为任何一个而放弃另外一个。而是为了能互补。我现在就是早上学一个半小时的算法,然后下午再学习OO。算法更注重细节,而OO注重的是整体,是从宏观的角度来分析问题。偶也是个小菜鸟。不过菜鸟也有发言权是吧,所以说的不对的地方。请高手别笑。
我第一次来看这个网站
只有一个想法banq老师说的对
学习java是一种语言 有设计理念和想法就可以设计出在层次上杰出的软件
至于基础当然什么也不会是不行的 但是java能力应该更接近"宏观"的基础也就是设计模式和面向对象思想
太基础了就没有创造力 知道基础是为什么应用就行了吧
补充说下 我觉得数学算法什么的就好像是机器需要的螺丝钉那样 
而面向对象的思想就像是企业家管理生产线 我不必知道螺丝几号对几号 不必要知道什么零件用多少螺丝 需要的只是知道什么样的产品用到什么事情上

我觉得所谓的2种基础不可同日而语
有个人说像盖楼 同感 设计师是不会关心生产材料是多少钱买的之类的
因为各有各的需求
相争无非说哪个基础重要 其实就一样 需要什么基础时找什么样的专业人才 一个人2方面兼顾得不偿失

--[[ 引用leebai的评论

这个帖子很强,非常值得深入探讨,很多高人都:::非常认真:::地发表了自己的观点,我也来掺呼两句。

首先说个故事,我们公司招聘程序员,有一道笔试题是(泄密,以后就不能用了:)):



数字1、2、3、、、、10排成一圈,首尾相连。从1开始从中取数,每隔两个数取一个,如1、4、7、、、,直到取完为止。要求写个程序把取数序列打印出来,可以用任何熟悉的语言或伪代码。


这是我中学时在AppleII上做的练习题,easy吧?。就这个题,60%以上的应聘者交白卷;能写出代码的应聘者中,大部分又存在逻辑错误;做对的只是个别,算法好的压根就没见过。而这些应聘者中,绝大部分人的简历上罗列着J2EE,EJB,UML,设计模式,IOC,Strust,Spring,MVC,Hibernate,ADO,XML。。。一大堆名词,很多还写着精通Java,OOP!!! 我很纳闷,怀疑这些人的简历都是抄的、学历证书都是买的,于是每次都挑几个答题差的面试,结果发现人家对这些技术还真不怵,说起来个个都如数家珍,头头是道。99年至今,我基本上每年都要面试很多程序员,个人的感觉是:从事JavaWeb开发的程序员一代不如一代,JavaWeb开发社区的教育学习是:::彻底失败:::。

===============================
看了上面的故事,有点智商的都应该看出的我的第一个观点:任何时候基础都是第一位的,再好的翅膀插在猪的背上,猪也飞不起来。
zjlzjlzjl、Coolyu0916认为基础很重要,banq兄其实也没有说基础不重要,这一点大家是有共识的,不必多说,如果有人认为基础=基础知识,那他一定飞不起来,咱们就不和他讨论了。

===============================
智商再高点应该可以发现我的第二个观点:软件技术的基础是数理逻辑,猪飞不起来,不是因为骨骼肌肉不够强壮,而是猪太笨重,看问题要看问题的本质。
zjlzjlzjl本意想说的应该是java语言是基础,但标题写成了j2se是基础;banq兄估计没细看zjlzjlzjl的正文,顺着标题就反驳说j2seAPI不是基础,其实是关公战秦琼了。java语言和j2seAPI是什么关系,大家应该都清楚,不清楚的就别看什么J2EE、设计模式等等高深武功了,省得走火入魔。
banq兄提出模式设计是基础,zjlzjlzjl认为java语言是基础,Coolyu0916等延伸出数据结构和算法是基础,我认为都没有错,按我的意思,数理逻辑才是真正的基础;再往下推,智商才是终极基础,要不猪怎么就不能玩Java?

banq兄认为模式设计和数据结构是两条并行、对立的东西,这一点我有自己的看法。我认为数据结构的本义并不单是堆栈链表二叉树之类具体的东西,而是一个软件实现的数学模型,从这个角度说,设计模式其实也是一种数据结构,面向对象的数据结构(不是说OO表达的堆栈链表二叉树之类)。连最简单的程序都要有数学模型,就像上面的笔试题,因此,在数理逻辑之上,数学模型的抽象能力才是软件技术的基础,堆栈链表二叉树、设计模式都是数学模型的例子而已。因此数据结构不是就那么几种,而是你想不到的多;设计模式也不是就那么几种,也是你想不到的多,对于真正掌握语言的人来说,前人总结的模式和数据结构不过是一些语言应用的例子而已,无非是“熟读唐诗三百首,不会作诗亦会吟”,离真正的思想原创还有很大距离。大学软件专业课程设置的一个缺陷就是把<<数据结构>狭义化(或者说没有设置专门的<<数学建模>>课程)。

banq兄将OOP思想绝对化(也是很多OO大师的主流倾向),我认为也是可探讨的。站的高一点说,软件的目的是为了解决问题,即软件的本质是工具,没必要把工具意识形态化。站的低一点说,“面向对象”符合人认识世界的自然天性,而“面向过程”其实也符合人认识世界的自然天性,比如说“打酱油”,我们首先想到的是“两毛钱交过去,一瓶酱油拿回来”,而不是先想到“钱包”、“钞票”、“哪条路走”、“哪家店”、“哪个瓶子”、“让谁去打”,因为这些对我们“打酱油”这个“业务”不重要,所以自然地被大脑至于次要的位置,甚至忽略,如果硬要OO方式去建模,只能把问题复杂化。再退一步说,OO也不能解决所有的软件问题,你可以把这个论坛的数据库替换成XML(XML也不是OO),但你不能能把目前绝大多数应用系统后台的Oracle、DB2。。。都换成XML。OO数据库概念叫唤了这么多年,产品也推出不少,就没见有成功的,我看不是因为技术不行,而是方向根本就不对;其实目前Java后台开发的主要问题就是OO编程与RDBMS访问之间的mismatch问题,EJB,Hibernate等都是在这个地方折腾,目前看这个折腾还远没到消停的时候。

===============================
我的第三个观点,需要和智商很高的朋友:)一起探讨:JavaWeb开发不应该走现在的高端路线,既然没办法让猪飞起来,那就让猪跑起来。

我猜想zjlzjlzjl提出这个问题的出发点之一,应该含有对目前各种不断更新的j2ee开发技术的厌倦;banq如果没有自己的框架,而是不断跟随这些新东西,也一定会厌倦;对于初学者或者天资不够的程序员,他们连厌倦的资格都没有,只有迷茫:学海无崖,何处是岸?这么点破事,做起来怎么就这么费劲?

j2ee开发为什么这么费劲?j2ee社区的开发效率为什么远低于.net、php?

千条万条,不如一条:j2ee程序员的包袱太重,要学的东西太多,时间精力过于分散,导致基础薄弱,能力很难提高。

既然总是找不到足够数量、足够水准的程序员做j2ee项目,我们就有理由怀疑主流的J2EE开发模式本身是否有问题。一个地方的老百姓都成了刁民,那地方一定是穷山恶水,或者官府腐败、苛捐杂税太多。在我看来,j2ee的苛捐杂税就是太多了。

各中J2ee开发框架或技术,包括EJB、Struts、Spring、Hibernate、JSF等等,还有banq兄的这个jdon:),都明确地告诉你:我这东西很simple,你这样这样就行。但很少有告诉你:你必须先这样这样,才能用好我的东西。我认为,一个好的开发框架或技术应该是三流程序员也会用,二流程序员用起来很爽,一流程序员用起来叫绝的龙泉三尺剑,而不是一个只有优秀程序员才挥舞得动的青龙堰月刀。如果不懂设计模式就做不好j2ee应用的话,那么大量j2ee应用项目的拖延和失败也就是理顺成章的事了。

基于降低j2ee开发门坎、提高开发效率的思路,我很早以前就设计了一个JavaWeb开发框架:http://www.xjawa.org/ (打个广告,呵呵)。 该框架只要求程序员掌握基本的Java、SQL、JavaScript、HTML、简单ServletAPI,其他所有技术都不是必需。当然,由于j2ee开发社区的浮躁气氛,开发人员对主流新技术的狂热追求,以及客户被大厂商严重忽悠,我这框架在公司内部也不能全面推广;具有讽刺意义的是,数年之后,居然跑出来一个Ajax,而这东西仅仅是我框架中的一部分而已,这两年居然成了技术热门。

总的感觉起来,国内的技术环境确实很浮躁,大部分程序员不注重技术基础,更谈不上计算机科学素养。因为根基不稳,所以特别容易跟风,而j2ee的风又是东南西北的胡吹,开发者,尤其是初学者搞不清方向也就很正常了。

]]-- 引用leebai的评论

非常同意,赞一个!!!!!!!
强烈建议每个人都应该通读两遍


[该贴被slangmgh于2007年09月07日 09:00修改过]

通读了一遍,很多牛人。
但也有个别水平貌似还不错的人老喜欢钻牛角尖。
Coolyu0916,这个人总是在让别人去做你的那个东西,但能否同样要求你做一个jive或者banq的这个网站出来? 不是说你做不到(功能而言),但你几乎肯定不会真的去做,大家是在讨论问题,而你这样和人讨论根本就是流氓逻辑。
这个问题我和其中大部分人的观点一致:分工不同,方向层面不同而已,没必要绝对化。
另外的一个帖子里的一句话说的好:“全局着眼,局部着手”。
其实,就是这么简单。
java我才开始学。。不过那道题我是会做的,方法一般..
#define N 10
#include
void main()
{
int i,j=0,k,sum=0,a[N];
for(i=0;i {
a=1;
}
for(i=0;sum!=1;i++)
{
if(i==N)
{
i=0;
sum=0;
for(k=0;k {
sum+=a[k];
}
}
if(a==1)
{
j++;
if(j%3==1)
{
a=0;
printf("%d ",i+1);
}
}
}
for(i=0;i {
if(a==1)
{
printf("%d",i+1);
}
}
}