聊计算机专业,绕不开一个经典问题:它到底是工科还是理科?这问题就像问一个程序员,PHP是不是最好的语言一样,总能引来一堆讨论。你问不同学校毕业的程序员,可能会得到完全相反的答案。而且他们说的都对。
这事儿的关键在于,计算机科学(Computer Science)这个学科本身就很特别,它一半是理论,一半是实践。就像一个硬币的两面,你很难只看一面就说你了解了它。
咱们先把“理科”和“工科”这两个词掰扯清楚。
理科(Science),追究的是“为什么”。它研究的是世界的基本规律,是纯粹的理论探索。物理学家研究宇宙的起源,数学家推导新的定理,这都是理科的范畴。理科的目标是发现知识,它的成果是论文,是理论。所以理科专业通常对数学和逻辑思维能力要求很高,因为你要用这些工具去探索未知。
工科(Engineering),关心的是“怎么办”。它拿理科发现的规律和知识,去解决现实世界的问题,去创造新的东西。 工程师用物理学原理造桥,用化学知识开发新材料。工科的目标是应用知识,它的成果是产品,是解决方案。所以工科除了理论,还特别强调动手能力和实践经验。
把这两个定义套在计算机专业上,就有意思了。
计算机专业里的“理科”成分
计算机专业里有非常“理科”的一部分,通常就叫“计算机科学”(Computer Science)。这部分内容极其抽象和理论化,是整个学科的基石。
想想这几个问题:
计算机能做什么,不能做什么?它的计算能力的边界在哪里?(这是计算理论)
怎么衡量一个算法比另一个算法更快、更省资源?(这是算法复杂度分析)
我们用的五花八门的编程语言,它们设计的底层逻辑和原理是什么?(这是编程语言理论)
这些问题都和具体的某台电脑、某个软件没太大关系,它们是纯粹的数学和逻辑问题。学这些东西的时候,你大部分时间是在跟纸笔、白板和数学公式打交道,而不是敲代码。我上学时学“形式语言与自动机”,感觉就像在上数学系的课,整天都在画状态机、做各种证明,目的就是为了从理论上搞明白计算机是怎么“识别”语言的。这就是计算机科学的“理科”面,它探索的是计算这个行为本身的规律和本质。
所以,如果一个大学的计算机专业,课程设置里有大量的离散数学、算法设计与分析、计算理论、形式语言这些课程,那它的理科味道就很浓。在美国,很多顶尖大学会把这样的计算机科学专业放在文理学院(College of Arts and Sciences)里,毕业了发的是理学学士(Bachelor of Science)学位。
计算机专业里的“工科”成分
但是,计算机专业更有大量的“工科”内容。毕竟我们多数人学这个,是为了去开发软件、构建系统,解决实际问题的。这一部分更侧重于“技术”和“工程”。
比如这几个方向:
怎么组织一大群程序员,高效、可靠地开发出一个像微信那样复杂的软件?(这是软件工程)
怎么设计一个能让几亿人同时在线购物的网站后台,还不崩溃?(这是分布式系统和计算机网络)
怎么让数据在硬盘和内存里存得又快又好,随时能取出来用?(这是数据库系统和操作系统)
怎么把芯片、内存、主板这些硬件组合起来,让它们协同工作?(这是计算机体系结构)
这些都是典型的工程问题。你需要用已有的科学理论,结合各种工具和技术,去设计、建造、测试和维护一个复杂的系统。这里面不光有技术,还有很多关于成本、时间、团队协作和项目管理的学问。
我做第一个大型软件项目时,才真正体会到什么是“工程”。理论上完美的算法,在实际应用中可能因为数据量太大而跑不起来。代码写得再漂亮,一个微小的bug也可能让整个系统瘫痪。你必须考虑各种现实世界的限制,在性能、成本和开发时间之间做取舍。这就是工程师每天在做的事情。
在中国,绝大部分学校的“计算机科学与技术”专业都设在工学院下面,属于工学门类。 毕业的时候,拿到的也是工学学士学位。 这也反映了国内对这个专业更侧重于应用和工程实践的定位。
学校和课程设置才是关键
所以,纠结“工科”还是“理科”这个标签,意义不大。更实际的做法,是去看你想申请的那个学校、那个专业的具体课程设置。这才是决定你大学四年到底学什么的根本。
有的专业名字叫“计算机科学”,但课程里全是软件开发、网络应用、数据库这些,那它就是个工科项目。有的专业叫“计算机工程”(Computer Engineering),除了学软件,还要学大量的电路、电子技术、嵌入式系统,这就更偏硬件,是工科里的“硬工科”。
举个例子,美国的MIT和加州大学伯克利分校,它们的王牌专业叫EECS(Electrical Engineering and Computer Science),直接把电子工程和计算机科学绑在一起,这就是一个典型的工科思路,强调软硬件结合。 而另一些学校,可能会把CS(Computer Science)和CE(Computer Engineering)分成两个独立的专业。CS偏软件和理论,归理学院管;CE偏硬件和系统,归工学院管。
所以,最好的方法就是去学校官网,找到这个专业的培养方案或者课程列表。看看核心课程都有哪些。如果数学、理论、算法的课程占了很大比重,那它就偏理科。如果软件工程、系统设计、项目实践的课程更多,那它就偏工科。
对未来职业发展有影响吗?
对于绝大多数想当程序员、做软件开发的人来说,你的专业到底是工科还是理科,几乎没影响。公司招聘“软件工程师”,关心的是你的编程能力、算法基础、项目经验,而不是你学位证上印的是“工学”还是“理学”。
但是,不同的侧重会对你的知识结构和思维方式产生潜移默化的影响。
偏理科的训练,会让你有更扎实的理论功底。这在你需要解决一些非常根本性的、对性能要求极高的难题时,会很有优势。比如你要去开发一个新的数据库内核、设计一个新的机器学习算法,或者从事前沿的科学研究,深厚的理论背景是必不可少的。这类岗位往往对学历要求也更高。
偏工科的训练,则让你能更快地适应工业界的需求。你对软件开发的整个流程、对各种工具和框架的运用会更熟练,动手能力更强,能更快地为团队做出贡献。 这是绝大多数软件公司里最需要的技能。
总的来说,计算机专业就是一个理科和工科高度融合的领域。它用理科的方式去探索计算的本质,又用工科的手段去解决现实的问题。科学是它的骨架,工程是它的血肉。这两个方面互相驱动,共同发展。没有理论科学的突破,工程应用就会停滞不前;没有工程实践中遇到的新问题,科学研究也会失去方向。
所以,别再为它是工科还是理科而烦恼了。它既是,又不是。更重要的是,你想成为一个什么样的计算机人才?是想探索理论边界的科学家,还是想构建伟大产品的工程师?看清楚学校的课程设置,然后选择那个更符合你目标的方向,这才是最实在的。

技能提升网