计算机科学已经死了吗?[关闭]


18

问题: CS的科学和艺术死了吗?我的意思是,这些天来思考,计划和有效解决问题的实际需求似乎已脱离CS。该领域似乎正在降低进入壁垒,因此更多的人可以“编程”而不必学习如何真正编程。

背景: 我最近刚获得计算机科学学士学位。我正在一家IT部门的大型公司中担任起步职位。我主要在工作中使用.NET和其他Microsoft技术,但是在此之前,我已经通过实习等工作完成了Java工作。我个人是我自己的有趣项目的C ++程序员。

在深度:通过我一直在做的工作,在我看来,CS中不再存在真正科学的严格学科。过去,程序员必须有效地解决问题,才能使系统健壮和快速。但是现在,随着诸如.NET,Java和脚本语言等主流技术的出现,似乎已经在效率和健壮性之间进行了权衡以简化开发。

与我合作的大多数同事甚至都没有计算机科学学位。大多数人获得了电子工程学位,少数人获得了软件工程学位,甚至有些人是来自没有四年制课程的技术学校。然而,他们没有CS的技术背景,没有研究理论和算法,也没有考虑做一个优雅的解决方案(他们只是寻求最简单,最便宜的解决方案)而表现不错。

该公司敦促我们使用Microsoft技术,这些技术可以解决所有实际问题,并用可以在一半时间内为您自动构建项目的库和工具代替它。我并不是想讨厌这些语言,我知道它们可以达到目的并且可以很好地完成工作,但是当您的员工不知道哈希表如何工作,使用错误的排序方法或运行SQL命令时,效率极低(但是可以在可接受的时间内完成工作),感觉就像是在开发开发技术以整合新的“程序员”,而不是实际教人们如何做正确的事情。

我有兴趣制作高效且美观的程序。如果有更好的方法,我宁愿回去重构它,也不要滑动它。但是在企业界,他们迫使我快速而不是优雅地完成任务。那真的让我很烦。

这就是我一生都会期待的东西吗?对于那些热爱CS的科学和艺术而不只是薪水的人,还有没有职位?

同样,如果您在Java学校的危险之前没有看过这本书,那么可以读一读


2
两件事-1.开发不必艰苦。2.在可伸缩性很重要的情况下,编写良好的程序将是必不可少的。我原则上同意你的意思。尽管我认为自己是新手程序员,但我有兴趣在低水平(一定程度上)学习所有内容,而不使用预先编写的框架,依此类推……(至少从……开始)我会使用任何形式的框架,这将是我自己的框架
匿名

48
我认为您的CS与编程令人困惑,这些是相关的,但有两点不同。
2011年

1
@克里斯我完全同意。我广泛使用了框架和库,但是在没有先了解问题以及库如何解决问题的情况下,我尝试这样做。一旦知道,我就可以选择在这种情况下最能解决问题的库,而不是仅仅针对每个问题扔一个通用库并希望它坚持
下去

8
您打算用这个问题解决什么问题?
杰里米

15
@Veaviticus,您真的希望管道工知道流体动力学(这样他们才能更好地完成工作吗?)。大多数行业应用程序(桌面/网络)都不需要解决高度复杂的问题(很少)。在CS中拥有背景知识对您有帮助吗?最肯定的。LOB 是否需要 ->并非如此。
2011年

Answers:


25

是的...没有

好问题,但错误的假设。

教育似乎缺少科学部分,但是那种认为科学只是为了使程序高效的假设是错误的。

科学是教人们如何定义和解决问题的必要手段

可悲的是,某些“ CS”课程的这一部分(课程?)似乎被完全省略了,取而代之的是带有琐碎或已知解决方案的玩具问题,而仅仅是为了教给他们熟悉工具的知识。

令人失望的 许多Java学校的毕业生都变了样,从未教过如何分解问题,设计算法,指定测试甚至有效调试。


2
我上的一所学校甚至没有给Java带来太多压力,我所做的大部分工作都是使用C ++。但是他们仍然没有教我们如何做您提到的任何事情。他们涵盖了基础知识,略读了一些东西,并深入探讨了每位教授感兴趣的内容。如今,似乎学校正在设法吸引尽可能多的“开发人员”,而不是科学家。
Veaviticus 2011年

@Veaviticus:那是给幸运的学生的。在我的大学里,教授们具有抽象的精神分裂程度,他们的考试观念是“背诵正式定义”。
DeadMG

语言与分解问题的教义无关。一个问题就是一个问题,无论它是C,Java还是Ruby。
钻机2012年

29

计算机科学已经死了吗?”“我是计算机科学学士学位的应届毕业生。我在IT部门一家体面的公司担任起薪职位。

老实说,我只有两分钱:您不会在一家规模较大的公司的IT部门中找到计算机科学的“科学”,因为它是IT部门,而不是CS部门。尝试回到学校攻读博士学位,或在一家专注于计算机科学的公司的工程部门工作(例如,图像处理,高性能网络,计算机代数系统,航空航天等)。在这里,您会发现棘手的有趣问题,这些问题通常不会容忍草率的设计。

“对于那些热爱CS的科学和艺术而不只是薪水的人来说,还有职位吗?”

是的,绝对可以,但可能不是中型公司的IT部门。


16

如果您是程序员,请不要认为自己是“计算机科学家”。计算机科学家是创造下一代计算机的人,其中一些仍然是科幻小说,直到得出正确的材料组合,最小化和计算理论。它们只是管道的开始。在这里和现在开发软件的人都是“软件工程师”;他们采用理论和工具,有时将实践理论和现实世界工具放在顶层,以利用这种复杂的电子魔法的潜能发挥作用,并使其发挥我们的作用。反过来,这就是“计算机工程”领域的一种专业化,它采用了计算机科学家的理论,并将它们(包括硬件和软件)应用于实际的最终用户电子解决方案。

在IMO,这是业务与理论相遇的地方。在这种情况下,老话“好人为善”可以很容易地转向“好人为善”。将自己视为“工程师”而不是“科学家”,然后将您的工作与其他工程学科并行进行,就可以消除差异。

假设有一位客户来找您,一位土木/结构工程师,要求您搭建桥梁。这座桥需要跨越20英尺,支撑自身并承受一吨的负载,它需要持续10年的例行维护,他们希望在一个月内花费20,000美元。这些就是你的限制;达到最小值,但不超过最大值。这样做“足够好”,并获得薪水。建造金门大桥对您而言是一项糟糕的工程,远远超出了设计规格和预算几个数量级。您通常最终会吃掉超支的费用,并为超时而支付罚款。即使您仅花费1000美元的时间和材料,建造重量达5个成年男子体重的索桥,对您来说也是一项糟糕的工程。您没有得到良好的客户评价和推荐,

回到软件中,假设您有一个客户,该客户需要构建一个文件处理系统来消化传入的文件并将信息放入系统中。他们希望在一周内完成此任务,并且每天必须处理五个文件,大约10MB的数据,因为这是他们当前获得的所有流量。您的宝贵理论大都被抛诸脑后;您的任务是在一周内制造出符合这些规格的产品,因为这样做还可以满足客户的成本预算(因为材料通常是这种规模的软件合同的一部分)。花两个星期,即使是十倍的收益也不是一种选择,但是很可能,一天之内构建的程序都不能处理一半的吞吐量,并且指令要运行两个副本。

如果您认为这是一个边缘案例,那您是错的。这是大多数内部人员的日常环境。原因是投资回报率;这个初始程序不需要花费太多,因此可以很快收回成本。当最终用户需要它做更多或更快时,可以对代码进行重构和缩放。

这就是当前编程状态的主要原因。由整个计算历史证明的假设是,程序永远不会是静态的。它始终需要升级,最终将被替换。同时,运行程序的计算机的不断改进既减少了对理论效率的关注,又增加了对可伸缩性和并行化的关注(一种算法以N平方的时间运行,但可以并行运行在N核上,看起来是线性的,通常更多硬件的成本要比开发更有效解决方案的开发人员便宜。

最重要的是,有一个非常简单的原则,即开发人员代码的每一行都是其他可能出错的地方。开发人员写的越少,他写的东西出现问题的可能性就越小。这并不是对任何人的“错误率”的批评。这是一个简单的事实陈述。您可能知道如何用5种语言来回编写MergeSort,但是如果您只用手指在一行代码中使用一个标识符,则整个Sort都将不起作用,并且如果编译器未捕获它,则可能会带您进入几个小时进行调试。与List.Sort()对比;它在那里,在一般情况下是高效的,而且,最好的是,它已经可以工作了。

因此,牢记以下几点构建了现代平台的许多功能和现代设计方法的宗旨:

  • OOP-将相关的数据和逻辑构建到一个对象中,并且该对象的概念在任何地方有效,因此它是对象,或更特殊的派生。
  • 预先构建的模板-好的60%或更多的代码是语法缺陷,也是使程序在屏幕上显示内容的基础。通过标准化和自动生成此代码,您可以将开发人员的工作量减少一半,从而提高生产率。
  • 算法和数据结构库-如上文所述,您可能知道如何编写Stack,Queue,QuickSort等,但是当有内置所有这些代码的代码库时,为什么必须这样做?您不会因为需要一个网站而重写IIS或Apache,那么,当有几种不错的实现可用时,为什么要实现QuickSort算法或红黑树对象呢?
  • 流利的界面-同样,您可能拥有一种对记录进行过滤和排序的算法。速度很快,但可能可读性不强;您的初级开发人员将需要一天的时间来了解它,更不用说对记录对象的其他字段进行排序所需的外科手术更改了。取而代之的是,像Linq这样的库用一两行可配置的方法调用替换了很多非常丑陋的,通常是易碎的代码,以将对象列表变成经过筛选,排序,投影的对象。

2
好的答案,但是您错过了重要的一点。“我无法复制的东西,我不明白。” 知道它们的工作原理并不意味着您需要为每个项目手动键入它们。相反,它可以确保您了解他们的长处和短处,这将帮助您选择最好的。然后,您只需要知道该算法/数据结构是否在标准库中即可。
Michael K

除了你的格言是错误的;我可以很清楚地理解一些我不希望成功复制的实质性事物背后的概念。我原则上同意;任何类型的成功工程师都需要了解足够的理论来选择可行的解决方案。这并不意味着工程师必须能够制造每种类型的灯泡才能了解每个人的规格,从而为房屋选择合适的灯泡。同样,我可以使用一棵红黑树,了解它的性能和正确的应用程序,而不必知道如何从头开始实现它。
KeithS 2011年

与工程类比不是一个好例子。在CS中建立“更好的桥梁”并不一定要付出很大的代价-通常只是要了解哪种工具适合正确的工作。即使实施非常复杂的教科书算法也常常超出人们的舒适范围,但这并不是一个困难或昂贵的想法(取决于范围-但假设这是一个人工工作,而不是人工工作)。通常情况下,它甚至更容易-没有自定义实现,只是知道正确的工具和Google关键字的问题。
Eamon Nerbonne

8

在我看来,IT似乎是您在做IT,而不是CS,这并不意味着CS已经死了。CS还没死,只是大多数工作都在软件开发中。由于大多数CS学生都学习编程,因此他们通常最终以程序员而非计算机科学家的身份受雇。与编程工作相比,计算机科学工作微不足道。您甚至可以使用计算机科学技术来制作复杂的应用程序,但是在我看来(并且我不喜欢意见回答,因为它们是主观的),这属于工程师阵营,而不是科学家阵营。

同样,美观大方的代码在旁观者的眼中,但是对于大多数公司/经理而言,按时进行足够好的设计远比美观的代码重要,但从来没有按时完成。

最后,有现实世界和lala-land。不幸的是,我们从前者那里得到了薪水,这就是软件开发的“科学/艺术”之处,在于如何在有限的时间/预算约束下生产高质量的软件。我在职业生涯的开始就感受到了与您相同的感受。我一直想创建“最好的”,但是很快我意识到“最好的”不是最有效或最优雅的,而是最经济高效的设计。


3
“美丽而优雅的代码”与“好消息,但要准时”是错误的二分法。如果您的设计简单,那么按时完成就更容易了,简单的设计等于精美的设计。只是,简单并不意味着简单
pillmuncher 2011年

1
@pillmuncher,是的,我同意,美丽的代码很简单(但并不简单),但是不幸的是前提是主观的/相对的。“简单的设计等于美观的设计”不是断言,而是一种观点(我非常同意100%的一种非常流行的观点,但仍然是一种观点)。时间表,需求和成本是没有意见的。这些约束将导致针对给定约束的足够好的设计。
阿曼多

“在我看来[1] IT似乎是您在从事IT业,而不是CS,这并不意味着CS已经死了。[2] CS尚未死,只是大多数工作都在软件开发中。” 您的第一个陈述是正确的-OP在IT中而不是CS中。我对您的第二个声明表示怀疑,但是,因为许多所谓的“计算机科学家”也从事软件开发。这就是所谓的“研究与开发”,计算机科学家可以定义,解决和证明路由算法在某些网络拓扑结构上的正确性,然后实施“官方”或原型实现
Bill VB

8

首先,你弄错了。“思考,计划和有效解决问题”不是科学,而是工程。科学更多地涉及探索新领域。实际上,在学术界,人们对代码效率的关心程度远小于工业界。在学术界,更多的是概念证明等。

不,您要描述的是软件开发所需的知识较少。如果要求相同,那可能是正确的。但是,如今,软件工程师应该知道如何处理多线程,分布式计算,扩展等。他们应该知道如何有效地领导项目。几十年前,这些都不是课程中的全部内容。


从我在这里阅读的内容来看,仍然不是。许多学校不教授工程学,而是教授语言。那等于只向土木工程专业的学生教授Autocad。
Michael K

@Michael:还没见过像样的大学那样做。
vartec

1
我去RIT。它排名很高,但仍然很糟糕。没有一所学校会正确地教授编程,因为在其他课程中,它根本不可能在四五年内完成。
乔恩·珀迪

4

我不认为你所说的是完全正确的,但你确实有一些点的反正。具体而言,我认为随着时间的流逝,计算机科学和软件工程逐渐发展。

软件工程(与其他工程一样)是关于应用科学来构建产品,解决问题等。计算机科学主要涉及对算法的研究(尽管这部分常常被人遗忘)如何实现这些算法(至少从理论上讲是这样)。 -例如,也许将所有PRAM机器都视为等同)。

记住这些,我认为分叉背后的原因很明显:像典型网站这样的大多数算法问题已经很久以前就已经解决了。也许更重要的是,大多数问题都已经得到了很好的解决,以至于对于一般的Web开发人员而言,问题几乎已经完全消失了。例如,对分布式数据库进行原子更新绝对不是一件容易的事,但是典型的Web开发人员只是编写一些SQL,并不了解(或关心)为弄清楚如何完成工作而进行的大量研究可靠地。

一次,将计算机科学与软件工程分离是根本不可能的。解决的问题很少,以至于编写一个相对琐碎的程序都需要对基础进行研究。如果您想做的事情像在50年代末或60年代初对一堆数据进行排序一样简单,那么很有可能您将不得不对数据进行一些分析,然后尝试设计一种最适合于对特定数据进行排序的算法-与当今的排序算法相去甚远,即使是已知的算法也不如当今所知。

尽管50年来的研发取得了丰硕的成果-大多数典型的开发不仅可以使用已知算法,还可以使用预先编写的实现。基于算法的现有知识(甚至现有实现),可以非常合理地解决大多数典型问题。

不过,这并不意味着计算机科学已经死了,还有更多的算法需要研究,而且人们正在对其进行研究。但是,这的确意味着大多数研究是更专业的,并且仅可能适用于相当专业的领域。在获取和应用知识之间可能还存在更大的“鸿沟”。在编写排序程序的过程中,您一次找到了一种更好的排序方法,并且几乎立即将其写入了实际代码中。现在,许多计算机科学致力于解决诸如如何使用本质上无限数量的处理器的问题,这也许有一天会有用,但是即使是原始部落也不会将我计算机中的双核视为“很多”。 :-)


1

软件开发和计算机科学不是一回事,我发现我的大多数同学都拥有理学士学位。Comp Sci程序对此感到沮丧。

我认为软件是计算机科学的产物,就像绘画是视觉艺术的产物一样。

我认为大多数具有CS学位的人都会被雇用从事软件开发工作,特别是在他们职业生涯的早期。我认为许多担任此职务的人都呆在那里,不再走下去。

我认为,当出现新的问题或范式或“将其拍打在一起”不够好时,差异就会开始显现。谁来构建新的框架或语言?谁坐下来敲定新的物理引擎的细节?谁使用图论/图变换从算法的每次性能迭代中挤出几个周期?

我将在开始的地方结束,并同意在软件开发/工程方面有很多计算机科学家,也许没有发挥他们的潜力。


1

一般而言,您似乎将计算机科学与编程和软件开发混淆了。两者不一样,甚至不接近。无论我们的学位怎么说,我们中的绝大多数都是程序员,而不是计算机科学家。除非您积极参与学术界的高层工作,否则我敢打赌,您对计算机科学的发展一无所知。


0

我可以告诉你,计算机科学还很健康。我每天必须重新解决问题,并提出有效而优雅的解决方案。我必须每天使用自己的工程师技能,并利用自己和同事的知识为我们的客户解决这些问题。

我并不是想讨厌这些语言,我知道它们可以达到目的并且可以很好地完成工作,但是当您的员工不知道哈希表如何工作,使用错误的排序方法或运行SQL命令时,效率极低(但是可以在可接受的时间内完成工作),感觉就像是在开发开发技术以整合新的“程序员”,而不是实际教人们如何做正确的事情。

这听起来像是员工的问题,但并不是每个程序员都这样。

仅仅存在使我们的工作更轻松的工具并不意味着我们不应该理解底线技术,如果我们不这样做,我们就不会在帮助任何人,当然也不会在以正确的方式解决问题方面做我们的工作。


我同意。我并不是要说没有不需要思考的工作,或者所有开发人员都不知道他们在做什么,但是我只是来自CS计划,我可以告诉你我的学校没有教给我一半我现在知道的东西。我是自己学的。现在,我认识了他们,我可以使用为我做到的框架。但是,如果我不是一个人学的话,那我只会盲目地使用一个框架,通常是错误地使用它
Veaviticus 2011年

0

您只是不了解当前的问题。问题不在于获得最高性能,而是在于获得足够的性能以使您的应用程序具有足够的响应速度和足够的速度。学习编程是指以最少的钱来解决问题。

我讨厌这样说,但是您对CS的死所留下的任何印象都只是您自己对“真正的”程序员应该做的事情的先入之见。


对。我知道企业需要赚钱。而且我当然不会使应用程序的某些部分“足够快”,而不是使其达到最佳状态。我对整个趋势感到好奇,因为许多开发人员从未研究过CS(至少据我所知)。他们从其他地方进入领域,几乎没有甚至没有真正的理论根据,只有框架经验
Veaviticus 2011年

@Veaviticus:使用框架可能不是开创性的学术理论,但肯定仍然是CS。
DeadMG 2011年

0

好吧,死与否值得商!!

事实是,在当今的技术时代,大多数公司都雇用员工来通过软件自动化解决现实世界中的工作流类型任务。他们对您可以编写的程序多么优雅或更快不感兴趣,只要它可以使企业以更高的输出更快地执行即可。

应力是在多个输出在更短的时间。(想想作物/食品的商业化;更快,更高的增长,更少的成本)。科技界也发生了同样的事情(下一个新想法)。

请记住,在当今时代,由于知识的数量和获取方式的发展,事情的发展比以往任何时候都快。在过去的日子里,产量很小并且更好,利润更大。现在,游戏已彻底改变。只要看一下客户服务质量之类的东西,总的来说就不会持续太久。

优雅和效率对像Google这样的科技公司来说很重要,尽管即使是那些地方也不是完美的选择,但您可以在未来几年内与其中一家公司合作来接近它。

生活中总会有一个权衡。您可以找到所有时间和精力都集中在薪水较低的工作。或者,您选择与我们其他人一起游泳以获得更高的报酬,而忽略不完美的事物。这种认识在您体内的渗透速度越快,您就可以为现实世界做好准备。我并不是说您应该忽略质量和优雅,但要了解动态。您会变得更快乐:)


0

在我看来,未来可能会发生的一些最有趣的事情肯定会基于计算机科学的科学部分,特别是改进的计算机视觉/机器学习和其他信号量化算法。这些可能会在行业中得到推动(例如采用Microsoft Kinect),但是这些难题如此之大,它们肯定会基于学者的大量研究和进步(再次采用Microsoft Kinect)。


0

我认为标准的日常编程与一门科学一样,是一门艺术,但确实存在对计算机科学的科学领域非常感兴趣的领域。例如,公司和大学的研究人员。如果您真的想专业地参与科学,那么您应该寻求博士学位。但是,尽管我还需要依靠我在现实中更具创造力的一面,但我发现我的教育中的科学部分一直是有价值的!

不知道自己在做什么的人可以使用您提到的某些工具来破解某些东西,但是他们通常会雇用真正的CS人员来制作工具,您必须获得更多抽象才能真正推动自己。

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.