呵呵,我觉得j2se api 和设计模式应该都算是基础吧,只不过是学习不同的阶段的基础.
写软件就象写文章,api是我们的词汇量,设计模式和框架就象我们文章的结构和文章的写作手法.没有词汇量的积累自然很难写出好的文章,甚至没办法写文章,
但是只有词汇没有一定的写作手法(模式),比如修辞方式等很难写出好的文章(软件).
如果文章的结构(框架)混乱,写的文章自然难以阅读,而软件需求就象是文章的主题和灵魂.
而写那方面的文章自然需要相关专业的知识,同样,做管理软件需要管理的知识,有时也需要数学和数据结构的知识甚至网络协议的知识,当然相关的知识可以从别人那里合作来获得.
与建筑设计类似,如果我们连基本的普通房子(API)的构成都不清楚自然很难理解什么建筑风格.可是房子看多了,却没有自己的思想,没有归类和抽象成的理论(模式)很难设计出名作.
API我们需要了解,如果我们在了解的过程中体会到别人的思想,再有设计模式理论指导自然理解的透彻.
偶觉得bang老大是从系统开发和设计者的角度来考虑的,而zjl3则是从实用应用层次为出发点的.当然应用者要想进步成gs也应该理解和学习设计模式.而gs在学习和进化的过程中应该也认真学习过一些api
484?
什么 J道哦,中国计算机科学之所以会如此,也就是因为中国有太多想BANG这样的"人物".
[该贴被aspserver于2007年07月06日 18:12修改过]
什么 J道哦,中国计算机科学之所以会如此,也就是因为中国有太多想BANG这样的"人物".
做为一个IT从业者,我门除了要把自己的分内工作做好外,我门还需要的是社会责任感,民族的荣誉感,自豪感。而不是为了追求一时的私利,拔苗助长。宣扬什么所谓的观点与论断。
我可以这样说,如果一个程序员没有学过C,数据结构与算法,编译原理,数学等基础性的知识,那么他注定一辈子都只是个代码工人,除了每天写重复的代码外还是写重复的代码。
BANG 的论断是从一个提高生产效率(私利)的角度出发,而不是本着科学,务实的态度来看待计算机科学这门事业。
别把自己放在高处,高处不胜寒。希望你务实一点,不要一天没事就在论坛上刮“浮夸风”,不要误导初学者。凡是都有一个量变到质边的过程,这些简单的道理我就不多说了。
看看中国的IT业,看看我门的JAVA程序员门,大多数人只会点框架,什么框架流行用什么框架,成为软件工厂的代码工人。
[该贴被aspserver于2007年07月09日 11:22修改过]
>>>为什么用框架,是为了提高生产效率、为了降低成本
你说你用了框架除了框架的API你什么都不会
每天都在关心框架的变更
每天都在问自己是不是落伍了
担心这个不会找不到工作,那个不会怎么样

言之有理!我们总是在感叹我们struts不会,hibernate不会,什么框架出来,你就什么都不会。我们会了又怎么样,这些框架也好比工具,你会了这些工具就跟工厂里的工人的一样了,这只能让中国的软件普及,而不能让软件科学进步。如果要使软件业有发展的话,那就是去设计框架,框架的设计的好坏就源于你算法和数据结构的精通程度,就如一个高端仪器工具需要精细的零件。

看了这么多发言,忍不住也说几句。

我根本不赞成Coolyu0916的两个观点
1 Coolyu0916也承认搞oo框架和搞算法是不同的分工,但他显然有一种算法优越感,认为搞算法就高人一等,我觉得这种偏见十分错误。先入为主认为自己擅长的东西高级,把别人视为低等,不是一个成熟的IT人应持的态度。
2 Coolyu0916认为数据库和os就是单纯的算法和数据结构,这点我是万万不能苟同的,windowsXP那样复杂的体系结构难道仅仅是算法,我想还是框架设计为主吧,当然它比一般企业应用要更注重算法。至于数据库更不仅仅是一个算法问题,你一个算法专家去搞数据库,可能吗?数据库和os有着比企业应用更为复杂的体系结构,虽然早期数据库和os开发使用的是面向过程的语言,但框架设计这一关是回避不了的,决不因过程式语言就成了纯算法,那么多的功能有机集成在一起,而且有提供给用户扩充的接口,没有一个好的框架,行吗?

我个人认为,数据库和os可以看作是一个企业应用,算法只是其中的一个部分,只不过它更加成熟,而且产品化,经过千锤百炼,适应了几乎所有企业。

我见过国外一家大公司的一个电子书浏览器的源码,纯C写的,50万行,30个人搞了1年。我们要参考它作一个java版的,单单听他们给我讲解软件架构就讲了3天。其中称得上算法的,依我看只有一个加解密模块。纯C算过程式语言吧,能说只有算法吗?

我认为只要是做软件,不管什么语言,除非你要做一个演示小程序,否则都是架构设计为主,算法为辅。至于谁高级低级的问题,只能看谁有垄断权。只有一个合格架构师,非它不可,那他就nb。同样,只有一个搞算法的,那他身价必然倍增,有两个的话,就递减了。

再补充一下
我先表明自己,我是搞底层算法的,2001年到现在一直从事图形算法方面的工作,做过电力图形cad、svg图形编辑器、可视化流程设计器、三维opengl。由于需要跟应用相结合,所以又被迫学了spring、webLogic这些中间件技术。
作这么多年图形算法,感觉的是,底层算法的需求大都十分直观,基本上就是数学公式的套用。只需要过程化的思维,就是一步一步,像一条线一样。真正难学的是java中间件技术,面向对象的思维方式跟数学的思维方式存在明显的冲突。

公司有三个算是资深的架构师,我跟他们的特长正好相反。他们都是数学盲,但很善于用oo方式思考问题,碰到怎么复杂的问题都从容应对,能同时面对错综复杂的体系架构而不犯怵。而我只能把问题纯粹化后才能处理,然后再整合到体系中去。

碰到算法问题,就两样了,三维空间物体旋转后的位置计算、消隐计算,我轻松搞定,他们怎么也不能理解,一位老兄看了我的代码后,摇摇说“你还是杀了吧”。
虽然在公司,别人无法替代我,但我也总想在架构设计方面做出突破。花了几年的功夫,spring、struts、webLogic应该说也懂得了不少,但付出的时间代价太大,我总疑惑他们怎么那么轻松就拿下来了。我也单独负责开发了几个项目,但自己清楚,太大的不行,都是中小项目。
说到底,架构设计也是难度很大的。你从中科院或者名大学里拉出一群算法专家来,改行搞框架,他们还真不一定行!

我是通过自学走上编程这条道路的,看了大家的讨论,我想谈谈自己的一些看法。我学过传统基础知识,但没有深入研究。我从对程序一巧不通,对程序的迷盲到对程序有了认识是通过自学考试中老师讲的C语言课程,但那只是对我认识程序起到了很大的帮助,并不能让我用它开发开发项目。此后就学习了数据库的相关知识,那时还不能自己设计程序,只能根据别人的要求开发一些简单的模块。我也尝试用面象过程的思想去设计程序,但只可以设计一些比较简单的程序。(从学习到实际开发这段时间不是很长,一年左右)后来我接触到了JAVA,我对它的思想一开始就很认同,虽然那时我还并不完全理解。从那以后我就按照面象对象的思想去思考程序上的问题。差不多一年后,我就可以运用面象对象方法设计出我的第一套运行服务端业务应用程序,对于应付日后的频繁业务变更可以比较轻松的应付。
我学习程序可以用跳跃式来形容,可以给初学程序的朋友们一个建议。先开始需要学习基础知识,但是不用深入研究,因为那时没有真正应用的需求,深入研究并不能很快的帮助你。之后需要重点学习面象对象的思想,要忘记面象过程的思想,由于你没有深入研究基础知识会忘记的比较快^_^面象对象的思想利于我们做项目的设计工作。但设计一定是建立在相当开发经验的基础之上的,你需要依照面象对象的方法自己去研究开发一些小项目,在具体开发时,你肯定会遇到很多比较基础的东西,这时你再去就这部分深入学习,学习效果会很好。我不建议一开始就大量的学习框架之类,因为现在框架太多,以目前的水平会看花眼,只会盲目跟随,不利于应用的选型。随着时间的推移,你会越来越清晣面象对象的理念,这时你可以使用框架应用到你的项目中去(确实比你自己设计的幽雅很多),可以分析研究开源的框架,理解他们的设计思想,程序技巧,提高你自身的设计能力。
其实学习程序的人有两类,一类是应用型,一类是研发型,并不是都通过一种方式就可以学成。个人感觉应用型不需要深入研究太多基础知识,但需要有所认识,需要熟练使用现成框架,应用型程序员的重点应该放在框架学习上。研发型需要深入研究基础知识,但是也需要研究目前的框架技术,不要闭门造车,因为只有这样,才可以提高自己,才可以为我们中国的软件发展做出贡献。
以上只是自己的一些心得,认识还不全面,欢迎大家讨论,以促进互相提高。谢谢!
cxz7531 列举的现象很能说明问题:
面向对象的思维方式跟数学的思维方式存在明显的冲突。

人各有所行,别看都是搞软件,处理复杂事物解析的能力和抽象数学算法的能力都存在隔行如隔山的现象,过去把软件只看成后者能力,忽视前者,所以中国巨型复杂软件系统很少,美国前几年火星探测人的地面管理系统都用Java写的,不知中国探月计划管理系统是否采取OO,如果不是(按照中国软件数学化思想应该不是),那N多年后,还得推倒重来。

Unix的哲学里,放在首要地位的是数据结构,不是算法。照他们的说法,“既然数据结构已经明了了,算法自然也出来了”。再说算法,什么是算法?“计算的方法”?我觉得不如说是“解决问题的方法”更合实际。“给你一堆数,对它们进行排序”,这就是一个问题。有了问题,自然有解决方法,你怎么排,就是你的解决方法。子程序,if,else,for循环等等,都是算法,算法在粒度上是递归的。程序即是解决方法的集合。OOA/OOD同样也是解决问题的方法,有冲突么?举个最常见的数据结构——二叉树,用过程式思维,你可能先想到的是在它上面会有哪些操作。而用OO思维,二叉树就是一种对象。二叉树有两棵子树,这两棵子树同样是对象。树和它的子树间就是OOD关系里的聚合。所谓的“二叉树遍历”,无非就是要跑一遍这些所有的对象,怎么跑,就是体现你的解决问题的能力的地方,也就是通常所谓的“算法”。说白了,这些都是抽象思维,不是算法,也不是OOD。算法和OOD只是抽象的思维的一个具体子类。

冯·诺依曼模型至今为止还是构成计算机的基本模型。这种模型的基本立足点就是指令+数据,指令处理数据,也就是通常所说的过程式思维。过程式思维就能导致指令不能重用么?就能导致难以扩展难以修改?宏指令集,子程序,不都是重用的表现?“对象组合”在本质上不也是追求一个统一的、递归的责任体?如果换成OO模型,你会怎么设计计算机的基本模型呢?你的对象运用得再彻底,领域建模(说实话这里的领域实体除了运算器,控制器,存储器和I/O系统,还能有什么?)再厉害,最终在某个地方(也许是你在对象模型里建模成领域服务),你还是要对数据进行加减乘除之类的基本运算,而这些运算,本质上还是过程范式,表现出来的还是算法。

我的观点是,侧重OO跟侧重算法并没有冲突,两者非平行,而是正交互补的关系。

  对于这个问题的讨论,其实就是对JAVA在不同层面应用的理解。
  就比如一个制衣企业,它不用去管棉花是怎样种植的,又是怎么纺成布的,它只需要买来合适的布,设计并制出适应市场的,漂亮、舒适、安全的衣服,销售出去并创造利润就算完成任务了。利用JAVA开发应用程序的企业不就像这个制衣企业吗?
  这应该就是JAVA面向对象的设计理念了。
  我们根据市场的需求,拿有用的开发程序(JAVA)和框架等,依据客户的需要,结合我们的设计理念,充分利用我们的知识,包括了解的(不是用3、5年时间去钻研的)算法和数据结构等,制造出能够解决实际问题的应用程序,并被市场所接受,这就已经成功了。
  有人会说,这样我们掌握不了核心的技术,会永远跟在别人的屁股后面跑。
  这就好比绝大多数人用互联网是去找对他们有用的信息,而不是研究网络本身。
  我是很佩服能为中国的软件事业增砖添砖添瓦的老大,但这是有条件的,一是志趣在此,对程序本身的开发有极大的热情,二是有这样的条件,至少是不愁吃喝,三是有此能力;这样做,至少也能为中科院的大大们排忧解难嘛。盼能设计出ChineseJAVA,ChineseOS。
  总之,学以致用,并以此为社会创造价值并获取利润才是我们大部分同志首先应该做的。
  不好意思,有点跑题了。讨论这个问题,就好像在讨论盖一座楼是地基重要还是楼层重要。忽略地基恐怕开发商就要去坐牢,但哪个开发商也不会把主要的时间和精力放在地基上的。
  以上就是我对JAVA中面向对向理念的理解和对这个议题的一点看法,纯属一家之言。在这里我要声明的是我不是JAVA程序员,对JAVA也没有什么很深的造诣,看大家讨论的很激烈,因此想发表一下自己的看法,不当之处请多多指正。
[该贴被carterwang于2007年07月30日 01:36修改过]
[该贴被carterwang于2007年07月30日 01:38修改过]
按照客戶,無非搞點簡單業務,技術含量高的不多,說白了還是工人,這是不爭的事實,框架,模式只是解決方法的一種手段,看到這裡的人吹噓java,感覺很是惡心,大多數人用他只是用用而已,整天看到这個炫耀會STRUTS那個炫耀會SPRING,更是讓人起雞皮疙瘩。
我们学院就是没有学C的情况下直接开了oo的课程——java。而周围的人听说这样开课后很多都评论我们学院开课非常奇怪,顺序怎么不是由基础开始再深入。

再就是大家在做java项目的课程中,周围人包括很有经验的老师等等人的建议很多都是——数据库很重要,数据库设计一定要在所有设计前最先出来。即便采用hibernate的时候,也是现有数据库设计,后有反向工程的映射文件和java类。

而第一个java web稍微完整些的程序,是数据库课程设计中完成的,数据库设计成了其中的重头。

对于软件领域的知识体系问题,最近进行了很多自我的总结思考,碰巧今天又发现了这个帖子。关于软件和数学的关系问题——有一门叫做《计算理论》的课程,是国外CS专业的很重要的一门课,国内CS专业基本不怎么开这门课了——从我的自身体验来看,这门课比较难学,但是真正帮助我们从数学的角度来理解计算机方面的种种。比如大名鼎鼎的church-turing理论,计算机和算法已经被进行了数学的抽象,图灵机模型和算法其实是一一对应的关系。怎么说呢,按照个人的理解,觉得数学这个抽象的工具某种意义上还是很practical,在软件领域有着不可磨灭的作用。

不过,以本人目前的理解能力,觉得oo和数学不是排斥的关系,大概,oo从宏观上组织软件结构……

数据库方面,本人正处于严重困惑中,开发系统时数据持久化和数据库是怎么一回事儿,顺序问题,本人正在痛苦的摸索中。

然后,我想,之所以很多程序员不能把注意力放在业务领域这一块,而是被java中各种技术冲昏了后,可能除了因为大家思维转变的原因,还有一个重要原因是……怎么说呢,大概缺乏一个实现的架构,又对那些角色的程序员那么容易使用。以自己的感受来说,一个开发团队中采用了某种大家不熟悉的开源框架,那么似乎每个成员都必须花时间去了解熟悉它。其实大家的学习能力,还有完全清晰的分工协助情况,实际情况下总不很那么理想化的。是大家代码功底不够?设计模式思想缺乏?学习速度有限?还是别的原因呢?

以上是做为一个大三刚结束的本科生一些看法,包括一些疑惑

嗯,我是个新人,对于这些什么面向对像并不是很懂。但是在我看来,其实所有的问题都是算法和数据。面向对象是解题思想,软件工程是经验。我有点很不理解,就是为什么那么多的人喜欢去创造抽象名词,像什么BO,SOA,IOC这些。计算机的东西本来就很抽象了,那些BO,SOA,IOC的东西也挺抽象了,就搞不懂他们为什么还喜欢给这些东西再加上一个更抽象的名词。让我们这些初学的人看了更是一头雾水,不知所云。再说说java,在我看来和C没什么太大区别,无非是多了一些API。在C的时代你可能需要亲自去告诉计算机一步步要怎么做,去写那些代码。过程化编程。而在JAVA中,你可能只需要告诉它我需要窗体,它就会自动的去帮你写那些过程。实现面向对象。(例如,要把大象装进冰箱里,在C语言你可能要这么做1打开冰箱的门2把冰箱里的东西一件件拿出来3把大象塞进冰箱4关上冰箱的门。而在java中你只需要说我要把大象放进冰箱它就会自动的替我们完成那些过程。)我还记的我刚学JAVA的时候,我们的老师就说我们是在面向对象的语言里搞过程化的勾当。那时需要去写一个电子表格,我们傻傻的去一行行写过程化的语句。当我们写完后,我们的老师突然告诉我其实只要一句就可以了,他new了一个JTable就OK了,我们全班都在那哭啊。后来老师告诉我们,其实我们写的代码和JTable的源代码是一样的。只不过他们有直接提供,而我们却自己去写而已。脱了裤子放屁多此一举。到最后我们老师就告诉我们,其实在源代码上没什么本质的区别,他们帮我们写好了那些过程而已。面向对象真正重要的是它的4种特性,当我们把曾经学的过程化代码结合上这四种特性后就是面向对象了。而我们在使用的时候就应该想着用一个对象,而不是写过程了。但要是哪一天万一没有我们要用的这种类型的对象呢?那很抱歉,只能回去写过程化的代码,再加上4种特性把它封装起来。然后再在程序中使用这个对象。这就是J2SE。而到了J2EE。则完全不一样了,因为在J2SE里你可能只考虑如何实现。但在J2EE你就要考虑代码的通用性,可延伸性,可扩张性。那时我们学完J2SE后学J2EE真的快疯了,因为我们完全的没经验。写的东西乱七八糟,把所有东西都合起来写。尽管它也可以实现,但如果万一某一天要改一点东西那就太困难了。我们那时都想写好代码,让它具备代码的通用性,可延伸性,可扩张性。但因为我们没经验,所以总是不知道该如何下手,模块应该怎么划分,如何具备延伸性。都不知道该如何做。我们的老师总是告诉我们写的多了你自然而然就知道该如何划分,该如何写。直到我们学了架构以后我们才轻松了点。那时才明白那些架构说白了就是那些开发人员多年来在代码的通用性,可延伸性,可扩张性的经验总结。那些东西可以让我们更好的去开发。给我们一个规则,只要我们的程序具备这些规则就可以让程序具备那些特性。所以在这样看来,J2SE的内容其实就是那些API的使用,这些东西并不是很重要,如果你真的牛,你完全可以编写自己的API。这样的话你还不如去学C,搞清楚地层的东西。J2SE只不过是个跳板而已,让你明白那些特性,具备那些思想。学完J2SE你可以有两种选择,一向下延伸,去搞清楚原理,追求地层的东西。逆流而上,去开发属于自己的工具。让别人使用你的工具。或许某一天你开发出一种全新的系统,完全打败WINDOWS呢。二向上扩张,学软件工程,学习企业的开发之道。去接受那些规则那些经验,当你有了足够的经验就看你个人是否有那能力去开发你的规则。这是个人的选择。所以j2se这东西重不重要只看个人能力。如果没有它却也是完全不可能,它是基础的思想(和C的那些原理不一样)但只要你领悟了,它就也显的不是那么重要。重要的还是看你自己以后的选择。。。。。
以上是我个人的观点。。
我其实挺纳闷的。现在的企业笔试都是忽略了本质的东西,在J2SE里死命考我们那些API的特性,功能。。问你这个类哪来干嘛用哪个类拿来干嘛用。疯了。我知道怎么用就好。必要的特性了解下就好,以免在程序中造成资源浪费和安全性。API这东西那么多,全背下来还不死人。。知道如何找到他们就OK了,不懂的用找个DEMO,看看它是如何使用的不就结了。它的特性看看API文档就好了。非要搞那么多麻烦。
如果我们的国家经济不能发展起来,讨论算法、数据结构与框架、模式哪个重要意义不大。而我们又很需要这种学习氛围。
目前的状况是,我们不得不在一段时间内(或许是相当长的一段时间内)一直跟着或赶着别人的脚步,就算国外专家把技术核心都跟你讲了,也不见得你就能够设计出类似或更好的东西出来,除非是由我们独特的东方思维抽象出来的。没有必要争论太多太深,也没有必要带上情绪,你明白自己要的是什么,需要什么才最重要。这世界,多一个人不多,少一个人不少,但是,没有谁与谁毫无关联,关键是看问题的角度咯,想一下,有什么办法可以把两者更好得结合起来,为我所用,这不更好吗?