CS 自学计划——Harvard CS50: Week 0

这周开始了我的 CS 自学计划,目的是补全自己作为转行前端工程师缺失的系统计算机学习。目前的想法是对标计算机本科专业的课程设置,全面系统地学习一遍计算机基础课程。

这个计划的第一门课选择了哈佛大学最受欢迎的公选课程:CS50,算是把自己当做小白重新入门吧。​课程的定位是为包括小白在内的同学提供对 CS 和编码艺术的介绍。第一周的内容是课程介绍,​没有涉及太多的技术细节,我会总结为两个字,就是关于“抽象”。

第一层抽象:CS 是做什么的

CS 容易被想象成非常高深、非常极客的概念,但​ Professor David J. Malan 给出了一个更平实但更接近于本质的答案,CS 是用来解决问题的。抽象成一个简单的模型就是给它一些内容,它能帮我们解决成我们需要的内容,至于它做了什么,我们可以先将它看做一个黑盒。

image-20231103194531213

第二层抽象:解决问题的方法即算法

计算机通过 0 和 1 可以标记不同的内容,课程中使用了一系列与日常生活紧密相关的例子,层层推进地演示了计算机的实现方式:

  1. 标记数字:二进制换算
  2. 标记文字:
    1. ASCII 标记英文
    2. Unicode 标记更多文字
    3. emoji 标记更年轻的文字
  3. 标记图像:RGB
  4. 标记视频

image-20231103194557581

这些例子反映出不同的解决方法实现了不同的结果,不同的文件类型即标记出不同的解决方法——所有用来解决问题的方法都是算法。

为了进一步阐释算法,Professor David J. Malan 上演了经典的撕黄页书的桥段。从“挨页翻找”到“每两页翻找”再到“一分为二查找”,由此说明算法存在正确与否和高效与否的差别。

第三层抽象:从需求到代码

在撕黄页书的例子中,不需要任何计算机知识也能够知道如何解决查找特定人名的问题(了解 26 个字母的排序即可),因此,在很多情况下,只要能够定位问题,用用伪代码描述解决方案,就已经离最终的结果很近——只差把伪代码翻译成代码了。
在课程的后半部分,Professor David J. Malan 通过几个 Scratch 项目阐释了如何通过“伪代码”(Scratch 算是包含了代码核心思想的非代码吧)来解决问题。最终的课程作业也是使用 Scratch 来“解决一个问题”——自己写一个项目。
image-20231103194649899

一些思考

  1. 尽管这一节课对于非技术小白来说不会学到什么新鲜的“知识点”,但是看完的感受仍然是时间没有白费,最让我印象深刻的点来自于如何做好技术与沟通的结合,包括:
    1. 课堂上举的例子都很生动,解释起来也深入浅出,能够很大程度上消除第一次接触 CS 的人对于学习这门课的畏难情绪;
    2. 例子的安排很连贯,能和前一个知识点环环相扣,能够很好的抓住大家的吸引力
  2. 尽管是第一节课,但例子中涵盖了许多 CS 的核心思想和概念,除了解释 Scratch 语法的过程中已经涉及到 conditional、loop、定时器、composition 等等之外,让我觉得最有意思的是对“怎样算是解决了问题”的案例演示。这个点来自于 Professor David J. Malan 自己多年前的 Scratch 项目,其中有个动效是一片垃圾从天而降,操作者可以通过鼠标控制垃圾的动线,将它“扔进”左下角的垃圾桶了。这个动作看起来是“扔进”了垃圾桶,但实际上只是符合了人在物理世界中对事物的理解,在代码实现上,垃圾只是位移到了垃圾桶上方,然后消失了。让我觉得有意思的地方在于,尽管它没有真实再现现实,但换句话说,“怎样算是解决了问题”的底层问题是“什么才是真正的需求”,垃圾看起来扔进了垃圾桶不就是需求吗,至于它应该真的进入垃圾桶,反而是我们给需求强加的伪需求了。

后续 TODO

  • 作业 // 准备写一个贪吃蛇的游戏
  • 给博客增加 About Me 页面,把自学计划的内容更新进去