Lecture 1. Computer Science


Welcome to CS 61A

课程内容介绍

在本课程中,你将编写代码,但编写代码只是课程的一部分。更重要的是,本课程将教你如何进行计算思维——即如何以系统化、定量化和逻辑化的方式来分析问题并解决问题。无论你是只参加这门课程,还是计划之后参加更多课程成为一名软件工程师,编写代码都有许多用途。你可能会编写应用程序、网页、桌面应用软件来解决问题,或编写数据分析预测股市、气候变化或下一次地震的发生。

编程的实际应用

例如,像Professor DeNero那样的人可能会编写代码来分析文本,以确定谁是某作品的作者,或者用来进行语言之间的翻译。如果你像Professor Farid一样研究视觉信息,可能会编写代码来分析和处理图像。编程是将你头脑中的想法转化为实际可行操作的最强大技术之一。

图像处理的趣味性

Professor Farid展示了几个可以用图像玩耍的例子,比如改变像素值到颜色的映射,创造出有趣的视觉效果。例如,通过程序将图像的像素扭曲。这些只是基于你的想象力和技能集的限制。

应用于严肃场合

除了娱乐,编程还可以用于更严肃的应用。Professor Farid花了很多时间研究视觉信息,并在法律领域工作,试图分析图像以提取信息。他处理过的一个最喜欢的案例是一起银行抢劫案,通过处理监控相机拍摄的照片,帮助找到了银行劫匪的车牌号,最终逮捕了嫌疑人。

image-20240502121801734

这部分内容的目的不在于展示代码,而是展示编程的强大能力。你的想象力和技能是唯一的限制。这门课程及后续课程的任务是扩展你的技能集,为你提供基本工具,让你学会如何使用计算思维解决问题,无论是分析图像、文本还是来自股市和气候变化的数据。我们的目标是教你这些通用技能,并帮助你将这些技能应用于解决有趣和重要的问题,助你在职业生涯中向前发展。


课程组成部分

在本课程中,你将参与包括讲座、实验室(lab)、讨论和教程等多个部分,每一部分都非常重要。我们将提供视频讲座,这在常规学期内比现场讲座更受欢迎。因此,我们将在晚上提前发布讲座视频,让你有更多时间提前开始学习。

实验(Lab)的重要性

实验(Lab)是课程中最重要的部分,它定于每周一进行。这是因为课程的核心是学习解决问题,而解决问题的技能需要通过实践来培养。我们推荐你参加每周一下午2点或2点10分的实验介绍,而不是单独完成实验任务。实验介绍由经验丰富的助教主持,他们会提供问题解决的方向和帮助。

讨论和教程的作用

讨论和教程是课程中另一个非常重要的组成部分,它们通常在每周三进行。教程与实验室不同,你不需要电脑来解决问题,这有助于培养你独立思考问题的能力,而不是依赖计算机判断对错。这对学习计算机科学和编程来说是极其重要的技能。

作业和项目的安排

每周都会有新的作业和实验室任务,这些都是为了帮助你实践并提高解决问题的能力。除此之外,课程还会设置一些项目,有时这些项目的截止日期会安排在周五。所有这些活动都是为了确保你能够有效地学习和应用课程中学到的知识。

辅助资源和帮助

课程网站上提供了完整的课程安排和资源,你可以在需要时查阅。此外,如果你在完成实验室或作业时遇到困难,可以利用助教提供的办公时间获取一对一的帮助。我们还设有问答环节,你可以在这些时间向教师提出关于讲座内容的问题,或者听听其他同学的问题。

教学方法的创新

为了使课程感觉更加互动和精细,我们引入了教程这种新的教学格式。这不仅仅是为了帮助你解决具体的技术问题,更是为了帮助你学会如何思考和解决问题,这一点在未来的职业生涯中将非常有用。

通过这些丰富的课程内容和教学活动,我们的目标是帮助你掌握解决问题的基本工具,无论是在图像分析、文本处理还是数据分析等领域,都能运用这些工具来解决实际问题。


计算机科学简介的教学方式

计算机科学是对人类创造的最灵活的机器——计算机的研究。这门科学探讨哪些问题可以通过计算来解决,如何解决这些问题,以及什么技术可以带来有效的解决方案。例如,排序算法的最优方法是计算机科学教学的一部分,尽管这通常是61b课程的主题。而在61a中,我们更侧重于如何解决各种突如其来的问题。

计算机科学家的研究领域

当你问一个计算机科学家他们在做什么时,他们通常不会简单地说研究计算机。他们会具体说明他们研究计算机科学的哪一个分支。计算机科学家可能专注于系统(比如开发手机操作系统或全球分布式系统如Facebook),人工智能(使机器能够执行诸如行走和解析图像等生物擅长的任务),图形学(制作像皮克斯这样的动画电影),安全性(确保例如Zoom网络研讨会的安全),网络技术(构建互联网),编程语言(构建所有这些基础设施),理论或科学计算等。

计算机科学的细分领域

计算机科学的每个领域内还有更细分的子领域。例如,在人工智能领域,研究者可能不会广泛地研究人工智能,而是专注于特定的方面,如决策制定——世界上最好的国际象棋和围棋选手现在是计算机,或是自然语言处理,即尝试让计算机对文本执行有用的操作。Professor DeNero个人的研究领域是机器翻译,这是自然语言处理这一子领域中的一个更小的子领域。


如何教授计算机科学入门课程

教授计算机科学不仅仅是教授编程。还包括应对计算机科学家的共同敌人——复杂性。当你在上述任何领域尝试做一些有趣的事情时,你必须与复杂性作斗争。每当你构建一些有趣的东西时,你都必须面对并管理这种复杂性。

抽象化的重要性

计算机科学是研究如何使用计算机解决问题的科学,涉及各种技术和方法。在这个过程中,我们使用“抽象化”这一工具来简化复杂性。抽象化是指为复杂的事物命名,而忽略其内部细节,就像我们用“John”这个名字代表一个由复杂细胞和组织构成的人类个体。在计算机编程中应用这种思维,需要一定的练习和技巧。

编程范式的介绍

我们将介绍几种编程范式,这些是时间验证的程序开发理念,帮助组织和处理大型程序。这些范式在计算机科学的多个子领域中都有应用,是学习计算机科学不可或缺的一部分。

Python编程基础

课程还包括Python编程基础的学习,但我们关注的是编程语言的基本原理,而不是深入其最新功能或应用。我们的目标是帮助学生构建基础,从而在计算机科学的任何领域都能应用这些基本技能。

项目与实践

我们会进行一些较大的项目,让学生有机会实践所学。这些项目可能看起来挑战很大,但伯克利的学生有能力完成它们。通过这些项目,学生可以在第一门课程中就开始构建有趣的东西。

计算机如何解释编程语言

课程的最后,我们将探讨计算机如何解释编程语言,即如何将编写的程序转化为计算机能够执行的指令。这部分将通过一个项目来完成,学生将亲自编写一个程序,让计算机能够理解并执行。

课程的挑战与选择

课程的挑战性

这门课程以其难度和所需的时间投入而闻名,尤其是对于没有任何编程经验的学生。即便如此,从零开始的学生也有可能成功完成课程,尽管这将需要更多的时间和努力。

替代课程的选择

对于没有编程经验的学生,可以考虑先修CS 10(计算的美丽与乐趣),这是为初学者设计的课程,使用基于块的编程环境,减少了编程的难度,并在学期后半部分教授Python。这可以为学生提供一个更平缓的学习曲线,帮助他们为更高级的课程,如61A,做好准备。

额外的学习资源

学校信息学院还提供了一门假设没有Python或编程先验知识的七周课程(INFO 206A),它的学习节奏比61A更慢,可以作为补充材料帮助学生更好地理解基本概念。

总体而言,这门课程旨在通过不同的教学部分和项目实践,为学生提供计算机科学的全面基础,让他们能够在未来的学习和职业生涯中解决各种问题。


课程政策和学习哲学

课程目的与合作精神

本课程的目的是让学生学习他们尚未掌握的知识,而不是证明他们已经知道的内容。因此,课程鼓励学生之间相互帮助,共同学习。课程政策不允许任何人因为其他同学还未掌握某些内容而对他们进行贬低。这是一个学习和成长的过程,过程中的挑战和实践是必不可少的。

技术交流与学习

在学习过程中,向其他人解释技术问题是一项非常宝贵的技能。课程鼓励学生在解决问题的过程中尝试向他人解释问题,这不仅可以加深自己的理解,也能帮助他人学习。课程工作人员的角色是辅助和支持学生的学习,而不是评判学生的能力。

关于协作与学习的正确态度

课程鼓励学生相互讨论和协作,一些项目允许与合作伙伴一起完成。然而,在协作时也有一定的限制:不应查看除合作伙伴外其他人的代码,除非是在帮助他们解决问题。在实验室中可以自由探索,但在家庭作业和项目中,学生应依靠自己的理解完成任务。

如何处理学习中的挑战

学习过程中的失败和挑战是正常的,甚至是必需的。当学生遇到难题时,他们应该寻求帮助,但需要保持自主解决问题的态度。学习发生在解决问题的过程中,而不仅仅是在问题解决之后。

学术诚信的重要性

课程严格要求学术诚信,任何抄袭行为都将受到处罚。课程使用先进的技术来检测不当行为,因此试图取巧的行为是不明智的。建立良好的学术习惯对未来的职业生涯至关重要,因为真实世界中的问题没有现成的答案可以抄袭。

本课程旨在通过挑战性的项目和严格的学术要求,培养学生独立解决问题的能力。课程政策和学习哲学强调合作、学术诚信和通过挑战中的实践学习的重要性。通过这种方式,学生不仅学习计算机科学的技术知识,还学习如何在现实世界中应用这些知识解决复杂问题。


课程演示与内容概览

程序演示简介

在课程的开头,教授进行了一个编程演示,选择不解释所有细节,目的是避免第一天的演示变得乏味。演示中,教授简要介绍了课程将涉及的五个不同部分:函数、值、对象、解释器和数据,并展示了使用Python进行简单计算和数据处理的例子。

Python编程基础

使用Python 3版本,教授展示了如何启动Python解释器并进行基本的计算操作,例如加法、乘法和使用内置函数(如绝对值计算)。这些基本操作展示了Python不仅可以处理数字,还可以操作字符串和其他类型的数据。

复杂数据操作

演示中进一步展示了如何处理更复杂的数据类型,例如文本字符串。以莎士比亚的作品为例,教授展示了如何快速统计作品中的单词数量、使用不同的字符串函数,以及如何通过编程快速访问和处理存储在文件中的大量文本数据。

文本数据分析

通过分析莎士比亚的作品,教授示范了如何进行文本分析,例如计算特定单词(如“the”和“thou”)的出现次数,以及如何处理和分析文本数据以找出具有特定属性的单词(例如回文词)。这一部分强调了编程语言在文本分析中的应用,以及如何利用编程方法解决实际问题。

编程语言的灵活性

演示中教授强调了编程语言的强大灵活性,可以通过编程对信息进行重新表达或转换。例如,将莎士比亚作品中的所有单词转换为一个集合来找出独特的单词,或者探索所有单词的首字母。这种灵活性使得程序员可以根据需要自由地组合和重组数据处理步骤,以探索和发现数据中的新见解。

实际应用和学习指南

教授通过这个演示不仅展示了如何使用Python进行文本处理和数据分析,还介绍了编程可以如何帮助我们理解和解析大量信息。此外,教授提醒学生,通过课程的学习,他们将能够逐步掌握将这些基本概念应用于更大更复杂问题的能力。课程的目的是让学生学会如何将学到的编程技能应用于解决各种各样的问题,不仅限于计算或数据处理,还包括实际生活中的各种挑战。


计算机科学的巨大生产力源于其优雅而强大的基本思想,所有计算的核心在于三点:信息的表示、处理的逻辑以及设计抽象来管理逻辑的复杂性

1. 信息的表示

信息的表示指的是如何将现实世界中的数据转换为计算机可以理解和处理的形式。这是计算的基础,因为没有数据,计算就无从谈起。

例子:

在计算机中,整数可以用二进制表示。例如,十进制的数字 5 在计算机中表示为二进制的 101。同样,文本数据也可以通过字符编码(如 ASCII 或 Unicode)来表示,比如字母 ‘A’ 在 ASCII 中表示为 65。

扩展:

不同的数据类型需要不同的表示方式。除了基本的整数和字符表示外,复杂的数据结构(如数组、链表、树和图)也是信息表示的一部分。对于图像数据,可以使用像素矩阵表示;对于音频数据,可以使用采样点序列表示。选择合适的数据表示不仅影响计算的准确性,还直接关系到计算的效率和存储的使用。

2. 处理的逻辑

处理的逻辑指的是对信息进行操作和计算的规则和方法。这包括从简单的算术运算到复杂的算法和程序流程控制。

例子:

一个简单的例子是排序算法,如快速排序。快速排序通过选择一个基准元素,将数组分为两个子数组,使得一个子数组中的所有元素都小于基准元素,而另一个子数组中的所有元素都大于基准元素。然后递归地对这两个子数组进行排序。

void quicksort(int arr[], int low, int high) {
    if (low < high) {
        int pivot = partition(arr, low, high);
        quicksort(arr, low, pivot - 1);
        quicksort(arr, pivot + 1, high);
    }
}

扩展:

处理逻辑不仅包括具体的算法,还包括程序的控制结构(如条件判断和循环)、函数调用机制以及错误处理等。高效的处理逻辑可以显著提高程序的执行效率和可靠性。例如,理解和应用算法设计中的分治法、动态规划和贪心算法等思想,可以帮助解决各种复杂问题。

3. 设计抽象来管理逻辑的复杂性

设计抽象是为了应对复杂系统中的逻辑复杂性。通过将复杂的问题分解为更小的、易于理解和处理的模块,可以更好地管理和维护系统。

例子:

面向对象编程(OOP)就是一种设计抽象的方法。OOP通过定义类和对象,将数据和操作封装在一起,从而实现模块化和重用。例如,考虑一个银行系统,我们可以设计一个 Account 类,包含账户余额和一些操作(如存款和取款)。

class Account {
private:
    double balance;
public:
    Account(double initialBalance) : balance(initialBalance) {}
    void deposit(double amount) { balance += amount; }
    void withdraw(double amount) { if (amount <= balance) balance -= amount; }
    double getBalance() const { return balance; }
};

扩展:

除了OOP,其他编程范式(如函数式编程和面向方面编程)也提供了不同的抽象方法。设计模式(如工厂模式、观察者模式和单例模式)提供了解决常见设计问题的通用方案。抽象不仅限于代码层面,还包括系统架构和软件设计。例如,微服务架构通过将大型应用拆分为多个独立的服务,使得每个服务可以独立开发、部署和扩展,从而有效管理系统的复杂性。

这三点——信息的表示、处理的逻辑和设计抽象——共同构成了计算机科学的基础。通过精确理解和应用这些基本思想,我们可以构建高效、可靠和可维护的计算系统,从而实现计算机科学的巨大生产力。