什么本科计算机科学课程最适合工作场所的程序员?

Rob*_*ner 18 computer-science generic-programming

这里的想法是在大学毕业后让更好的程序员.

我想我必须使用算法,它不是你可以很容易地自己拿起的东西,我认为它使你能够在更深层次上看到软件的效率和正确性.

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

这些结果将成为我想写给我老学校CS部门的一封信的一部分,我认为有很多课程我根本没有帮助,而我认为其他课程本来就非常宝贵.

Ben*_*ter 24

我还没有找到一个很好的CompSci课程,为工作场所的软件工程师做好充分的准备.如果你找到一个有以下[虽然它是否可以被称为CompSci我很怀疑,它更像真实世界软件设计,这是一个非常不同的野兽].

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

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

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

即使你确实设法在你的课程中学到了所有这些,我敢说你可以在一个体面的callibre的软件开发咨询实习三到四个月里比在整个课程中学到更多.在我获得学士学位后的前6个月里,我学到的东西比在整个3年课程中学到的要多.不可否认,如果没有我在课程中学到的许多东西,我就会黯然失色,但是有很多东西被不必要地教导,可以被更有用的内容所取代.


Sar*_*Mei 17

你在一个真正的公司编写软件的夏天上课.

说真的 - CS课程并不意味着培养优秀的程序员.他们的目的是培养计算机科学家,作为副作用,他们也可以编写软件.

  • 有些大学实际上会给你一个实习或合作社的信誉.在我的大学,它只有1个学分的课程,但它可能会更好. (2认同)