type
status
date
slug
summary
tags
category
icon
password
我从 10 岁开始用 TI-82 图形计算器编程。小时候我喜欢电子游戏,当得知我可以自己制作电子游戏时,我欣喜若狂——同时还能分散我对数学课的无聊注意力。很快,我爱上了编程这门手艺,并踏上了一段漫长而有益的旅程,培养我作为一名程序员的技能。
这段旅程的一部分包括在斯坦福大学获得计算机科学学士和硕士学位,其中包括在研究小组工作了很长时间。作为一名专业人士,我建立了许多有用的项目,并为我的领域贡献了重要的知识。在这篇文章中,我将探讨计算机科学教育为专业开发人员提供了什么价值(如果有的话)。
有些人持极端观点,认为计算机科学教育完全无用或认为计算机科学教育完全必不可少。我的观点是,计算机科学教育被高估了,但并非毫无用处。程序员所做的绝大部分工作,即形成良好的抽象和避免复杂性,几乎完全不受计算机科学课程的影响。
在我的职业生涯中,我曾遇到过几次问题,如果没有计算机科学教育,我想我是无法解决的。这些问题都与分布式系统中的算法有关,这些算法需要形式化证明才能确保其正确性。这些案例恰好对各自的系统至关重要——例如,正是这种算法使Storm成为可能。所以从这个意义上说,我个人从计算机科学教育中受益匪浅。
然而,我也必须承认,与绝大多数程序员相比,我所处理的问题的规模和难度是不同寻常的。大多数人并没有设计新的分布式处理范式。我非常怀疑大多数程序员是否需要知道如何对算法进行形式化证明、确定算法的渐近复杂度,甚至是否了解那么多数据结构。大多数人都在进行那种涉及将数据库、应用程序框架、部署工具、监控系统和数据处理框架等组件拼凑成应用程序的编程。
当然,有些领域在日常工作中更需要计算机科学教育——分布式系统就是一个例子。但即使在这个领域,你的绝大部分工作也是形成良好的抽象并避免复杂性——这两项关键技能是你在计算机科学教育中学不到的。计算机科学教育的好处仅限于你从一小部分情况中获得的价值。对我来说,这些情况非常有价值,但大多数程序员甚至不会遇到它们。
我之所以觉得有必要写这个话题,是因为在程序员面试中,通过臭名昭著的白板编程面试,通常只测试计算机科学技能。一个人能否在高压情况下解决一些可爱的算法问题,并不能说明他在正常工作条件下编写可靠、干净、结构良好的程序的能力。这种做法类似于根据飞行员在航空工程考试中的表现来招聘他们。这些知识是相关的和有用的,但并不能说明这个人是否具备这份工作所需的技能。
这种招聘方式特别奇怪的是,存在一种各方面都更好的替代方案。带回家的项目是衡量编程能力的一个很好的标准,而且对公司来说,投入的时间要少得多(评估项目需要 15 分钟,而面试需要 1 小时)。此外,我发现大多数候选人更喜欢带回家的项目,因为它压力较小,而且能更好地展示他们的技能。
因此,从这个意义上讲,由于软件行业的不合理性,计算机科学教育有助于在求职面试中取得好成绩。但最近有一些趋势表明,这些荒谬的招聘做法将会改变——Recurse Center和Insight Data Engineering等项目利用其成员在一到三个月内建立的项目作为卖点,帮助他们找到工作。因此,随着行业的适应,计算机科学知识不再是获得程序员工作的关键,完整的计算机科学教育将变得不那么重要。这需要多长时间还不清楚。
根据我的经验,成为优秀程序员的唯一方法就是多多练习。读书和上课并不能让你成为更好的程序员——它们可能会提供一些指导,但真正的进步来自于你在实际项目中投入的艰苦时间。我可以整天阅读有关如何执行完美翻滚的书籍,但直到我穿上降落伞并进入驾驶舱时,这一切都毫无意义。编程也是一样的。
总的来说,我对计算机科学教育的价值有着复杂的感受,主要是因为我从中获得了个人利益。但在大多数情况下,我认为它被严重高估了。看到一个人才严重短缺的行业,然后发现非常优秀的自学成才的程序员因为没有计算机科学背景而在面试中被过早拒绝,这很奇怪。我希望看到这个行业在这方面有所改善,但与此同时,我很高兴利用这种不平衡作为竞争优势。