整个夏天,我很幸运能够进入Google Summer of Code.我学到了很多东西(可能比我在所有大学课程的总和中学到的要多).我真的很想知道为什么他们不会教我在学校学到的一些东西.仅举几例:
单元测试
版本控制
敏捷开发
在我看来,他们花了大量时间预先教授数据结构和算法等其他内容.虽然我仍然认为早期学习这些非常重要,但他们为什么不在他们之前教这三个呢?或者只是我的学校没有教授这些东西?
不要误会我的意思,我不认为大学总是要教最时髦的编程时尚,但是我的教授不应该教我一些"在你开始编码之前绘制图表吗?"
对您的问题最简单的答案是,计算机科学和软件开发领域都是非常新的,并且不是很好理解.虽然现代所有的科学和工程学科都在迅速发展,但其他领域有更多的经验可供借鉴,并且对它们如何运作有更广泛的共识.
例如,尽管最近在材料科学方面取得了进步,但土木工程师已经知道大约2000年如何建造一个不会坍塌的拱门,这是可以在大学里教授和学习的,而且争议相对较少.虽然我完全同意您关于软件开发人员应该学习的技术,但此协议基于个人经验和非正式推理.为了成为社会公认的"最佳实践",我们需要收集的定量数据非常昂贵:版本控制有多大帮助?它有什么用?单元测试?我们可以推断出各种技术的有效性,但实际上证明效率最终会非常昂贵.我们需要从头到尾运行一个完整,逼真的软件项目,无数次,拥有相同专业知识的程序员团队,使用不同的技术.至少我们需要大量有关这些项目不愿发布的现有项目的数据.
土木工程师有数千年的桥梁可供查看,并提供大量信息.另一方面,软件开发人员只有几十年的信息,其中大部分都是保密的,因为组织很少有动力整理和发布有关开发人员效率的信息,即使他们正在收集信息(大多数都是"T).
还有一些混乱的领域.软件开发或软件"工程"实际上与计算机科学不同.软件开发人员需要掌握计算机科学的工作知识,但是在算法复杂性的边界或者并行性推理的工作并不是工作程序员每天都会做的事情.同样地,一个真正的"计算机科学家"会编写大量丢失的代码,这些代码只是不起作用或者没有做任何有趣的事情,并且不会从实际软件产品的那种严格程度中获益.
互联网和开源社区的出现可能提供足够的数据来开始最终回答这些问题,但即使答案明天可用,它们也可能需要100年时间才能渗透到国际社会,以至于每个人都同意什么应该在学校教授.
最后还有一些经济方面的考虑.这是一个相对较短的时间,因为几乎每个参与软件开发的人都可以便宜,轻松地访问专用机器来运行他们想要的任何开发工具.几十年前,完全专注于运行测试的机器,甚至包含无限的源代码历史,对于很多人而言,这似乎是非常昂贵的.
因为我们的老师:
没试过单元测试,
不知道如何使用版本控制和
甚至没有听说过"敏捷开发".
学生应该把事情掌握在自己手中.我们做到了,结果很好,不是吗?
列奥纳多达芬奇写道,
那些在没有科学的情况下迷恋练习的人就像是一名没有方向舵或指南针进入船只的飞行员,从来没有任何确定性.实践应始终建立在理论知识的基础之上.
好学校既教授理论(数据结构,算法等),也教授实践(单元测试,版本控制等).这需要适当的教师混合,以便能够正确地教授这枚硬币的两面.一个完全由理论类型组成而没有真正经验的教师将不会这样做.同样,完全由从业者组成的教师也不会这样做.你需要一个混合,好学校有这个.
计算机科学一直有些矛盾; 关于计算机的部分不是科学,而科学的部分不是计算机.
大学倾向于更多地依赖于"科学"方面(算法,数据架构,编译器等),因为这些东西比当前的行业最佳实践更加"永恒",这些行业最佳实践往往逐年发展变化.例如,版本控制在过去5年或10年中经历了惊人的变化,但是大O仍然是大O,并且散列,btree和递归仍然像40年前一样有用.他们的想法通常是为您提供足够的基础,然后您可以选择git等工具,并了解当您被告知底层数据结构是SHA-1哈希的非循环有向图时,以及开发人员努力工作时的含义优化系统调用的数量,使其受到约束.
现在,考虑一下你学到了所有你必须知道的事情才能理解最后一句 - 如果答案是'大学',那么他们的工作做得很好.
当我在俄勒冈理工学院担任兼职教时,我教过这些东西.他们被教导,只是稀疏.
一切都是流行的时尚.在大学的第一年,你将比在大学里的所有年份学到更多.计算机科学与计算机无关.
College为您提供了一个装满工具的工具箱.这是一把螺丝刀,是一把月牙扳手.你可能会在大学里使用每个工具一次.当你进入现实世界的时候就是你真正发现自己拥有的东西.你可以从其余部分中找出有用的部分,你想在工作台上留下哪些,以防万一,以及你每天留在口袋里的东西.
Tqm,Iso,Cmm,Agile等等.这些都是他们将要来的时尚,他们会去,没有一个成功的不仅仅是常识.所有成功的工程师和公司都使用某种常识,这就是使他们成功的原因,很少有人需要它的名字.问题是你不能出售常识,经理无法通过培训和购买常识来证明自己对公司的价值而没有一个吸引人的名字.在上面写一个名字,他们的上级已经阅读了一些新闻文章或杂志,经理保住他们的工作,你保留你的.声称遵循这些做法的公司实际上很少.大多数人都会向一位顾问写一张支票,并将他们的年度和/或终身证书交给某个俱乐部,以便他们可以在他们的网站上放置图形或在他们的产品进入的盒子上贴上标签.许多人会争辩说,这种情况很罕见......在那里,看到它,它发生了.这是业务的一部分,你必须偷工减料以保持盈利并保持门打开和灯亮.所有这些做法的核心追随者都认为最后一个是时尚,而这一个不是,最后一个真的太昂贵了,这个不是.最后一个是假的你刚刚聘请了一位顾问,这个是真的.与编程语言一样,这些也将发展.最后一个是假的你刚刚聘请了一位顾问,这个是真的.与编程语言一样,这些也将发展.最后一个是假的你刚刚聘请了一位顾问,这个是真的.与编程语言一样,这些也将发展.
您了解业务现实,大学系统以及您在其中的角色的能力是关键.像生活中的任何事物一样,选择你的战斗.它不是大学或企业或政府或任何其他人的工作,教你想要你需要或想知道.寻找第一名是你的工作.同样,你不能责怪别人为你提供时间来做这件事,你必须这样做.你会脱离马,你不是受害者,起床并重新开始,没有任何借口,生活不公平.利用讲义,不要假装独立.并且当然要支付你的会费,不要给公司干涸的讲义,而不给他们一些东西(当时你最好的?)作为回报.
为什么人们认为cmm或敏捷或其他任何一种都是时尚?为什么他们认为他们不是?为什么教授教你这样的程序?为了避免得到或避免常数或避免这个和那个?是因为它产生更可靠的代码吗?表现更好的代码?减少人为错误?或者是因为对论文/程序进行评分更容易,让他们有更多时间进行研究?是因为他们不知道如何编程,他们只是关注这个主题的其他人?他们是否告诉过您,您无法拥有可维护,可靠,高性能的代码?您甚至无法"选择任何两个"可维护的干扰,可靠性和高性能?有时你会牺牲性能的可靠性.有时你不关心可靠性或性能,你只想从版本117.34获得.另一个版本118.0.0的会计软件程序.您的商业模式来自销售版本升级和技术支持,就软件开发人员而言,任何旧机器人都可以以相同的方式编写相同的代码.用大学新鲜的东西替换烧坏的,并继续销售升级.
这些问题没有普遍的答案,你必须找出你的意见,与之共存并为之辩护.改变主意,与之共存,并捍卫它.
质疑一切......如果我触摸炉子上的火锅,我真的会被烧掉吗?害怕的心理影响是否会造成更多的伤害而不仅仅是被烧伤?是否有一种安全的方法来测试答案而不会受到伤害?
当我能负担得起的时候,我会购买并最终在我的宿舍里融化晶体管,帽子,电阻器等,所有这些都有一种独特的难闻气味.购买立体声耳机比在第一个晶体管类别后第二天建造一个放大器要便宜得多,也便宜得多.Linus当然是例外,它比购买操作系统更容易购买操作系统......虽然你在那段时间学到的东西与Linus学到的不同,但你可以做得更多.
大学内外的世界将采用这些公式(cmm,敏捷等)来解决问题,当下一个问题出现时,他们会迅速放弃它们.你不必使用版本控制来获得成功,就像没有那样有很多成功(实际上,由于行业的时代,到目前为止还没有版本控制有更多的成功).同样,您可以通过最少的测试获得成功(以计算机行业中真正的大牌为例).您可以通过测试自己的代码以及通过遵循永远不应该测试自己的代码的规则获得成功来获得成功.您可以使用emacs成功,并且您可以成功使用vi.你必须决定什么混合适合你,如果你很幸运找到一个与你同意的工作场所.
当你离开大学并进入现实世界时,倾听并与之合作并与"老定时器"争论.他们有几十年到几个世纪的综合经验,他们陷入的陷阱,你可能会避免和或自己测试(也许你意识到你没有必要触摸火锅,发现它会烧伤你).大多数人会看到这些潮流中至少有一两个来去匆匆,特别是它们被烧得多么糟糕,以及它们从中恢复过来的方式.他们知道许多不同的测试方法,以及测试样式的名称.什么有效,有什么不行.风险在哪里以及如何避免在切线上浪费时间.当你成熟并且你成为旧计时器时,将它向前传递.通过尝试教导那些关注你的人来支付你学到的东西.记得要教他们如何钓鱼,不要给他们一条鱼.有时你必须让它们在成功之前失败,防止它们被烧得太厉害.
我真正想在这里说的是,现在我们处于一种罕见的情况,我们可以看到平行宇宙的演变(并可能影响它).是的,与物理学相比,计算机科学是一门年轻的科学.但与此同时,它已经进化了很多次.根据您的工作地点和与您合作的人员,您可以观察硬件工程师.硬件世界中的编程语言当然不是新的,但它并没有像软件世界那样快速地发展.软件有几十年的开端.硬件一直认为软件工程师是二等公民.我们的工作很容易,他们的工作很难.(注意我实际上都是硬件和软件工程师).有趣的是,现在他们仍在处理我们认为的基本或婴儿问题.为什么我需要使用版本控制,我是唯一一个在这个芯片上工作的人.您使用gcc或其他廉价编译器或免费IDE的经验可能与我使用的昂贵工具相比,如果公司认为您值得使用它或者甚至知道如何使用它们他们会给你买一份副本.还有一长串其他借口.我有幸学习了vhdl和verilog,并在一周之内从这样一个硬件工程师那里得到了高效率(尽管我的文凭说电气工程师我的职称是软件工程师).我想学习这些语言,当我可以使用这些工具时,我会在办公室呆到深夜并自学.从那时起,该工程师特别意识到我所说的是真的,语言只是语法,编程基础是相同的,工具都做同样的事情.它的苹果和苹果不是苹果和橘子.
虽然在一般仍难以发送,这两个平行的产业之一,在语言的编程习惯比其他很多更多的经验,源头控制,测试,工具,编程环境等方面的消息.我试图解决的问题是在开发时采用硬件设计,创建价格合理的功能模拟器,我们可以与处理器的模拟(虚拟机)配合使用,这样我们就可以开始测试硬件并开发测试和可交付软件早在我们进入芯片之前.没有关于此的任何"新",但我们没有机制来获取最新代码,跟踪代码中的更改以查看我们需要关注时间的位置.没有用于跟踪定义硬件的用户(编程)接口的文档的机制.在一个金色的副本以二进制形式某人的电子邮件收件箱和时,以及它不,你必须阅读的Verilog,找出到底是怎么回事只改变.等等,那个verilog是多大了?我整整一周花在你身上的那个错误在三个星期前发现并修复了吗?那么我们只是飞到一些度假胜地和派对六个月等待硬件人员完成他们的任务并把它扔到墙上给我们,或者我们借此机会试着保持耐心和乐观并告诉他们他们有一些常识方法不是那种让他们既能完成工作,也可以分享他们的工作以及分享他们的东西进行同行评审的常识方法...... 那verilog是多大了?我整整一周花在你身上的那个错误在三个星期前发现并修复了吗?那么我们只是飞到一些度假胜地和派对六个月等待硬件人员完成他们的任务并把它扔到墙上给我们,或者我们借此机会试着保持耐心和乐观并告诉他们他们有一些常识方法不是那种让他们既能完成工作,也可以分享他们的工作以及分享他们的东西进行同行评审的常识方法...... 那verilog是多大了?我整整一周花在你身上的那个错误在三个星期前发现并修复了吗?那么我们只是飞到一些度假胜地和派对六个月等待硬件人员完成他们的任务并把它扔到墙上给我们,或者我们借此机会试着保持耐心和乐观并告诉他们他们有一些常识方法不是那种让他们既能完成工作,也可以分享他们的工作以及分享他们的东西进行同行评审的常识方法......
请记住,硬件工程师确实带着一盒闪亮的新工具离开大学,就像你一样.您学习了17种不同的编程语言,其中您只能使用一种语言,您职业生涯中的其他语言将在您离开大学后发明.当他们离开大学,他们会告诉你他们所知道的关于微积分和相对论的许多电子是如何在每一个元素,并计算周围高斯表面的电荷.但他们职业生涯的大部分时间是一,零,和,或者不是(嘿,我们有共同点,你真正需要了解的是计算机,一,零,和,或者不是硬件或软件工程师).从物理学,微积分的基本定律来看,电子不会像编程语言那样快速地发生变化.但是编程的基本原理在所有语言中都是相同的,并且将继续存在于未来.您是否离开大学知道或者您是否认为Java与C++不同且优于C++,因为这和那个以及另一个?
像任何其他企业一样,大学的工作就是保持盈利.他们必须聘请合适的学者,以便为正确的学生和正确的研究资金以及正确的研究项目提供帮助,使大学获利.他们必须提供合适的班级,以培养合适的学生并培养出合适的毕业生,这样几十年后,大学附近的雇主和希望远在外的雇主都会认识到这所大学能够培养出富有成效且有利可图的员工.(是的,有时你必须吸引合适的运动员参加正确的运动,以获得适当数量的电视时间和适当数量的名称识别和体育收入).一些大学将教授C++和Java,有些大学永远不会.有些人会发明CMM,有些人会教Agile,有些人则不会.如果大学有任何价值,那么你可以在那里学习.他们不会教你学习的所有东西,但他们会有一些有用的东西.当您在那里时学习一些东西,在工具箱中收集合理数量的各种形式的工具.离开大学找工作.如果您的工具箱很糟糕,可能会找到另一所大学而从未提及第一所大学.如果它是一个好的工具箱,请使用这些工具并根据自己的时间构建一些新工具.如果它是一个非常好的工具箱,说出关于那所大学的好东西,以及你从中学到的好学术,并从学校回来支付他们给你的东西.即使你没有在大学工具的通用目录中获得所有可能的工具,你也会走开某个子集.即使你不毕业......
哦,上帝不要让我开始
我曾经在一所声名卓着的大学担任过cs主任,告诉我面向对象的编程只是一个"时尚",所以他们没有提供像C++那样的任何课程.
至于为什么他们不教这些东西,那么,大学就是教你学科的基础知识,不一定是行业的最佳实践
最简单的答案是,你正在学习计算机科学,你列出的东西与计算机科学的学术领域并不真正相关.软件开发可能是你用计算机科学做的事情,是建立在你学到的东西之上的东西......但计算机科学和软件开发并不是一回事.
教你版本控制的课程,或者如何编写有效的单元测试...这将教你一个交易,即(好的)软件开发.
那么大学的事情就是他们需要教授真正普遍的东西.像敏捷开发这样的东西仍然很新,尽管它在互联网上被讨论了多少,但它并没有在任何地方使用,所以教给全班学生可能只会让少数人进入敏捷商店.
然而,版本控制是现在不可原谅的事情.这是每个人都需要理解它的工具,它几乎和编译器一样有用,CVS已经存在了大约20年以上.任何离开大学的程序员至少都需要理解这些概念.幸运的是,如果您在大学中进行任何小组工作,您可能很幸运能够与已经了解版本控制的人一起降落,并说服您的小组使用它.我知道我很高兴那个人在我的小组里.
单元测试也非常不可原谅.我唯一要说的是,这本书仍然是在测试驱动的开发上,并且100%的代码覆盖总是有时会比它的价值更麻烦.但单元测试非常有价值,应该在软件工程课程中介绍.我想,有些东西正在进入一些大学,但还没有到达所有大学.
为什么不呢?我获得CS学位的经历几乎是一样的.原因是,据我所知,教授编程的人不会编程.不需要教授这些东西进行认证,教师不熟悉它,学生从不开发任何重要的项目作为课程的一部分.与教授CS理论或Java语法相反,实际教授编程没有动力.
这取决于大学.我于2003年毕业于澳大利亚大学.在那段时间里,我们学习了UML,单元测试,XP(和其他敏捷方法),以及Z,算法和数据结构,操作系统等所有正式的东西.
虽然他们没有详细介绍单元测试,但更多的是为了一次演讲而通过服务.如果能够学会如何编写有效的单元测试,而不仅仅是"什么是单元测试",那将是很棒的.
就版本控制而言,我们从第2年开始在我们的编程项目中使用它(CVS).
我同样强烈赞同Glyph所说的话.CS是一个不成熟的领域,实际上只是在过去的50年里,我们不知道我们应该学习什么,什么只是一时的流行.给它一个150年,然后事情可能会更多地解决.失败的真实世界项目的数量很明显,这是一个不成熟的行业.想象一下,如果80%的建筑项目失败了!
计算机科学家认为他们是数学家而不是工程师,所以他们更喜欢教数学部分而不是工程部分.测试,版本控制和文档不会超过任何其他工程学科中的时尚.