MITx 6.00.1x 学习体会

2020年8月7日,我正式完成了edX上的《MITx - 6.00.1x: Introduction to Computer Science and Programming Using Python》课程的全部学习和考试,并且获得了证书。学完确实感觉收获不小,下面来简单谈一下学习的体会。

MITx 6.00.1x是MIT开设的一门零基础的Python和计算机科学入门的在线课程,据说在Python入门课程中很受欢迎,上网搜一下可以看到很多人推荐这门课。一共包含13个Lecture和一节总结,课程结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
├─01. Introduction to Python
│ 01.1. Introduction
│ 01.2. Knowledge
│ 01.3. Machines
│ 01.4. Languages
│ 01.5. Types
│ 01.6. Variables
│ 01.7. Operators and Branching

├─02. Core Elements of Programs
│ 02.1. Bindings
│ 02.2. Strings
│ 02.3. Input_Output
│ 02.4. IDEs
│ 02.5. Control Flow
│ 02.6. Iteration
│ 02.7. Guess and Check

├─03. Simple Algorithms
│ 03.1. So Far...
│ 03.2. Approximate Solutions
│ 03.3. Bisection Search
│ 03.4. Floats and Fractions
│ 03.5. Newton-Raphson

├─04. Functions
│ 04.1. Decomposition and Abstraction
│ 04.2. Introducing Functions
│ 04.3. Calling Functions and Scope
│ 04.4. Keyword Arguments
│ 04.5. Specification
│ 04.6. Iteration vs Recursion
│ 04.7. Inductive Reasoning
│ 04.8. Towers of Hanoi
│ 04.9. Fibonacci
│ 04.10. Recursion on non-numerics
│ 04.11. Files

├─05. Tuples and Lists
│ 05.1. Tuples
│ 05.2. Lists
│ 05.3. List Operations
│ 05.4. Mutation, Aliasing, Cloning
│ 05.5. Functions as Objects

├─06. Dictionaries
│ 06.1. Quick Review
│ 06.2. Dictionaries
│ 06.3. Example with a Dictionary
│ 06.4. Fibonacci and Dictionaries
│ 06.5. Global Variables

├─07. Testing and Debugging
│ 07.1. Programming Challenges
│ 07.2. Classes of Tests
│ 07.3. Bugs
│ 07.4. Debugging
│ 07.5. Debugging Example

├─08. Exceptions and Assertions
│ 08.1. Exceptions
│ 08.2. Exceptions Examples
│ 08.3. Exceptions as Control Flow
│ 08.4. Assertions

├─09. Classes and Inheritance
│ 09.1. Object Oriented Programming
│ 09.2. Class Instances
│ 09.3. Methods
│ 09.4. Classes Examples
│ 09.5. Why OOP
│ 09.6. Hierarchies
│ 09.7. Class Variables

├─10. An Extended Example
│ 10.1. Building a Class
│ 10.2. Visualizing the Hierarchy
│ 10.3. Adding another Class
│ 10.4. Using Inherited Methods
│ 10.5. Gradebook Example
│ 10.6. Generators

├─11. Computational Complexity
│ 11.1. Program Efficiency
│ 11.2. Big Oh Notation
│ 11.3. Complexity Classes
│ 11.4. Analyzing Complexity
│ 11.5. More Analyzing Complexity
│ 11.6. Recursion Complexity

├─12. Searching and Sorting Algorithms
│ 12.1. Search Algorithms
│ 12.2. Bisection Search
│ 12.3. Bogo Sort
│ 12.4. Bubble Sort
│ 12.5. Selection Sort
│ 12.6. Merge Sort

├─13. Plotting
│ 13.1. Pylab
│ 13.2. Plots
│ 13.3. Labels
│ 13.4. Comparing Plots
│ 13.5. Display Details
│ 13.6. An Example

├─14. Summary and Wrap-Up
│ 14.1. Summary

我学习的这一期是从6月4日开始,8月6日早上7点(北京时间)课程正式结束,整个学习时长约两个月(含期末考试的时间,所以实际时间略少于两个月)。课程一共7周,每周包含两个Lecture,每小节会有一个时长从几分钟到十几分钟不等的视频课程,一周的视频课程合计约2个小时左右。讲课的过程中会穿插若干道习题练习,并且一周会出一个大的Problem Set,大多是解决一个整体的编程问题。免费学习可以接触到上述所有内容,如购买了证书,还会增加期中和期末考试,总分过65分后获得证书。因为平时成绩占总成绩的50%,平时保持进度按时完成作业的话获得证书的难度不大。

但虽说一周的视频课程只有2小时左右,实际上每周学习的时间——特别是对于真正的零基础来说——要远远超过2个小时。从上面的目录中可以看到,这门课程的进度并不慢——第一周数据类型和分支循环,第二周函数和迭代、递归等简单算法,第三周tuple、list和dict,第四周debug和异常,第五周class和继承,第六周时间复杂度及搜索、筛选算法。这么多内容只用每周2小时的视频必然是介绍得比较简略的,在此之外需要自己琢磨很多东西。很多扩展知识及对computational thinking的培养是包含在习题和Problem Set中的,这些题目既立足于当前所学的知识又富有一定的挑战性,每次做完都要耗费数倍的时间和精力。课程自己的定位似乎是每周不超过15小时(如果自己超过了15小时学习时间还可以反映给他们)学习时间,我没有花费过那么久的时间,但确实每周都要付出半天到一天的时间学习。

就我学习的感受看,零基础跟完这门课完全没有问题,但当然,前提是能坚持下来。我个人认为这门课对于没有编程基础的人来说是比较难的,要极大地发挥自己的主观能动性,主动投入精力去学习和思考。我自己之前自学过一点C#,第一周感觉完全没有障碍,第二周需要想一想不过总体来说也还行,但到第三周就感觉不管是知识上还是习题上都在逐渐变难。到第四周,已经看到讨论区里有零基础的学生因为跟得非常吃力而放弃了这门课程。MITx 6.00.1x在课程的最初就明确告诉大家:“This is a hard course. It is easy to get discouraged, but don’t!”确实,我在整个过程中时常学得焦头烂额,但当自己把所有的问题一点一点琢磨明白,学完这两个月的课程后,发自内心感觉到与两个月之前相比有所提升——虽然不好说是多么巨大的提升,但至少迈出了从无到有的第一步。

另外,虽然跟这门课本身没有什么关系,但是对于像我这样完全没有专业知识的普通的中文使用者,其难度还有一部分来自于各种各样的英文专业术语,不仅有计算机的,还有数学的,甚至举例里面还有金融、游戏等各种方面的。一些词汇可能英语为母语的人都是从小听惯的,但我听过来就一头雾水,时常要暂停下来查一查。但不得不说,在计算机语言方面还是英语课程质量比较高,国内绝大多数计算机语言教程的质量就别提了。

那么具体的收获是什么呢?因为这门课程不仅仅是一门Python入门课,它还是一个致力于培养computational thinking的课程,所以若要谈收获,需要从这两方面去谈。

首先是Python。在接触这门课之前,我对Python并没有什么兴趣(事实上现在也不怎么有兴趣),对于Python除了知道一个print()之外并没有更多的了解。但现在我已经能写出一段简单的代码,虽说可能写得比较丑陋,但总归是能写出来了。之前说到的《胜者出局》,其中一道谜题我也是通过写了两行Python代码解出来的。

就我的感受来看,Python确实是一门适合入门的语言,非常轻灵,就像一个五脏俱全的麻雀,很容易由此将初学者领进门。就说值类型,C#中有sbyteshortintlong,有floatdoubledecimal等等等等,而Python就用intfloat概括了以上,怎一个简单粗暴了得。如果先知道了“整型”和“浮点型”这两个大类,再去学习别的语言的类型,想必就能比较容易地过渡过去了。不过话说回来,最好的计算机语言一直是个引战话题,Python也一定有它不足的地方。对于简单的问题可能写起来非常简洁,而复杂一些的问题就未必简洁了。总体而言,Python确实给了我一些惊艳感,特别是得知它是一个创建于1991年的语言时,只想对这个语言的发明者拱手说一句佩服(当然,这么多年它也是一直在不断优化的)。不过somehow我还是有些不太适应Python,可能不会去进行更加深入的学习了。

但MITx 6.00.1x的重点事实上是通过Python这个具体的工具,来为初学者培养一种如何将一个具体问题抽象为编程问题以及如何一步步用代码实现的computational thinking。习题(特别是代码部分)感觉难,其实也主要难在对computational thinking的缺乏,而非对于Python这一语言的使用。我非常高兴这门课没有像大多数课程一样傻傻地教语言,而是在教我们使用语言解决问题的思维模式,因为这才是实际解决问题的根本,否则语言虽然学会了,面对实际问题还是丈二和尚摸不着头脑,不知道该从何下手。第二周到第五周的Problem Set都是非常有趣的对于解决某个具体问题的训练,第二周是计算信用卡还款,第三周是hangman游戏,第四周是拼单词的游戏,第五周是破解凯撒密码。这几个Problem Set合理地将一个大问题化解成运用当前知识可以解决的一个个小问题,慢慢地computational thinking就一点点建立起来了。

不过当然,一个具体的工具,不论多么复杂总是可以学会,而建立一种思维却不能一蹴而就。现在学完后我的computational thinking还是不怎么样,还需要大量的训练,不过俗话说万事开头难,师傅领进门,后面的事情就会容易很多。

我发现对于计算机语言来说,想入门不是一件简单的事情,在遇到一个真正能将自己领进门的课程之前,要经历若干次从入门到放弃的过程。MITx 6.00.1x这门课讲得非常通俗易懂,能让一个零基础的人从头到尾学完,并且里面讲的内容都能理解(虽说有学得好学不好的差别),有能力独立解决简单的编程问题,我认为确实是一门不错的课程。如果说有什么不满之处,就是我觉得这个课程的结构并不很清晰——不过这可能是我在吹毛求疵,也可能是我没有看配套教材,只看了视频和ppt的缘故,这门课的教材《Introduction to Computation and Programming Using Python (2nd Edition): With Application to Understanding Data》(ISBN: 9780262529624)据说也是一个非常不错的入门教材。习题非常值得一做,可以极大地巩固和扩展所学的知识,坚持下来会有不小的收获。

但显然,对于一个入门课程,对它的期待不能太高,不能指望学两个月以后自己就可以出道了,世界上没有这种课程。MIT还有一个与之配套的进阶课程《MITx - 6.00.2x: Introduction to Computational Thinking and Data Science》,这个就达到了中等难度,不过依然使用Python语言,由于我暂时不想深入了解Python,可能不会继续学下去。

接下来还是想尽快转回到学习C#,希望在此基础上学C#能容易一些。遗憾的是还没有找到教C#比较好的MOOC,edX上Microsoft自己开设的C#课程也结课不开了,教Python的课倒是层出不穷,真是网红语言……