许多组织正在将目光投向计算机科学学位之外,以聘请能够交付实际成果的程序员。以下是他们可能正确的原因。
图片来源:hxdbzxy / Shutterstock
科技界真的需要计算机科学吗?不是指计算机或芯片,而是指那些以此命名的大学院系所教授的抽象理论集合。不是指广义的科学,而是指用理论视角思考编程的理念。
既然人工智能(AI)将迅速让我们都失业,这个问题就变得更加棘手了。AI将能够深入思考计算理念,因此我们无需这样做。它们已经能够追踪数十亿条知识点。如果我们能让AI在我们小憩时构建出宏伟的东西,那么计算机科学作为一门学科还有什么意义呢?
并非计算机科学领域没有做出贡献。有数PB(拍字节)的LaTeX文件,里面充满了绝妙的想法,比如新的编程语言、巧妙的搜索算法、机器视觉算法,以及其间的无数概念。许多甚至非常出色。
问题在于,我们中很少有人真正需要其中的大部分。一位朋友承认,他曾目睹一个开发团队通过淘汰计算机科学专业的毕业生,只招聘物理学家、会计师或任何其他精通数学的人才而蓬勃发展。这些新员工在让机器交付成果方面更为实际,而这正是大多数企业想要做到的。
追求计算机科学学位或聘请拥有该学位的人并非错误的努力;只是对于大多数公司需要解决的问题而言,这可能并非必要。以下是一个尚不完整的清单,解释了为什么IT招聘经理忽略这些学位可能会更好。
1. 大型语言模型(LLM)正在改变编程的内涵
有些势利小人称它们为“随机鹦鹉”。另一些人则声称它们只是巧妙的压缩机制。但它们在编程方面确实相当出色。它们会犯错,会“幻觉”出不存在的API调用,但总的来说,它们为我节省了数小时阅读文档的时间。 当我使用它们时——我每天都用——我发现自己的速度提高了三到十倍。不仅如此,我还可以忘记整个课程的内容。前几天我需要一个数据结构,LLM建议了正确的一个。然后它用我几乎不懂的语言为该数据结构编写了代码。两门完整的学期课程被机器学习所取代。
2. 无代码工具正在激增
计算机科学家们可以为自己让自己失业而拍拍自己的背。世界充斥着低代码和无代码工具,这些工具完成了几年前还需要程序员忙碌的大部分工作。现在,LLM为这些技术栈增加了更多杠杆作用,它们比以往任何时候都更加强大。
这些解决方案并不完美。它们仍然会失败或有不足之处,但它们在不断改进。而且它们极大地减少了对人类艰苦卓绝努力的需求。我们更像是数据流水线的看护者和策展人,而不是在漫长、孤独的赶牛中放牧数据的牛仔。
3. 理论分散注意力并造成混淆
许多计算机科学家本质上是数学家,这种痴迷于定理的思维模式渗透到整个学科中。一位理论家告诉我,至少在他看来,所有的数学证明都只是程序,反之亦然。他对交付能完成工作的代码不那么感兴趣,更感兴趣的是证明他的代码是正确的。好吧。
计算机科学专业的学生毕业时很少不接触NP完全性和图灵机这两个优美的理论领域,如果它们不产生不良直觉的话,这两个领域本会令人愉快。一位生物学家曾请我解决一个DNA序列匹配问题,我回来后声称它是NP完全的——这是一类解决起来可能非常耗时的问题。他不在乎。他需要解决它。事实证明,大多数NP完全问题在大多数情况下都相当容易解决。但理论家们痴迷于那些困扰简单算法的少数情况,尽管这些情况在日常生活中很少见到。
图灵机也存在同样的问题。尽职的计算机科学学生学习像莱斯定理这样的虚无主义结果,该定理表明我们根本无法分析计算机算法。但是图灵机对于常规机器的运作方式来说是一个相当糟糕的模型,而且创建能够对我们的代码进行智能操作的软件相对容易。任何不以批判性眼光看待这些理论结果的计算机科学专业学生,都有可能在唾手可得的完美可用答案面前放弃。
4. 学术性语言很少被使用
学术界在每个领域都可能滋生势利和对晦涩解决方案的偏爱。当我问一位麻省理工学院的毕业生他最喜欢的语言是什么时,他自豪地告诉我,他肯定我不知道那是什么。在我追问之下,他让步说那是CLU。他是对的。
【CLU 是一种由麻省理工学院(MIT)在20世纪70年代中期开发的编程语言。它在编程语言历史上占有重要地位,因为它引入并推广了许多现在在现代语言中常见的概念,尤其是:
抽象数据类型(Abstract Data Types / Clusters): 这是 CLU 的核心概念,语言的名字也来源于此(CLUster)。它允许将数据结构及其上的操作封装在一起,隐藏内部实现细节,为面向对象编程奠定了基础。
迭代器(Iterators): CLU 是最早支持迭代器的语言之一,允许以统一的方式遍历集合中的元素。
异常处理(Exception Handling): CLU 也引入了结构化的异常处理机制。
尽管 CLU 本身并没有获得广泛的商业应用,但它的设计思想和特性深刻影响了后来的许多编程语言,包括 C++、Java、Python、C# 和 Ruby 等。】
那些痴迷于语言的人提出了许多伟大的想法,但有时这些想法会造成混乱和困惑。如果一个团队成员喜欢某个古怪的特性并将其包含在代码库中,那么每个人都必须学习它。仅仅几个这样的特性,上手的时间就会非常漫长。
这就是为什么谷歌在构建Go语言时选择了“阳春白雪”的路线。创造者们坚持认为,该语言应该结构简单,易于在最短的时间内学会。这样每个人都能很好地掌握核心内容。
5. 许多计算机科学教授不会编程
大多数计算机科学系的一个不可告人的秘密是,大多数教授不会编程。他们真正的工作是讲课和争取科研经费。他们懂电子表格和经费申请,但并非实际编写代码。这就是为什么上帝给了他们研究生。他们中许多人上一次真正编程还是在读研究生的时候。从那以后,技术生疏,布满蛛网,他们机器上的编译器可能都无法启动了。
6. 许多必修科目很少被使用
数据结构通常是学生第二门计算机科学课程的主要内容。但是我们中很少有人再使用很多数据结构了。我们把东西扔进对象哈希表,或者把它们推入替我们思考的数据库中。考虑算法复杂度仍然有用,但很少有人需要担心B树或链表。不仅如此,我们中的许多人已经意识到,相信标准库会更好。自己修改数据结构太容易出错了。许多组织有充分的理由禁止自行创建数据结构。
在经典课程中,还有许多其他不再重要的科目示例。它们被使用,但在很大程度上是自动化的。编译器复杂且至关重要,但唯一编写它们的人是被迫在为期一学期的课程中创建玩具版本的学生。即使是苹果公司在创建Swift编译器时也使用了现成的开源工具。
7. 数学模型将我们引向错误的方向
任何学习过数据库理论的人都了解Boyce-Codd范式的巧妙之处,即我们将复杂的数据结构分解成小表的方式。它非常优雅和高效——直到你为了等待充满JOIN命令的SQL查询响应而等到天荒地老。
大多数开发团队很快就学会了“反规范化”他们的数据库以提高性能。他们去除了所有巧妙的设计,将数据放在一个巨大的表中。这很难看且浪费,但通常速度快得惊人。而且磁盘空间很便宜。
一旦他们将所学付诸实践,许多开发人员会花几年时间忘掉他们计算机科学课程中学到的所有数学技巧。
8. 体制滋生傲慢
学位的本质就是赋予毕业生以权威来论证自己优越性的能力。但即使在最好的情况下,也很难知道什么是真正正确的,尤其是在一个快速发展的领域。
我共事过的一个人非常喜欢他带到部门的“编码标准”,并抓住一切机会在代码审查期间引用这些标准。这些标准相当于对空格放置位置的挑剔意见,但他以学术般的精确性谈论它们,并像挥舞大棒一样使用它们。他会以不符合标准为不祥的理由来指责代码。于是我们所有人都不得不计算空格,以便一切都能符合某些准学术标准。
9. 许多现代技能被忽视
大多数现代技能在许多计算机科学系都没有涵盖。在典型的课程列表中,你很少会找到Node.js、React、游戏设计或云计算。普通学校的课程列表专注于基础知识——比如竞争条件这样的深层概念,这些概念在Node.js或React这样的词汇被遗忘很久之后仍将是计算的一部分。这是一个崇高的目标,但大多数程序员99%的工作是与当前流行词的特性作斗争。
计算机科学系培养出能够理解一些基本挑战的深度思考者,却对主导普通员工日常工作的细节一无所知,这种情况很常见。这就是为什么公司发现,雇佣一个在物理实验室使用Python处理来自仪器的一些数据流的人同样值得。他们可以像计算机科学天才一样轻松地学习那些浅显的细节。
10. 学术前沿成果姗姗来迟
机器学习和人工智能现在风靡一时,许多人争相进行实验。但是计算机科学系已经研究它们几十年了。是研究学校今天提出的所有想法,还是耐心等待它们最终可以普遍使用,这有意义吗?
11. 终身教职可能滋生自满情绪
终身教职制度背后有其极好的理由,大多数享有其保护的教授因其早年的贡献而理应获得所有这些福利。问题在于,在快速发展的领域,今天的学生几乎不需要十几年前的见解。然而,终身教职保证了许多教授将比他们拥有最伟大见解的时代晚十年、二十年甚至三十年。
还有一些分心的事情可能让教授们偏离正轨。一位获得终身教职的天才似乎无休止地在博客上谈论扑克锦标赛以及让他输掉比赛的“爆冷”(bad beats)。另一位则投资了一支小联盟棒球队,并吹嘘自己与球员们一起玩耍,在他们进行击球练习时捡球。
12. 空谈理论鲜能产出成果
当我告诉一位终身教职的教员,我的一个学生凭借几堂关于Angular和React的课找到了一份工作时,他笑着说:“我最不想做的就是把这里变成一所技校。”
这没问题,但没有多少人能够有理由花费近五十万美元来思考多项式或指数级的天使能否在针尖上跳舞。博雅教育传统是一件美妙的事情,但它鼓励了对实用知识的蔑视。一切都关乎某些深刻、永恒的真理。但是,当你的公司必须在下周截止日期前交付产品时,没有人有时间进行空谈和思考永恒的真理。
名词解释:
计算机科学 (Computer Science):研究计算理论和应用。
人工智能AI (Artificial Intelligence):模拟人类智能的理论与技术。
大语言模型LLM (Large Language Model):处理和生成自然语言的大型模型。
数据结构 (Data Structure):组织和存储数据的方式。
API 调用 (API Call):程序请求服务接口。
低代码/无代码工具 (Low-code/No-code Tools):通过可视化界面快速开发。
NP 完全性 (NP-completeness):计算复杂度理论中的问题类别。
图灵机 (Turing Machine):理论计算模型。
Rice 定理 (Rice's Theorem):关于程序属性不可判定性定理。
代码库 (Code Base):程序源代码的集合。
编译器 (Compiler):将高级语言转为机器码的程序。
标准库 (Standard Library):编程语言自带的常用代码集合。
数据库理论 (Database Theory):研究数据库原理和模型。
Boyce-Codd 范式 (BCNF):数据库关系模式规范化高级形式。
反范式化 (Denormalization):数据库设计牺牲规范化提高性能。
SQL 查询 (SQL Query):查询和管理关系数据库的语言。
JOIN 操作 (JOIN command):合并两个或多个数据库表的记录。
编程规范 (Coding Standards):编写代码应遵循的规则和指南。
代码评审 (Code Review):同行检查代码以发现问题。
Node.js:基于Chrome V8引擎的JavaScript运行时。
React:构建用户界面的JavaScript库。
云计算 (Cloud Computing):通过网络访问计算资源。
竞态条件 (Race Condition):多个进程访问共享资源结果不定。
抽象数据类型 (Abstract Data Type):定义数据和操作但不暴露实现。
迭代器 (Iterator):按顺序访问集合元素的对象。
异常处理 (Exception Handling):程序运行时处理错误或异常事件。
面向对象编程 (Object-Oriented Programming / OOP):基于对象概念的编程范式。
睿观:许多企业在招聘程序员时开始不再将传统的计算机科学(CS)学位视为必需,甚至有意忽略,转而青睐能交付实际成果的人才。主要原因在于,随着AI编程助手和低代码/无代码工具的普及,许多曾经需要深厚CS理论知识的任务已可自动化完成,大幅提高了开发效率并降低了对人工干预的需求。传统的CS课程侧重于抽象理论(如NP完全性、图灵机)和数学模型(如数据库范式),这些在现实世界中常显脱节或为追求性能而被规避。此外,一些学术教授缺乏实际编程经验,课程内容也未能及时反映业界对Node.js、React、云计算等现代技能的需求。相比之下,来自物理、会计等数学背景的实用主义者,由于其解决实际问题的能力,在技术岗位上同样表现出色。作者认为,学术界有时滋生对实践的轻视和对理论的过度强调,而企业更需要能按时完成工作的务实人才,而非沉湎于抽象思辨的理论家。