同窗们好,我是王老师——二哥呀!(笑喷)前端
好巧!前几天有同窗私信问过我这个问题:大学计算机专业,面临分专业,计科,软工,大数据,物联网,网络工程,该选什么?再加上高考结束后填报志愿,想必有不少同窗挺迷茫的。git
我就来(主观地)一一分析下,从后往前。github
网络工程,听起来还算是蛮高端大气上档次的,你们能够去百度百科或者维基百科看一下这个专业的解释。个人理解是网络工程是将计算机以及其余设备串联完成网络通讯,以及智能化监控的学科。主要的分支有:路由交换、网络安全、无线网络等等。算法
我以前在的一个公司(十年前了),一百多号开发,但就两三个网络专业的人才,他们很重要,一旦机房的网络出问题,都得靠他们解决。嗯,说句“心怀鬼胎”的话,日常咱们最喜欢的一件事就是网络出问题,或者公司断电,嗯,天赐的“摸鱼好时机”。固然了,这种机会很少,这两三位同事老是能在最短的时间内把问题解决掉。数据库
物联网,也简称为 IoT,是近些年比较火的一个概念,是指将平常的物理对象链接到互联网的过程——从医疗设备,到可穿戴设备,小到智慧家居,大到智慧城市。编程
先说说我家的状况吧,比较经常使用的智能设备有两个,一个是扫地机器人,须要地面墙角比较规整一点才能比较顺利地完成清洁工做;一个是小夜灯,人通过的时候就亮起来,过一会本身就灭了,但常常夜里翻个身它就亮了,还有点“智障”。后端
相对来讲,物联网还有很大的发展空间,好比智慧交通,再好比智慧农业,具体点的例子就是经过湿度传感器来自动触发灌溉等。安全
大数据,也就是 Big Data,我了解到的适用于大数据的技术有:分布式文件系统、分布式数据库、云计算平台、可扩展的存储系统等。奥巴马曾说“大数据”是将来的石油,可见其重要性。markdown
大数据专业是典型的交叉学科,不只涉及到计算机,还会涉及到数学和统计学,不只对学校的学科实力有要求,对我的的硬性基本功也是有要求的。网络
软件工程专业是以计算机科学为基础的,更增强调软件开发的工程性,包括软件需求分析、软件设计、软件测试、软件维护和软件项目管理等。
计算机科学,也就是计科(Computer Science,简称 CS),不只会研究计算机的硬件,也会研究计算机的软件,更具体的主题包括编程语言、程序设计等。
先插个楼,开局一张图:计科最佳指南。
我以前读过邹欣大佬(目前是 CSDN 副总裁)的一本书——《构建之法》,第一章就对软件工程和计算机科学的关系作了解释,它们开设的课程很类似,但本质上它俩是彻底不一样的。
计算机科学这一学术领域能够分为:计算机理论、信息和编码理论、算法和数据结构、形式化方法、编程语言等。
偏实践的领域:计算机体系结构(或者叫计算机组成原理)、操做系统、计算机网络、安全性和密码学、人工智能、计算机图形学、人机交互、嵌入式系统和软件工程。
按照武侠小说来说,计算机科学更像是九阳神功、乾坤大挪移这种顶级内功;而软件工程更像是七伤拳、龙抓手、太极拳法等武功招式。在内功浑厚的基础上,武功招式就能够打出最大的伤害值。
另外还有一种比较功利性的说法:若是打算本科毕业后就参加工做,可选软件工程,若是打算考研进修,可选计算机科学。
不过,在我看来,不管选择计算机科学仍是软件工程,大部分同窗最终的选择都是作一名软件工程师。(落脚点仍是很实在,增删改查嘛,hhh)
固然了,软件工程师能够分为两种:一种是充分理解了计算机科学,从而有能力应对充满挑战的创造性工做;另外一种仅仅凭着对一些高级工具或者框架的熟悉而勉强应付。
第一种工程师能随着时间的流逝,不停地成长,最终成为技术大牛;而第二种工程师每每浮于表面,只学习某些特定的工具和技术,而不研究底层的原理,慢慢就会停滞不前。
我我的的总结就是,软工的内核仍是计科,计科学得好,软工、大数据、物联网、网络工程都是能够自如应对的。
接下来就很重要了!怎么才能好学计科呢?怎么才能成为别人眼中的大牛呢?
先说理论。
若是你要学习物理,我推荐你顺着物理的发展史学习,先学习牛顿的经典物理,再学习热力学、电磁学,而后学习相对论、量子力学这些完全推翻经典物理的,最后学习电动力学这种硬核的。
整个学习过程,是自底向上的。学计科也要这样吗?
先学习电路,而后学习冯诺依曼结构,造一台计算机?接着再学习如何用汇编写个 mini os?接着学习如何写一个简易版的编译器?最后再学习高级编程语言,好比说 Java、Python、C++?
显然这样是行不通的!计算机科学的学习最好是自顶向下。
什么是顶?在我看来,就是一门高级的编程语言,好比说 Java、C++ 或者 Python。我我的从事 Java 后端开发的时间比较久,因此仍是拿老本行来讲。
当你学习到 Java 并发编程中的“原子性”、“同步”、“异步”、“进程”、“内存分配”这些概念的时候,你天然而然会产生不少疑问,而后就会去学习操做系统,学习计算机组成原理,而后你的一系列问题就会逐渐被解决。
当你在学习 Java 的时候遇到性能问题时,你就会去研究,啊,原来 Java 是一门解释型的编程语言,而 C 语言是一门编译型的编程语言,因此 Unix/Linux 这种操做系统要用 C 语言来实现,由于要最大限度的压榨硬件的瓶颈。
固然了,Java 为了提高自身的性能也是费尽心思,好比说即时编译(JIT,Just-In-Time)经过在运行时将字节码编译为本机机器代码来提升性能;好比说垃圾回收机制的升级,从 GC 到 ZGC,GC 的痛点在于垃圾回收期间,全部的线程都会中止活动,等待 STW(Stop The World)的结束,而 ZGC 在标记、转移和重定位阶段几乎都是并发的,大大缩短了停顿的时间。
跑偏了,继续来讲。
当你用 Java 实现某个业务需求时,发现人家的算法实现比你快得多,你天然会好奇,为何会这样?而后你发现人家用的数据结构和你的不一样,接着你就会去学习数据结构,再了解一些高效的算法,好比动态规划等。
你看,从学 Java 的语法开始,你一步步学到了操做系统、计算机组成原理、数据结构与算法。
跟着需求去学习,才能真正学好计算机科学。
我也会给你推荐《CSAPP》这本黑皮书,毕竟永远的神,但若是你没有编程基础就去啃,你可能很快就会被劝退的;反而,一开始,你读一读我写的《教妹学Java》,或者去 B 站上看尚硅谷或者动力节点这些培训机构的 Java 视频课,没准你会越学越以为有信心——这么简单的东西,我这么聪明,还能学不会?你会有这种自信的错觉的!
反而一开始去啃 CSAPP,你会感受,老天!我特么是个废材啊,我学的什么鬼玩意,这居然看不懂,学不会?
你可能要问,编程语言有不少种,Java、Python、C/C++、Go、JavaScript 等等,选哪个呢?
选择 Java 吧,常听人说“人生苦短,我用 Python”;选择 Python 吧,常听人说“Go 是 Google 的亲儿子,发展势头正劲”;选择 Go 吧,常听人说“前端(JavaScript 必学)更容易学习一些”;选择 JavaScript 吧,常听人说“C/C++ 具有现代程序设计的基础要求,是不少编程语言的基础。”
而后就又麻了!
我是从大一就开始学习的 Java,当时没有选择,由于不知道还有其余编程语言(嘘),学校让学 Java 就学了 Java。只能说很是的幸运,选对了。
那么同窗们也不须要纠结,前端、Java、Python、C++/C,到底怎么选?学校安排啥就学啥,若是学校没安排,那么选 Java 多是最朴实无华的选择,由于综合(就业岗位和薪资)考虑的话,Java 是其余编程语言没法替代的。
固然了,你也能够选择 C 语言,这也是一个没法反驳的选择,C 语言是其余不少编程语言的基石,学了这个,再学其余任何一门编程语言都是很好的基础,只不过,指针这块确实使人头痛!
选择一门编程语言后,踏踏实实地去学习,就会连根拔起不少其余方面的内容,好比说数据库、数据结构与算法、计算机组成原理、操做系统、计算机网络等等。
一个一个来解决。
C 语言:
推荐翁恺教授的《C 语言程序设计》,B 站地址:
Java:
你能够先看看我整理的这份 GitHub 上星标 115k+ 的 Java 教程,里面涵盖了 Java 全部的知识点,包括 Java 语法、Java 集合框架、Java IO、Java 并发编程和 Java 虚拟机,内容很少,只讲重点。
GitHub 星标 115k+的 Java 教程,超级硬核!
数据库:
数据结构与算法:
计算机组成原理:
操做系统:
计算机网络:
你可能要问,必定要按照这个次序吗?
答案是能够不按照,但我这里有 3 个重要的“先决条件”:
限于篇幅的缘由,学习资源我这里无法列全。
但考虑到同窗们的诉求,我上周末花了两天的时间,整理了一份 CS 自学指南,里面囊括了全部我认为值得推荐给你们的学习资料(有书、有视频、有公开课、有在线文档),这些学习资料不用怀疑,我都看过,虽然有些没有看完,已经在 GitHub 上开源了。
你能够大体按照我列出的顺序,借助我推荐的教材和视频课程,最好是二者兼顾,而后花 100-200 个小时去学完每个科目,而后在以后的程序生涯里,不断重温这些精华,你会来感谢个人!
要把这些内容所有学完,固然是须要花时间的,不可能一朝一夕就能完成,大学期间可能彻底学不完,即使是工做几年后仍然可能学不完,但相信我,你会在这条路上获得快乐,获得知足的。
还有什么比学习更重要的事情呢?
若是有,那就是给二哥点个赞,来个三连了!