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

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

在这个迷茫期,很多程序员都在思考类似自己是不是适合做程序员、是否要做一辈子程序员、是否要转行到其他职业,比如产品经理等问题。如果不能很快地得到这些问题的答案,那么这些程序员就会一直被这些问题所困扰,举步难行,浪费大好光阴。

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

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

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

几乎所有的程序员,刚开始学习编程时,都是先从具体的编程语言开始学起的。由于早期还没有高级语言出现,所以很早之前的程序员所能接触到是汇编语言、机器语言,甚至是直接操作电子电路来编程;而近几十年,由于高级编程语言的出现,程序员首先接触到的都是这些高级语言,比如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++等编程语言,对于很多程序员学习的技术基本上都是在这一层。不过高级语言想要运行在机器上,一般都会经过编译器进行编译,或者通过解释器进行解释执行,而编译器和解释器则是在计算机编译原理这门课中讲述的,之前提到过的语法糖等概念也是在这里介绍的。

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

以上这些课程的学习并不是一朝一夕能够搞定的,也不是在大学期间就能够完全学懂的,不过如果有可能,还是尽自己全力能掌握多少就掌握多少,剩下的不是特别明白的,需要在以后的工作中慢慢体会、慢慢理解。

因此,无论是对于大学生还是对于已经工作的同学,都不能急于求成,需要持续不断地学习,这个过程可能持续三至五年,甚至更久。同时,为了加快大家对这块知识的理解和掌握,下面简单推荐一些笔者正在学习和已经学习过的一些资料,希望能够带给大家一些帮助。

1、数字电路

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

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

不过,有关数字电路的视频网络上倒有一些,比如清华大学、东南大学都有一些视频,大家可以自行百度搜索即可。

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

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

2、计算机组成原理

计算机组成原理这门课很好地向我们阐述了计算机是如何工作的,是如何计算和输出我们想要的数据的,同时由于本门课是考研科目,所以各个大学都会有一些公开课视频,比如清华大学等,大家可以自行搜索得到,笔者就不再推荐了。这里推荐的是笔者看过的几本书。

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

最近笔者在看的另一本比较通俗易懂的书叫《穿越计算机的迷雾》,个人觉得写的比上面两本更通俗一些,大家也可以先读这本书。不过由于这本书已经绝版了,大家可以尝试到淘宝上看能否找到。

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

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

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

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

3、汇编语言

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

4、计算机操作系统

跟计算机组成原理一样,计算机操作系统同样是一门考研课程,所以网络上存在的资料是非常多的,大家可以自行搜索。不过笔者还是需要推荐两本书,一本是笔者本科和研究生期间都学过的一本书《现代操作系统》,研究生期间有幸得到这本书的译者陈向群老师的亲自授课,也是学到不少知识。

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

5、计算机编译原理

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

书籍推荐的话当然是经久不衰的《编译原理》这本书了,教学视频的话,大家可以到网络上找下。

6、离散数学

离散数学个人认为对于计算机学生而言是非常重要的一门课,可惜的是由于在本科期间对计算机认知的不够,导致在学习这门课的时候只是把它当做一门数学来学习,并且也没有花太大的精力来学习,相信对于大部分的计算机专业的同学来说也是这样的。

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

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

7、数据结构与算法

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

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

那么对于这三个阶段,我分别分享两本本人在读或者读过的书,大家可以参考和借鉴。

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

实践阶段我推荐的是《数据结构(Java版)》,由于本人是从Java开始学起的,大家可以根据自己学习的语言找来对应的实践书籍来学习。通过实践过程,大家可以一方面学习书中各种数据结构的实现原理和算法的设计思路,同时可以对照着编程语言中这些数据结构的实现原理,比如可以对照Java中对于链表是如何实现的,这样不仅可以了解数据结构与算法是怎么回事,同时也对自己学习的编程语言进一步做了深入的研究。

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

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

8、计算机网络

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

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

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

以上是个人的一些愚见,同时也是本人工作几年后的一些感悟,希望能够帮助到正在大学学习或者正在迷茫的程序员们。

作者:程序员的窘境
链接:https://www.jianshu.com/p/ab20dc455132
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

原文地址:https://www.cnblogs.com/tkzc2013/p/10819979.html

时间: 2024-10-13 22:45:59

计算机专业学生一定要学好这几门课!(转)的相关文章

大牛给计算机专业学生的 7 个建议

layout: default title: 大牛给计算机专业学生的 7 个建议[转] category: [技术, C/C++] comments: true --- 七个建议 看到名字时候,只是好奇,看完之后,还是决定把文章转载一下了.不知道是不是因为其中的一个选择的缘故,我之前也徘徊了好久时间. 具体的内容 文章如下: 导读:由于Joel Spolsky的双重身份(昔日耶鲁大学计算机系学长,今日Fog Creek软件公司的CEO),所以听听他的建议,对于当今无数困扰于就业压力的中国高校计算

计算机专业学生在毕业之前应该做的10000件事 ...

今天看了一篇,觉得很有感触,有必要记录一下(以下内容...) 现在正是毕业时节.我想有必要汇总一下计算机专业的学生在获得学位之前应该(单独)完成的10000件事情.碰巧的话,学生们在过去学过的课程中完成了其中的一部分.但可能大多数还没有被遇到过,所以学生们需要为这些课外实践空出时间.       这份清单是受别人启发,而正如标题所说,它是关于行动,而不是了解或者学习.第一手经验绝对是探索用电脑完成的有趣的事情的最有效方法.一旦我们成功使程序运行并且/或者克服困难超越了障碍,我们因此会获得极大的成

大学的计算机专业学生怎么学习

现在到大学基本上都是上了十几年学,不说是学习老手,也是应试老手了,但是大学越上越不会考试了,更不会学习了,面对计算机专业这个对专业要求很高的专业,得想想怎么学习,怎么面对快速发展的技术,很多人说讲究效率,但是效率怎么产生,得有策略,十几年的学只是教会了我们怎么考试,但是没有教会我们怎么学习,特别是怎么自学,在大学三年,慢慢就发现现在学的不是学习,而是怎么学习,在这个技术快速更新的专业,学会学习,才是立命之本. 就拿我们学校专业课程来说,我总结了一下路线,基本上就是那么几种: 1.软件开发 2.a

Java 学生信息管理系统的实现(简洁易懂),适合计算机专业学生参考,毕业论文设计参考等

编写一个简单的学生管理信息系统. 在oracle中设计一张学生表,以学号作为关键字. 其他学生信息有:姓名.手机号. 在进入系统时,显示如下菜单: ************************************************** =====欢迎进入学生管理信息系统===== 1. 新增学生 2. 修改学生 3. 删除学生 4. 查询学生 5. 退出系统 请选择(1-5): ************************************************** (

计算机专业学生有必要专门花时间练习打字吗?

打字是当今职场人士的一项基本技能,速度的快慢一定程度可以帮助你提高做事效率,撰写报告,编写ppt等职场必须的场景,对于一个新手来说,如何提高自己的打字速度不只是靠练,还需要掌握一些基本的打字方法,这样才能事半功倍去提高打字的速度和准确率. 正常情况下,通用的电脑键盘的键位是有排列标准的,如果配合上一套比较科学的指法,必将有效地提高打字的速度和准确率. 说它是标准的打字方法,其实就是一种被广泛认为比较科学合理的手指分工击键的打字指法方式,以实现各手指与键位的最佳配合从而高速准确地进行打字输入.所谓

某班有5个学生, 每名学生的数据包括学号,姓名,3门课成绩,从键盘上输入5名学生数据,要求打印出3门课的总平均成绩以及最高分的学生数据(包括学号,姓名,3门课成绩)

1 #define _CRT_SECURE_NO_WARNINGS //关闭安全检查 2 #include<stdio.h> 3 #include<stdlib.h> 4 5 //定义结构体类型 6 struct ST 7 { 8 int ID; 9 char name[20]; 10 float score[3]; 11 }; 12 13 //方法1 : 结构体数组作为函数参数 开销大 14 float avg(struct ST sts[], int n) 15 { 16 fl

清华计算机专业课程列表

本科课程 微型计算机技术 http://www.nuist.edu.cn/courses/jsj/GD_jsj_001b/index.htm数据结构 [url]http://www.nuist.edu.cn/courses/jsj/GD_jsj_002b/index.htm[/url] 人工智能导论 [url]http://www.nuist.edu.cn/courses/jsj/GD_jsj_003b/index.htm[/url] 信号处理原理 [url]http://www.nuist.e

大学本科计算机专业应该学点什么?

答应给一位刚上大一的小盆宇指点一下,所以我这里简单的说点吧.有砖家看了觉得可笑的话,请勿发表高见.谢谢. 首先还是要推荐Sir前辈的<胡侃>(点击可传送),将近20年过去了依然是经典.然后,我对各种课程的理解是这样的: 首先简单说下英语吧.大学是没有人“教”你英语的,英语课很扯淡,英语全靠自学.好在讲语法的地方高中都讲完了,大学基本就是词汇量,实际应用等等.英语的重要性在于:四六级. 考研.还有原版专业书.其中原版专业书是最重要的.你将来要接触的计算机的资料,英文的比中文的要管用的多. 然后是

关于计算机专业的一点看法

上了快三年的课,学的一般般,特想知道我们学的课程有什么用,我就想呀想,终于有了点门路. 我的专业是计算机科学与技术,先不说科学与技术这个话题,单说什么是计算机,直观来讲,眼见为实,我们看见的那个箱子加显示屏或者笔记本电脑就是计算机,它直观到让人不想思考的地步.我们利用计算机可以玩游戏,为什么!我们为什么可以利用电脑来玩游戏,这就是我们想要了解的内容,我从底到顶的分析一下. 首先,我要问你计算机是什么组成的?聪明的人就会回答CPU.显卡.声卡.显示器等等罗列出一堆东西,再问你什么是CPU?你也许会