【问题标题】:What undergraduate computer science course best prepares programmers for the workplace? [closed]什么本科计算机科学课程最能帮助程序员为工作做好准备? [关闭]
【发布时间】:2010-10-28 01:35:49
【问题描述】:

这里的想法是让更好的程序员从大学毕业。

我认为我必须使用算法,这并不是您自己可以轻松掌握的东西,我认为它可以让您更深入地了解软件的效率和正确性。

我也相信教授实际编程可能会有所帮助,但我学到了大部分我在工作中学到的编程知识,这让我认为其中一些编程课程块(不是全部)本可以更好地使用。

这些结果将是我想写给我以前学校的 CS 部门的一封信的一部分,我认为我参加的很多课程根本没有帮助,还有一些我认为非常宝贵的课程.

【问题讨论】:

  • 在加拿大,大学和学院之间是有区别的。大学有专门培养程序员的项目,这与计算机科学有很大不同。是的,知道如何为计算机编写指令来做某事通常在许多计算机科学课程的早期就被教导,它不会简单和通用,以至于大多数程序员工作都使用相同的技能集。运行模拟的人可能与执行简单 CRUD 应用程序的人有很大不同的要求。

标签: computer-science generic-programming


【解决方案1】:

计算机科学!= 编程。

如果您正在寻找更优秀的程序员,请寻找接受过 2 年制大学课程教育且专门专注于此的人。

【讨论】:

  • 我同意 Andy,我认为过分强调编程教学,而不是更正式的主题(算法、自动机理论,甚至操作系统)。我很高兴我不是唯一一个有这种感觉的人。
  • 我不知道我是否会说 != 是真的。现实情况是它的 1/3 到 1/2 可能是 1/4...
  • @robbotic,我认为你和@Andy 在这点上是截然相反的。我认为这个答案意味着 CS 主题对编程并不是特别有用。从长远来看,我不同意这一点,尽管也许拥有 2 年学位的人一开始就有更多的实践知识。不过,具有 CS 背景的人应该能够在新情况下更快地学习、适应和应用原理。
  • @tvanfosson 我不一定同意第二个陈述,但我同意 CS 不应该完全以编程为中心。我认为编程应该发挥重要作用,但是(在我看来)学生最好不要参加编程本身的课程,而是将其纳入所有课程。我希望我是有道理的,我只是想整理一下我对这个主题的想法,我只是认为我们现在的做法还不够好。感谢您的意见。
  • 我同意 CS != Programming,但 CS 仍然做出了健康的贡献。单靠 CS 并不能造就一个好的程序员,但没有一个 CS 能造就一个真正糟糕的程序员。画家 Shlemiel 是实用 CS 的经典例子。
【解决方案2】:

数据库设计

函数式编程

面向对象编程

x 驱动设计

【讨论】:

    【解决方案3】:
    • 商业 101
    • 办公室政治200
    • 现实世界中没有什么是学术性的

    实际上,在从事编程工作的第一天起,您就不会被期望成为高级开发人员。学习一些编码基础知识肯定会让您走很长一段路,但随着时间的推移,我看到不少计算机科学专业的学生都在苦苦挣扎现实世界,因为他们并不真正知道自己在第一天会进入什么领域。他们在业务领域中挣扎,并理解他们为什么要做他们所做的事情。他们不知道该与谁沟通。

    【讨论】:

    • 另一个好处,很少有课程是针对培养专业人士的。如果你不能与你的团队相处,谁在乎你有多聪明?
    • +1 无论如何,这绝不是学者们可能让你相信的那么简单。
    • 您将通过在专业环境中的经验逐步学习如何成为专业人士。然而,很明显,十分之九的程序员并没有仅仅通过经验来学习如何编写和推理代码。
    • @mquander - 为工作做好准备与通过多年的胃灼热、头痛和路上的颠簸逐渐建立自己有很大的不同。
    • 同样,在你的行业(编程)方面变得熟练不同于通过实验努力成为半熟练的人,并在你的职业生涯中因为你不理解的原因而成为一个糟糕的开发人员。询问任何正在面试编程职位候选人的线索的人,了解大多数 CS 毕业生的培训情况。你宁愿有一个刚进入这个行业但又是一个伟大的程序员的开发人员,还是一个不会写一行代码来挽救他生命的优秀沟通者?
    【解决方案4】:

    我想说这是数据库系统和软件工程项目课程之间的联系。在我的学校,这两个课程都不是本科学位所必需的,但本科生可以参加。对于大多数程序员来说,掌握一些数据库知识可能比算法更重要。在项目团队中工作,甚至在课程项目中,可以帮助您了解团队动态以及如何在团队环境中工作。

    另一方面,我坚信对基础计算机科学主题(包括数据结构、算法、操作系统等)的良好理解对于准备一个程序员成长至关重要。

    【讨论】:

    • 是的,我喜欢项目课程的想法。幸运的是,大多数大学都需要它。你认为它应该跨越一个学期以上吗?也许有一年的课程,甚至是实习?
    • 我认为高级顶点课程应该是一个 2 学期的项目。我无法想象你可以在一个学期内完成任何现实的小组项目,每周只需 3-6 小时的课堂作业。
    【解决方案5】:

    没有什么比通过构建项目获得的知识更重要的了,如果你正在学习关系数据库课程构建一个库系统项目,如果你正在学习汇编语言构建一些诸如 PC 工具之类的东西,它并不重要,它是 32/ 64 位汇编。

    只有通过“编程”才能成为更好的程序员,而不是仅仅通过学习课程和获得高 GPA。

    【讨论】:

      【解决方案6】:

      这是一个很难回答的问题,但我认为在许多 CS 程序中阻碍程序员的一件事是缺乏动手编码。了解计算机科学的理论很重要,但我认为很多理论性很强的 CS 课程因为不需要在课程中进行编程练习而失败。例如,我见过很多需要研究和论文的 AI 课程,但不需要代​​码。在我看来,理解计算机科学的理论非常重要,但能够应用它同样重要。

      【讨论】:

        【解决方案7】:

        我还没有找到一门很好的 CompSci 课程,可以让软件工程师为工作场所做好充分准备。如果您找到具有以下内容的软件[尽管它是否可以称为 CompSci 我很怀疑,它更像是真实世界的软件设计,是一种非常不同的野兽]。

        计算机科学是一门更具理论性的学科,具有非常现实的世界意义,但在学术方面更有用。例如,算法设计对软件工程师非常有帮助,但对消费者并没有真正的直接帮助。例如,了解如何构建快速排序算法或了解链表遍历在当今的软件工程环境中并不是真的那么有用 - 当然,了解理论有助于为工作选择正确的工具,不要误会我的意思。作为开发人员,我们中的许多人依靠计算机科学世界的输出来改进我们的开发工具,事实上,如果没有它们,许多开发人员会陷入困境,但是把计算机科学专业的毕业生放在用户面前,让他们设计一个对他们来说有意义的软件和学术知识将分崩离析,因为两者使用完全不同的语言。

        对于软件工程师来说更有用的课程将包括尽可能多 [甚至可能更多] 以下我能想到的组件:

        • 编程语言 - 基本的程序流程、范式、语法等。大部分都讲得很好,所以我不会过多地坚持这一点。尽管如果教授一些完全不同类别的编程语言会很有帮助——例如,我学习了 C、Pascal 和 VB 3(?我不记得确切的版本了)。如果程序员至少学会一门函数式语言、一门命令式语言、一门声明式语言,那将会更有帮助。
        • 调试 - 在编写 nTier 应用程序 [许多/大多数现实世界的应用程序都是] 时,能够找出问题所在 是很有用的,一直到如有必要,协议级别。 WireShark 等分析工具对此非常有用。
        • 通信设备 - XML、XQuery、XPath、XSL、XSD [因为这些似乎被广泛使用]。
        • 关系型数据库设计 - 这已经被很好地教授了。
        • 关系数据库性能调优 - 仅仅设计表是不够的,知道何时适合索引某些字段以及何时不适合也很重要,而且似乎很多课程都没有涉及。
        • 数据规范化 在很多情况下,这似乎也被很好地教授了。尽管大多数学生似乎进入现实世界时会吐出他们所学的理论——“你应该总是使用 Boyce-Codd 范式”等,而没有真正考虑这些理论的含义。有时在现实世界中,我们有充分的理由违反规则。
        • 查询优化 - 编写基本查询通常似乎处于毕业生舒适区的外部界限,应该教授优化。此外,还应教授查询分析器等工具,以帮助学生调试应用程序的性能问题。
        • 存储过程/触发器 - 我还没有遇到可以编写存储过程或触发器或有效使用其中任何一个的学生。 Selects/Joins/nested Selects 似乎是查询设计所教内容的限制。
        • 基本算法 - 根据我的经验,这门课讲得很好,但是很多学生似乎不知道如何决定哪些算法适用于哪些情况,而没有被告知“使用某某算法,解决这个问题”。如果您可以说“解决这个问题”,那将很有用,他们会说,好吧,我有一组算法在这种情况下很有用,这是最好的,因为 x、y 或 z原因以及如何应用它来提供解决方案。
        • 递归 - 我还没有找到一种可以教授递归的方法,看来你要么明白,要么不明白。有一天,我会找到一个很好的比喻,即使是最基本的程序员也能理解这一点。
        • 抽象 - 尽管这是 OOP 的核心原则之一,但这似乎是许多课程所掩盖的东西。
        • 代码重构 - 知道何时 重构以及几乎同样重要的是,何时 重构。
        • 代码重用 - 似乎很多课程都在吐槽剪切/粘贴猴子 - 这不是代码重用应该意味着什么!
        • 源代码控制 - 在我的第三或第四份编程工作之前,我没有学习源代码控制,而且我个人不知道有哪个软件工程师在他们的课程中学习了源代码控制......为什么是吗?
        • 备份和恢复 - 我还没有听说过有任何课程教授这个。有多少初学者程序员因为没有考虑备份而丢失了所有工作?我知道我过去有过——不过最近没有。不是我不知道备份,而是俗话说“它永远不会发生在我身上”。它发生在你身上,并保证在你必须演示你刚刚失去的一切之前它会是正确的!
        • 文件系统维护 - 好的,有些课程会简要介绍这一点,但很多课程不会。
        • 编写高质量的设计规范 - 这似乎总是作为课程简介提供,但很少要求学生自己设计。编写工作范围和理解文档模板似乎远远超出了大多数软件课程的范围。
        • 用户文档 - 用户不会像您那样思考,将“不言自明”或“简单到白痴都能使用”的软件交给他们会让您大吃一惊。有一句名言:“今天的编程是软件工程师努力构建更大更好的防白痴程序与宇宙试图产生更大更好的白痴之间的竞赛。到目前为止,宇宙正在获胜”。编写一个 8 岁的孩子可以遵循的用户文档 - 编写它可能看起来很痛苦,但一旦完成,并且永远更多,你会感谢自己。
        • 技术文档 - 即,如果学生可以使用 Sandcastle、nDoc 或任何文档工具,将会很有用。
        • 测试计划 - 设计允许测试的测试和软件。 nUnit 或类似工具将是教授软件开发课程的绝佳工具。事实上,教授 任何 测试框架总比不教授任何测试框架要好...看起来就是这样。
        • FAT/SAT/UAT 测试 - 这将有助于了解现实世界中的各种测试场景,例如健全性检查、工厂验收测试和用户验收测试。签署您的软件与开发软件一样重要。如果您没有交付客户认为他们得到的东西,那么您就不会获得报酬 - 无论您的解决方案在技术方面多么出色。
        • 软件架构 - 了解实际 n 层应用程序的不同组件,以及使用它们的优缺点。
        • 与用户的互动 - 也许这不是真正的计算机科学,但学习如何与那些不经常与你有相同想法且思维方式不同的人交谈,这与交流有关,但确实是开发人员需要注意的事情。
        • 常识 - 叮,叮,叮,叮 - 有很多程序员对此一无所知!这些课程旨在证明您可以独立思考,我不明白为什么这么多毕业生进入现实世界认为他们所要做的就是盲目地应用他们所教的规则,而不考虑原因和含义。我将重复我之前所说的——在现实世界中,我们有时会找到违反规则的很好的理由。我们不会盲目地跟随它们,我们也不会盲目地破坏它们。软件开发是一门艺术,就像所有艺术一样,我们必须知道什么时候可以,什么时候不能,同样重要的是,我们应该什么时候不应该违反规则。作为一名毕业生,你已经学会了规则,你已经证明了这一点。现在,您需要做这门课程真正想教给您的事情 - 应用您学到的知识来独立思考。
        • 倾听 - 你会惊讶地发现有多少次我看到编写代码是因为开发人员“认为他们知道客户想要什么”,而不是真正倾听用户在说什么并了解他们的实际需求。
        • 理解 - 与聆听齐头并进。
        • 沟通技巧
        • 与技术无能的人交谈 - 即您的大部分用户群
        • 项目调解 - 向开支票的人推销您的想法
        • 优先级 - 如何确定哪些功能比其他功能更重要。
        • 预算 - 时间估算
        • 时间管理 - 当你周围的每个人都在妨碍你的时间并且不关心你的最后期限时,如何按时完成工作。就像你所有的朋友都希望你去酒吧喝一品脱或十品脱一样,而你还有一份尚未开始的课程作业,明天结束时要交。
        • 范围蔓延 - 什么时候说,不,这不在规范/预算中。

        即使你确实设法在你的课程中学到了所有这些,我敢说你仍然在软件开发实习的三四个月内会学到更多东西一个像样的水准的咨询而不是整个课程。在获得学士学位后的前 6 个月里,我学到的东西比我整个 3 年课程中学到的更多。诚然,如果没有我在那门课程中学到的许多东西,我的脸会掉下来,但是有太多不必要的东西被教了,可以用更有用的内容代替。

        【讨论】:

        • 对于一个班级来说,这是一个非常大的列表:P 虽然我喜欢你在这个方面的发展方向。这里有很多主题可以很好地服务于新程序员(尤其是源代码控制和与用户的交互)。
        • 新的“计算机与信息科学”专业涵盖了很多此类内容,这些专业更多地面向软件工程而不是面向理论。
        • 这个覆盖了很多,但也有很多没有被覆盖并且应该被覆盖真正为现实世界做好准备的毕业生。
        • 公平地说,这些要点中的大部分都可以在很短的时间内教授。学习文档、源代码控制、备份等内容并不需要很长时间。很多其他的东西,比如数据库设计,都是教过的,但是太短了,以至于这些材料只是一个品尝者,如果没有很多更多的工作,它永远不会真正有用。
        • 老实说,我不认为 CompSci 专业的学生真的能培养出出色的软件开发人员,而且这些课程也并非真正针对这一点。 CompSci 是一门理论学科,最好是为了它所服务的目的而保留——这在很大程度上是学术性的。不要误会我的意思,我们软件工程师从他们的工作中受益匪浅,但他们的目标受众不是普通消费者。
        【解决方案8】:

        你暑假在一家实际的公司编写软件的课程。

        说真的 - CS 课程并不是为了培养优秀的程序员。它们旨在培养计算机科学家,作为副作用,他们也可以编写软件。

        【讨论】:

        • 好主意,我喜欢实习班的概念。
        • 有些大学实际上会给你实习或合作社的学分。在我的大学里,只有 1 学分的课程,但可能会更好。
        【解决方案9】:

        我的看法(作为一名英语 IT 主管)是,办公室的一天比学校的一周值得,因此,如果你能找到一种获得一些经验的方法,那将是值得的。

        除此之外,只要对自己的能力有信心,发挥自己的优势,并准备好用 Google 搜索任何你不知道的东西!

        如果您想从普通的 IT 人群中脱颖而出,请确保您能够正常沟通,因为令人惊讶的是有多少“顶尖”毕业生无法做到。

        【讨论】:

          【解决方案10】:

          最重要和最相关的不是 CS 课程。你需要好好沟通。无论您上什么课程,您都可以成为更好的听众/读者和更好的作家/演讲者。

          【讨论】:

          • 是的,为此点赞。当我上大学时,人们没有学习计算机,然后成为了程序员,他们成为了计算机科学家。其他人都成了程序员。
          【解决方案11】:

          我在谢菲尔德大学的软件工程学位中与工作场所最相关的两个是第二年的 Software Hut 模块,该模块涉及在一个学期内为现实世界客户生产软件产品的团队。我认为有三个不同的客户,团队相互竞争,为他们生产最好的系统。

          然后在第四年,三分之一的成绩来自经营一家软件公司,同样是针对现实世界的客户。虽然并不完全像经营一家实际的企业,但由于我们生产的任何产品都受到知识产权限制(因为我们还是大学的学生,他们拥有这项工作),但我们确实参与了公司运营的大部分方面——禁止任何会计/合同撰写。

          【讨论】:

            【解决方案12】:

            这完全取决于您要编程什么以及您对什么类型的问题感兴趣。

            显然是一般的组合

            • 离散数学(你的逻辑、图论、一些数论和递归)

            • 算法设计(学习各种解决问题的模型、设计范式、思考计算机资源)

            • 软件工程(管理软件项目、使用现有组件、成对或成组工作、版本控制、模式等)like this

            • 编程密集型课程(我参加了this course),教你解决问题的一般思路,在编写一行代码之前收集你的想法,接触不同的编程范例

              将使您为大多数编程挑战做好准备。

            之后,这一切都取决于您要在哪个域上工作。问问你的导师、你大学的前辈和教授,和他们谈谈你的目标和兴趣。他们会比这里的任何人都更好地为您提供建议。

            但是不要忽视批判性思维,写作课。参加可让您展示自己的想法并为公开演讲做好准备的课程。

            【讨论】:

              【解决方案13】:

              大学毕业就成为更好的程序员?直到学校开始教授内聚、耦合、良好的编程实践、版本控制、配置管理、现代开发模型等概念——我不这么认为。我通常看到的是自学者希望自己做正确的事情,或者如果幸运的话,他们会被雇用到一个宣扬和实践好的组织。

              【讨论】:

                【解决方案14】:

                我认为学术的空白应该由学生组织或独立的学生项目来填补。

                在我的大学里,我们有专门针对 CS 学生的 Association of Computing Machinery 学生分会,我们还有一个致力于视频游戏开发的学生组织。这些组织通过从行业中引进演讲者并迫使学生相互合作,帮助向学生传授“现实世界”。

                如果学生对领先的软件团队感兴趣,或者如果学生希望在技术上更加熟练,他们辅修文科,我还建议主修计算机科学辅修商业的学生。我知道这看起来很奇怪,但我这样做了,我发现它实际上教你如何在纯粹的技术和数学角度之外思考,以及如何将人类思维应用于软件开发。

                【讨论】:

                  【解决方案15】:

                  我认为我学到的最多的课程是数据结构和算法。知识独立于技术的进步,它提供了各类程序员使用的基本工具。

                  【讨论】:

                    【解决方案16】:

                    我们需要一门课程来构建某种社区服务项目。这要求我们使用和学习整个软件工程策略。

                    不过,除非老师决定在课堂上放一些古怪的东西,目的是让事情变得尽可能困难,否则这样的课程将大大缺乏......

                    【讨论】:

                      【解决方案17】:

                      本科期间的数据结构和算法课程对我的工作有很大帮助

                      【讨论】:

                        猜你喜欢
                        • 2023-03-26
                        • 1970-01-01
                        • 2011-06-16
                        • 1970-01-01
                        • 2010-10-31
                        • 2010-11-08
                        • 2013-01-29
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多