他们为什么不在学校教这些东西?[关闭]


118

在整个夏天,我很幸运地参加了Google Summer of Code。我学到了很多东西(可能比我所有大学课程学习的总和还多)。我真的很想知道为什么他们不教一些我在学校早些时候学到的东西。仅举几例:

  • 单元测试
  • 版本控制
  • 敏捷开发

在我看来,他们花了大量时间在教学其他方面,例如数据结构和算法。尽管我仍然认为这些对于早期学习非常重要,但为什么不在他们之前教更多这三个呢?还是仅仅是我的学校不教这些东西太多?

别误会我的意思,我认为大学总是不应该教那些最流行的编程风尚,但我的教授难道不应该教我“在开始编码之前先画一个图”吗?


47
我发现大多数老师离开现实世界的时间都足够长,以至于他们不了解最新的趋势,例如版本控制和单元测试。
Ryu

14
我不确定将版本控制称为“最新趋势”是否公平。- SCCS是在1972年开发en.wikipedia.org/wiki/Source_Code_Control_System
JeffH

2
他们确实在RIT教授这些东西。
geowa4'9

6
你是对的。他们应该教那些东西,而不是数据结构,算法,并发性,网络和数据库。我的意思是,谁需要学习这些知识
汉弗莱·鲍嘉

1
我认为这在很大程度上取决于您所就读的大学。至少对于我所访问的大学而言,我可以告诉您,从一开始就对我们所有CS功课进行单元测试(即使它们没有遵循最佳实践,但这只是一个开始)以及版本控制。除此之外,我同意大学应该教您通用的抽象概念的观点。要正确掌握测试,版本控制以及敏捷开发,需要大量的第一手经验,但您不太可能适合您所拥有的全部课程。
约翰内斯·鲁道夫,

Answers:


188

您问题的最简单答案是计算机科学和软件开发领域都非常新,并且了解得还不够。尽管现代所有科学和工程学科的发展都在迅速发展,但是其他领域也有很多可以借鉴的经验,并且人们对它们的工作原理有更广泛的共识。

例如,尽管最近在材料科学方面取得了进步,但是土木工程师们已经知道如何建造不会倒塌的拱门了大约2000年,这是在大学中可以相对较少争议地进行教与学的事情。尽管我完全同意软件开发人员应该学习的技术,但是该协议是基于个人经验和非正式推理的。为了成为社会上公认的“最佳实践”,我们需要定量的数据,这些数据收集起来可能会非常昂贵:版本控制有多少帮助?它有什么帮助?单元测试?我们可以推断出各种技术的有效性,但实际上证明该有效性将非常昂贵。我们需要从头到尾运行一个完整的,现实的软件项目,无数次,都是由拥有相同专业知识的程序员组成的小组,使用不同的技术。至少我们需要大量有关现有项目的数据,而这些项目将不愿发布。

土木工程师拥有数千年的桥梁,其中包含大量信息。另一方面,软件开发人员只有几十年的信息,其中大部分都是保密的,因为组织几乎没有动力来整理和发布有关其开发人员有效性的信息,即使他们正在收集这些信息(大多数情况下也是如此)。 ')。

还有一些领域的混乱。软件开发或软件“工程”确实与计算机科学不同。软件开发人员需要计算机科学方面的知识,但是在算法复杂性或并行性推理的边界上工作并不是每天工作的程序员都会做的事情。同样,真正的“计算机科学家”将编写大量不起作用或不做任何有趣事情的一次性代码,并且不会从实际软件产品的那种严苛条件中受益匪浅。

互联网和开放源代码社区的出现可能提供了足够的数据来开始最终回答这些问题,但是即使明天有答案,他们大概要花100年的时间才能渗透到国际社会,每个人都同意什么应该在学校教书。

最后,有一些经济方面的考虑。这是一个相对较短的时间,因为几乎所有参与软件开发的人都可以廉价,轻松地访问专用计算机来运行所需的任何开发工具。几十年前,完全将一台机器专用于运行测试,甚至包含无限的源代码历史记录,对于许多人来说似乎简直是昂贵。


44

因为我们的老师:

  1. 从未尝试过单元测试,
  2. 不知道如何使用版本控制和
  3. 甚至没有听说过“敏捷开发”。

学生应该将事情掌握在自己手中。我们做到了,结果还好,不是吗?


3
“我们做到了,结果还好,不是吗?” -我们中的某些人...一路上迷路了,因为老师们没有尽力而为。
AndreiRînea,2009年

12
好吧,无论老师做什么,人们仍然会抱怨。锋利的人总是渴望知识,并且结果很好。
杰弗里·何塞

我们的老师不是软件开发人员,我们也不打算学习软件开发学位。我们-在很大程度上-追求计算机科学,这是另一种野兽,它更多地关注理论而非实践。
Dean J

1
@mislav:你的老师是谁?
CesarGon

43

达芬奇(Leonardo da Vinci)写道:

那些迷恋没有科学的实践的人就像是没有舵或罗盘的船上的飞行员,永远无法确定他要去哪里。实践应始终基于扎实的理论知识。

好的学校既教授理论(数据结构,算法等),又教授实践(单元测试,版本控制等)。这需要教师的适当配合,以便可以正确教授硬币的两面。完全由理论类型组成的,没有实际经验的教师是不会做的。同样,完全由从业人员组成的学院也不会这样做。您需要混合,好的学校也有。


1
我同意您所说内容的主旨,但是我认为同时管理多个版本的问题是理解的关键理论要素。相比之下,我同意使用CVS和SVN之类的工具来解决此问题完全属于“实践”领域。
Andrew Swan

但是在一般的“软件工程概论”类型的课程中,可能不需要在多次讲座中涵盖版本控制。涵盖它的功能,基本用法,也许还涉及分支/合并。
亚当·贾斯基维奇

我有一个叫做“团队软件项目”的类。这并不包括版本控制,但它确实盖UML,软件开发方法,需求收集,单元测试等
亚当Jaskiewicz

@Alan,您在谈论哪些学校?
lifebalance 2015年

40

计算机科学一直有些矛盾。与计算机有关的部分不是科学,而与科学有关的部分不是计算机。

大学倾向于更多地依靠“科学”端(算法,数据结构,编译器等),因为这些东西比当前的行业最佳实践“永恒”得多,后者每年都在发展和变化。例如,版本控制在过去5或10年中发生了惊人的变化,但是big-O仍然是big-O,并且哈希,btree和递归仍然像40年前一样有用。他们的想法通常是为您提供足够的基础,然后您可以使用git之类的工具,并在被告知基础数据结构是SHA-1哈希的无环有向图并且开发人员已经努力工作时理解其含义。优化syscall的数量,使其与io绑定。

现在,考虑一下您在哪里学到了理解最后一句话所必须知道的所有内容-如果答案是“大学”,那么他们做得还不错。


13

一切都是一时的流行。大学一年级的学习将比大学一年级的学习更多。计算机科学与计算机无关。

College为您提供了一个包含所有工具的工具箱。这是螺丝刀,是月牙扳手。您可能会在大学里一次使用每种工具。当您进入现实世界时,便是真正了解自己拥有的东西。您可以从其余部分中挑选出有用的东西,以防万一,您想留在工作台上的那些东西,以及每天都放在口袋里的那些东西。

Tqm,Iso,Cmm,Agile等。这些都是它们将会流行并且将会消失的时尚,成功的秘诀不只是常识。所有成功的工程师和公司都使用某种常识,这就是使他们成功的原因,很少有人需要为其命名。问题是您不能出售常识,经理不能通过训练和购买常识而没有醒目的名字来向公司证明其价值。在上面写上一个名字,他们的上司已经在一些新闻文章或杂志上读到了,而经理则保留了他们的工作,而您却保留了您的工作。实际上,很少有声称遵循这些做法的公司这样做。大多数人会给顾问写一张支票,并向某个俱乐部获得他们的年度和/或终身证书,以便他们可以在其网站上贴上图形或产品随附的包装盒上的标签。许多人会争辩说,这是罕见的……在那里,看到了,它发生了。这些都是业务的一部分,有时您必须偷工减料才能保持盈利,并保持大门打开和开灯。所有这些实践的铁杆追随者都认为,最后一种是一种时尚,而这不是一种,最后一种确实太昂贵了,无法遵循,这不是一种。最后一个是假的,您刚刚雇用了一名顾问,这是真实的。像编程语言一样,它们也会发展。最后一个是假的,您刚刚雇用了一名顾问,这是真实的。像编程语言一样,它们也会发展。最后一个是假的,您刚刚雇用了一名顾问,这是真实的。像编程语言一样,它们也会发展。

您了解业务现实,大学系统及其角色的能力是关键。像生活中的一切一样,选择自己的战斗。教您想要或想要知道的不是大学,企业,政府或任何其他人的工作。寻找第一名是您的工作。同样,您不能责怪其他人为您提供了这样做的时间,您必须这样做。你会从马上摔下来,你不是受害者,站起来再回来,没有任何借口,生活不公平。请充分利用讲义,不要假装独立。当然要付您的会费,不要吸干公司的讲义,而不要给他们一些东西(当时最好的东西?)作为回报。

人们为什么认为cmm或敏捷或其他任何一种时尚?他们为什么认为自己不是?教授为什么教你那样编程?避免gotos还是避免常数,还是避免这种情况?是因为它产生了更可靠的代码吗?性能更好的代码?减少人为错误?还是因为对论文/程序进行评分更容易,给他们更多的时间进行研究?是因为他们不知道如何编程,而只是在关注别人关于该主题的书吗?他们是否教过您不能拥有可维护,可靠,高性能的代码?您甚至不能“选择任何两个”可维护性来干扰可靠和高性能?有时您会牺牲可靠性来提高性能。有时您不关心可靠性或性能,只想从117.34版中获取。2到版本118.0.0的另一个会计软件程序。您的商业模式来自销售版本升级和技术支持,而对于软件开发人员而言,任何旧机器人都可以以相同的方式编写相同的代码。用刚毕业的大学一人代替烧坏的人,并继续销售升级产品。

这些问题没有统一的答案,您必须找出自己的观点,接受并捍卫它。改变主意,忍受它,捍卫它。

质疑一切...如果我触摸炉子上的火锅,我真的会被烧死吗?害怕的心理影响会导致不仅仅是被烧毁的伤害吗?有没有安全的方法来测试答案而不会受到伤害?

当我买得起时,我会在宿舍里购买并最终融化晶体管,电容,电阻等,所有这些都有明显的难闻的气味。为您的立体声音响购买一个耳放要比在第一次上晶体管的第二天尝试制造一个耳放便宜得多,而且容易得多。当然,Linus只是购买一个操作系统要比编写一个操作系统更容易……尽管您当时所学的内容与Linus所学的有所不同,但是您可以完成更多工作。

大学内部和外部的世界都将采用这些公式(cmm,敏捷等)来解决问题,当下一个公式出现时,它们将以同样的速度丢弃它们。您不必使用版本控制就可以成功,有和没有版本的成功一样多(实际上,由于行业的发展,到目前为止,没有版本控制的成功很多)。同样,只需进行最少的测试就可以成功(以计算机行业中的知名人士为例)。您可以通过测试自己的代码来获得成功,也可以通过遵循永远不要测试自己的代码的规则来获得成功。您可以成功使用emacs,也可以成功使用vi。您必须确定哪种组合适合您,如果幸运的话,请找到一个适合您的工作场所。

当您离开大学并进入现实世界时,请与“老朋友”一起聆听并与他们进行辩论。他们有数十年到数百年的综合经验,陷入了陷阱,您可以避免和/或自行测试(也许您意识到不必触摸火锅就能发现它会烧死您)。大多数人将至少看到其中一种或两种流行时尚,特别是它们被烧得多么厉害,以及从中恢复过来所做的事情。他们知道许多不同的测试方式,以及测试样式的名称也已出现和消失。什么有效,什么无效。风险在哪里以及如何避免在切线上浪费时间。随着您的成熟,您将成为旧计时器,将其向前传递。尝试教那些跟随您的人,以支付所学到的东西。记得教他们怎么钓鱼 不要只给他们一条鱼。有时,您必须让它们失败,然后才能成功,以免它们被严重烧毁。

我现在真正想说的是,现在我们处在一种罕见的情况下,我们可以目睹平行宇宙的演化(并可能影响它)。是的,与物理学相比,计算机科学是一门年轻的科学。但与此同时,它已经发展了许多倍。根据您在哪里工作以及与谁一起工作,您可能可以观察到硬件工程师。硬件世界中的编程语言当然不是什么新鲜事物,但它的发展速度不如软件世界。软件有几十年的领先优势。硬件一直认为软件工程师是二等公民。我们的工作很轻松,他们的工作很辛苦。(请注意,我实际上是硬件和软件工程师)。有趣的是,现在他们仍在处理我们认为基本或婴儿的问题。为什么我需要使用版本控制,所以我是唯一在该芯片上工作的人。如果您认为gcc或其他便宜的编译器或免费IDE的使用价值足以使我值得使用,甚至不知道如何使用,他们可能会与我使用的昂贵工具进行比较,他们会为您提供一份副本。一长串其他借口。我很高兴能同时学习vhdl和verilog,并在一周之内都能从这样的硬件工程师那里敢于冒险(尽管我的文凭说电气工程师我的职务是软件工程师)在这两个方面都变得富有成效。我想学习这些语言,当我可以使用这些工具时,我一直呆在办公室过夜,自学成才。从那时起,那个工程师特别意识到我说的是真的,语言只是语法,编程基础是相同的,所有工具都具有相同的作用。它的苹果和苹果不是苹果和橙子。

通常,尽管仍然很难发送消息,这两个并行的行业之一在语言,编程习惯,源代码控制,测试,工具,编程环境等方面拥有比其他行业更多的经验。我要解决的问题是在开发硬件设计时采用它们,创建价格合理的功能模拟器,我们可以将其与处理器的模拟(虚拟机)配合使用,以便我们可以开始测试硬件并开发测试和交付软件的时间早于我们使用芯片的时间。对此没有什么“新”,但是我们没有机制来获取最新代码,跟踪代码中的更改以查看我们需要集中精力在哪里。没有机制来跟踪定义用户(编程)硬件接口的文档。一个黄金副本以二进制形式存在于某人的电子邮件收件箱中,仅在以下情况下发生更改,好吧,您不必阅读Verilog即可了解发生了什么情况。等等,verilog多大了?我整周花在您身上的那个错误是三周前发现并修复的?因此,我们只是飞往某个度假胜地并参加聚会六个月,以等待硬件人员完成任务并将其丢给我们,还是我们借此机会尝试保持耐心和乐观,并教他们有一些不那么侵入性的常识方法,使他们既可以完成工作,备份工作,也可以共享自己的东西以供同行评审... verilog多大了?我整周花在您身上的那个错误是三周前发现并修复的?因此,我们只是飞往某个度假胜地并参加聚会六个月,以等待硬件人员完成任务并将其丢给我们,还是我们借此机会尝试保持耐心和乐观,并教他们有一些不那么侵入性的常识方法,使他们既可以完成工作,备份工作,也可以共享自己的东西以供同行评审... verilog多大了?我整周花在您身上的那个错误是三周前发现并修复的?因此,我们只是飞往某个度假胜地并参加聚会六个月,以等待硬件人员完成任务并将其丢给我们,还是我们借此机会尝试保持耐心和乐观,并教他们有一些不那么侵入性的常识方法,使他们既可以完成工作,备份工作,也可以共享自己的东西以供同行评审...

请记住,硬件工程师确实像您一样带着一盒闪亮的新工具离开了大学。您学习了17种不同的编程语言,但您只能使用其中一种,而您大学毕业后会发明其他语言。当他们离开大学时,他们可以告诉您他们对微积分和相对论的了解,每个元素中有多少电子,并计算高斯表面附近的电荷。但是他们的职业生涯大部分是一,零和/或非(嘿,我们有共同点,您真正需要了解的所有有关计算机的知识,一,零和/或非硬件或软件工程师)。有了物理学,微积分的基本定律,电子将不会像编程语言一样快地发生变化。但是编程的基本原理在所有语言中都是相同的,并将在未来继续存在。您是不是从大学时代就知道了这一点,还是因为Java与C ++有所不同而又有所不同?

像任何其他行业一样,大学的工作是保持盈利。他们必须聘请合适的学者来带来合适的学生,合适的研究经费和合适的研究种类,以使大学盈利。他们必须提供合适的班级,以吸引合适的学生并培养合适的毕业生,以便随着数十年的过去,雇主们不仅在大学附近而且希望遥远的地方将认识到这所大学能够培养出生产性和可盈利的雇员。(是的,有时您必须在正确的运动中吸引合适的运动员,以获取正确的电视时间,正确的名称识别和体育收入)。有些大学会教C ++和Java,有些则不会。有些人会发明CMM,有些人会教敏捷,而有些人则不会。如果大学具有任何价值,那么您就有一些需要学习的东西。他们不会教你所有需要学习的东西,但是会有所帮助。了解到那里的东西后,请在工具箱中收集合理数量的各种形式的工具。离开大学,找到一份工作。如果您的工具箱糟透了,也许会找到另一所大学,永远不要提第一所。如果可以的话,请使用这些工具并自行构建一些新工具。如果这是一个非常不错的工具箱,请对那所大学和您从中学到的知识和好的学者说些好话,并偿还学校给他们的钱。即使您没有在大学工具的通用目录中获得所有可能的工具,您也将摆脱某些子集。即使你不毕业...



11

最简单的答案是,您正在学习计算机科学,并且列出的内容与计算机科学的学术领域并没有真正的联系。软件开发可能是您使用计算机科学所做的事情,是建立在您学到的知识的基础上的东西……但是计算机科学和软件开发不是一回事。

教会您版本控制或如何编写有效的单元测试的课程,这将教会您一种交易,即(良好的)软件开发。


10

哦,上帝别让我开始

我曾经在一家著名大学担任过CS系主任,告诉我,面向对象编程只是一种“时尚”,所以他们不提供任何像C ++这样的幻想类。

关于为什么他们不教这些东西,那么,大学在那里教您该学科的基础知识,不一定是该行业的最佳实践


2
换句话说,大学将其角色(正确或错误)视为提供学术教育而非职业培训。这就是为什么许多应届毕业生对现实世界编程技术知之甚少的原因(例如编写可维护的代码)。
Andrew Swan

现在,他们在许多大学中(至少在最初的几年中)教的都是Java。啊,具有讽刺意味。
马修·申克尔

他什么时候告诉你的,OOP是一种时尚?直到Java出现之前,OOP都比流行知识更接近时尚。
2009年

@ [drewster]:1994年,尽管我认为您对Java给予了太多赞誉。OOP是编程语言演进中的逻辑演进。在其历史的任何阶段都将其称为“时尚”(1994年少得多)表明,CS院长的面目全非。
Steven A. Lowe

2
学术与现实世界/实践之间的错误二分法是什么?您在“现实世界”工作中使用的几乎每个想法都来自学术界或被其改进。您认为缺少GOTO的原因是什么?对象来自于1967年的计算机科学家。许多计算机科学人员尚不清楚OOP的优势,但这仍然是未定的事情。工业界认为这会有所帮助,但是有许多失败的项目证明是相反的。

9

好吧,大学的事情是他们需要教授真正通用的东西。诸如敏捷开发之类的东西仍然是相当新的东西,尽管在互联网上谈论得很多,但它并没有在所有地方使用,因此向全班学生教授它可能只会使少数进入敏捷商店的人受益。

但是,如今版本控制是不可原谅的。每个人都需要了解它,它是一种几乎与编译器一样有用的工具,并且CVS已有20多年的历史了。离开大学的任何程序员至少都需要理解这些概念。幸运的是,如果您在大学里做过任何小组工作,您可能很幸运能与已经了解版本控制并说服您的小组使用它的人一起学习。我知道我很高兴那个人加入我的团队。

单元测试也几乎是不可原谅的。我唯一要说的是,这本书仍处于测试驱动开发之外,要想获得100%的代码覆盖率,有时总会带来麻烦,而不是值得的。但是单元测试非常有价值,应该在软件工程课程中进行介绍。我以为其中有些东西正在进入某些大学,但还没有普及到所有大学。


在大学课程中不需要版本控制。他们不妨教“如何使用Visual Studio”。最好把它留在找工作的时候。至于测试-单元测试不一定是最好的,但是他们应该至少教会所有形式的测试实践中的一些。
gbjbaanb

@gbj同意,直到我找到一份工作,我才知道版本控制是什么,我立即看到了好处,并在一天之内学会了它。在学校的IMO中还有许多重要的事情要教。
temp2290,2009年

7

的确为什么不呢?获得CS学位的经历几乎是相同的。据我所知,原因是教编程的人没有编程。不需要教那些需要认证的东西,老师们也不熟悉它,并且学生从不开发任何有意义的项目作为他们课程的一部分。与讲授CS理论或Java语法相反,没有实际去教编程的动机。


6

计算机科学家认为他们是数学家而不是工程师,因此他们更喜欢教授数学部分而不是工程部分。测试,版本控制和文档没有比其他任何工程学科更受潮流欢迎。


因此,我们应该只雇用软件工程师,而不是计算机科学家?;-)
Andrew Swan

如果您认为其中任何一项都符合“工程”的定义,我会感到担忧。它们符合煎锅的定义,而不是工程。
本杰明·R

6

这取决于大学。我于2003年从澳大利亚大学毕业。在那段时间里,我们学习了UML,单元测试,XP(以及其他敏捷方法论)以及诸如Z,算法和数据结构,操作系统等所有形式化的东西。

但是,他们并没有详细介绍单元测试,而是只是支付了一项讲座的合格服务费用。学到了如何编写有效的单元测试,而不仅仅是“什么是单元测试”,这将是很棒的。

至于版本控制,从第二年开始,我们就在编程项目中使用它(CVS)。

我也确实同意Glyph所说的话。CS是一个不成熟的领域,实际上只是在过去的50年中,我们不知道我们应该学习什么,什么才是过去的时尚。给它一个150年的时间,然后情况可能会进一步恶化。现实世界中失败的项目数量明显表明这是一个不成熟的行业。想象一下,如果80%的建筑项目失败了!


5

所有这些都可以轻松地(简短地)放在有关软件开发实践的一堂课中。它不是大多数CS课程的一部分,因为那与CS无关,尽管我确实认为对这些内容的一些介绍很有用。我学校有这样一堂课。它没有涵盖版本控制,但涵盖了UML,需求收集,开发方法(各种敏捷和瀑布式开发),单元测试,集成测试等,并且要求我们以4-5的团队合作来开发项目(在Java中相当简单的Clue盗用)。如果您认为需要进一步的软件工程课程,可以选择这些课程。

尽管在我参加的任何课程中都从未提到过版本控制,但我的大多数朋友还是将其用于个人项目,课程分配等,因此,好像我们没有接触过它。在团队分配过程中,没有自己捡拾东西的人被同学强迫使用。

大学的宗旨是教授概念和理论,因为这些都是您自己很难掌握的东西。版本控制是一个工具,非常容易使用。稍微使用它,阅读网络上的一些教程,您已经准备就绪。如果您需要讲座和家庭作业来弄清楚如何从SVN中进行检查,那么实际上很困难的事情会遇到很多麻烦。

请记住,在课外有很多方法可以学习大学知识;利用这一点。您需要花很多钱去上课并使用这些设施,所以请花点力气,然后参加LUG和ACM会议,参加项目团队(总是有一些ME在构建需要程序员的机器人)或管理人文部门服务器的工作。从材料工程大楼的装卸平台中转移计算机,通过快速的宿舍互联网连接下载Linux iso,然后进行娱乐。


说得好!尽力挤牛奶。
AndreiRînea,2009年

3

我认为问题在于大学并不需要他们去教你成为一名专业人士,而应该专注于编程的学术方面。我以为至少应该参考行业中使用的最新方法和技术,因为这些东西也具有学术意义。

在我们的课程中,我们学习了“个人软件过程”,其中涉及诸如记录在项目上花费的时间,良好的注释等,但没有提及诸如版本控制之类的专业基础知识。


3

您已经命名为3,我认为其中一些对于理解计算机系统(例如版本控制)几乎没有同等重要。这些都是工作的一部分,您无需了解就可以成为一名优秀的程序员/计算机科学家。

对于单元测试也是如此-为什么选择单元测试?当然,可用性测试,系统测试,用户验收测试和工厂验收测试更重要吗?好吧,除非您将代码交付给维护部门,否则您认为自己的工作已经完成:)

考虑一下我每天使用的其他概念,这对了解软件和计算机系统基础知识的学生没有多大用处:

  • 良好的评论做法
  • 符合标准(不仅是国际标准,还包括团队编码标准)
  • 文件资料
  • 变更控制(不一定与用于存储差异的版本控制相同,更多地是关于更改内容和更改原因的原因)
  • 可用性发展

以上是所有您不需要编写优质代码的“软技能” 。

但是,如果您缺少数据结构和算法之类的“硬”技能,那么编写好的代码的机会几乎是不可能的。


2

我在大学里学到了所有这些。也许这取决于您选择的课程?我的课程非常多样化(软件设计,UI设计,电子商务,AI,功能编程等)。软件设计涉及设计模式和单元测试(一个涉及各种事务的大型项目)。UI设计...我们是一个三人小组,致力于一个项目。没有版本控制,我们无法做任何事情,所以我们做到了。敏捷开发是我们的教授不断告诉我们的东西,但他们将其留给每个小组使用。

我发现许多大学生参加了“简单”课程或会给他们高GPA的课程。其他人则专注于他们想学习的内容,并在很大程度上探索以找到他们感兴趣的领域。然后有些人确切地知道他们对什么感兴趣……这很好,除了他们倾向于不使他们的课程多样化。


问题是这些课程至少在我的学校是较高级别的课程。我认为这些应该是第一门讲授的内容,或者至少应该是中级的。
杰森·贝克

2

要回答为什么这些不是首先要教的东西:本科课程通常会训练您成为硕士生。只有当您开始选择自己的课程(通常在以后的几年中)时,您才能选择了解学术界以外使用的东西。这就是为什么他们专注于算法,数据结构,为您呈现未解决的问题等的原因。

我个人认为他们这样做是很好的。编程并不像我们许多人想象的那么容易。许多人为此而苦苦挣扎。我希望这些人在弄清楚Perforce是什么之前先了解for循环的工作原理。


2

他们不教授此类主题,因为大多数学校都是学术性的,而不是贸易性的。也就是说,它们旨在教授思想和理论,而不是训练您进入职业生涯。质量保证的整个概念与计算机科学无关,只有通过数学证明。此外,质量保证实践和开发工作流程在一家开发公司与另一家开发公司之间存在很大差异,因此在学校里教它们会浪费您的时间和金钱。


2

我一年级学习了所有这些东西,除了敏捷开发。

一切都是关于选择合适的学校,恕我直言。如果您进入前十名,您将很快学到所有这些东西。

就一般的CS教育而言,我们基本上是在要求教授很多东西(各种口味的语言,数据结构,运行时效率,事物在位级上的实际工作方式)。我想提出一个问题:孩子们为什么不自己学习更多有关软件工程的知识?


2

就像学生一样,每个学院都是不同的。有些大学,或更准确地说,有些教授抵制变革或懒惰。幸运的是大多数不是。理论,概念,历史等对于任何CS课程都非常重要且至关重要。但是,为学生准备工作环境也是如此。不足为奇的是,我所在地区的社区大学提供非常实用的最新CS课程。大型,知名和著名的大学所需要的不多。


2

这仅仅是因为数据结构和算法构成了计算的核心,因此更为重要。单元测试,版本控制和敏捷方法论只是行业的工具(并且,如果有必要的话,有望在工作中使用它们)。


1

我认为优秀的CS程序应该讲授基础知识,这些基础知识将成为您将来进行所有编程教育的基础。像敏捷这样的开发方法和版本控制工具都像时尚。他们来来去去。而且,它们通常用于行业环境,而不是学术环境,因此,我认为大学很少涵盖诸如您可能会在工作中学到的东西。我并不是说这是对的,但这可能是学术上的想法。


抱歉,但是我不认为敏捷和版本控制会比装配线或微积分的发明更流行。在现实世界中,我们正在设计的东西从根本上改变了程序设计,但是大学在其小型演讲台上与现实相去甚远,以至于他们不知道我们已经前进了。
奥斯汀2009年

1

我同意你的意思。我最近刚开始在软件开发领域工作,而且我已经开始学习敏捷开发,这是我从未在大学里学过的东西。

事情的事实可能是大学教授跟不上最新的开发技术。他们可能还会觉得自己的课程中还有其他更重要的内容。


1

大学的讲师并不知道如何编写软件,他们只是研究,教导软件,偶尔会抨击一些只有在论文发表之前才有效的代码。

仅仅是因为像Titus这样的人,我们才招募到真正精通编程的学者- 在这里阅读他对这个话题的评论

当我还是一个学生的时候,我在图书馆中阅读有关极限编程的书籍,我们在课堂上简短地讨论了这本书。拥有。

祝您事业蒸蒸日上,我希望您能获得学位,在您的名字后面写上字母很高兴。:)


1

您提到的所有三件事(单元测试,版本控制,敏捷开发)都在格罗宁根大学的计算科学课程中进行了一定程度的讲授。这是否是一件好事,我将悬而未决。但并非没有大学能教您“实用知识”。


1

这些是基于我在换专业之前在CS程序方面的有限经验以及我在一家大型软件公司实习的经验。之所以没有讲授单元测试,是因为您必须创建的大多数程序都不够大,无法进行自动化测试,并且您保证了一组特定的输入,因此可以手动测试所有内容。教您如何自动执行测试也可能会与项目的评分打交道,因为大多数项目都是使用运行自动化测试的脚本进行评分的,因此请快速浏览一下代码以确保您没有int foo1;int foo2; 并且您使用适当的缩进。

我不知道为什么不会讲授版本控制,但是其中一部分可能是项目的规模。我从来没有任何一个项目足以进行版本控制,而我的意思是说超过1000行代码并花了整个学期来编写。我想他们认为如果需要,您会自学。我曾经有任何小组项目都应该是成对编程项目,如果两个人都在同一台计算机上,为什么还要使用版本控制?

我不知道为什么不教授敏捷开发,但是它可能又回到了程序大小的问题。尽管敏捷开发在运行于个人计算机和小型服务器上的新软件中很常见,但通常不用于诸如IBM大型机之类的系统或诸如文档为准的银行或医疗等问题领域。这也可能与以下事实有关:敏捷发展不是在20年前左右,当时许多教授都接受了培训。


>如果两者都在同一台计算机上,为什么要使用版本控制?即使我是计算机上唯一的人,我也使用版本控制!否则,您将如何管理分支和补丁程序发行,甚至查看文件的先前版本(在上一次更改使文件失效之前)?
Andrew Swan

来自安德鲁的同上。即使我的所有工作都是在笔记本电脑上完成的,而且大部分都是单独工作,我仍广泛使用SCM工具。备份,版本控制,分支和合并,修补旧代码。所有这些都是不仅将其用于源代码,而且将其用于任何产生的内容的原因。
马修·申克尔

没有理由不对您的代码是否通过单元/验收测试评分。

1

主要原因是许多(大多数?)大学认为自己的目标与商学院不同。因此,他们想教学生如何学习以及该学科的基本原理。此外,算法和数据结构将适用于任何编程语言,并且不依赖于特定的工具(毕业时可能会或可能不会一直使用)。

在计算机科学中,这意味着算法,数据结构,计算机理论,编译器理论等。您要列出的内容很少是关于如何编程,如何解决问题等的知识。这是关于编程的实践(其中,顺便说一句,对于任何想成为程序员的大学人来说,都是一本了不起的书。现在,许多功能将不会在入门级代码猴子的位置使用,导致某些人认为它没有用。我不同意。我认为这可能非常有用。但是,这并不意味着获得CS学位后,您就知道成为程序员所需的一切。

这也不是说您提到的内容没有用。他们是。如果您不学习它们,那么在作为程序员的工作上将会遇到麻烦,而且我认为至少在一定程度上应该在大学里教他们。我会看教学版本控制,单元测试等,就像看艺术本科课程一样,以及关于什么是画笔以及在各种情况下应该使用哪种画笔的教学。


1

我认为这取决于您所使用的计算机科学程序的类型,既有针对研究和科学方面的程序,又有一些针对实现方面的程序。我特别拒绝某些学校,只有那些留在学术界的教授。如果您没有教授没有“使用”他们所教的内容,那么所有这些实际上都在他们脑海中。

Plug:我在DePaul大学获得了Comp Sci的学士学位和在Soft Eng的MS学位,主要是由兼职老师/教授教授的,这对我来说很好,因为我希望他们能带上前一天的轶事并将其与班级联系起来。同样,这是一所通勤/非全日制学校,大多数学生都有使用所学知识的工作。

学习的过程仍然是从所有理论开始的,但是随后我们通常会被问到“你们中有多少人在工作中实际使用了它?” 通常的答案是“我们以简化或简单的方式使用它”,然后进入实际的实际场景。

在我上学期间,总是进行单元测试。即使他们开始使用Java,他们还是让我们对所有项目都使用ANT和JUnit。这是构建配置和单元测试的良好起点。

我参加的大约三到四门课程中都包含了极限编程。我记得它们都是从12个不同方面开始的,从结对编程到单元测试(请参见上文)。现在看来,重点是敏捷。

因此,快速的答案是,是的,那里的学校比其他学校更务实。


1

单元测试和版本控制都是在我上大学的第二年计算机科学课程中讲授的。单元测试属于测试的一部分,该部分还包括白盒和黑盒之间的差异,并且在三年级的编程任务中有很大一部分标记用于良好的错误处理,而这些错误可以很容易地从单元测试中获得。

我认为,在学术环境中教授敏捷开发可能相当困难。虽然我确实从理论上了解了瀑布法,但直到毕业并搬入可能与学术界截然不同的现实世界后,我才在野外看到它,例如,第三年我做了所有奇怪的错误案例并几乎通过一项作业,我从未触及该作业试图教会我有关信号量的内容。

另外,敏捷已经存在了多长时间,您指的是哪种形式的敏捷?根据我所见,它有许多不同的实现。


1

我不认为敏捷编程是一种时尚,但是与此同时,我很难想到教师可以为您提供项目以让您学习的一种方法。除非他们为您提供项目A构建,项目B在a上展开。问题是时间和范围。在4个月的课程中,这将非常困难。

版本控制和单元测试方法不断变化,并取决于语言或定义它们的人。

数据结构和算法可以在类设置中进行处理。坦白说,他们还要花更多的精力来理解然后进行单元测试和版本控制。尝试记住大学的一部分是教你教自己。拼贴没有完全相同的任务。或至少程度不同。恕我直言。


嗯,我认为大学和大学的意思是一样的..虽然不是母语人士。

取决于您在美国(国家/地区)所处的位置,它们是相同的,在加拿大,它们是不同的。我认为在各州,我所谓的拼贴实际上称为初级拼贴。在澳大利亚,它被称为塔夫语(原谅拼写)。不说母语的人会
觉得
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.