大家好,很高兴再次见到大家,我是你们的朋友全战军。
2020.6.18 重新添加并修改部分内容
谨以此文献给所有还在大学生活中迷茫的计算机科学专业的学生!!!
不管你是怎么选择这个专业的,我想告诉你,这是一个很深奥的领域,如果你对它没有热情,还是趁早转行吧。
阅读本文首先需要明确自己的专业是偏向硬件还是偏向软件(本文主要针对计算机科学与技术专业,不涉及偏向硬件的内容)。文章目录链接如下:
计算机相关的专业其实涵盖的范围很广,有偏向硬件的信息与通信工程、电子科学与技术,也有偏向软件的软件工程,也有综合性的计算机科学与技术。物联网工程、网络安全、数字媒体技术等二级学科都能找到自己的一席之地。除了专业有软硬之分,课程也有软硬之分。比如数据结构与算法、编译原理、数据库原理等都是偏向软件的专业,操作系统、计算机组成原理、计算机体系结构等都是偏向硬件的专业,而计算机网络、计算机图形学等涉及比较复杂的方面,所以就不分类了。
重点是这些课程都是计算机专业的基础课,所学的内容是本科期间力争掌握的,虽然不需要学得太深,但一定要了解清楚,不能停留在表面。这一点无论对考研还是就业都极其重要。从考研来看,以计算机科学与技术一级学科为例,计算机专业统考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,那会是简历上不可多得的加分项。大部分公司内部使用 Github/SVN 进行版本控制和协作开发。GitHub 的基本操作很简单,只有几个常用的命令行操作,1-2 天就能学会。至于团队开发,最好在实际项目中使用,尝试创建分支、合并分支等基本操作,不懂的地方继续学习。
Web前端开发 HTML+CSS
这是近两年比较火的话题,究其原因,就是web领域的前后端分离,前端的定义不再局限于切图、美工设计之类的工作,从基础的HTML+CSS到各种前端框架,都是需要往这个方向学习的。建议大学生直接学习HTML5+CSS3,这是HTML+CSS的新标准。虽然有些浏览器(比如IE,这是前端开发人员必选的浏览器)对新标准不兼容,但是随着时间的推移,新标准必然会取代旧标准,特别是HTML5 canvas标签,更需要深入学习。没有一个网页会是纯文本的。
JavaScript
前端三剑客除了HTML+CSS之外,还包括JavaScript。初学者对JavaScript和Java的关系很困惑,这里我告诉你,他们的关系就好比雷锋和雷峰塔,张三和张三峰的关系!!!根本没有关系。当然JavaScript也有了一个新的标准,就是ECMAScript6(ES6)。JavaScript本身并不是一门严格的面向对象编程语言,但是新的标准可以更加适合面向对象编程,可以提高开发人员的工作效率。当然目前有些浏览器还不能完全支持ES6标准。当然不建议学完JS再去学Jquery,前端技术日新月异,Jquery作为早期JS的好搭档,现在已经逐渐不适用了。
前端框架 Vue、AngularJS、React
学前端比学后端更需要把握时代潮流,只有不断学习新的东西,才能在前端站稳脚跟。千万不要以为前端简单就学前端,任何深入研究过前端的人都会告诉你,前端的水比后端深很多。前端三大主流框架是Vue、AngularJS、React,建议从Vue入手,这个框架简单易用,能帮你快速度过前端新手阶段。不建议全部学,每个互联网公司都有自己的标准,比如阿里巴巴用的是React,Google用的是Angular,中小型公司也青睐Vue,学过两个之后,你会发现很多内容出奇的相似,所以在学框架的时候,一定要记得学习思路,这样才能及时适应时代的需求。
你以为这就是结束吗?不,不,这只是开始。
前端很复杂,不是简单的几段话就能说清楚的,如果你真的想学前端,还是认真百度一下上面的内容吧,虽然你只是有所了解,但你已经领先别人一步了。
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的一种网页技术,随着前后端分离架构的提出,已经呈现没落的趋势。Java 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项目大多规模较大,需要处理一些高并发的情况。一个后端开发人员应该熟练使用流API来控制对象集合,掌握RxJava这个具有函数式编程风格的库或框架。在Java网络编程领域,Elliotte Rusty Harold的《Java网络编程》是一本非常经典的书,非常有必要扎扎实实地学习这部分内容。网络开发的经典框架是Netty,它是一个异步的、事件驱动的网络应用框架,可以快速开发高性能的网络服务器和客户端。JVM的底层机制在很多情况下都起着非常重要的作用。这时候你一定会接触到Vert.x,大学期间不需要学得太深,掌握它的核心组件就可以了。
后端框架
后端框架的基础是MVC,也就是前面说的Java Web三大组件。不过企业通常使用比较方便的SSH(Spring+strtus2+Hibernate)或者SSM(Spring+SpringMVC+MyBatis),没有好坏之分,不同的公司会使用不同的标准。Java框架的发展虽然赶不上前端的速度,但也在不断变化,自然需要不断学习。
你以为这就是结束吗?不,不,这只是开始。
移动开发
移动设备主要有安卓手机和iPhone手机,所以开发也应该分为两部分。安卓原生APP开发手机改变了人类的生活,各种APP层出不穷,80%以上的手机系统都是安卓系统,不到20%的手机系统是IOS,其他系统几乎可以忽略不计。所以安卓开发现在成为了App开发的主力军,而安卓开发一直都是以Java语言为主,直到近两年黑马Kotlin的异军突起。学过Java的都会知道Kotlin,都会惊叹Kotlin的友好,但是不得不说现在Java还是主流,Kotlin在开发上还是有很多不稳定的情况,新技术的推广估计还要等几年,需要自己熟悉Android的SDK和JNI机制,或者不断用各种项目去练习,GitHub上很多不错的项目可以自己fork研究一下。
国内的IOS受众虽然不如安卓,但是也需要APP。现在IOS开发基本就两种语言,Objective-C和Swift。Objective-C在老项目中用的比较多,技术比较成熟。不过Swift目前有统一IOS的趋势。学习IOS开发一定要跟上IOS系统的发展,2017年9月苹果推出了IOS11版本,不要从很老的版本开始学习。
你以为这就是结束吗?不,不,这只是开始。
虽然原生应用性能更佳,但对于程序员来说学习成本较高,即便有 Java 基础,也难以入门 Android 开发,而且大部分大学也没有开设移动开发课程。目前市面上替代原生应用的 APP 开发主要有两种:Hybrid APP 和 Web APP,开发效率高,学习成本低,非常适合计算机专业的学生尝试。Hybrid APP 采用前端开发技术,如 ReactNative 或者 Ionic+Angular,使用 JavaScript 代码进行开发,经过框架处理后转化为原生 APP 代码,得到所谓的 Hybrid APP。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)。另外艾格特、Layabox等也经常出现在国内公司的招聘中。这类引擎大多支持JS(包括TypeScript)。很多玩过3A大作的同学都不屑于开发2D游戏。这个可以理解,但是如果把cocos引擎作为学习游戏引擎的一部分来学习呢?Unity引擎整合了很多内容,你确实可以通过unity快速开发出游戏原型,但是你很难深入学习unity内部的原理。作为一款简易的2D引擎,cocos具备了一个游戏引擎的基本组成部分,但是相比于unity简化了不少内容,对引擎本身的学习很友好。提醒一下,这里的cocos2d-x不使用cocos creater。
数字媒体
如果想学这方面的话,需要会操作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++语言,这是图形图像处理中的主流语言。当然也有支持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(入侵检测系统)、网络渗透等有深入的理解。
逆向工程分为不同的平台,例如窗口,Android,iOS等。反向工程需要深入了解计算机组成的原理,熟练的汇编语言以及在C/C ++中执行基本编程的能力。有许多用于反向工程的分析工具,例如IDA PRO,WINDBG等工具。
现在,计算机领域已经渗透到各行各业,各种与计算机相关的位置都在无休止的流中列出。许多名词可能会被读者理解。