他们为什么不在学校教这些东西?

时间:2008-09-17 02:21:12

标签: unit-testing version-control agile

整个夏天,我很幸运能够进入Google Summer of Code。我学到了很多东西(可能比我在所有大学课程的总和中学到的要多)。我真的很想知道为什么他们不会教我在学校学到的一些东西。仅举几例:

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

在我看来,他们花了大量时间预先教授数据结构和算法等其他内容。虽然我仍然认为早期学习这些非常重要,但他们为什么不在他们之前教这三个呢?或者只是我的学校没有教授这些东西?

不要误解我的意思,我不认为大学总是要教最时髦的编程时尚,但是我的教授不应该教我一些“在你开始编码之前绘制图表吗?”< / p>

32 个答案:

答案 0 :(得分:187)

对您的问题最简单的答案是,计算机科学和软件开发领域都是非常新的,并且不是很了解。虽然现代所有的科学和工程学科都在快速发展,但其他领域有更多的经验可以借鉴,并且对它们如何运作有更广泛的共识。

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

土木工程师有数千年的桥梁可供查看,并提供大量信息。另一方面,软件开发人员只有几十年的信息,其中大部分都是保密的,因为组织很少有动力整理和发布有关开发人员效率的信息,即使他们正在收集信息(大多数都是“T)。

还有一些混乱的领域。软件开发或软件“工程”实际上与计算机科学不同。软件开发人员需要掌握计算机科学的工作知识,但是在算法复杂性的边界或者并行性推理的工作并不是工作程序员每天都会做的事情。同样地,一个真正的“计算机科学家”会编写大量丢失的代码,这些代码只是不起作用或者没有做任何有趣的事情,并且不会从实际软件产品的那种严格程度中获益。 / p>

互联网和开源社区的出现可能提供足够的数据来开始回答这些问题,但即使答案明天可用,它们也可能需要100年时间才能渗透到国际社会的每个人同意在学校应该教什么。

最后还有一些经济方面的考虑。这是一个相对较短的时间,因为几乎每个参与软件开发的人都可以便宜,轻松地访问专用机器来运行他们想要的任何开发工具。几十年前,完全专注于运行测试的机器,甚至包含无限的源代码历史,对于很多人来说,这似乎是非常昂贵的。

答案 1 :(得分:42)

因为我们的老师:

  1. 从未尝试过单元测试,
  2. 不知道如何使用版本控制和
  3. 甚至没有听说过“敏捷开发”。
  4. 学生应该把事情掌握在自己手中。我们做到了,结果很好,不是吗?

答案 2 :(得分:41)

莱昂纳多达芬奇写道,

  

那些迷恋实践的人   没有科学就像飞行员一样   进入没有方向舵或船舵的船   指南针,从来没有任何确定性   他要去哪里实践应该   始终建立在良好的知识基础之上   理论。

优秀学校既教授理论(数据结构,算法等),也教授实践(单元测试,版本控制等)。这需要适当的教师混合,以便能够正确地教授这枚硬币的两面。完全由理论类型组成而没有真正经验的教师将不会这样做。同样,完全由从业者组成的教师也不会这样做。你需要一个混合,好学校有这个。

答案 3 :(得分:39)

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

大学倾向于更多地关注“科学”方面(算法,数据架构,编译器等),因为这些东西比当前的行业最佳实践更加“永恒”,而这些行业最佳实践往往会逐年发展变化。例如,版本控制在过去5年或10年中经历了惊人的变化,但是大O仍然是大O,并且散列,btree和递归仍然像40年前一样有用。他们的想法通常是为您提供足够的基础,然后您可以选择git等工具,并了解当您被告知底层数据结构是SHA-1哈希的非循环有向图时,以及开发人员努力工作时的含义优化系统调用的数量,使其受到约束。

现在,想想你在哪里学到了所有必须知道的东西,以便理解最后一句 - 如果答案是'大学',那么他们的工作做得很好。

答案 4 :(得分:12)

答案 5 :(得分:12)

当我在俄勒冈理工学院担任兼职教时,我教过这些东西。他们被教导,只是稀疏。

答案 6 :(得分:11)

哦,上帝不要让我开始

我曾经在一所声名卓着的大学担任过cs的院长告诉我,面向对象的编程只是一种“时尚”,所以他们没有提供像C ++那样的任何课程

至于他们为什么不教这些东西,那么,大学就是教你学科的基础知识,不一定是行业的最佳实践

答案 7 :(得分:10)

最简单的答案是,您正在学习计算机科学,而您列出的内容与计算机科学的学术领域并不完全相关。软件开发可能是你用计算机科学做的事情,是建立在你学到的东西之上的东西......但计算机科学和软件开发并不是一回事。

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

答案 8 :(得分:8)

与大学相关的是,他们需要教授真正具有普遍性的东西。像敏捷开发这样的东西仍然很新,尽管它在互联网上被谈论了多少,但它并没有在任何地方使用,因此向全班学生教授它可能只会使少数人进入敏捷商店。

然而,版本控制是现在不可原谅的事情。这是每个人都需要理解它的工具,它几乎和编译器一样有用,CVS已经存在了大约20年以上。任何离开大学的程序员至少都需要理解这些概念。幸运的是,如果您在大学中进行任何小组工作,您可能很幸运能够与已经了解版本控制的人一起降落,并说服您的小组使用它。我知道我很高兴那个人在我的小组里。

单元测试也几乎是不可原谅的。我唯一要说的是,这本书仍然是在测试驱动的开发上,并且100%的代码覆盖总是有时会比它的价值更麻烦。但单元测试非常有价值,应该在软件工程课程中介绍。我想,有些东西正在进入一些大学,但还没有到达所有大学。

答案 9 :(得分:6)

为什么不呢?我获得CS学位的经历几乎是一样的。原因是,据我所知,教授编程的人不会编程。不需要教授这些东西进行认证,教师不熟悉它,学生从不开发任何重要的项目作为课程的一部分。与教授CS理论或Java语法相反,没有动力实际教授编程。

答案 10 :(得分:6)

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

他们没有详细介绍单元测试,更多的是通过一次演讲的服务。如果能够学会如何编写有效的单元测试,而不仅仅是“什么是单元测试”,那将是很棒的。

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

我同意雕文所说的内容。 CS是一个如此不成熟的领域,实际上只是在过去的50年里,我们不知道我们应该学习什么,什么只是一时的流行。给它一个150年,然后事情可能会更多地解决。失败的真实世界项目的数量很明显,这是一个不成熟的行业。想象一下,如果80%的建筑项目都失败了!

答案 11 :(得分:5)

计算机科学家认为他们是数学家而不是工程师,因此他们更喜欢教授数学部分而不是工程部分。 测试,版本控制和文档不会超过任何其他工程学科中的时尚。

答案 12 :(得分:4)

在软件开发实践的单一课程中,所有这些都可以很容易地被覆盖(浅)。它不是大多数CS课程的一部分,因为这不是CS的内容,尽管我认为对这些内容的一些报道是有用的。我的学校有这样的课程;它没有涵盖版本控制,但它确实涵盖了UML,需求收集,开发方法(各种敏捷和瀑布),单元测试,集成测试等,并要求我们以4-5的团队工作来开发项目(Java中相当简单的Clue rip-off)。如果您觉得需要进一步的软件工程课程,那么它们可作为选修课提供。

尽管我在任何课程中都没有提到一次版本控制,但我的大多数朋友都将它用于个人项目,课堂作业等等,所以我们并没有接触到它。那些没有自己捡起来的人在团队任务过程中不得不被同学使用。

大学旨在教授概念和理论,因为那些是你自己难以接受的东西。版本控制是一种工具,很容易上手。使用它,阅读网络上的一些教程,你就完成了。如果你需要讲课和家庭作业来弄清楚如何检查SVN中的某些内容,那么你将会遇到很多困难。

请记住,有很多方法可以在课外学习东西;利用这一点。你付出了很多钱去参加课程并使用这些设施,所以为了它所有的价值而喝它并参加LUG和ACM会议,参加项目团队(总有一些ME建立一个需要程序员的机器人),或者得到管理人文部门服务器的工作。从材料工程大楼的装货码头中挑选一台计算机,下载带有快速宿舍互联网连接的Linux iso,然后玩游戏。

答案 13 :(得分:3)

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

在我们的课程中,我们学习了个人软件过程,其中包括记录项目花费的时间,良好的评论等,但没有提到版本控制等专业基础知识。

答案 14 :(得分:2)

就像学生一样,每所大学都是不同的。有些大学,或者更确切地说,有些教授不愿改变或懒惰。幸运的是大部分都没有。理论,概念,历史等对任何CS课程都很重要。但是,为学生的工作环境做准备也是如此。毫不奇怪,我所在地区的社区学院提供最新且适用的CS课程。与大型,成熟和着名的大学不同。

答案 15 :(得分:2)

除了敏捷开发之外,我在大学一年级学到了所有这些东西。

所有关于选择合适的学校,恕我直言。如果你进入前10名,你将很快学会所有这些。

就CS教育而言,我们基本上要求教授们如此教授(各种语言的语言,数据结构,运行时效率,以及实际上如何在比特级别工作)。我想提出一个问题,为什么孩子们不会自己去学习软件工程?

答案 16 :(得分:2)

他们没有教授这样的话题,因为大多数学校都是学术性的,而不是贸易。也就是说,它们旨在教授思想和理论,而不是训练你进入职业生涯。质量保证的整个概念与计算机科学无关,除了通过数学证明。此外,QA实践和开发工作流程从一个开发室到另一个开发室都有很大不同,所以在学校教它们是浪费你的时间和金钱。

答案 17 :(得分:2)

这仅仅是因为数据结构和算法构成了计算的核心,因此更为重要。单元测试,版本控制和敏捷方法只是交易的工具(如果有必要的话,预计会在工作中接收它们。)

答案 18 :(得分:2)

我在大学里学到了所有这些知识。也许这取决于你选择的课程?我的课程非常多样化(软件设计,UI设计,电子商务,AI,功能编程等)。软件设计涉及设计模式和单元测试(一个涉及各种事物的大型项目)。 UI设计......我们是一个从事项目的三人小组。没有版本控制我们什么都做不了,所以我们得到了。灵活的开发是我们的教授不断告诉我们的,但是他们把它留给每个小组来使用它。

我发现很多大学生都参加了“简单”课程或课程,这些课程或课程会给予高GPA。其他人专注于他们想要学习的东西,并且正在大力探索找到他们感兴趣的领域。然后有些人确切地知道他们感兴趣的东西......这很好,除非他们往往不会使他们的课程多样化。

答案 19 :(得分:2)

要回答为什么这些东西不是第一个被教授的东西:本科课程通常训练你成为硕士生。只有在您开始选择自己的课程(通常在以后的几年中)时,您才能选择了解学术界以外的事情。这就是他们专注于算法,数据结构,向您展示未解决问题等的原因。

我个人认为他们这样做很好。编程并不像我们许多人看起来那么容易;很多人都在为之奋斗。我宁愿这些人在弄清Perforce怪物之前先了解for循环是如何工作的。

答案 20 :(得分:2)

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

类似于单元测试 - 为什么选择单元测试?当然,可用性测试,系统测试,用户验收测试和工厂验收测试更重要吗?好吧,除非您在将代码发送到维护部门后认为您的工作已经完成,否则它们是完全的:)

想想我每天使用的其他概念,这对于学习软件和计算机系统基础知识的学生来说没什么用处:

  • 良好的评论实践
  • 标准合规性(不仅仅是国际标准,而是团队编码标准)
  • 文档
  • 更改控制(不一定与存储差异的版本控制相同,这更多是关于您更改内容的原因和原因)
  • 可用性开发

以上都是“软技能”,你不需要来编写好的代码。

然而,如果你错过了“硬”技能,比如数据结构和算法,那么你编写好代码的机会几乎是不可能的。

答案 21 :(得分:1)

大多数大学软件项目必须符合单个班级的范围,这意味着有效地进行为期5-6周的项目,涉及1到4名合理的无经验程序员。单元测试和源代码控制只有在您将其扩展到涉及更多人的长期项目时才会变得令人信服地有效。因此,很难将这种技术构建到类项目中,而这种方式不仅仅是毫无意义的要求。

答案 22 :(得分:1)

我不认为敏捷编程是一种时尚,但与此同时,我很难想到教师可以给你一个项目让你学习它的方式。除非他们给你项目A建立一个,项目B扩展为。问题是时间和范围。在4个月的课程中,这将很难。

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

数据结构和算法可以在课堂设置中使用。老实说,他们需要花费更多的精力来理解单元测试和版本控制。试着记住大学的一部分就是教你自学。拼贴画并没有完全相同的授权。或者至少不同程度。 IMHO。

答案 23 :(得分:1)

我认为优秀的CS课程应该教授将作为未来所有编程教育基础的基础知识。敏捷等开发方法和版本控制工具就像时尚;他们来去匆匆。此外,它们往往被用于工业环境而不是学术环境,因此我认为大学很少能够涵盖那些你可能在工作中学到的东西。我不是说这是对的,但这可能是学术心态。

答案 24 :(得分:1)

单元测试和版本控制都是在我上大学的第二年计算机科学课程中讲授的。单元测试属于测试部分,其中还包括白盒和黑盒之间的差异,并且在第3年的编程任务中有很多标记用于良好的错误处理,这很容易来自单元测试。

在我认为的学术环境中,敏捷开发可能很难教授。虽然我在理论上确实了解了瀑布方法,但直到我毕业并进入可能与学术界完全不同的现实世界之后,我才开始在现场看到它。在第3年,我做了所有奇怪的错误案例,并且几乎通过了一项任务,我从未触及过任务授权给我讲述信号量的核心。

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

答案 25 :(得分:1)

我认为这取决于您所处的计算机科学课程类型是针对研究和科学方面的课程,还有哪些课程适用于实施方面。我特别拒绝某些只有教授留在学术界的学校。如果你没有教授那些没有“使用”他们所教导的东西,那就完全是他们的头脑了。

插头:在德保罗大学攻读Comp Sci和MS in Soft Eng,我主要是由兼职教授的教师/教授教授,这对我来说很好,因为我宁愿让他们来自一个轶事前一天并将其与课程联系起来。 此外,这是一个大多是通勤/兼职学校,大多数学生都有工作使用他们正在学习的东西。

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

在我上学期间,单位测试始终存在。即使他们开始使用Java,他们也让我们在所有项目中使用ANT和JUnit。这是构建配置和单元测试的良好开端。

极限编程包括在我所参加的大约3或4个课程中。我记得他们都从12个不同的方面开始,从配对编程到单元测试(见上文)。而现在似乎关注的是敏捷。

所以快速回答是肯定的,那里的学校比其他学校采用更务实的方法。

答案 26 :(得分:1)

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

我不知道为什么不会教授版本控制,但其中一部分可能是项目的大小。我从来没有任何足以进行版本控制的项目,而且我的意思是超过1000行代码,需要整整一个学期来编写。我想如果你需要的话,他们会认为你会教给你自己。我所拥有的任何团队项目都应该是成对编程项目,为什么在同一台计算机上使用版本控制呢?

我不知道为什么敏捷开发不会被教授,但它可能会与程序大小相同。虽然adgile开发在个人计算机和小型服务器上运行的新软件中很常见,但它通常不用于IBM大型机等系统,也不用于文档为王的银行或医疗等问题域。它也可能与这样一个事实有关,即20世纪前许多教授都接受过培训,这种事实并非如此。

答案 27 :(得分:1)

你提到的所有三件事(单元测试,版本控制,敏捷开发)都在格罗宁根大学的计算科学课程中得到了一定程度的教授。这是否是一件好事,我将作为一个悬而未决的问题离开;但是没有大学教你“实际的东西”是不正确的。

答案 28 :(得分:1)

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

在计算机科学中,这意味着算法,数据结构,计算机理论,编译器理论等。你列出的东西不是关于理解如何编程,如何解决问题等等。它是关于编程的实践(顺便说一下,这对于大学里的任何一个打算作为程序员工作的人来说都是一本了不起的书)。现在,大部分内容都不会用在入门级代码猴位置,导致一些人认为它没用。我不同意。我认为它非常有用。但是,这并不意味着在获得CS学位后,您将了解作为程序员所需要的一切。

这也不是说你提到的东西没用。他们是。如果你不学习它们,你将无法作为程序员工作,我认为它们应该在大学里教授,至少在一定程度上。我会看一下教学版本控制,单元测试等,就像我在艺术本科课程中看到的那样,以及什么画笔的教学以及哪些应该用于各种情况。

答案 29 :(得分:1)

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

只是因为像提图斯这样的人,我们才得到任何真正认真编程的学者 - Read his comments on that topic here

当我还是一名学生时,我在图书馆阅读有关极限编程的书籍,我们在课堂上对它进行了详细的讨论 - 要求我们遵循软件开发的“瀑布模型”的相同类,其中“编译”是它自己的一步。

你职业生涯中最好的,我希望你毕业你的学位,很高兴你的名字后面有字母。 :)

答案 30 :(得分:1)

我同意你所说的话。我刚刚开始在软件开发领域工作,我已经开始学习敏捷开发,这是我从未在大学里教过的。

事实可能是大学教授没有尽可能多地跟上新的开发技术。他们也可能觉得课程中还有其他更重要的事情。

答案 31 :(得分:0)

理想情况下,我的猜测是他们要么没有时间教这些东西,要么教授算法和语言更重要,大多数学生将难以学习的东西。

学校是自学的对立面,因为这些东西(版本控制,单元测试)是最容易学习的,所以他们需要确保即使是能力最差的学生也能够做最重要的基础编程和算法,并在以后做“周围事物”。

你谈论的那些事情会随着时间而改变,而且很难改变工具等。大教育结构就像保持简单。