为什么仅有计算机科学学位是不够的?


目前向有抱负的软件工程师传授计算机科学知识的方法与业界对他们毕业后的期望之间存在着巨大差距。虽然应届毕业生可能擅长理解算法的复杂性,如在排序列表中进行二进制搜索的 O(log(n)),但许多人在从头开始设计综合系统时却举步维艰。

最近,我与一位从马里兰大学获得计算机科学学位的朋友进行了一次交谈。他分享了自己的面试经历,重点提到了他面临的一个具体问题:设计一个系统来监控华盛顿特区地铁系统中所有列车的位置。这个场景凸显了许多毕业生在将所学知识应用于现实世界的复杂系统设计时所遇到的挑战。

他详细阐述了自己的回答,讨论了二叉树和链表等潜在的数据结构。然而,当我询问将数据从火车传输到运行其软件的计算机是否切实可行时,他却难以给出解决方案。我问是否应在每个车站安装一台计算机,通过 HTTP 与中央计算机通信,他对此没有回答。

值得注意的是,这个人是个优秀学生,成绩一直是全 A。他选修了一些最具挑战性的计算机科学课程。然而,他在回答我认为的基本问题时却遇到了困难。这凸显了仅仅依靠在学术上接触计算机科学和计算机工程的局限性。

这一观点强调了计算机科学教学方式中的一个根本问题。我当然不是第一个指出这一点的人。在与计算机科学与技术专业的应届毕业生交谈时,我发现他们在知识方面存在很大差距,这常常令我感到惊讶。虽然计算机科学教育作为一种学术追求很有价值,但只接受过正规计算机科学教育的人却发现自己没有为软件工程师的职业生涯做好充分准备。

我在马里兰大学学习计算机科学期间,分配的项目缺乏协作性、创造性和源代码控制实施,而所有这些都是有效软件开发的基本要素。这些方面对于培养学生熟练编写软件至关重要。

在程序员的职业生涯中,孤立无援的工作是很少见的。与同事互动、在开源项目中合作、解读他人编写的代码是常有的事。令人惊讶的是,典型的计算机科学课程中往往缺乏这些关键技能。

此外,我在课堂上遇到的项目始终遵循一种可预测的模式:"实现这个函数 "或 "实现这些函数"。虽然我明白这种作业背后的道理--它们可以方便地测试给定输入的正确输出,但它们缺乏现实世界项目所要求的灵活性。分配具有开放式设计可能性的项目,就必须为每个学生量身定制测试,而这在班级人数较多(通常超过 200 人)的情况下是不切实际的。这种限制进一步阻碍了在多样化的真实世界场景中培养解决问题的基本技能。

计算机科学教育中最明显的缺陷之一就是没有专门的 "版本控制 "课。有些毕业生甚至对 Git 等版本控制系统缺乏基本了解。我曾亲眼目睹教育者建议将代码的多个副本放在不同的文件夹中作为临时 "备份",但这并没有灌输源代码控制这一软件开发人员职业生涯中不可或缺的重要技能。

解决这些问题需要积极主动的解决方案。
在我看来,最关键的一步是从编程教育一开始就融入版本控制的概念和意义。试想一下,学生们在写完最初的 "Hello World "程序后,会被介绍将其提交到 Git 的过程。版本控制应该成为每个编码人员的本能,为什么不尽早引入呢?通过将版本控制无缝融入基础编程概念,我们可以让未来的开发人员从一开始就掌握基本技能。

第二种方法虽然在大规模实施上具有挑战性,但它涉及到从一开始就分配更多开放式的协作项目。对于学生来说,学会如何在项目中协作、分工和有效沟通至关重要,这样才能确保软件在集成各个组件时实现无缝运行。

通过团队合作,学生将了解到版本控制的复杂性,包括拉取请求、合并冲突和代码审查,这些都是专业开发人员会遇到的基本问题。

在规模较大的大学中,采用这种方法会遇到困难。自动化,如通过自动测试进行评分,变得不切实际。教授们必须像英语或数学教授评估论文那样评估项目--通过阅读代码并根据其预期功能进行评分。

最后,开发人员应具备理解陌生代码库的能力。令人惊讶的是,在我的计算机科学课程中,分析他人编写的代码的机会非常有限。这项技能与协作密切相关,但也适用于原始代码创建者无法提供指导的情况。向学生展示现有代码并指导他们对其进行修改(例如将其功能从 "x "转换为 "y")的项目,有助于磨练这一关键技能。

我的建议被所有开设计算机专业的大学普遍采纳的可能性很小。那么,如果正规教育无法教会一个人如何成为一名出色的开发人员,个人又能做些什么呢?如何才能真正精通软件开发?

归根结底,学生有责任寻找并参与课外编程活动。我强烈建议学生去当学徒。无论是在软件开发公司实习,还是积极参与开源社区活动,这些经历都是非常宝贵的。许多开源社区都提供导师计划,专门帮助新的贡献者熟悉社区的开发标准。这种合作是互惠互利的,对新人和社区都有帮助。

与经验丰富的软件工程师建立一对一的关系是另一种绝佳的学习方式。就我个人而言,我很幸运能在高中时期获得这些机会,它们对我成长为一名软件工程师以及在该领域找到工作起到了关键作用。

网友讨论:
1、学术界:让我们做科学
工业界:你们教的东西不对,我们需要从毕业那天起就完美无缺的小工人。
学术界:那不是我们的工作,你们应该培养初级工程师。
工业界:我怎么可能有责任去培训那些能让我们赚大钱的复杂艺术人才呢?
学术界:因为整个人类文明史都是这样的。
产业界:不,不关心,股东价值什么的

2、这是主要的区别。大学教授一门科学,但 FAANG 需要编码猴子。

3、聪明并拥有学位应该足以获得入门级编程工作。没有一所大学能够培养计算机科学毕业生进入该行业所使用的极其庞大的技术生态系统。

4、亿万富翁:我们如何才能同时让教育变得尽可能昂贵,同时让人们接受更长的时间?