学校编程与行业编程之间的区别?[关闭]


50

很多学生毕业并找到第一份工作后,即使他们可能是大学里的优秀程序员,也会觉得自己并不真正懂编程。

在学术环境中进行编程与在“现实世界”中进行编程有什么区别?



4
我想说的是,在学术界,您会深入学习:学习概念,问自己问题,改善抽象思维。在行业中,您会深入学习:您学会使用许多不同的技术而又不问太多问题,就必须把事情做好。通过行业经验,您还将学习管理大型,复杂的项目:这是一个非常实际的问题,您会因为缺乏时间而无法在大学学习。
乔治

9
这个问题是在博士级别,毕业后还是在一般的“教室与现实世界”环境中问?
鲍勃

@鲍勃 这更多是关于普通学术界的。课堂/研究/定向阅读/作业与行业中的“真实世界”编程。
rdasxy 2011年

好。这还不是很清楚,因为有些事情是由想说的人完成的,例如“学术程序设计”,可以帮助生物学家弄清楚细胞模拟。
Bob

Answers:


72

在传统的本科计算机科学课程中,您只能学习编程。但是现实世界并不需要仅仅是程序员的人。现实世界需要真正的软件工程师。我知道许多工作说明似乎并没有表达这种区别,这只会使事情变得混乱。在现实世界中,您需要能够:

  • 需求没有直接提供给您时,收集并分析需求
  • 设计和分析几乎无限可能的架构
  • 创建测试计划并对其执行操作以评估和改善系统质量
  • 具有不同背景和经验水平的团队协同工作
  • 估算和计划工作,即使您不完全知道要构建什么
  • 有不同需求且不一定一致的利益相关有效沟通
  • 协商时间表,预算,质量和功能,而不会令利益相关方失望

哦,是的,您还必须也能够编写代码,尽管平均这只需要花费软件工程师40%到60%的时间。

因此,并不是刚毕业的计算机科学专业的本科生不知道如何编程(实际上很多人都是非常好的程序员)。因为他们中的许多人都不知道该怎么做。


18
Oh yeah, and you also have to be able to write code too, but that's, on average, only 40 - 60% of a software engineer's time.-甚至在非常糟糕的大型公司商店中,甚至是0-20%。
里奇·梅尔顿

1
+1是一个很好的答案,而Ritch则是+1(应该更多)。如果现任工程师将项目生命周期的20%以上花费在编码上,那么这是非常非常错误的。50%的设计,30%的测试,其余的%20 ....包括编码在内的所有其他内容似乎都是正确的。通过适当的设计,编码应该很简单。没有它,人们所谓的“编码”实际上就是无休止的重写,试图
在进行过程中将

36

在大学...

您的老师给您:

  • 定义明确,孤立的问题,可以在较短且定义明确的时间范围内提供解决方案(此后将丢弃)
  • 分配之前向您介绍的一组定义明确的工具
  • 明确定义的解决方案质量度量,您可以轻松确定解决方案是否足够好

在现实世界”...

  • 这个问题是模糊的,复杂的并且嵌入到上下文中。随着时间的推移,这是一组相互矛盾的要求,您的解决方案必须足够灵活和强大,以便您可以在可接受的时间内对这些更改做出反应。
  • 您必须选择工具。团队10年的代码库中可能已经有可用的东西,也许有一些开源项目,或者有商业库,或者您可能必须自己编写。
  • 要确定软件的当前迭代是否有所改进(因为您几乎从未真正完成过软件项目),您需要进行回归测试和可用性测试,后者通常意味着模糊,复杂,自相矛盾。 ,上下文嵌入的需求再次发生变化。

结论

学校编程和现实世界中的编程本质上是天壤之别,与实际重叠很少。CS将为您准备“真实世界”的软件开发,例如田径训练将为参战做好准备。


11
这基本上就是我要回答的。在学校,您知道问题所在,也知道解决方法。在“现实世界”中,您很少知道解决方案,甚至根本不知道真正的问题。
鲍勃

20

他们面临着问题的另一个方面:

学术界主要关注“编程科学”,因此研究了使有效的特定算法有效的方法,或研究了为使某些范例更具表现力而量身定制的语言。工业主要集中在生产必须出售的东西上。它必须依靠“工具”,这些工具不仅是语言和算法,还包括库,框架等。

这种“焦点”上的差异使得C语言的学术大师几乎无法编写Windows应用程序(因为我们的Windows API不在C99标准中!),因此感到“无法编程”。但是,实际上,他具有学习自己所缺少的一切的全部能力。如果没有适当的学术研究(不一定是在学术界进行),那么很难找到一些东西。


10

好答案。让我补充一点,学术程序设计在规模上往往几乎像玩具一样。这对教学很有好处。作为老师,您正在尝试最有效地传达想法。不利的一面是,现实的编程在质量上是如此不同,很难弥合差距。

差异之一在于性能分析。我写了很多帖子试图指出这一点。性能分析只是表面上的算法和测量。要真正有效地执行此操作,您必须将其作为调试过程进行处理。

另一个区别是可维护性。这涵盖了从样式到特定领域的语言设计的所有内容。除非您真正知道要最小化的内容,否则您将无法有效地做到这一点。

这些东西没有被教导,它们在生产率上产生了巨大的差异。


1
我想知道如何教授这些东西,因为它们需要大量的时间和经验才能获得。我正在协助一个软件工程课程,每班10个学生的团队必须在几个月内(从10月到4月的两个学期)开发一个小型软件产品。这使他们对编程,计划,确定需求和任务的优先级,进行沟通等等有一种感觉。但是,当然,与他们将在现实世界中面对的情况相比,这几乎是很少的。但是,您不能仅花4年时间对此进行研究。
乔治

@Giorgio:为了提高性能,我有一个预先存在的代码库(不是很大),该代码库显示了如何通过一系列迭代进行优化,从而获得较大的加速因子。这是一个容易教授的技能。对于DSL和可维护性,我还有一些喜欢的示例可以用于教学。这两个都可以轻松地纳入一个学期的课程,并有余地。所以我认为可以做到。
Mike Dunlavey

1
好的,我了解:使用大型的真实示例,让学生们研究它们。很好的主意。
乔治

@乔治:我是30年前的教授,所以我仍然记得一些方法。我也将这些想法写进一销量不佳的书中,这仅意味着我有时间去思考和解释它们如何融合在一起。
Mike Dunlavey

我没有太多经验,在博士期间我曾担任过几年的助教。我现在在一家公司工作。关于大学的编程,恕我直言,真相在中间:大学里有一些非常有用的教学,但是很难涵盖软件工程师在其职业生涯中将面临的所有重要问题。正如您所指出的,您可以通过一些努力真正地教一些现实世界的事情。当然,并非所有的大学教授都愿意这样做。
乔治

8

在学术界,大多数人都学习计算机科学或相关课程。迪克斯特拉曾经说过:“计算机科学与计算机无关,而天文学与望远镜无关。” 学习计算机科学的人首先要学会成为科学家,而不是程序员。作为程序员,他将保持业余状态,因此很难过渡到专业程序员。


8

更新:好像有人在读我的思想:毕业生的期望与现实 ...

我认为,还有其他两个因素:

问题规模:在学术界,我主要是“从头开始”开发软件,这意味着在大多数情况下,我遇到的最大程序就是我编写的最大程序。这不强调处理和应对复杂性的必要功能,这些复杂性是由不同的软件相互交互产生的。如果我意识到复杂性需要付出的努力,那么我可能会选择完全不在行业内。

阅读与写作:问题规模的另一个副作用是,在“现实世界”中,我们经常接触别人撰写的作品,这些都是出于维护目的(我在学术界没有做过维护),扩展或仅仅是分工。因此,阅读代码比编写代码变得重要得多。

改善程序设计教育的建议:学术界应使我们更多地了解现实情况,而不必退回到职业培训上。医生必须在某个时候面对尸体,以查看它们是否“为此而生”(我听说过有人在经历这种经历后放弃了该课程)。如果我在二十出头时看到了一个20K LOC项目,该项目由不同的编程风格组成,我必须在一天内就理解并在三个bug中进行修正,那么我可能会考虑其他职业选择,尽管可能没有。


为了扩展您的隐喻和我自己在医学上的经验:医生在医学院学习了一般概念,但是我们所有人都在实习生和住院医生中学习了基本要素和实际工作中的捷径。
气垫船充满鳗鱼

2
这个!第一次进入一百万个LOC代码库时,您会意识到,这不会像在大学时所做的那样。很快就很清楚,您将永远不会理解该代码库的全部内容,您所做的一切都必须来自阅读和理解他人的代码,而不是架构和编写自己的代码。
罗曼·斯塔科夫

4

我发现学术编程与工业编程之间的最大区别在于健壮性。大多数人在职业生涯中都经历过“对我有用”的悖论,这是这种情况的延伸。在学术界,重点放在算法和功能上,很少关注在日常情况下软件的可用性和稳定性。

例如,在我的办公室,我们有一名工程师负责该软件,并且是一位在拐角条件下导致崩溃的大师。他将尽可能快地单击一个按钮,直到发生崩溃...如果操作花费的时间太长,他将开始在屏幕上随机单击(出于沮丧?IDK...。)

改变我们的编程思想,使我们做“史蒂夫证明”的事情,总体上提高了我们应用程序的稳定性。


3

我在学校进行编程培训的个人经验为零-我是英语专业。向我询问有关济慈和拜伦的信息!-但是我收到了几个新的应届毕业生,并在专业软件开发领域培养了他们并指导了他们。所以我可以从这个角度讲。

我的经验是,他们从学校中学到的所有东西实际上都是对编程的兴趣。他们的技能从零到微不足道。即使在他们中技能最高的人中,他们也没有自我指导的能力。他们的想法不仅仅是小规模的。他们实际上是微型的。一个包含数十行代码的系统使它们完全崩溃。

但是你知道吗?他们获得了兴趣,这很重要。兴趣很大。我可以和感兴趣的人一起工作。我可以将他们转变为开发人员,只要他们对成为一名开发人员感兴趣。地狱,这就是开始的全部。这是对后现代美国小说家的赞赏。


2

在学术界,

缺点

  • 我们的截止日期主要是为了得分。
  • 错误真的不引起麻烦,因为大部分项目都没有在现实世界的应用中使用。

加号

  • 我们有足够的时间进行研究。
  • 从最初的目标摇曳不会造成太多的麻烦。

在行业中

  • 我们将在其实际上是由公司使用的项目。
  • 我们在不断变化的客户需求压力下工作。
  • 最后期限很少灵活,因为这可能给软件公司和客户造成巨大的财务损失。

看一下这个:

http://www.dodgycoder.net/2011/10/how-to-become-better-programmer.html


我将不得不不同意“实际使用”部分。在90年代中期,我去了5年,分别在3家不同的公司(大,中,小)工作,我写的东西都没有投入生产。我认为这并不是一种罕见的经历。
Bruce Ediger

2

学术编程更多地是关于自己编写代码。这对于学习其工作方式非常重要。代码质量和版本控制不算什么。除了显着的例外,代码的生存期没有超出赋值时间。项目范围往往受到限制,而且不太可能蔓延。

在现实世界中,您应该拥有尽可能少的原始代码。团队开发了大量代码。使用库例程比自己编写代码更好。代码质量和版本控制变得更加重要。代码的寿命往往远远超出最初的预期。项目范围通常很广,如果不加以管理,往往会大幅度攀升。


1

其实,

完全区分学术水平的编程和现实世界的编程是不可能的。

我想说的最大区别可能是:在现实世界中编程-您不仅需要了解编程知识,还应该能够快速适应。

根据您从事的行业,您必须遵守其法律。

迈克尔只是通过陈述与编程相关的任务来触及冰山一角,我将其归类为简单的工作(如果您值得付给面团,那么您将得到报酬)。

通常,在一个行业中,每个主题您将至少面临几个挑战:

  • 适用法律(例如客户对医疗的保密性)
  • 主题知识(例如,发票税制,库存,资源管理,医疗计划,行业标准)
  • 缺乏,不存在或与行业标准/管辖法律不同的客户要求

如果您将研究博士学位级别的编程项目与现实世界的项目进行比较,则它们的难度,入门级技能等非常相似。

唯一真正的区别就是现实世界的项目

  • 有一个客户
  • 有预算(时间,金钱,人力资源)

当其他人制定规则时,球比赛就不同了:)


0

如果您看一看学术界在IT领域学习的科目,就会发现大约一半的时间浪费在数学,科学,选修课等上,而另一半则浪费在学术科目上,例如:编译器设计,算法理论,计算机架构,优化,操作系统,数字电子学以及其他与工业相关的课程,例如C编程和Web编程。

上面提到的大多数主题都很容易理解,但是它们都不会直接为日常IT需求提供强大的背景知识。

遵循Microsoft Web编程要求(即某人成为组织中的生产团队成员所需的区域):

1- C#.NET或VB.NET

2- ASP.NET

3- HTML和CSS

4- SQL Server(或另一个数据库)

5- OO应用程序编程和设计

6- Java脚本

7- MVC框架

8-一些源代码控制工具的暴露

9-接触自动测试工具

10错误追踪工具

11-电子商务概念(可选)

12-ORM

13-一些业务分析技巧

14-一些沟通技巧

15-可能是一些云计算基础

如您所见,在大学/大学期间,上述大多数要求很少被关注(您最多可以选修一门课程)。

不能完全怪罪机构,因为有很多这样的技术堆栈,而且它们还在不断变化。

Microsoft的上述大多数内容都无法帮助想要使用Java开发应用程序的人。

真正的问题是,当今企业所需要的技术堆栈中,没有一个能被完整覆盖。

以上内容涵盖了毕业生是否适合在商业环境中编程等商业工作的问题。该答案不包括研究实验室等的需求。另外,其他领域比上述领域还需要更多技能,例如游戏开发,嵌入式开发,实时系统开发等。


12
您的清单中有15个项目。我想我可以再增加30个。学术知识不是要教您所有这些知识,而是教您如何找到所有这些知识的方法。而且,要拥有当所有当前技术都将被淘汰时(从现在起10年后)仍将可用的知识,这就是所有理论的全部优点,而不是浪费时间
乔治

2
@Giorgio,感谢您的评论,您的观点是正确的。我已经明确指出“不能完全怪罪机构”。虽然最初的问题与学术教育的性质无关,但我个人的观点是,学者所教的内容与企业期望之间存在巨大差距。弥补差距的法案曾经由企业在昂贵的在职培训中支付。在所有经济体都经历着激烈竞争和艰难时期的今天,我想知道谁会为弥合这一差距而付出代价?
NoChance 2011年

@Emmad Kareem:是的,我同意有很大的差距。大学教授通常不了解“现实世界”中发生的事情,因为他们专注于抽象研究。但是,正是这些抽象的思维技能现在使我能够在几周内学习一门新语言(现在正在学习Scala)。我也了解,也许对您来说,金钱问题会更加强烈。我在意大利长大,当我学习大学的学费时,每年大约200美元(加上我们不得不自己买书)。与您在美国所支付的费用相比,我想这很少。
乔治

3
同样,如果您正在学习工程技术并学习如何制造汽车,没有人会教您如何驾驶特定的汽车:这只是他们希望您自己了解或学习的东西。
乔治

1
浪费了吗 如果您拥有声称拥有的学位,那么您应该了解得更多。即使您不坐在那里,也不用对高级数学进行编程,但是在学习高级数学时所学到的经验教训也直接转化为“看到”一个干净优雅的解决方案。
钻机

0

规模和重点
从我的经验来看,在学术环境中,通常您正在处理的应用程序的规模要小得多,可以在一天或一周内完成,甚至可以在一个学期中由一个或两个程序员完成- -通常,您编写的所有内容都是一次性的代码,该词在该学期之后将被丢弃。在现实世界中,您可能会发现自己正在开发一个大型团队花费数月(甚至数年)才能完全开发的应用程序。您将花费更多的时间来调试其他人的代码,并试图了解代码库的基础结构,努力不破坏现有部分来添加一些新的或修改的要求。

需求,集成,客户
此外,开发代码的某些方面,例如需求分析,集成测试等,在学术项目中往往较少代表。为了公平地进行评分,通常讲师已经为您确定了要求,而不是在会议中共同决定的。您不一定非要以他们不想要的特定方法“出售客户”,但从技术角度来看,与他们的需求不同的是实际上是可行的。在学术环境中,您的客户(分级员或讲师)往往会对自己想要的东西有一个非常具体的想法,在现实世界中,您可能会遇到不真正知道自己想要什么并且必须动脑子来了解什么的客户应该建造。


0

维护与可维护性

在学术界(至少在本科层次上),软件的构建考虑了短期目标,通常要完成一些家庭作业或学期项目。分配完成后,该代码将被丢弃,并且再也看不到。

在专业环境中,大多数软件在编写时都考虑了长期使用。该软件打算至少使用几年,并且需要构建为易于维护和随时更新。

与此相关的是维护工作。大多数专业编程工作都涉及更新或维护现有软件。所谓的“绿地”项目是例外,而不是常规。

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.