CS自学指南-编程入门

MIT-Missing-Semester
课程简介
- 先修要求:无
- 编程语言:shell
正如课程名字所言:“计算机教学中消失的一个学期”,这门课将会教会你许多大学的课堂上不会涉及但却对每个 CSer 无比重要的工具或者知识点。例如 Shell 编程、命令行配置、Git、Vim、tmux
、ssh
等等。如果你是一个计算机小白,那么我非常建议你学习一下这门课,因为它基本涉及了本书必学工具中的绝大部分内容。
除了 MIT 官方的学习资料外,北京大学图灵班开设的前沿计算实践中也开设了相关课程。
课程资源
- 课程网站:https://missing.csail.mit.edu/2020/
- 课程中文网站: https://missing-semester-cn.github.io/
- 课程视频:https://www.youtube.com/playlist?list=PLyzOVJj3bHQuloKGG59rS43e29ro7I57J
课程中文字幕视频:
- 课程作业:一些随堂小练习,具体见课程网站。
CS50: This is CS50x
课程简介
- 所属大学:Harvard
- 先修要求:无
- 编程语言:C, Python, SQL, HTML, CSS, JavaScript
连续多年被哈佛大学学生评为最受欢迎的公选课程。Malan 教授上课非常有激情,撕黄页讲二分法的场面让人记忆犹新(笑)。但因为它的入门以及全校公选的属性,课程内容难度比较温和,但是课程作业质量非常高而且全部免费开源,非常适合小白入门,或者大佬休闲。
课程资源
资源汇总
@mancuoj 在学习这门课中用到的所有资源和作业实现都汇总在 mancuoj/CS50x - GitHub 中。
CS50P Introduction to Programming with Python
课程简介
- 所属大学:Harvard University
- 先修要求:无
- 编程语言:Python
CS50的番外篇,依旧由 David J. Malan 授课。在该课程中你将学会 Python 的基础与进阶语法,以及各种 “Pythonic” 的编程方法。此外对于 Python 特色的代码库、代码测试以及错误处理,该课程也会较为深入地探究。
该课程无需任何编程基础,且相对平易近人。适合所有想要快速入门 Python 语言的各阶段学生。
课程资源
资源汇总
@mancuoj 在学习这门课中用到的所有资源和作业实现都汇总在 mancuoj/CS50P - GitHub 中。
CS61A: Structure and Interpretation of Computer Programs
课程简介
- 所属大学:UC Berkeley
- 先修要求:无
- 编程语言:Python, Scheme, SQL
伯克利 CS61 系列的第一门课程,也是我的 Python 入门课。
CS61 系列是伯克利 CS 专业的入门课,其中:
- CS61A: 强调抽象,让学生掌握用程序来解决实际问题,而不关注底层的硬件细节。
- CS61B: 注重算法与数据结构以及大规模程序的构建,学生会用 Java 语言结合算法与数据结构的知识来构建千行代码级别的大型项目(一个简易的谷歌地图,一个二维版的 Minecraft)。
- CS61C: 关注计算机体系结构,让学生理解高级语言(例如 C)是如何一步步转换为机器可以理解的 01 串并在 CPU 执行的,学生将会学习 RISC-V 架构并自己用 Logisim 实现一个 CPU。
CS61B 和 CS61C 在本书中均有收录。
回到 CS61A,注意这不仅仅是一门编程语言课,而是会深入到程序构造与运行的原理。最后你将在第 4 个 Project 中用 Python 实现一个 Scheme 的解释器。此外,抽象将是这门课的一大主题,你将学习到函数式编程、数据抽象、面向对象等等知识来让你的代码更易读,更模块化。当然,学习编程语言也是这门课的一大内容,你将会掌握 Python、Scheme 和 SQL 这三种编程语言,在它们的学习和比较中,相信你会拥有快速掌握一门新的编程语言的能力。
注意:如果此前完全没有编程基础,直接上手 CS61A 需要一定的学习能力和自律要求。为避免课程难度过高而导致的信心挫折,可以选择一个更为友好的入门编程课程。例如伯克利的 CS10 或者哈佛大学的 CS50。
课程资源
- 课程网站:https://inst.eecs.berkeley.edu/~cs61a/su20/
- 课程视频: 参见课程网站链接
- 课程教材:http://composingprograms.com/
- 课程教材中文翻译:https://composingprograms.netlify.app/
- 课程作业:课程网站会有每个作业对应的文档链接以及代码框架的下载链接。
资源汇总
@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS61A - GitHub 中。
Introductory C Programming Specialization
课程简介
- 所属大学:Duke
- 先修要求:无
- 编程语言:C
非常好的课程,自我感觉收益非常大:
- 侧重基础和基本概念:如 frame、stack memory、heap memory 等讲得很透。
- 针对C最难掌握的指针,有好的练习和编程来加深和强化理解。
- 非常好的 GDB,Valgrind 上手训练,作业也会涉及一些基本的 Git 练习。
- 老师建议作业用 Emacs,所以对 Emacs 小白来说,是个不错的入门。如果你会用 Vim ,我建议你用 Evil 插件。这样你不会丢掉 Vim 的编辑功能,同时可以体会 Emacs 的强大。工具箱里同时有 Emacs 和 Vim 时,效率会有不少提高。Emacs 的 org-mode,和 GDB 的顺滑整合,等等等等,都会让你如虎添翼。
- 虽然可能需要付费,但我觉得值。
- 虽说课名是入门,但兼具广度和深度。
课程资源
- 课程网站:https://www.coursera.org/specializations/c-programming
- 课程视频:同上
- 课程教材:同上
- 课程作业:同上
资源汇总
@haidongji 在学习这门课中的作业实现都汇总在 Duke Coursera Intro C 中。因为时间关系,我最后一课最后一周的几个作业到目前还没有完成。
Stanford CS106B/X: Programming Abstractions in C++
课程简介
- 所属大学:Stanford
- 先修要求:计算机基础 (CS50/CS106A/CS61A or equivalent)
- 编程语言:C++
Stanford 的进阶编程课,CS106X 在难度和深度上会比 CS106B 有所提高,但主体内容类似。主要通过 C++ 语言让学生在实际的编程作业里培养通过编程抽象解决实际问题的能力,同时也会涉及一些简单的数据结构和算法的知识,但总体来说没有一门专门的数据结构课那么系统。
课程资源
- 课程网站:CS106B, CS106X
- 课程教材:https://web.stanford.edu/class/cs106x/res/reader/CS106BX-Reader.pdf
- 课程视频:https://www.bilibili.com/video/BV1G7411k7jG
CS106L: Standard C++ Programming
课程简介
- 所属大学:Stanford
- 先修要求:最好掌握至少一门编程语言
- 编程语言:C++
这门课会深入到很多标准 C++ 的特性和语法,让你编写出高质量的 C++ 代码。例如 auto binding, uniform initialization, lambda function, move semantics,RAII 等技巧都在我此后的代码生涯中被反复用到,非常实用。
值得一提的是,这门课的作业里你会实现一个 HashMap(类似于 STL 中的 unordered_map
), 这个作业几乎把整个课程串联了起来,非常考验代码能力。特别是 iterator
的实现,做完这个作业我开始理解为什么 Linus 对 C/C++ 嗤之以鼻了,因为真的很难写对。
总的来讲这门课并不难,但是信息量很大,需要你在之后的开发实践中反复巩固。Stanford 之所以单开一门 C++ 的编程课,是因为它后续的很多 CS 课程 Project 都是基于 C++的。例如 CS144 计算机网络和 CS143 编译器。这两门课在本书中均有收录。
课程资源
- 课程网站:http://web.stanford.edu/class/cs106l/
- 课程视频:https://www.youtube.com/channel/UCSqr6y-eaQT_qZJVUm_4QxQ/playlists
- 课程教材:http://web.stanford.edu/class/cs106l/full_course_reader.pdf
- Assignment1下载网址:https://github.com/snme/cs106L-assignment1
- Assignment2下载网址:https://github.com/snme/cs106L-assignment2
- 课程作业:具体内容见课程网站,我做的时候一共是两个:
- 实现一个 WikiRacer 的小游戏
- 实现一个类似 STL 库的 HashMap
资源汇总
@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS106L - GitHub 中。
CS110L: Safety in Systems Programming
课程简介
- 所属大学:Stanford
- 先修要求:最好有一定的编程背景并对计算机系统有初步的认识。
- 编程语言:Rust
在这门课中你将会学习 Rust 这门神奇的语言。
如果你学过 C 并接触过一些系统编程的话,应该对 C 的内存泄漏以及指针的危险有所耳闻,但 C 的底层特性以及高效仍然让它在系统级编程中无法被例如 Java 等自带垃圾收集机制的高级语言所替代。而 Rust 的目标则是希望在 C 的高效基础上,弥补其安全不足的缺点。因此 Rust 在设计之初,就有带有很多系统编程的观点。学习 Rust,也能让你之后能用 C 语言编写出更安全更优雅的系统级代码(例如操作系统等)。
这门课的后半部分关注在并发(concurrency)这一主题上,你将会系统地掌握多进程、多线程、基于事件驱动的并发等若干并发技术,并在第二个 Project 中比较它们各自的优劣。Rust 中 “futures” 的概念非常有趣和优雅,这些基础知识对你后续对计算机系统相关课程的学习很有帮助。另外,清华大学的操统实验 rCore 就是基于 Rust 编写的,具体参见文档。
课程资源
- 课程网站:https://reberhardt.com/cs110l/spring-2020/
- 课程视频:https://youtu.be/j7AQrtLevUE
- 课程教材:无
- 课程作业:共 6 个 Lab 和 2 个 Project,作业文档和代码框架详见课程网站。其中两个 Project 非常有趣,分别是:
- 用 Rust 实现一个类似于 GDB 的 debugger
- 用 Rust 实现一个负载均衡器
资源汇总
@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS110L - GitHub 中。
在2022年 CS110L 没有开源作业源码的背景下,Rust 快速演进导致2020版本课程项目中所使用的库过于老旧。对此,@fung-hwang 尝试进行了适配(时间为2022.11)。其适配过程和作业实现都汇总在 fung-hwang/CS110L-2020spr - GitHub 中。也许当你开始本课程时 Rust 和这些库又发生了变化,但你仍可以参考并从中获得启发。
Amirkabir University of Technology 1400-2: Advanced Programming Course
课程简介
- 所属大学:Amirkabir University of Technology
- 先修要求:无
- 编程语言:C++
无意中发现的一个 C++ 课程。课程的 homework 质量很高,每个 homework 相互独立结构简单,且有完善的单元测试,非常适合用来学习 C++ 的编程。本课程共 7 个 homework,如下所示:
- 实现一个 Matrix 类以及相关函数。
- 实现一个模拟加密货币客户端/服务端执行过程的程序。
- 实现一个 Binary Search Tree (BST)。
- 实现 C++ 中的 SharedPtr 和 UniquePtr 智能指针。
- 使用继承和多态实现多个类。
- 使用 STL 库解决 4 个问题。
- 是个 python 项目,有兴趣的可以看看。
没找到课程的主页,只有在 github 有 homework 的源码(名字为 AP1400-2-HW 的那几个)。
课程资源
- 课程网站:无
- 课程代码:https://github.com/courseworks
- 课程教材:无
- 课程作业:7 homework
Haskell MOOC
课程简介
- 所属大学:University of Helsinki
- 先修要求:无
- 编程语言:Haskell
函数式编程正在越来越多的融合入现代编程语言。Java 的 Streams,JavaScript 的 Promises,以及在 ECMAScript 草案阶段的 Record & Tuple。在学习这些内容时,我总是感觉我在死记它们这些 api 的行为,虽然能够使用它们写出一些程序,但总感觉不到掌握了它们。究其原因,它们为什么存在?它们为什么是这样的?设计它们的思想是什么?学完函数式编程会给你答案。
虽然这门课的名字是 Haskell,但它的核心内容是函数式编程思想。就像学习面向对象程序设计,大概率不会选择 Java 之外的语言。
学习 Haskell,但重点不在于使用它。这门课会让你用刚刚够用的 Haskell 语法,刚刚够用的库函数,一丁点的工具,去解释核心的程序语义,也就是函数式编程的核心思想。这不会让你浪费时间陷入语言细节以及语言生态中,我觉得它是这门课的最大优势。
这门课覆盖的内容:
- Pure Function
- Lazy Evaluation
- Strongly Typed
- Type Inferred
- Curry
- Monoid / Functor / Monad / Applicative
如果你有编程经验,课程的 Part1 很简单,难度集中在 Part2 的十三章之后。课程的练习很棒,它有一种在做 CS61a 练习的感觉。练习的注释中有足够的提示,作业在你提交之后会给你标准答案,你还可以在官方的 Telegram 中提问或与他人讨论。
课程资源
- 课程网站:https://haskell.mooc.fi/
- 课程视频:无
- 课程教材:https://haskell.mooc.fi/
- 课程作业:https://github.com/moocfi/haskell-mooc
- 社区:https://t.me/haskell_mooc_fi
资源汇总
@showtheunli 在学习这门课中用到的所有资源和作业实现都汇总在 showthesunli/haskell-mooc - GitHub 中。(非常不建议在作业时,参考别人的实现)