没有CS基础的人,如何学习CS相关知识?

没有CS基础的人,学习CS相关知识,无非以下几种情况:

一:有充足的时间和经历,主观上客观上都允许系统性学习CS的情况,例如题主本人。

二:非CS专业,想要转向CS求学/就业,有一定的时间准备,但需要节奏较快。

三:需要掌握编程技能作为辅助工具,其实不能算学CS,只能算学习编程技能,例如非工科博士生、商业分析人士,需要处理大量数据的。

如果是要系统性学习的话,整个知识体系里的内容早晚都要仔细走一遍的。当然因为题主即将进入CS科班,这些课程早晚学校都会学,其实没必要刻意提前去学,如果想预习的话,应该从基础的基础部分开始学。

1.基础的基础

这部分我发现很多回答都跳过了,但是对于真正0基础,又有充足的时间的人来说,最应该的不是急着去学编程语言、计算机组成、或是算法,而是先打好最基础的部分,从以下开始:

  • 微积分
  • 线性代数
  • 离散数学
  • 英语

事实上这也是任何CS科班在正式学习CS专业课程前都必须要修的课。

为什么呢?

写代码这件事,其实现在很多小学生都在学,甚至小学生们还写得很不错。

如果你之后想在CS领域长期走下去,一定要知道:代码只是工具。而这其中的理论,才是区分一个「计算机工程师/科学家」与其他「会写代码」的人的区别。

计算机应用的本质,是在处理器上运行算法来处理数据。其他的软硬件知识都是在辅助这个流程。

而为了理解更核心的算法和数据结构,就需要很强的数学基础,去理解如何处理连续的和离散的数据。

之所以把英语列在这里,是因为「人类能看懂的high level编程语言」的本质是遵守一定协议的英语,所以英语好的话学习编程语言会相当快。当然对于题主的情况就不用刻意去学了。

猫猫镇楼,骗你们进来看

2.专业理论基础

在打好数学基础后,就可以学习CS专业知识了,其中理论基础包括:

  • 计算机组成原理
  • 操作系统
  • 计算机网络
  • 数据库基础

这些知识很多半路转CS的人其实都没有好好学过,只是草草了解一下,然而这真的是错误的,这些全是都是必修课。

(1)基础工具:各类编程语言

是的,讲了这么多才提到编程语言…

当然你可以很早就接触编程语言,我故意放到这么后才提到就是为了强调,学编程≠学CS,编程只是CS的工具,就如同去学PS≠学设计,学打字≠学写作一样。

编程语言是CS所有理论实现为应用的通道,即使你不需要学习任何理论,就可以使用编程语言实现很多虽然简单但是实用的功能,但是!一旦需要处理真正需要基础含量的工作,理论基础扎实不扎实马上就体现出来了。

所以我建议,除非时间太紧,否则别急着从编程语言开始第一步。

前面提到了high-level与low-level的概念,这个不是说高级低级,而是高层底层。越高层的越易懂,通用性越强;越底层的越难理解,越需要很多基础理论。

比如MATLAB就非常高层,高层到很多人觉得它不算编程语言,你学习它不会遇到任何玄学问题,环境一键搭建,编译执行一键完成,不用自己部署库,你只要知道怎么用代码实现功能就可以了,学起来简直轻松愉快。

C++就向底层走了很多,你需要知道编译环境的配置/了解操作系统/懂得数据是怎么占用内存的/明白指针背后是什么。而最底层的机器码和汇编就完全不是给人看的,事实上你写的任何代码,都会被编译成这样的最底层语言去让处理器执行,你的处理器是看不懂你写的C++和Python的。

至于你从什么语言先学起,这个不重要,掌握理论和一样工具后,掌握其它工具是非常迅速的。建议学习的编程语言有:

C++ 非常接近底层的语言,兼容C(所以其实两个语言就一起学了),运行效率高,多用于对性能很看中的应用,例如无人驾驶等

Java 效率比C低,广泛应用于各类有交互需求的互联网产品或者信息系统

Python 编程容易但执行效率低的脚本语言,相对来说简单易学,应用比较广

3.核心知识:算法+数据结构

很多人为了找工作刷题,刷的也就是算法题。这两个知识很可能是合成一门课讲的,因为它们分不开。

有一本1976年出版的很经典的CS教科书叫做“Algorithms + Data Structures = Programs”,即《算法+数据结构=程序》。

当然这句话理解的时候容易被歪曲,但是其表达的核心内容是不变的。之前所有的知识,无论是编程语言,还是计算机理论基础,都是为了能让你的算法更好的运行。

算法的定义是”a finite sequence of well-defined, computer-implementable instructions, typically to solve a class of problems or to perform a computation” 简单来讲,就是一个解决问题的逻辑。

广义来讲就是:

按照一个公式根据输入的x值算出相对应的y值,这个公式是一个算法。

给你一副扑克牌,你想了一个方法尽可能快把牌分成四个花色的四堆,这个方法是一个算法。

给你一堆零件,你设计了一个流程让所有人同时工作,最快速度组装成了一台机器,这个流程是一个算法。

所以说,相比教科书里的狭义的针对数学和CS来讲的概念,我更希望大家广义的理解,因为很多算法的设计过程,是真的以这样物理世界的其它问题的解决方案为启发的。

算法能力是区别一个程序员跟一个软件工程师的指标。

打好基础的基础,之后你再深入,你会发现事半功倍(事倍功半?到底怎么说来着…….

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 注销 /  更改 )

Google photo

您正在使用您的 Google 账号评论。 注销 /  更改 )

Twitter picture

您正在使用您的 Twitter 账号评论。 注销 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 注销 /  更改 )

Connecting to %s