18

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

我想我必须使用算法,它不是你可以很容易地自己掌握的东西,我认为它可以让你更深入地看待软件的效率和正确性。

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

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

4

17 回答 17

25

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

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

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

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

即使你确实设法在你的课程中学到了所有这些,我敢说你仍然会在一个体面的软件开发咨询公司实习三四个月,而不是在整个课程中学到更多。在获得学士学位后的前 6 个月里,我学到的东西比我整个 3 年课程中学到的更多。诚然,如果没有我在该课程中学到的许多东西,我会面无表情,但是有太多不必要的内容可以用更有用的内容代替。

于 2009-05-21T21:20:19.540 回答
17

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

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

于 2009-05-21T21:21:21.210 回答
4

计算机科学!=编程。

如果您正在寻找更好的程序员,请寻找具有 2 年制大学课程教育且专门专注于此的人。

于 2009-05-21T21:11:10.217 回答
4
  • 商务101
  • 办公室政治200
  • 在现实世界中没有什么是学术的

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

于 2009-05-21T21:13:05.203 回答
4

没有什么比通过构建项目获得的知识更好的了.

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

于 2009-05-21T21:14:54.810 回答
4

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

于 2009-05-21T21:28:19.667 回答
3

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

于 2009-05-21T21:15:41.547 回答
3

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

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

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

于 2009-05-21T21:46:43.637 回答
2

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

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

于 2009-05-21T21:13:45.687 回答
2

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

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

于 2009-05-21T21:36:52.877 回答
1

数据库设计

函数式编程

面向对象编程

x 驱动设计

于 2009-05-21T21:11:54.927 回答
1

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

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

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

于 2009-05-21T21:27:52.380 回答
1

这一切都取决于你想要编程什么以及你对什么样的问题感兴趣。

显然,一般的组合

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

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

  • 像这样的软件工程(管理软件项目、使用现有组件、成对或成组工作、版本控制、模式等

  • 编程强化课程(我参加了这门课程),教你解决问题的一般思路,在编写一行代码之前收集你的想法,接触不同的编程范式

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

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

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

于 2009-05-21T21:38:11.283 回答
1

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

于 2009-05-21T21:39:56.867 回答
1

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

于 2009-05-21T22:16:33.843 回答
1

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

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

于 2009-05-21T23:59:19.253 回答
1

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

于 2009-10-18T21:11:59.447 回答