CS自学

前言

本文主要用于归纳作者的CS自学过程,课程顺序代表了作者自学CS的顺序,内容由浅入深。


CS自学指南

这是一个CS自学导航性质的网站,资源丰富而全面,且具有可行性,本文的大部分内容都来源于此,非常推荐一读。

然而这本书写作时间较早,有些开源资源或不可用,或已改名,对于这些资源,本文加以更新。

Crash Course: Computer Science

这是一个科普性质的视频,通过这个视频,你可以对计算机科学学科有一个整体的概览。

  • 课程视频: B站

MIT Missing Semester

Missing Semester从字面上看译为消失的学期,旨在讲解计算机中各种各样的前置工具和知识,比如Shell, Vim, Git等等。

这门课程无关代码,却指向了开发代码的环境,比如版本控制,比如命令行,比如数据结构。

内容不深,但相当广泛,听完后可以在其中挑选自己感兴趣的内容进一步深入学习,适合新手学习,非常推荐。

Git

Git是一个大名鼎鼎的版本控制工具。

学习中,你可能很早就听说过了Github,但却不知道该如何使用。对于工程,你可能有分工思想,但却不知道怎么实现多人合作。修改论文时,你可能只能通过不断创建副本1,副本2来进行版本迭代,但为文件夹中一长串的副本而深感头疼。

这些都能在学习Git的过程中得到解决,推荐学习。

Coursera Nand2Tetris: Part1

Nand2Tetris是由希伯来大学Noam和Shimon开设的一门课,课程内容为计算机架构。全课分为Part1和Part2两部分,Part1讲述计算机硬件架构,Part2讲述计算机软件架构,两部分内容相关,但完全独立,如果你是新手,推荐按顺序学习。

在Part1,你将从与非门电路开始,通过归纳抽象的方法,一步一步搭建与门或门等门电路,进而搭建全加器和半加器等芯片,进而搭建内存、ALU,进而搭建CPU完成Hack电脑的搭建。

为了控制你搭建的这台电脑,你还将学习汇编语言,以及学习如何将汇编语言翻译为机器语言,也即所谓的汇编器。

通过这门课程的学习,你将明白电脑本身并非什么魔法,仅仅是一台蕴含人类智慧的机器,究其物理介质,不过数字电路的高低电平而已。

然而,你又将惊叹于电脑设计的精密性,包含各种各样的协议与标准,使之成为一项工程,非常推荐学习。

MIT 6.092: Introduction To Programming In Java

这门课程较为系统的介绍了Java的特征、语法和库,课程没有视频,但PPT内容清晰,易于自学,适合新手入门。

课程后附带作业,推荐完成。

作业内容较为简单,且下次课的PPT开头一般会进行讲解,网络上相关的作业解答资源也非常丰富。

Coursera Nand2Tetris: Part2

Nand2Tetris Part2是Part1的后续课程,在Part2中,主要介绍了计算机的软件架构。

为了适配成千上万芯片,人们在高级语言和汇编语言之间引入了一个中间态,在本项目中称这个中间态为VM语言。通过Part2的学习,你一步步搭建VM Translator、Compiler和OS,最终获得一个能够运行高级语言的环境。

在这个环境上,你就可以开发任何你能够想到的程序了,比如课程名中的俄罗斯方块(Tetris)。

我在学习Part2的时候没有全部学完,我只完整完成了Project7和Project8,Project9-Project12我只听课,并没有做课后作业。理由是我认为Compiler与VM Translator的搭建非常类似,无非是格式更加复杂琐碎,对于我而言,了解计算机的架构已经足够了。另外,由于Jack语言并非目前主流语言,我对Jack语言开发游戏项目也没有多少兴趣,因为这对我的专业没有多少帮助。因此,我的资料库中没有Project9及之后的资料。

总而言之,这门课程对理解计算机本身很有帮助,推荐学习。

作者自用

作者自用楼中主要列举了作者正在学习的一些内容,内容通常不太完整全面,读者可以选择忽视。

UCB CS70

MIT 6.041SC

UCB CS61A

UCB EE120

MIT 6.102: Software Construction

这门课实际上是一门软件工程专业的课程,其目标在于教会你如何写出高质量的代码。

这门课程使用的编程语言是Java,因此将其放在这篇文章当中。

课程没有视频,但有详尽的文字解释,内容清晰,易于自学。