如何自学计算机专业课程

前言

昨晚听了一期知乎live:如何自学计算机专业课程

学习后发现,里面的内容更适合计算机专业的在校生以及计算机基础较弱的小白。此外,作者推荐的一些教材倒是不错,在此分享。

image

Test Post Data From PC to see whether it is auto refreshed in Mobile App.

image
image
image

完全可以。计算机专业是人类历史上第一个可以通过互联网学习到几乎所有专业知识的这么一个专业。

image

计算机专业的自学路线图

美国计算机学会ACM发布了《计算机科学课程体系》的报告,当前最新版是2013年的。计算机科学被划分为18个知识领域。如下:

image
image
image

知识的掌握程度划分为三级:

image

虽然计算机科学被划分为18个领域,但是这18个领域有着紧密的联系,构成了知识之网。这是我们的核心任务。

image

学计算机的目的:

  • 掌握上层应用的开发,为了能够在IT公司找一份工作。是以就业为目的的自学。

  • 以考试为目的的自学

  • 为了解决工作中遇到的特定问题,提升专业技能,升职加薪。以个人的职业发展为目的。

对于小白而言,首先要对计算机科学和计算机产业形成整体的认识。这方面可以读导论或者科普读物。建议先读吴军博士的《浪潮之巅》。这本书讲IT产业非常精彩。

紧接着,要做两件事:(1)掌握一门编程语言;(2)学好数学。这两者是并行的。

(1)掌握一门编程语言:

  • 第一种:C是一种结构化的编程语言。如果不会C,后面的课程根本学不下去。

  • 第二种:Java是一种典型的面向对象的语言。Java有活跃的社区和数之不尽的开源项目。

  • 第三种:JavaScript 或者Python。这两个语言都是属于动态编程语言的范畴,应用极为广泛。JavaScript是全世界使用人数最多的一种语言,并且JS的各种框架层出不穷,进步飞快,业界的工作机会众多,对找工作是非常有帮助的。但实话实说,JS在计算机专业课程中用的并不多。Python却不同,它被国内外的很多大学选为新生的第一门语言。尤其是在这个大数据时代,Python真是火爆。

上面这四种语言,是学软件开发必须要掌握的,从任何一个语言开始学起都可以。

(2)对于数学,我们必须掌握四门课程:

  • 高等数学
  • 离散数学
  • 线性代数
  • 概率论与数理统计

在掌握了编程语言,用编程语言写了一些应用程序之后,又学习了一些数学之后,你就可以进入计算机专业基础课程的学习。这些课程构成了计算机的核心课程群,我们通常把它称为「专业基础课」。专业基础课有十多门,其中最重要的是四门如下(这四个课程也是考研科目):

  • 数据结构与算法
  • 计算机组成原理
  • 操作系统
  • 计算机网络

除此之外,计算机基础课还包括:

  • 编译原理
  • 面向对象的方法
  • 关系数据库的理论
  • 软件工程等等

这次我们就只针对那四个考研科目进行介绍。

这里我要强调的是:计算机专业基础课程的学习,和我们在工作中实用技术的学习,这两者不是相互矛盾的,而是相互促进的。比如计算机网络课程,对web开发框架有帮助;反过来,如果写了web框架,就能更深刻的理解计算机网络这门课程。

在完成专业基础课和实用技术的学习之后,就进入了一个新的自学阶段。这个阶段可以针对你感兴趣的特定领域深入钻研了。比如你对人工智能感兴趣,那可以学一下机器学习、spark等等。这个时候的学习目的非常明确,即:培养特定领域的专业技能,让你成为特定领域的专家。

image
image

自学效果的好坏高度依赖于个人的学习动机,以及自学过程中采用的方式、方法、策略。要想取得好的学习效果,了解一些学习理论是非常重要的,这里推荐一本书叫《学习之道》。书中介绍了很多学习有关的新成果。

image
image

选书和看书的基本原则

当某人告诉你,某书是某领域最好的书籍,不要盲目相信,要经过自己亲自试验再下结论。通常情况下,一本别人眼中的好书,可能的确质量很高,但如果阅读它超过了你的能力,那对于你而言,它就不是一本好书,因为你不具备所需要的背景知识,和相关的技术经验。

第二个原则是,选择那些你已经具备读懂前提的书。

image

阅读科普书籍的最主要目的是:了解特定领域的背景知识、明了这个领域的基本数据和概念,建立全局观。

image

读者:多读几遍真的很重要,我在看js的时候,把廖雪峰的教程看了好多遍,敲了好多遍。

image

上图是计算机网络的经典教材。我们拿着两本书来举例。
比如《计算机网络:系统方法》这本书,作者在前言中就很明确地说明,它是针对网络设计者写的。注意是网络设计者,不是网络应用开发者。这本书讲的是计算机网络的基本原理。介绍的是最初的设计者遇到了什么问题。

读第一遍时,第一章一定要认真阅读,包含了很多的术语。

读第二遍时,每章的开头很重要。

比如《计算机网络:系统方法》这本书,里面讲到的网络安全这一章,如果你当前还没有涉及到这一块儿,这一遍就可以跳过。但是有关PCP协议的内容,在实际开发中用的很多,就很重要,这些内容分布于书中的各个章节,这就需要你把它们抽取出来。

image

比如上面的这本《离散数学》,一页纸就要啃两个小时。

image

与书籍相比,视频的优点是很独特的,特别适合展示动的过程,比如程序的调试过程、算法的运行步骤等。

image

有很多编程工作属于工程领域,按部就班,有很多现成的套路,创造性并不强,数学在这些项目中并非成败的关键因素。项目中,确实有算法在底层做支撑,但这算法往往都有现成的底层库。你只需要知道如何调用就行,并不需要理解算法的细节,并需要具备多深的数学功底。对于初级程序员来说,主要干的是搬砖的活儿,特别是CRUD类的代码。

image
image

同济的《高等数学》教材还是不错的,但是国内数学教材有个最大的问题就是:往往只讲法则、定理、证明、习题,不讲数学的发展历史、具体应用、也不强调解决特定问题的思路,不适合自学。

image

普林斯顿的《微积分读本》,最大的特点是,讲的很细,采用内心独白的方式介绍微积分,有高中基础即可。内容虽然没有同济的多和深,但学习计算机来说,也基本够用了。

读者:这里也给大家推荐本冷门数学书,名字叫考研数学三部曲,销量很少。因为这本书优点是由浅入深,缺点是又臭又长,适合文科生看。

image
image

《计算机科学概论》起到的是建立全局观的作用。

image

读者:想从Python 入门的同学,也推荐Headfirst Python。整个headfirst 系列都推荐。

读者:headfirst真的很不错,同推荐,特别设计模式。

image
image

《深入理解计算机系统》这本书,对于形成计算机系统的全局观非常有用。这本书简称为CSAPP,很有名。这本是最大的特点是从使用者,而不是从设计者的角度来组织材料的,难度适中,文字流畅。但这本书不适合零基础入门,你至少应该首先学过计算机导论,并且有一定的C语言开发经验,会用Linux。

读者:CSAPP看的时候要动C语言并且要看计算机专业导论,不然看不懂的。

考研的四门课

下面介绍计算机专业的几门骨干和和核心课程。同时也是考研的四门课程:数据结构与算法、计算机网络、操作系统、计算机组成原理。

(1)数据结构:

image

上图中,数据结构与算法包括了两部分内容。

现在的大数据和人工智能,完全就是算法。

image

上图中,第一本书有两个版本:java版本和C语言版本,难度适中。后两本书,较难。

image
image

对于多数人来说,掌握算法,只需要知道算法的思想、应用场景和优缺点就可以。实际开发中,你要设计新算法的机会并不多,并且那些应用很广的算法,都已经在框架里提供了现成的组件。这些组建内部已经实现了算法,你只需要知道是怎么回事,会调用就可以了。比如说加密和解密的算法。

考研和大公司面试,也不会考到复杂的算法,准备前多刷几遍即可。

(2)计算机组成原理:

image
image

计算机组成原理主要是介绍计算机由哪些部件组成的,这些部件是如何互相协作、完成处理功能、同时用来满足各种成本和功耗指标的。

学习这门课程之前,通常需要学习数字电路基础。

学完计算机组成原理之后,再去学操作系统和编译原理。

image

学习计算机组成原理之前,建议大家先看《编码》这本书。

(3)操作系统:

image
image

上图中,操作系统的书分为两类:教材和专著。

image

操作系统的教材里,数学公式不多,但它并不是说操作系统者这门课就很容易学,学好操作系统的关键是一定要把它和软件开发、动手实践结合起来。

很多操作系统都是用C语言写的,建议大家在学习操作系统之前,先学习C语言。

学习操作系统,最重要的是明白操作系统的内部机理。推荐大家实用C语言在Linux下学习。

进程和线程也是属于操作系统的范畴。

读者:补一个金老师的网易云课堂:http://mooc.study.163.com/u/8050019871#/c

(4)计算机网络

image
image

我推荐大家实用C、java、Phthon这三种语言去编写网络应用程序。

另外必须要学会操作系统。网路协议栈通常都是由操作系统来负责实现的,网络应用基本都是多线程的。

上图中这里介绍了三本经典书籍。计算机网络中一个重要的特点是分层。我们会发现这三个经典教材是三个视角。

  • 第一本:从上层协议介绍到下层协议。
  • 第二本:从顶向上介绍。
  • 第三本:横切的方式,针对特定的问题(比如安全问题、性能问题)来展开介绍。
image

学习计算机网络的关键,是明白上面这三个问题。

一旦了解了计算机网络的这些基本原理,你就会发现,理解实际开发中的各种通信协议和各种网络库,就会比较容易。

掌握好相应的网路协议,是掌握上层应用软件开发技术的关键。比如,如果连http协议都没掌握,就去写web应用, 好比在沙滩上盖楼。

image
image

读者:对于很多朋友,你提的问题,其实更多的需要从自己自身出发,没有一个完全标准的答案,再你问问题之前,自己先思考一分钟。

其他

本次Live介绍的是如何自学计算机科学理论知识,第二场Live——“如何自学编程”:https://www.zhihu.com/lives/860490807847841792

第二场live介绍了如何训练编程技能。

第三场Live——“如何自学Java:入门与编程技能训练”:https://www.zhihu.com/lives/889495940065538048

第三场live是第二场Live所介绍之自学编程基本原则与方法的践行篇,同时也展示了计算机科学理论学习是如何与具体的编程技术(以Java技术领域为例)学习以及软件开发实践相辅相成的。

https://www.zhihu.com/lives/860490807847841792

https://www.zhihu.com/lives/889495940065538048

2017年12月21日举办Live,如何高效地掌握Android开发技术:https://www.zhihu.com/lives/916265051361529856

推荐阅读更多精彩内容

  • 经常听到有老师问以下问题:为什么学完高级语言程序设计后有些学生就不喜欢计算机专业了?为什么越来越多的学生越学越不喜...
    开点工作室阅读 2,940评论 3 27
  • 回老家一个多礼拜,以后这样的机会怕是不多,还是应该稍稍总结一下。 一 回老家在叔叔家玩了一天,看了他娶的第二个老婆...
    水田夏木阅读 84评论 0 0
  • 当节气“忙种”过后,炎夏算真的来临了。紧接着高考也来了。花开花落,月圆月缺,荏苒间,又是一个轮回。时光如流沙,你越...
    Harvest收获阅读 151评论 5 14
  • 我穿着洁白的纱裙,站在台阶上,我的右手交叠在你左手掌心之上,你微笑着看向我,陪着我一步一步踏着台阶往上走。我...
    鯨魚兒阅读 110评论 0 0