计算机专业学生一定要学好这几门课
很多程序员,包括计算机专业出身的程序员,也包括通过自学成为程序员的非科班同学,在工作一两年后甚至更久后,基本上都会碰到技术瓶颈,由此可能产生很长一段时间的迷茫期。
在这个迷茫期,很多程序员都在思考类似自己是不是适合做程序员、是否要做一辈子程序员、是否要转行到其他职业,比如产品经理等问题。如果不能很快地得到这些问题的答案,那么这些程序员就会一直被这些问题所困扰,举步难行,浪费大好光阴。
这篇文章不是用来探讨程序员是否能干一辈子、程序员如何转型到产品经理等问题的。相反,这篇文章的目的是想要帮助那些迷茫的程序员能够更加坚定地在程序员的道路上一直走下去,甚至走的更远。
本文的题目是"计算机专业学生一定要学好这几门课",并不一定指的是计算机专业的学生才要学习、掌握这些内容,我认为任何程序员都有必要学习和掌握这些内容。
这篇文章的题目可以更改为"程序员必须认真学习的课程",但题目之所以没有这样定,一是因为这些课程基本上都是计算机专业本科所教授的课程,所以计算机专业的学生学好这些是有必要的,但同时非计算机专业出身的程序员也是非常有必要学习好这些课程的;二是以计算机专业的学生要学好的课程为题,更能体现这些课程的价值,也能在一定程度上激起非计算机专业程序员的兴趣来学习这些课程。
几乎所有的程序员,刚开始学习编程时,都是先从具体的编程语言开始学起的。由于早期还没有高级语言出现,所以很早之前的程序员所能接触到是汇编语言、机器语言,甚至是直接操作电子电路来编程;而近几十年,由于高级编程语言的出现,程序员首先接触到的都是这些高级语言,比如Python、Java、C++等等。
对于刚开始学习编程的同学来说,能够用正在学习的高级语言做出一些软件,是学习时的根本动力,也是最终目标。所以,在这个阶段,大家都是如饥似渴、孜孜不倦地学习着如何用Python、Java、C++等编程语言写出一些诸如贪吃蛇、课程管理系统等软件,以此来展示自己学会了某种编程语言。
当某个同学能够用某种编程语言来写出一些别人写不出的软件时,就开始自认为学会了编程,同时也自认为掌握了计算机科学的相关知识。于是这位同学进入到了一家公司开始做着程序员的工作,也许这份工作还很不错。每天按时完成既定的编程任务、学习着最新的编程技术,一切都过得开开心心。
可是,在不断学习的过程中,不时或者经常地感觉到困惑、或者一头雾水,而这种感觉又无法描述,说不清道不明。比如在学习编程语言时,别人说Java是面向对象的,而C语言是面向过程的,可什么是面向对象,什么是面向过程?我真的懂面向对象么?为什么在工作中我体会不到面向对象的好处呢?
再比如说Java是静态类型语言,而Python是动态类型语言,那么什么是静态类型语言?什么又是动态类型语言呢?
再比如学习多线程编程时,经常会碰到锁、互斥、信号量等等概念,那这些概念又代表着什么呢?
再比如最新出现的Kotlin语言比Java语言拥有更好的语法糖,那语法糖是什么呢?
等等诸如此类的疑问,会不时地在我们的学习的道路中出现,甚至阻碍我们前进的步伐,使得我们只能浮于表面,不能抓住技术的本质。而这,正是本篇文章想要表述的,希望每个程序员能够认真地学习、掌握下面几门课程:
1、数字电路
2、计算机组成原理
3、汇编语言
4、计算机操作系统
5、计算机编译原理
6、离散数学
7、数据结构与算法
8、计算机网络
当然,程序员需要学习的还有更多,不过这里列出的都是计算机本科期间学习到的课程,并且这些课程都非常重要。估计很多同学像我一样,大学本科期间忙着学习高级编程语言,而无暇顾及这些课程,或者当时根本就听不懂或者不知道学习这些课程有什么用。不过,我认为现在是时候来好好认识下这些课程了。
对于上图,相信计算机专业的同学肯定不会陌生,是计算机系统层次结构图。从下往上代表着从计算机硬件到软件,最下层是计算机硬件部分,最上层代表着我们用编程语言写出的应用程序。这里每一层都代表着上面八门课程的一门或者两门课程。
硬联逻辑:代表着计算机硬件,也就是电子元器件。数字电路和计算机组成原理这两门课则专门用来阐述如何通过电子元器件来表示计算机中的1和0,同时这些电子元器件是如何配合以及如何计算的。这是计算机的根本,也是程序员最应该掌握的。
微程序:硬件级别的程序,这一层没有专门的课程来介绍,不过可以综合计算机组成原理和汇编语言来理解此层。
机器语言:初步印象中,提到机器语言,首先想到的就是01代码,这是软件和硬件的分界线,可以通过汇编语言来理解此层。
操作系统:此层主要有两个作用,一方面是为上层的编程语言提供接口,另一方面则是管理底层的硬件操作。在此层引入了非常多并且非常重要的概念,比如线程与进程、并发、信号量、锁、内存管理等等。
汇编语言:早期的程序员首先是用纸带上打孔来编程的,可以理解为直接用01来编程;而后为了方便开发,则发展出了汇编语言,可以通过add等简单的命令来实现一些基本的程序逻辑;后来才发展出现在的高级语言。所以,理解汇编语言,对理解高级语言有直观重要的作用,并且目前很多程序的底层也是用汇编来实现的。
高级语言:高级语言则是之前提到的Python、Java、C++等编程语言,对于很多程序员学习的技术基本上都是在这一层。不过高级语言想要运行在机器上,一般都会经过编译器进行编译,或者通过解释器进行解释执行,而编译器和解释器则是在计算机编译原理这门课中讲述的,之前提到过的语法糖等概念也是在这里介绍的。
最后三门课离散数学、数据结构与算法、计算机网络则在此结构图中没有体现,不过这三门却是贯穿整个系统结构的,上述提到的各个层级中,都或多或少地用到了这三门课程中的相关知识点。需要特别提出的则是数据结构与算法这门课,对于应届生而言,这门课是企业面试的重点;对于已经工作的同学而言,这门课是技术提升的关键。
以上这些课程的学习并不是一朝一夕能够搞定的,也不是在大学期间就能够完全学懂的,不过如果有可能,还是尽自己全力能掌握多少就掌握多少,剩下的不是特别明白的,需要在以后的工作中慢慢体会、慢慢理解。
因此,无论是对于大学生还是对于已经工作的同学,都不能急于求成,需要持续不断地学习,这个过程可能持续三至五年,甚至更久。
链接:https://www.jianshu.com/p/ab20dc455132