为什么Java在这么多机构中是通用语言?[关闭]


22

编辑:这个问题起初似乎是在抨击Java,我想在这一点上有点。但是,我要提出的更大观点是,为什么选择任何一种语言作为最终目标都是所有问题的解决方案。Java恰好是使用过的Java,所以这是我在这里要击败的Java,但是我并不是故意将Java撕成一个新的:)

在大多数学术环境中,我都不喜欢Java。我并不是说语言本身很糟糕-它具有几个非常令人希望的方面,最重要的是能够在大多数平台上运行而无需重新编译。在您的下一个应用^ TM中使用语言没有错。(不是我个人会做的事情,但这更多是因为我对它的经验较少,而不是设计很差)

我认为使用Java作为语言来教授高级CS课程是一种浪费。我的许多共同学生无法编程,但该死的,因为他们不知道如何在非垃圾收集的世界中工作。他们从根本上不了解要为其编程的机器。当某人可以在垃圾回收世界之外工作时,他们可以在一个垃圾回收世界中工作,反之亦然。GC是一种工具,而不是拐杖。但是,它被用来教计算机科学专业的学生的方式是拐杖。

计算机科学不应教授针对一种语言的整套课程。学生们离开了,所有好的设计都是惯用的Java设计,而面向对象的设计是唯一可以做的唯一方法。其他语言,至少其中一种不是垃圾收集语言,应在教学中使用,以使毕业生更好地理解机器。

令人尴尬的是,拥有受人尊敬的机构在CS中拥有PHD的人无法从纸袋中编程出路。

更糟糕的是,当我与那些真正了解事物运作方式的计算机科学教授交谈时,他们会分享这样的感觉,即我们通过使用Java来做所有的事情对我们的学生不利。(请注意,如果我将其替换为任何其他语言,则上述内容将相同,通常是使用一种语言,而不是Java本身)

总的来说,我觉得我再也无法尊重任何程度的知识了-当我看不到周围的人能够摆脱Fizzbuzz问题的影响时,他们可以编程。

为什么/如何成为这种方式?


9
不用担心 给甲骨文一半的机会,他们将纠正这种情况:)他们对Android和Apache的诉讼仅仅是驱赶开发人员的开始。我在一家将上述内容作为开始教授Python的机构中进行教学,以期迎接未来的市场。
SamGoody

3
您指的是什么学术背景?我不希望CSci学生只学习一种语言。(我上次上学的时候,如果您认真地选择了专业和班级,您可能会熟悉C和Scheme,但是您至少会使用两种不同的语言。)
David Thornley,2010年

16
您能解释一下L1缓存的工作原理吗?您可以设计一个ALU吗?你能解释麦克斯韦方程吗?主板的热力学特性如何?你能建立一个USB驱动器吗?您真的知道您的计算机如何工作吗?还是您选择了适合您的兴趣的抽象水平然后从那里开始?
MetricSystem

5
因为确定需要了解内存管理以“从根本上了解他们正在为其编程的计算机”,这是一个完全任意的层次。如果没有必要了解您感兴趣的问题,通常最好花时间研究您感兴趣的内容(因为没有人有足够的时间来学习所有内容)。您提出的关于为什么Java程序员需要学习内存管理的任何论点都可以无限扩展,直到每个人都需要了解原子物理学来“理解”任何东西。
MetricSystem

7
此外,如果有人在这里有一个稻草人的论点,那就是您,因为我从未听说过有哪个CS程序仅将Java作为一种编程语言。
MetricSystem

Answers:


30

这不是Java问题,而是教学问题。不知道如何编程不是语言错误,这是学生的错误。可以说,所有问题,GC,基本机器知识,事物如何“在幕后”都是一样的。

您对垃圾收集的主要抱怨使我有些不满。除非您使用C或C ++,否则垃圾收集通常非常好,而不是问题。您希望他们都学习汇编吗?严格的高级语言对于教学非常有用。它为您提供了所需的库,程序包和其他功能的灵活性,而大多数其他高级语言(PHP,Ruby,Python,Perl)中都没有任何令人困惑的语言“糖”。


5
我并不是说不应教授高级语言。但是我是说,还应该教一些较低级别的知识(按C或Fortran或其他系统编程语言的顺序)。(低于C的用处不大,因为低于该水平,您所学的任何内容都将特定于单个计算机体系结构)。我并不是说所有CS毕业生都应该是优秀的低级程序员。但是我说的是,如果遇到低水平的问题,他们就不会像我周围的所有学生一样,四处飞溅和死亡。
Billy ONeal 2010年

3
@Billy:降低到最初的学习水平很困难。我发现自己在看C ++ / C代码,并在其中花了很多时间。不要指望奇迹,也不要指望天使。程序员需要有动力,无论问题有多高,他们都将很快“溅射并死亡”
Josh K

5
@Josh:足够公平,但是恕我直言,正式接触至少一个其他编程环境应该是获得CS学位的必要条件。该学位没有说“我了解Java”,而是说“我了解CS”。两者并不相同,仅靠Java(或任何语言)就无法完全了解CS 。(顺便说一句,+ 1)
Billy ONeal 2010年

2
@JoshK:无法进行低级调试,并且大大降低了正确推理其编写的代码含义的能力。
梅森惠勒

1
我知道程序员只学习Java,并且因为必须使用指针而对C ++或C感到恐惧。我不知道是否有人无法使用指针进行编程,可以将其视为真正的程序员:毕竟,所有现代计算机和运行时仍然基于包含寄存器,主内存,堆栈,堆的基本体系结构。因此,我更喜欢使用Java而不是C ++进行编程(如果您不必费心处理内存管理,绝对可以轻松地完成工作),但是我同意绝对不应该将教学局限于Java。
乔治

12

大学真的在这样做吗?还是这只是人们在接受不良工作面试候选人时得到的一种感知?

我4年前获得了CS学位,而Java是在入门课程中使用的,但之后并没有特别强调。首先,必修的核心课程要求您学习Java,C,C ++,SML(功能编程语言),汇编,matlab和CAST(电路描述语言)。这并没有考虑到所有的数学和理论CS课程,当然也没有考虑到六门选修的CS课程,这些课程可能会让您更多。从与许多不同大学的朋友交谈之后,听起来好像他们所做的并没有太大不同。

如果有大学只讲Java,那确实是一个悲剧。不是因为Java不好,而是因为它只是程序员应该使用的许多工具中的一种。仅懂Java的开发人员相当于只懂如何使用锤子的木匠。但是,我很难相信确实如此,至少对于受人尊敬的大学而言。我怀疑这只是看到不良候选人并责怪学校缺乏候选人的能力,而不是候选人本身缺乏动力/动力/好奇心/专业精神/等等的一种感觉。


2
同意 我几年前刚毕业,虽然我的大部分课程都是使用Java讲授的,但如果不选择使用C或C ++讲授的课程就很难毕业,而且我们还有一门强调Haskell用法的编程语言课程。
mipadi 2010年

就我而言,我们首先使用Pascal,然后使用Java作为OO语言。但是在过去的第二年中,有90%的教授不在乎您使用哪种语言。我们中的一些人使用c / c ++ / ruby​​ / C#/ python / even haskell,但是大多数人都坚持使用他们所知道的Java。仅使用汇编/ c / c ++所需的几门课程,即像我们的3D图形(可选)之类的课程,对于opengl来说几乎都是强制性的c / c ++。显然,基本系统课程会强制执行SPARC组装(因为我们是有意工作的并且底层)。我听说他们已经搬到了蟒蛇/ C ++在第一年,现在虽然....
AREN

11

我真的很惊讶这就是许多学校的情况。当我获得CS学位后,我进行了一系列语言课程,其中包括当天(大约40年前)所有流行的语言:汇编程序(Univac 1108和MIX),FORTRAN IV,SNOBOL4,COBOL,Lisp ,以及Algol68。我无法想象只教一种语言。或者,如何在不编写一些汇编程序的情况下欣赏编译器必须做什么。

我们在大多数数据和算法课程中都使用了Algol和FORTRAN。我本来希望在Lisp上花更多的时间-相反,我们仅作了介绍,现在正尝试重新学习其中的一些概念。我们使用SNOBOL4编写解析器-其模式与回溯匹配为以后许多现代语言所包含的regex库的工作奠定了良好的基础。

从那时起,对六种语言的介绍激发了我的兴趣。


8

为了得到真正的原因,您必须问那些经营这些机构的人(即使那样,他们可能也不会告诉您)。

几种可能的原因(我在这里既不捍卫也不指责任何人,只是猜测):

您可以用Java完成工作

Java是一种通用语言,因此可以用来解决许多问题。

许多老师懂Java

教一种您不懂的语言是很困难的

Java很流行

这意味着有大量的Java资源-书籍,活跃的社区,代码库等。

Java很简单

您无需了解许多底层知识或理论即可编写Java。您可能做得不好,但至少可以完成任务。

Java无处不在

您可以在几乎任何东西上运行它。

Java程序员有工作

有很多需要Java的工作-教师应该为学生准备现实世界。

时间有限

在许多课程中,没有时间教授多种语言,理论,低级概念等。

这是学生想要的

许多学生已经听说过(甚至使用过)Java。他们喜欢,因为它很熟悉。


6

这就是行业所要求的。Java开发人员短缺,因此学校开始创建它们。公司让开发人员一走进大门就可以开始工作。

无论如何,语言无关紧要。他们可以教授非GC语言,但仍然会产生不良的程序员。学校使用的语言是实施细节。学校应该教概念。如果不是这种情况,那就是学校而不是他们所教的语言是问题所在。仅仅因为某人不知道指针是什么并不意味着他们就不能成为有效的程序员。

无论如何,GC是未来的方式。


4
您不需要知道什么是指针。但是您需要能够相对较快地理解这个概念。不能理解指针或类似于指针的概念表明缺乏对计算机科学整体的理解。我并不是说所有CS毕业生都必须是很棒的低级程序员,但我是说他们至少应该对获得4年大学学位后的情况有一个概念上的了解。
比利·奥尼尔

1
CS与编程无关。
哈维尔2010年

1
@Javier:CS 与编程无关吗?当然还有CS的一个分支,“理论计算机科学”,这是不是编程,但在大多数情况下它关于编程。
Billy ONeal,2010年

1
@Billy ONeal:维基百科的定义有点长,但是最接近编程的部分是“对实现它们的实用技术的研究”。也就是说,这与实现(编程)无关,而是在研究实现技术(算法,结构,语言等)
Javier 2010年

1
@哈维尔:我认为“编程研究”和“编程行为”是同一个人。毕竟,读取代码的频率要比编写代码的频率高得多。但这不是重点-当您获得CS学位时,最终要做的就是编程。
Billy ONeal,2010年

4

懒惰和利润动机。Java让大多数人80%地完成了工作,而付出了20%的努力。但是,这通常会产生“猴子见猴子做”的伏都教编码员,他们对所发生的事情没有很深的了解,无法比高级工具更深入地研究。

正确地讲授C / C ++很难。即使做得好,也有很多人不会完全理解诸如指针之类的低级概念(对此进行了研究)。而且,这似乎与就业市场没有直接关系。


2
但是,如果您能理解指针,则可以更轻松地理解引用。
Michael K

3

我大都同意,但在一定程度上。

如果您要教授CS库仑,重点是数据结构或算法。消除大部分不必要的东西是一件好事。在学习高级概念时,您不希望学生处理低级的stuf。

另一方面,低水平的东西也应该教。如此一来,我们得到了更多的全能程序员。


我不是在谈论一门课程。对于单个课程,这很好。对于整个课程,事实并非如此。
Billy ONeal 2010年

3

与往常一样,这是您要教什么以及必须花多少时间完成的问题。

用Java做事意味着您不必处理流浪指针和free / malloc。这意味着更少的难以发现的错误。

这并不意味着您不应该了解底层机器-您必须精通该行业-也许您应该为该工作选择合适的工具。高级算法也许不是汇编程序课程的最佳主题。


对于入门课程或数据结构课程,Java很好。但是,不是整个四年制课程。
Billy ONeal

@比利 同意 我只是在提到使用Java可以买到一些您不必担心的东西。您应该在没有Java的其他课程中学习基础知识。

2

要求教给他们一些关于计算机如何真正工作的知识是太多了吗?对我来说,任何CS课程大纲都不会包含操作系统和计算机架构是没有意义的。我并不是说您应该能够在信封的背面设计一台计算机,但是总体概述使所有语言都具有针对性。我的意思是,Java在虚拟机中运行


1
是否有好的计算机科学程序包含OS课程和计算机组织课程?
mipadi 2010年

我当然希望不会!
Michael K

0

老实说,我不认为您应该失去对所有学位的尊重,尤其是不要放弃CS,因为所教授的唯一语言是Java。

任何体面的补偿。理科学生了解,他的CS学位不过是一张纸,真正的知识将来自于个人项目和个人学习。我想认为,优秀的学生知道他们需要了解C,学习如何在Linux / Unix中完成工作,并学习如何不被现代语言所束缚。


-1

我看不到使用Java的问题。最大的问题(如您所述)是大学将命令式编程作为解决所有问题的最佳且唯一的方法时。这与事实相去甚远。例如,对于三种不同的课程,不要使用三种命令式语言(甚至更糟的是同一种语言),而应该使用三种不同的编程范例。一个示例是Java(命令式),Prolog(声明式)和Haskell(功能性)。

至于为什么发生这种情况,我认为这是以下两种情况的结合:(1)政治-主席不虚心或有个人利益/赞助人,以及(2)懒惰-教授曾经是学生,他们任教所学。


-1

大急流城的卡尔文学院。当他们从Java切换到Python进行入门编程课程时,这位难以置信的教授在学期末向我们中的一群人提到:“他们中的许多人实际上可以编程,这太不可思议了”。他的惊讶与以前使用Java的经历形成鲜明对比。这并不会使Java成为糟糕的语言,只是很难从头开始学习。对于C或C ++或任何需要对内存分配方案或类型有深入了解的语言,我都会争论同样的事情。


1
嗯,Python与您提到的其他语言一样,需要对类型有深入的了解。
Billy ONeal

我希望带有口译员的语言会更容易学习,因为学生可以逐条陈述而不是逐条汇编地获得反馈。
凯文·克莱恩

@BillyONeal您误解了我,上下文是我最后一句话中的内存分配。我还不必担心str()或dict()或tuple()或list()或set()的元素的大小或数量……我只是“使用”它们。
Ben DeMott

@kevincline谢谢Kevin-这就是我想要传达的内容。从不赞成投票的人来看,我需要提高沟通技巧;)
Ben DeMott 2012年

-2

我获得了计算机系统工程学位,因此我研究了组装,微处理器,VHDL,逻辑门是什么以及如何从中创建触发器,我研究了电路,运算放大器,低通滤波器,幅度调制,在实验室中建立了一个听起来像电话键盘的电路,并被逻辑分析仪弄得一团糟,上了一些物理课。在Linux方面-我之前重新编译了内核,编写了一个微型设备驱动程序和一个家庭作业文件系统。

但是后来我意识到我更喜欢更多高级的东西。与C相比,我更喜欢Python。我喜欢C#,而且我喜欢垃圾回收器。我喜欢数学,算法和数据结构,但是我并不是指针的特别拥护者-我会把它们弄乱;我只是不想。

因此,您认为大学应该教更多的C,更少的Java。有人认为他们应该在Scheme中教授所有内容。Spolsky会两者兼而有之。

是的,大学学位的确只是纸上谈兵,但“不要让学业妨碍您的教育”。总是有Wikipedia,Stack Overflow,Coursera.org等。看起来传统大学将变得不那么重要。

如果我能在整个大学读本科,那我就去了另一所学校,我不会学习任何电气工程课程,而是学习数学,CS +物理和法语辅修课程。刮擦法语;我应该在瑞士留学,并在那学习5种自然语言。我还要回去找一个说服我的人,我绝对必须对大学的经济学课程进行一些介绍,以便在现实世界中生存下来,并把他收藏在我的弥尔顿·弗里德曼的书中(在仅有的几本书中)我读过的关于经济学的书籍,这些书籍并不烂)。我也不会为《 Freakonomics 1》这本书或有关Perl语言的书付钱。

事后看来,我会做很多不同的事情。我现在能做的,并且向您推荐的是,选择自己的冒险之旅:http : //www.codinghorror.com/blog/2008/03/choosing-your-own-adventure.html

事后看来,到现在我已经在股市上赚了1000亿美元,我将把它投资于癌症研究,我会聘请科学家摆脱塑料垃圾的世界。我本该向罗恩·保罗(Ron Paul)竞选活动捐赠足够的现金,以使中东战争发生在3年前。

现在认识到您将永远不会再浪费时间,因此请明智地花费时间。


投票者请详细说明。
工作

-2

几年前,我在英国的某个地方读到,Java的决定是为了吸引更多的学生学习编程。显然,由于缺乏讨厌的指针和内存管理等功能,大脑上的操作更加容易。我想这就是Python迅速被采用为新的“学习工具”的原因。我认为您的典型大学课程不会使您成为一名程序员。它要做的就是为您提供一定的知识,并为您做好编程的准备。通常,在uni之后的一段相当长的时间是可以称自己为程序员的那一天,当那个时候到来时,指针,垃圾回收和OOP以外的编程范例应该不成问题。


-2

为什么使用Java?

三个原因:

  1. Java使用C风格的语法。许多程序员都熟悉它,因此它减少了学习难度。

  2. 花了很多钱将Java推销为现代时尚。但是与Lisp相比,Java处于石器时代。

  3. JVM。JVM是关于Java的一件很酷的事情,它是合法的,而不仅仅是市场上的炒作。尽管JVM应该被誉为运行程序的平台,但它本身不值得Java语言的存在。您可以在理论上和实践上为JVM编译许多不同的语言。


1
欢迎。好像是您的第一篇写给Stack Exchange Programmers的文章。请查看常见问题页面programs.stackexchange.com/faq,以获取有关声誉,提问和回答问题的一些建议。关键是答案应该是有益的,而不是挑衅性的。如果您断言Java是石器时代而Lisp是现代者,请解释原因。许多读者可能知道Lisp是在1958年指定的,比FORTRAN还要年轻。如果您想说与FORTRAN或Algol共享的Java方面的东西会驱动其设计并限制它,请对其进行描述。
DeveloperDon

-3

您的问题正支持另一位写论文的人的发现,该论文称Java很酷,但不足以进行科学计算。我认为他应该只使用Big Decimal及其所有的高精度,NAN等,然后继续进行下去。

我只想生活在垃圾自动收集的世界中。它更健康,更清洁,更整洁,更美观,可以防止浪费医疗费用,这是更可取的-不必将某些东西标记为不需要的东西-只需将其取消引用或将其设置为null,或者当我移出范围时,该项目就会自动获得标记为垃圾收集。

好的,现在我只在谈论Java,但是如果它也可以在真正的垃圾情况下工作,那将是最有用的。Java可以在任何地方运行一次编写,这对我来说足够好了,因此可以在学校中将其用作语言。没有内存泄漏,也不想被快乐的程序员所喜欢,他们不想花时间标记他们使用的每个对象,而不再使用自身,这是代表Java的良好逻辑。

Java有指针-很好,我们称之为引用。String s1 =“ Hello”; 字符串s2 =“ Hello”; 字符串s3 =新的String(“ Hello”);

s1和s2将指向同一个String对象-通过引用s1 == s2,s1.equals(s3)但s1 == s3为假,因为s3是新的引用对象-这是引用和I的Java算法非常了解所有这些内容,对不起,我不希望被标记为不了解C或C ++的指针算法的内在复杂性的人。


2
引用不是指针。您不能在算术上使用它们,也不能使用它们来重新解释它们指向的内存。当然,无论您希望生活在一个垃圾收集的世界中多少,事实都是这个世界不是垃圾收集的世界。我并不是说Java是一种糟糕的语言,或者人们不应该使用Java。如果您喜欢它,请使用它,关于它的某些事情很棒。我只是认为它不适合作为初学者使用,因为它隐藏了新程序员必须理解的内容。
Billy ONeal 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.