关于大学计算机相关专业学习路线的见解与分析

2020.6.18 重新增改部分内容


谨以此文献给仍然迷失在大学生活中的计算机专业学子!!!

不管你是如何选择了这门专业,我想告诉你的是这是一个很深的领域,没有热爱不如尽早转行。

阅读本文首先需要你明确自己的专业是偏硬还是偏软(本文以计算机科学与技术专业为主,不涉及偏硬件的内容)。文章目录链接如下:
基础篇
web前端开发
web后端开发
移动端开发
游戏开发
数字媒体
人工智能
网络安全


计算机相关专业其实范围很广,包括偏硬件的信息与通信工程、电子科学与技术等,偏软件的软件工程等,综合型的计算机科学与技术。二级学科诸如物联网工程、网络安全、数字媒体技术都可以找到自己的归属。除了专业分软硬,课程也分软硬,比如数据结构与算法、编译原理、数据库原理等都是偏软件的专业,操作系统、计算机组成原理、计算机体系结构等都是偏硬件的专业,计算机网络、计算机图形学等涉及的面比较杂,故不做分类。

划重点,这些课程作为计算机专业的基础课,所学内容均为本科期间力求掌握的内容,虽不需要过深钻研,但也要了然于心,切不可浅尝辄止,这对考研和就业都极为重要。
考研的角度来说,以一级学科计算机科学与技术为例,计算机专业统考408(考研科目序号)包括数据结构与算法、操作系统、计算机组成原理、计算机网络四门课程。
就业的角度来说,国内互联网大厂相关技术岗位招聘均要求掌握数据结构与算法,熟悉操作系统、计算机组成原理、计算机网络的相关知识,虽没有考研难度高,但也是必要条件。


基础篇

C语言

编程语言是编程的工具,计算机相关专业的学生必须具备足够的编程能力。当然,关于“最好语言”的争论从来没有休止过,这里要强调一下:语言的选择真的没那么重要,编程语言本身才是要学习的内容,即使你现在学了Java,很有可能将来需要做python的工作,学习语言的过程最重要是语言的机制。要记住,在入门阶段不应过多的去考虑哪种语言更有前景。
对于初学者来说,以C语言入门自然是不错的,大多数大学也乐此不疲,当然其中不乏直接上手C++、Python的学校。对于C语言来说,不要求你学的多好,但一定要学的扎实,它决定了你以后学习任何一门语言的速度。大一大二期间要会用编程语言作为自己的开发工作,到后面你了解到编译原理才会对语言本身有新的认识,语言的本质都是一样的,因为计算机认识的不过是0和1。

数据结构与算法

掌握了C语言之后,接下来就会接触到数据结构与算法,实际上初学者很难分清什么是数据结构、什么是算法。这是一门颇有难度又饶有趣味的专业课,对于注重就业的高校来说,这部分的知识并没有足够强大的师资力量去支撑,这也导致了老师讲的不够透彻,学生也不愿意花精力去学习。从就业角度来说,对于开发中小型的系统,基础的数据结构与算法是足够用的,但这并不适合大型项目的开发。不熟悉这一块内容的学生,基本在工作3-5年后都会遇到瓶颈。而像BAT这类的互联网大厂招聘应届生时是非常重视数据结构与算法的,因为他们需要懂得这些知识的人才去做大项目的一颗颗螺丝钉,你这颗螺丝钉需要非常的“合格”才能放到规范化的流水线上。你说你想做全能的瑞士军刀?我告诉你大学期间你可以随心所欲的汲取你感兴趣的知识,但务必术业有专攻。
计算机专业的学生都会知道ACM,这是计算机领域的顶级程序设计竞赛,能够在比赛中得奖更是难上加难。一个优秀的ACMer需要付出常人2-3倍的努力才能有所成就,很多获奖者都是从初高中就参加信息学奥赛,所以如果你有天赋,那就尽全力去做;如果“尽吾志也而不能至者”,“可以无悔矣”。对于本科生来说,可以不以ACM获奖为目标,但切莫认为ACM是空中楼阁与己无关,实际开发中很多内容需要这样的编程技术,数据结构与算法仍然是计算机专业学生需要攻坚克难、反复琢磨的基础知识。

Linux && macOS

计算机专业的学生不能只会用Windows一个操作系统,
首先来说大多数据库、运维、安全的技术岗都是需要使用Linux进行维护的,很多开发岗也会选择mac的XCode进行开发。部分学校会开Linux的相关课程,相比于编程的硬实力,这些内容可以作为课下闲时充电的内容,而且要用得和Windows一样熟才行。大一大二期间要学会多操作系统的使用,到后面你开始操作系统的课程才会对OS本身有新的认识,操作系统的本质也都是一样的,无非是管理计算机资源并提供用户交互的系统软件而已。
很多初学者以为Linux很难,其实不然,既然是操作系统,Linux开发出来也是给用户用的,只不过专业人士用的多一点罢了。很多操作都是非常简单的,而且在学习Linux的过程中,你会逐渐拓展自己的视野,你会了解到如何挂载镜像,如何配置虚拟机,如何使用命令行(linux下的命令行可以在windows的powershell里使用,非常好用)。而且如果你要学习偏硬件的岗位,例如嵌入式开发等,Linux更是必不可缺的要求。

面向对象编程

C语言只能使用面向过程的开发方式?你可以说这句话没问题,也可以质疑这句话。没错,实际上C也是可以使用面向对象的编程思想的。请仔细思考编程语言的本质。
你的第二门语言可能是C++、JAVA、C#等等,这些语言都有一个共性:OOP(面向对象编程)。这和面向过程编程不一样,你不会再写一大堆混乱的函数来实现不同的功能,你要开始通过类与对象来做更好玩的事情。如果你的C语言基础打得非常好,再学任何一门语言你都会是轻松的。唯一困难的就是思想的转变,面向过程编程思想–>面向对象编程思想。到这个时候你就已经真正进了计算机专业的大门了,虽然这个时候你才大一下学期或者大二上学期。这个时期你一定要多学东西,当然第二门语言并不意味他将成为你的全部,我推荐你去多接触一下C++、Python、JavaScript、Lua等等。刚刚入门的小白需要迅速增加知识储备,越广泛越好,你了解的越多,你越能明白你自己以后想要的是什么。这和我上面提到的瑞士军刀的例子是共通的,很难说一门课两门课就能让你定下来未来几十年的工作方向,所以大学期间努力涉猎各个领域,你总会发现让你眼前一亮并愿意为之奋斗一生的事业。

数据库与SQL

毋庸置疑,数据库的基本操作都是要会的,无论你以后是做什么方向的工作,所有的工程都是要有后台数据库的。初学者最好使用Mysql + 可视化工具Navicat进行学习,当然学校有自己的要求就按学校的来。一般SQL的学习都是穿插在理论学习之中的,即使以后你不是专门要做数据库这方面的工作,SQL的大多数操作都是必须会的知识。

GitHub && SVN

大学课程并不会开设GitHub,这也属于闲时充电的内容。对于程序员本身来说GitHub可以很好的作为一个代码仓库保存大学期间所学所用,如果你的项目能多有几个star也是简历上不可多得的加分项。而公司内部大多采用内部SVN进行版本控制和协同开发。GitHub的基本操作非常简单,命令行操作也就几个常用的命令,基本上1-2天都能学会,至于团队开发最好还是实际项目中运用一下,尝试创建分支、合并分支等基本操作,出现了不懂的地方继续充电。


web前端开发

HTML+CSS

近两年挺火热的一个方向,产生的原因在于web领域前后端分离的趋势,前端的定义早已不局限于切图、美工之类的工作,从基础的HTML+CSS到各种前端框架都是这个方向需要学习的。大学生推荐直接学习HTML5+CSS3,它们是HTML+CSS的新标准,虽然有些浏览器(例如ie,前端开发者永远不可避免的浏览器)不兼容新的标准,但是随着时间的推移,新的标准必然会取代旧的标准,尤其是HTML5的canvas标签要深入的学习,没有一个网页出来效果是单纯的文字。

JavsScript

前端三剑客除了HTML+CSS,当然还有JavaScript,初学者迷惑JavaScript与Java的关系,这里告诉你,它们的关系就和雷锋与雷峰塔,张三与张三丰的关系一样!!!一点关系没有。当然JavaScript也有新的标准那就是ECMAScript6(ES6),JavaScript本身并不是严格的面型对象编程的语言,但是新的标准能够更适应面型对象编程,能够提高开发者的工作效率,当然也是有部分浏览器目前还不能实现完全支持ES6标准。当然学JS后并不推荐再学习Jquery了,前端技术日新月异,Jquery作为早期JS的好搭档现在已经逐渐不再适用。

前端框架Vue、AngularJS、React

学前端要比学后端更要掌握时代的趋势,不断学习新的事物,才能立足于前端。永远不要认为前端简单而学前端,任何一个深入学习过前端的人都会告诉你,前端的水比后端深多了。前端三大主流框架Vue、AngularJS、React,推荐先入手Vue,这个框架简单易用,能够帮你快速度过前端小白的阶段。不推荐全都学习,每个互联网公司都有自己的标准,比如阿里习惯React,谷歌自用Angular,中小公司也青睐vue。一旦你学过其中两种之后,你会发现很多内容惊人的相似,所以再学习框架的时候千万记住要学思想,这样才能够及时的适应时代的需求。

你以为这就完了?不不不,这才是开始。

  1. 对于一个工程性的大项目,混乱的外部js文件会把工程搞得一团糟,这里就继续学习Webpack打包工具了,不过2018年一个新的工具项目parcle在github上获得了不少的star,简单方便,大有超越Webpack的趋势。
  2. 现在市面上的ES6标准还是用的不如ES5,那如果出现了冲突怎么办呢?这时候你就要学习Babel了,这个东西能够帮助你做好两个标准的兼容问题。
  3. JavaScript还没学好的同学,TypeScript现在又火爆起来了,还不赶快加入学习!!!
  4. 认为前端只能作页面?NodeJs已经开始做后端的事情了!!!
  5. 认为前端不能做exe桌面应用?Electron已经开始做跨平台的桌面应用了!!!

前端水很深,不是简单几段文字能够描述清楚的,如果真心想学前端,不然认真的如把上面的内容百度一翻,虽然仅仅是了解,但是你已经做到先人一步了。

web后端开发

后端开发有很多种形式,Java、Python、Go、PHP都能做。

Java全家桶

这里以Java为例,毕竟现在大学教育都主要以Java为主要课程,授课流程基本都是从Java SE 到Java Web,再到Java EE、Java ME。小白估计又懵了,这里说的Java SE就是我们平时说的Java,SE表示是Standard Edition,这也是后面所有java技术的基础。而Java Web是Java的一种web技术,随着前后端分离架构的提出,已经呈现衰退趋势。使用ava Web开发的是早期前后端混合开发的模式,也就是后端程序员自己写HTML,使用Java语言编写Web,Jsp+Servlet+Javabean是Java Web的基本组成,这也是MVC的一种基本框架,很多图书馆管理系统、订票系统等都是Java Web做的。我们目前见到的各种花哨的网页其实或多或少都有前后端分离的成分,前端页面通过javascript的加持变得动态真实。致力于做Web后端的同学,不需要精通各种js实现,基本的前后端对接的知识却是需要掌握的。而Java EE,它的英文是Enterprise Edition,它是面向企业级开发的一个语言平台,熟练掌握Java EE的各种特性是后端程序员的必修课。Java ME,英文名称Micro Edition,它是一种面向嵌入式的语言平台,不想做偏硬件的同学可以不做研究。

操作系统与计算机网络

这两个课程是计算机专业的基础课程,java开发的一个主要特点就是多线程,而对于操作系统的整体认知都要来源于这门课程,你需要知道什么是并发运行,IO设备到底是如何管理的,计算机到底是如何运行的。Java的工程大多规模较大,需要应对高并发的一些情况,一个后端开发者应熟练的使用stream APi控制对象集合,掌握RxJava这种具有函数编程风格的库或者框架。在Java网络编程领域,哈诺德 (Elliotte Rusty Harold) 的那本《Java网络编程》是非常经典的书籍,非常有必要去踏实的学习这一部分的内容。网络开发的经典框架是Netty,它是一种异步的、事件驱动的网络应用框架,能够快速开发高性能的网络服务器和客户端。JVM的底层机制在很多情况下都有非常重要的作用,这时候你一定会接触到Vert.x,这里不需要过深的研究,只要掌握其核心组件就可以了。

后端框架

后端框架的基础就是MVC,也就是之前说的Java Web的三大组成,但是企业中通常会用更方便的SSH(Spring + strtus2 + Hibernate)或者SSM(Spring + SpringMVC + MyBatis),没有好坏之分,不同的公司也会用不同的标准,Java框架的发展虽然赶不上前端的速度,但也是不断变化的,自然是要不断学习。

你以为这就完了?不不不,这才是开始。

  1. Java虽然不擅长做桌面应用,这方面还是C++、JS更强大一点,但是你应该懂一些Swing、ATW的技术,甚至是更加深入的学习Java Fx技术。
  2. 所有的工程都是由数据库的,JDBC都不懂怎么做开发?后端程序员不能局限于Mysql,还于精通Oracle的相关技术才行,最好再去了解一下Redis。
  3. 组件式开发能够加快开发,Maven技术能够快速搭建工程框架,开发者应该熟练运用这种技术。
  4. 不懂服务器的后端不是好运维,后端开发者不能局限于Java的Tomcat,像Apache、Nginx这样的服务器软件都应该有所了解。

移动端开发

移动端的主要设备为安卓手机和iphone手机,所以开发也要分为两个部分。
安卓原生APP开发 手机已经改变了人类的生活,各种各样的App层出不穷,而手机系统中80%以上都是Android系统,不到的手机系统是20%IOS,还有几乎可以忽略不计的其他系统。所以Android开发已经是现在App开发的主力军了,而Android开发一直以来都是基于Java语言的,直到这两年突然出来的黑马Kotlin。所有学习过Java的人都会了解过Kotlin,他们会惊叹Kotlin的友好,但是不得不说的是,Java还是现在的主流,Kotlin用在开发中还是有许多不稳定的情况,新技术的推广估计还要再等几年。要去熟悉Android的SDK,熟悉JNI机制,要不不断用各种项目练手,GitHub上很多不错的项目都可以fork下来自己学习。

IOS原生APP开发 国内IOS虽然受众不及安卓,但也是需要App的啊,现在的IOS开发基本上也有两种语言,Objective-C和Swift,其中Objective-C的在老项目的使用还是多一点,技术也比较成熟了。不过目前Swift大有统一IOS的趋势,学习IOS开发一定要紧跟IOS系统的发展,2017年9月份苹果公司推出了IOS的第11个版本,不要从很老的版本开始学。

你以为这就完了?不不不,这才是开始。

  1. 原生APP虽然性能较好,但是对于程序员的学习成本较高,即便是有java语言基础上手安卓开发也比较困难,而且大多高校并不开设移动端开发的课程。目前市面上出现了HybridAPP与WebAPP两种替代原生应用的APP开发,开发效率高,学习成本低,非常适合计算机专业学生尝试。
  2. HybridAPP采用前端开发技术,诸如ReactNative或者Ionic+Angular,使用JavaScript代码进行开发,经过框架的处理,转变为原生APP代码,得到所谓的HybridAPP。
  3. WebAPP则更进一步减少开发壁垒,直接采用JavaScript进行开发,最后通过封装直接得到Web版本的APP。所以打算参加APP开发大赛的同学推荐使用这种易学易用的开发技术。

游戏开发

很多学生喜欢玩游戏,对于计算机专业的学生,想做游戏的也不少,许多学生想学但是却苦无门路。在游戏领域最顶尖的大学是美国南加州大学(USC),而国内大学几乎没有开设游戏相关专业。基本上都是计算机相关专业的同学通过兴趣逐渐进入这个领域,到现在还在认为游戏是“精神鸦片”的思想已经十分落后了。

游戏软件作为软件的一种,在软件工程的领域被划分为C/S架构(Client-Server),这不认同Web的B/S架构(Browser-Server),可是我们仍然可以看做一前一后的开发方式,客户端开发和服务器开发。服务器开发如同web后端开发一样,是作为前端数据的提供者和处理者,这里不多赘述。而游戏客户端与前端开发较为不同,这是因为游戏涉及的效果和实现较为复杂,web开发者可以通过前端的HTML5技术实现简单的2D游戏,但是对于3D来说则需要引入相关的库才能实现。游戏软件涉及图形图像处理、物理系统、粒子效果、UI页面等多个内容,而这些内容大多又是可复用的,所以出现了游戏引擎用来将这些功能类库全部集成到一起,方便游戏开发者能够专注代码开发。
3D游戏开发 在图形图像处理这方面,这C++、C#这两种语言是非常优秀的,千万不要以为Java能做任何事情,在图形图像领域真正的老大是这两门语言。大的游戏公司一般都有自主研发的游戏引擎,而市面上的主流引擎以Unreal(使用C++语言)和Unity(使用C#语言)为主,而Unity 3D有免费的个人版本,更适合学习与小团队开发,所以市场份额更高。之前Unity还支持JS和Boo,不过已经取消了对Boo、JS的支持,即Unity目前只支持C#语言。游戏开发这方面没有基础的同学可以学习C#,并尝试使用Unity引擎开发小的Demo。另外,王者荣耀就是用Unity制作的,对游戏感兴趣的同学可以多了解一下。

计算机图形学 如果说语言是武器,那么算法就是各种技能,而图形学就是游戏开发领域的重要技能。图形算法可能比数据结构与算法中的内容还要复杂,对数理知识的要求更高。很多开发者不屑于算法学习,认为我只要做出好看的作品就可以了,但实际上不是这样的,计算机这个领域就是这样,只要你想深入学习一些东西,算法永远是不可避免的。有的大学生做了两、三个Demo就去应聘,能够头头是道的讲出来自己是如何用引擎做出来的,但是一问到底层机制却说不出来,这就是内功修炼匮乏的原因,而且工作的时间越长表现的越明显。这部分你应该尝试学习一下DirectX或者OpenGL图形接口库,深入理解图形处理的机制。
shader在游戏领域是个难点,它决定了你做出来的作品是基于外表的好看还是基于内在的好看,前者只要有绚丽的贴图、纹理就能做出来,但是后者确实要深入理解游戏引擎渲染机制,掌握掌握纹理映射、光栅处理、GPU机制的综合体现。这里推荐b站的教程,在游戏开发方面有很多好的资源。不要以为这就完了,还有GLSL和HLSL等着你去学,shader真的不是看几个视频就能学好的东西。

2D游戏开发 不过对于学习来说我们就不用考虑那么多了,像cocos2d-x引擎支持C++、Lua、JS三种语言的编程,是国内第一游戏引擎,全球第二游戏引擎(仅次于Unity),除此之外还有Egert、Layabox在国内公司的招聘中也经常出现。这些引擎大多都支持的一门语言就是JS(包括TypeScript)。有很多玩过3A大作的同学不屑于开发2D游戏,我觉得可以理解,但是如果你把研究cocos引擎作为研究游戏引擎的一部分呢?Unity引擎集成了大量的内容,你确实可以通过unity很快开发出游戏原型,但是你却很难深入学习到unity内部的原理。而cocos作为一款简单的2D引擎,具备了游戏引擎的各种,却比unity简化了不少内容,这对于引擎本身的学习是非常很友好的。提醒一下,这里的cocos2d-x可不是使用cocos creater哦。

数字媒体

Adobe全家桶 如果想要致力于学习这方面的内容,Adobe系统的Ps(图像处理)、AI(矢量图制作)、Au(音频处理)、Pr(视频处理)、Ae(视频特效处理)都是要会操作的。不需要精通,毕竟不是做专业的美工师。像这些软件不需要去购买高昂的视频去学习,许多网上课程已经足够学会基本操作类,如果想进阶最好是购买一本专业书籍来帮助提升。

FFmpeg 这个软件更偏向于计算机专业,其中的操作不如Adobe的简单,但是对计算机专业的学生还是很友好的,它是通过命令行来操作的,包含libavcodec(一个用于多个项目中的音视频解码器库)和libavformat(一个音视频格式转换库)。

3dmax与maya 3D图像建模领域的两大巨头,这就偏向于美工的技术了,需要一定的美术功底。这两个软件的基本功能都没有什么差别。

虚拟现实 3D立体技术包括3D建模与3D显示,虚拟现实就是基于3D显示的一种技术,这个领域最基本的语言是C++,与C#,基本都是通过游戏引擎渲染出来的。

人工智能

人工智能不同于传统的前后端开发,它对线性代数、高等代数的要求很高,许多计算都是通过矩阵来做的。许多小白会对人工智能(AI)、机器学习(DL)、深度学习(DL)感到迷惑,这里总结一下,机器学习的目标是实现人工智能,而深度学习是机器学习的一种方法,除此之外还有决策树学习、贝叶斯学习等方法

Python是现在最火热的一门语言,在人工智能领域尤为吃香。Python语法简单,各类第三方库能够在许多不同的领域发挥作用,以至于已经有部分的高校开始尝试用Python作为计算机专业的入门语言来讲授。即使是在Web开发方面,Python Web也毫不逊色。不过还是让Python在属于它的领域大放光彩吧。

CNN(Convolutional Neural Network) 翻译过来就是卷积神经网络,它是一种新型的人工神经网络结结构,利用这种技术在图像和语音识别方面能够得到更优的预测结果,这种技术通常用在深度学习中。Tensorflow它是机器学习领域的一个开源软件库,它能够支持Python、C++、Java、Go等多种语言。我们在用Python做机器学习的时候大多会用到TensorFlow库和numpy库,想学习人工智能的同学一定要掌握好TensorFlow,TensorFlow是最流行的,但不一定是最好的,它也有自己的一些缺点,所以不要以为机器学习只能使用TensorFlow。

OpenCV 人工智能自然会涉及图像处理,计算机视觉以及模式识别,而这个视觉库。如果想学习像人脸识别,动作识别等领域的知识,这个库是一定要学好的。这个库主要接口是C++语言,在图形图像处理这部分C++是占有统治地位的语言,当然也有支持Python的接口。

大数据开发

Scala 现在的大数据人才大多还是以Java语言为主,之所以写Scala是因为在后端开发部分写了Java的相关内容,这里想讨论点别的。这门语言因为有Spark的存在,被使用的概率多了不少。它是一门非常适合函数式编程的语言,而且这种语言兼容Java,能够运行在JVM上,也可以调用Java的类库,是大数据方向的学生不可不学的一门语言。

Hadoop是Apache公司下的一个大数据通用处理平台,它是大数据方向的必修课,学习Hadoop不仅仅是学会搭建集群,还要掌握使用Hive(Hadoop架构之上的数据仓库)对数据进行精炼、查询、分析,通过HDFS(Hadoop分布式文件系统)来处理大规模的数据集等等。

MongoDB 大数据方向的学生不能局限于结构化的数据库,像MongoDB这样的非结构化数据库才是将来工作使用的主流数据库。

网络安全

密码学 解密与加密永远是网络安全的重要组成部分,密码学一定要系统的学习,因为网络安全的整个学习过程都要围绕密码学展开,很多学校没有专业的密码学课程,或者根本不知道什么是密码学。这就需要多买几本经典的密码学书籍来看看了,而且要多花精力来学习才行。

黑客攻防 网络安全方向的学生一定要以一个黑客的标准来要求自己,这里的黑客是指白帽黑客(不明白的可以参考百度百科黑客),这里就需要深入的学习Unix/Linux的底层机制了,市面上大多数的服务器都是以Unix/Linux为操作系统的,很少是Windows。要深入了解计算机网络模型的安全机制,理解防火墙的工作原理。对于Web安全、漏洞分析、0Day攻击、IDS(入侵检测系统)、网络渗透都要有较深的理解、

逆向工程 分为不同的平台,诸如Windows、Android、IOS等等,逆向工程要深入了解计算机组成原理,熟练掌握汇编语言,能够用C/C++进行基本的编程。逆向工程有许多分析工具可以用,例如IDA Pro、WinDbg等等,这些调试工具能够大大提高逆向分析的效率,要熟练掌握。


计算机领域现在已经渗透到各行各业,各种计算机相关的岗位层出不穷,上面仅仅罗列了一些博主熟悉的方向,当然热门的方向还有物联网(IOT)、通信技术等等,由于博主的知识储备非常有限,对这些领域了解的不多,所以就不班门弄斧了。文章涉及多个领域的专业内容,大可挑选自己感兴趣的部分进行阅读,很多名词可能读者不甚了解,推荐看完文章进行百度或者谷歌。当然,文章仅供参考,每个人的学习路线还是要有自己决定的。谨以此文献给仍然迷失在大学生活中的计算机专业学子!!!

你可能感兴趣的:(曾经沧海)