计算机专业学生必定要学好这几门课!(转)

不少程序员,包括计算机专业出身的程序员,也包括经过自学成为程序员的非科班同窗,在工做一两年后甚至更久后,基本上都会碰到技术瓶颈,由此可能产生很长一段时间的迷茫期。程序员

在这个迷茫期,不少程序员都在思考相似本身是否是适合作程序员、是否要作一生程序员、是否要转行到其余职业,好比产品经理等问题。若是不能很快地获得这些问题的答案,那么这些程序员就会一直被这些问题所困扰,举步难行,浪费大好光阴。面试

这篇文章不是用来探讨程序员是否能干一生、程序员如何转型到产品经理等问题的。相反,这篇文章的目的是想要帮助那些迷茫的程序员可以更加坚决地在程序员的道路上一直走下去,甚至走的更远。算法

本文的题目是"计算机专业学生必定要学好这几门课",并不必定指的是计算机专业的学生才要学习、掌握这些内容,我认为任何程序员都有必要学习和掌握这些内容。编程

这篇文章的题目能够更改成"程序员必须认真学习的课程",但题目之因此没有这样定,一是由于这些课程基本上都是计算机专业本科所教授的课程,因此计算机专业的学生学好这些是有必要的,但同时非计算机专业出身的程序员也是很是有必要学习好这些课程的;二是以计算机专业的学生要学好的课程为题,更能体现这些课程的价值,也能在必定程度上激起非计算机专业程序员的兴趣来学习这些课程。网络

几乎全部的程序员,刚开始学习编程时,都是先从具体的编程语言开始学起的。因为早期尚未高级语言出现,因此很早以前的程序员所能接触到是汇编语言、机器语言,甚至是直接操做电子电路来编程;而近几十年,因为高级编程语言的出现,程序员首先接触到的都是这些高级语言,好比Python、Java、C++等等。数据结构

对于刚开始学习编程的同窗来讲,可以用正在学习的高级语言作出一些软件,是学习时的根本动力,也是最终目标。因此,在这个阶段,你们都是如饥似渴、孜孜不倦地学习着如何用Python、Java、C++等编程语言写出一些诸如贪吃蛇、课程管理系统等软件,以此来展现本身学会了某种编程语言。多线程

当某个同窗可以用某种编程语言来写出一些别人写不出的软件时,就开始自认为学会了编程,同时也自认为掌握了计算机科学的相关知识。因而这位同窗进入到了一家公司开始作着程序员的工做,也许这份工做还很不错。天天按时完成既定的编程任务、学习着最新的编程技术,一切都过得开开心心。并发

但是,在不断学习的过程当中,不时或者常常地感受到困惑、或者一头雾水,而这种感受又没法描述,说不清道不明。好比在学习编程语言时,别人说Java是面向对象的,而C语言是面向过程的,可什么是面向对象,什么是面向过程?我真的懂面向对象么?为何在工做中我体会不到面向对象的好处呢?数据结构和算法

再好比说Java是静态类型语言,而Python是动态类型语言,那么什么是静态类型语言?什么又是动态类型语言呢?编程语言

再好比学习多线程编程时,常常会碰到锁、互斥、信号量等等概念,那这些概念又表明着什么呢?

再好比最新出现的Kotlin语言比Java语言拥有更好的语法糖,那语法糖是什么呢?

等等诸如此类的疑问,会不时地在咱们的学习的道路中出现,甚至阻碍咱们前进的步伐,使得咱们只能浮于表面,不能抓住技术的本质。而这,正是本篇文章想要表述的,但愿每一个程序员可以认真地学习、掌握下面几门课程:

一、数字电路

二、计算机组成原理

三、汇编语言

四、计算机操做系统

五、计算机编译原理

六、离散数学

七、数据结构与算法

八、计算机网络

固然,程序员须要学习的还有更多,不过这里列出的都是计算机本科期间学习到的课程,而且这些课程都很是重要。估计不少同窗像我同样,大学本科期间忙着学习高级编程语言,而无暇顾及这些课程,或者当时根本就听不懂或者不知道学习这些课程有什么用。不过,我认为如今是时候来好好认识下这些课程了。

 
 

对于上图,相信计算机专业的同窗确定不会陌生,是计算机系统层次结构图。从下往上表明着从计算机硬件到软件,最下层是计算机硬件部分,最上层表明着咱们用编程语言写出的应用程序。这里每一层都表明着上面八门课程的一门或者两门课程。

硬联逻辑:表明着计算机硬件,也就是电子元器件。数字电路和计算机组成原理这两门课则专门用来阐述如何经过电子元器件来表示计算机中的1和0,同时这些电子元器件是如何配合以及如何计算的。这是计算机的根本,也是程序员最应该掌握的。

微程序:硬件级别的程序,这一层没有专门的课程来介绍,不过能够综合计算机组成原理和汇编语言来理解此层。

机器语言:初步印象中,提到机器语言,首先想到的就是01代码,这是软件和硬件的分界线,能够经过汇编语言来理解此层。

操做系统:此层主要有两个做用,一方面是为上层的编程语言提供接口,另外一方面则是管理底层的硬件操做。在此层引入了很是多而且很是重要的概念,好比线程与进程、并发、信号量、锁、内存管理等等。

汇编语言:早期的程序员首先是用纸带上打孔来编程的,能够理解为直接用01来编程;然后为了方便开发,则发展出了汇编语言,能够经过add等简单的命令来实现一些基本的程序逻辑;后来才发展出如今的高级语言。因此,理解汇编语言,对理解高级语言有直观重要的做用,而且目前不少程序的底层也是用汇编来实现的。

高级语言:高级语言则是以前提到的Python、Java、C++等编程语言,对于不少程序员学习的技术基本上都是在这一层。不太高级语言想要运行在机器上,通常都会通过编译器进行编译,或者经过解释器进行解释执行,而编译器和解释器则是在计算机编译原理这门课中讲述的,以前提到过的语法糖等概念也是在这里介绍的。

最后三门课离散数学、数据结构与算法、计算机网络则在此结构图中没有体现,不过这三门倒是贯穿整个系统结构的,上述提到的各个层级中,都或多或少地用到了这三门课程中的相关知识点。须要特别提出的则是数据结构与算法这门课,对于应届生而言,这门课是企业面试的重点;对于已经工做的同窗而言,这门课是技术提高的关键。

以上这些课程的学习并非一朝一夕可以搞定的,也不是在大学期间就可以彻底学懂的,不过若是有可能,仍是尽本身全力能掌握多少就掌握多少,剩下的不是特别明白的,须要在之后的工做中慢慢体会、慢慢理解。

所以,不管是对于大学生仍是对于已经工做的同窗,都不能急于求成,须要持续不断地学习,这个过程可能持续三至五年,甚至更久。同时,为了加快你们对这块知识的理解和掌握,下面简单推荐一些笔者正在学习和已经学习过的一些资料,但愿可以带给你们一些帮助。

一、数字电路

说实话,数字电路是彻底被低估的一门计算机基础课,其余大学笔者并不清楚,不过笔者的大学至少没有严肃地来对待这门课,致使笔者在大学期间基本上只了解了一下基本的逻辑门电路,对于更高级的知识则知之甚少。

另外,有关数字电路的书籍也很难找出比较出众的,适合初学者或者计算机专业读的书籍,因此这里也不打算推荐有关数字电路的书籍。

不过,有关数字电路的视频网络上倒有一些,好比清华大学、东南大学都有一些视频,你们能够自行百度搜索便可。

最近在中国大学MOOC网站上发现南京理工大学的数字逻辑电路的公开课,很是适合计算机专业的同窗,这里推荐给你们:

http://www.icourse163.org/course/NJUST-1001753091

二、计算机组成原理

计算机组成原理这门课很好地向咱们阐述了计算机是如何工做的,是如何计算和输出咱们想要的数据的,同时因为本门课是考研科目,因此各个大学都会有一些公开课视频,好比清华大学等,你们能够自行搜索获得,笔者就再也不推荐了。这里推荐的是笔者看过的几本书。

 
 

首先推荐的是两本比较通俗易懂的书《大话处理器》和《编码》,这两本书都偏科普一些,阅读起来相对轻松,也更有趣味性,是不错的入门书籍。

最近笔者在看的另外一本比较通俗易懂的书叫《穿越计算机的迷雾》,我的以为写的比上面两本更通俗一些,你们也能够先读这本书。不过因为这本书已经绝版了,你们能够尝试到淘宝上看可否找到。

 
 

最后须要重点介绍的是《深刻理解计算机系统》这本书,这本书是从程序员的角度来看待整个计算机系统的,因此是很是适合程序员的。可是这本书不只仅包含了计算机硬件的相关知识,同时还包含了包括操做系统、计算机网络等相关知识,所以须要读者具有相关的知识才能学得更好,不过从零开始也是能够的,不过可能会比较吃力些。

 
 

一个好消息是国外一些大学在使用这本教材来教学,而且有教学视频和实验课程,好比我看过的华盛顿大学的视频:

https://courses.cs.washington.edu/courses/cse351/

不过坏消息是这些视频是英文版的(因此学好英语是多么的重要)。

三、汇编语言

 
 

汇编是一门相对比较难而且抽象的课程,可是倒是能够方便地进行实操的一门课,就像学习编程同样,能够实际的去运行书中的一些代码。一样地,你们能够去找找网络上存在的一些公开课视频,笔者这里推荐一门比较经典的书,是清华大学出版社出版的《汇编语言》这本书,能够配合视频一块儿学习。

四、计算机操做系统

跟计算机组成原理同样,计算机操做系统一样是一门考研课程,因此网络上存在的资料是很是多的,你们能够自行搜索。不过笔者仍是须要推荐两本书,一本是笔者本科和研究生期间都学过的一本书《现代操做系统》,研究生期间有幸获得这本书的译者陈向群老师的亲自授课,也是学到很多知识。

 
 

另一本须要推荐的就是《UNIX环境高级编程》,这本书到底有多经典,笔者也不想多作介绍了,你们能够自行查阅。之因此须要推荐是由于这本书是基于Unix系统的,而不少程序员在工做之后接触到最多的操做系统差不过就是Unix或Linux操做系统,所以仍是很是有必要进行学习的。

五、计算机编译原理

不少自学编程的同窗(包括计算机专业和非计算机专业)都不是很清楚编程语言编译时到底发生了什么事情,而且对什么是编译期、什么是运行时都只知其一;不知其二。编译原理这门课就是告诉咱们高级语言是如何一步一步地被转化为低级语言,并最终可以在计算机上运行的。

 
 

书籍推荐的话固然是经久不衰的《编译原理》这本书了,教学视频的话,你们能够到网络上找下。

六、离散数学

离散数学我的认为对于计算机学生而言是很是重要的一门课,惋惜的是因为在本科期间对计算机认知的不够,致使在学习这门课的时候只是把它当作一门数学来学习,而且也没有花太大的精力来学习,相信对于大部分的计算机专业的同窗来讲也是这样的。

不过我认为若是有时间和精力最好仍是再从新学习这门课或者在大学期间就好好学习,并持续不断地来复习这么课中提到的知识,直到掌握为止。

 
 

离散数学在国内使用的教材比较偏向于数学层面,而且没有和计算机知识有太多的关联,不过《离散数学及其应用》这本书比较好地阐述了离散数学的相关知识,而且和计算机中经常使用的知识进行告终合,学习起来更为顺畅。

七、数据结构与算法

相信不管是已经毕业的同窗仍是正在学校学习的同窗,都或多或少地被数据结构与算法这门课给折磨过。数据结构与算法这门课开篇就讲了一个很是重要的概念:程序 = 数据结构 + 算法,对于初学者可能还不能彻底地理解这句话,不过对于已经工做两三年的同窗相信对这句话是深信不疑的。

对于数据结构与算法的学习,我我的认为应该分层三个步骤:首先先大体了解什么是算法,能够经过一些科普读物来入门,这个过程我称之为入门阶段;接着能够尝试实现一些比较容易的数据结构和算法,这样能够更加深对数据结构和算法的了解,这个过程我称之为实践阶段;最后去了解数据结构与算法背后的相关数学原理等,这个过程我称之为原理阶段

那么对于这三个阶段,我分别分享两本本人在读或者读过的书,你们能够参考和借鉴。

 
 

入门阶段我推荐的是《算法图解》和《啊哈!算法》,这两本书经过简单通俗易懂的方式阐述了几个经常使用的算法,让你们对算法有个大体的了解,并学习一些基本的、经常使用的数据结构与算法。

 
 

实践阶段我推荐的是《数据结构(Java版)》,因为本人是从Java开始学起的,你们能够根据本身学习的语言找来对应的实践书籍来学习。经过实践过程,你们能够一方面学习书中各类数据结构的实现原理和算法的设计思路,同时能够对照着编程语言中这些数据结构的实现原理,好比能够对照Java中对于链表是如何实现的,这样不只能够了解数据结构与算法是怎么回事,同时也对本身学习的编程语言进一步作了深刻的研究。

 
 

理论阶段我推荐的是《算法心得》和《算法导论》这两本书,其中特别是《算法导论》这本书,其中可能牵涉到不少数学的推理过程,不过经过这个阶段的学习可以让本身的思路更上一层楼。

其实,对于理论部分还有一套读起来特别费劲的书籍,这里没有作推荐,是由于我以为对于大部分的程序员,可能没有太大必要去研究它。这里之因此说起,是以为你们若是有空闲时间,闲来无事翻翻也行。这套书叫《计算机程序设计艺术》,做者是唐纳徳·E. 克努特(Donald E.Knuath,中文名高徳纳),目前已经出到了第四卷上卷,书中大量的数学推理,因此数学比较好,而且爱好钻研的同窗能够尝试读读。

八、计算机网络

计算机网络的相关知识在工做时使用的频率仍是挺多的,即便不是直接的使用其相关的知识,也会经过一些软件间接的使用相关的知识。对计算机网络的认知也可能成为往后自身发展的瓶颈,好比作分布式系统的同窗。

 
 

对于计算机网络一样有两个阶段的书籍来推荐,第一个阶段,也就是入门阶段,《图解HTTP》和《网络是怎样链接的》能够比较快速地了解计算机网络中比较基础的相关概念,创建起对网络的认知。

 

第二个阶段,也就是理论和实践阶段,推荐的是比较著名的《TCP/IP详解》这套书,这套书共分为三卷,分别从协议的原理、协议的实现等角度来阐述TCP/IP。

以上是我的的一些愚见,同时也是本人工做几年后的一些感悟,但愿可以帮助到正在大学学习或者正在迷茫的程序员们。

连接:https://www.jianshu.com/p/ab20dc455132

相关文章
相关标签/搜索