CS 与 SE——对计算机行业有一个大致的了解

首先要搞清楚计算机有两个方向:Computer Science(计算机科学)和 Software Engineering(软件工程)。我后面就简称为 CS 和 SE。

按理来说,CS 是偏向理论的,因此离散数学、数据结构和算法、计算机组成原理、计算机网络、操作系统、数据库、编译原理、计算理论(形式语言与自动机)、算法分析与设计、汇编语言、数值分析等这些东西都应该学。而SE 偏向实用,也就是说主要应该学习软件工程、体系架构、项目管理、面向对象建模、数据库、Java 程序设计、Spring 开发/Web 开发/移动应用开发这些东西,当然算法、计组、计网、操作系统这四大件还是不能少的。

当然,作为大学实际开设的两个学科,实际教学都是偏向理论的。SE 的软件工程概论->软件需求工程->软件系统分析与设计->软件测试与质量保证->软件项目管理->软件体系结构(选修)这一套课程也是以理论为主的,实际上是几乎不写代码的。相比之下,CS 更加重视算法和底层方面的东西,如编译原理和算法分析、模电数电这类课程会更为重视,计网、操作系统、计组这些课程的教学时长也会更长一些。(但实际上在苏州大学俩专业这些课程的教学内容都是一样的,所以 SE 其实是以更少的教学时长学习了同样的知识,反之也可以说 CS 用更长的教学时长学习了同样的知识浪费了时间,这只能怪工程认证强制要求这俩专业在培养方案上作出区分)

按理来说,SE 方向的培养更适合毕业后从事应用开发工作,CS 方向更适合毕业后从事底层开发工作或研究工作。当然实际情况是这俩专业毕业后通常没啥区别,毕竟都是该学的理论都学了,只是侧重点稍有不同,多数公司和学校事实上也不怎么区分这俩专业。

我注意到绝大多数编程爱好者其实主要都是喜欢 SE,真心喜欢 CS 的不多,除非真是打竞赛而且数学很好,喜欢读计算机理论的人。毕竟对于大多数人来说,通过编程实现一个实用的软件要比用编程解决枯燥的理论问题有趣得多,真正喜欢对着黑底白字的窗口敲算法的人应该不会太多。很多算法研究者的兴趣也是后天培养的。也就是说,大多数人喜欢的只是通过计算机这个工具实现想法的过程。

另外,计算机行业还有“前端”与“后端”之分。当然,这两者指的都是开发岗。本着科普知识的目的,这里简要提一下这俩工作岗位的大致区分。

从广义上讲,前端和后端其实是相对的概念。在最普遍使用的 Web 开发领域,前端指的是网页前端(客户端)的设计,主要使用 JavaScript/TypeScript 作为编程语言,主要负责业务就是做界面;后端指的是网站后端接口开发(服务器端),主要使用 Java/Go/Node.js/PHP 甚至 Python/Ruby 作为编程语言,主要负责的业务是“CRUD”,也就是“增(CREATE)删(DELETE)改(UPDATE)查(READ)”操作。显而易见,在当前的环境下互联网行业对于 Web 前后端开发的需求量非常大,保守估计程序员岗位也有 70%以上在招 Web 前后端。

实际上除 Web 开发,桌面端应用开发、移动端应用开发或是游戏开发也可以以类似的方式分出前后端。当然,无论是桌面端开发还是移动端开发领域都已极大萎靡,岗位已经不多了,主要都已被 Web 替代了,即使你当前看到的很多桌面应用和移动应用,实际上都只是在 Web 的基础上套了个壳,本质上都是用的 Web 开发技术,单纯用 C++ Qt 和原生安卓/IOS 写应用的时代已经过去了。而游戏开发领域实际上一般很少归于纯粹的程序开发领域,设计与市场营销的占比相对是更大的,且该领域的就业面也相对狭窄,实际上真实游戏开发中所需要的程序员数量并不大。如果确实有兴趣入行游戏开发,建议先学好 C#,顺便也要打一些 C/C++的底子。

除此之外,还有近年来兴起但最近已经降温的“算法岗”,主要做的是机器学习尤其是深度学习领域的工作,用 Python 比较多,也有一些是做单纯的算法研究的,不过比较少。事实上算法岗的占比只有不到 10%甚至更低,而且基本上只有大厂养得起算法岗,门槛很高,工资未必高于 Web 前后端。算法岗进去后主要是做研究员。算法岗前几年显然过热了,而实际上市场对算法岗的需求量很少,且目前以神经网络为主导的算法研究变现能力非常有限,目前招人已经很少了。

当然还有测试方向,各行各业测试工程师需求量也是很大的。测试工作总体来说还是有些枯燥的,待遇比互联网低点,但要求也稍低。需要掌握一些基本的编程语言,Java/Python 一般是要会的,数据库是要比较熟练掌握的,测试工具好歹要精通一个,如果做 Web 测试 fiddler 也是要会的。当然一些测试的基本概念也是要会的。总体要求比开发稍低,待遇稍低,工作时间不固定(因为显然要等开发做完,但你也不知道人家什么时候写完代码),工作较枯燥。

然后还有一些稍有些小众或是属于泛 IT 的方向,这里也列出来:

  • 高性能计算领域:通常需要较好的 C/C++功底。市场需求量很少,基本上只有互联网大厂或芯片大厂会有需求。大致上就是做并行计算/集群/分布式计算等几个方向,有时候会带点 AI,进去后多半做研发。对算法功底有较高的要求。总体上是个要求较高,就业面较窄的领域。目前看来前景其实不好说。

  • 云计算领域:经典 cjb 领域,卖课的一堆,问就是就业岗位太多了,一问有啥实际应用全给你来虚的。实际上所谓的云计算工程师大多就是在数据中心做运维,或是干脆就是做 Web 开发。这东西定义非常模糊,什么东西都能来掺一脚,因此每年看到的云计算产业报告都是在蹭蹭蹭往上涨。具体行业咋样很难说,毕竟定义就不清楚。

  • 大数据领域:很多人把大数据和云计算绑在一起说,其实大数据还是要稍微实一点。基本上大数据做的工作也就是在各种框架和数据库上倒腾,写一些基本的脚本,比如折腾 Spark/Flink/Hive/HBase 这些。大数据这块基本被 Java 生态垄断了,Java 肯定要学,Scala 看情况学,如果需要深入折腾 Spark 还是要学的。

  • 数据分析师:也有人把这个归到大数据,我个人还是做区分的。这块实际上更多是交叉领域,需要和其他行业绑定,如生物医药和领域和金融领域。用 Python/R 甚至 Matlab/SPSS 的较多。实际上算是泛 IT 领域,和数学统计学关系更大点。这方面需求不少,但其实不是做计算机的。

  • 量化金融领域:从事这行的人一般叫做 Quant,主要还是用 Python 做金融分析。和上面的数据分析师有点像,不严格区分实际上也可以归作一类。这行主要做的其实是数学,编程当作工具使用,不是严格的 IT 领域。

  • 音视频处理/图像处理领域:经典的底层领域,行业里总是会有公司遇到相关需求,但真正的需求量总是很少,许多人搞一辈子开发也或多或少会遇上这方面的东西。主要使用的还是 C++,OpenGL 和 FFMPEG 用的很多。整体对理论水平的要求较高,就业面较窄,工资比 Web 高,属于标准的专业性岗位。

  • 嵌入式/物联网领域:实话说这块或许和许多计算机之外的工科专业关系更大点。基本就是拿 C 做硬件开发,和底层接触很多,需求量很大。但工资比互联网低一线,而且事情很多,难度大,知识水平要求高。不过没什么中年危机,也许算个优点。

  • 理论计算机科学方向(TCS):几乎只存在于高校老师中。基本没有就业前景,因为正常来说也没有公司需要一些精通计算理论的人。对理论知识水平要求很高,学校里事多,工资低,但谁叫有些人就是喜欢做这个。

最后更新于