Lecture 1. Computer Science
Welcome to CS61A
讲师介绍
- John DeNero:
- 课程讲师之一,专注于自然语言处理(Natural Language Processing,NLP)。
- 主要研究方向是通过计算机处理人类语言,如英语或中文,尤其关注自动翻译。
- 当前研究集中在增强人类译者的能力,帮助他们提高翻译的准确性和效率,而不是替代他们。
- 同时也热爱教学,曾多次教授此课程,对再次授课感到非常兴奋。
- Hany Farid:
- 与John DeNero共同教授本课程。
- 研究领域是视觉信息误导,涉及图像、视频、音频的操控及其对社会、民主的影响。
- 研究如何在互联网上的大量上传内容中检测和处理虚假信息,例如YouTube每分钟上传500小时的视频,如何在维持开放交流的同时减少网络的危害。
- 此前在Dartmouth College任教,现为加州大学伯克利分校的新成员。
课程参与人数与团队构成
- 目前参与者人数已经达到1822人,预计将超过2000人。
- 课程由73名助教(TAs)和导师(tutors)协助,主要负责小组教学。
- 助教和导师大多曾是本课程的学员,并多次回到课堂教授学生,他们是课程成功的关键。
编程与计算思维的重要性
- 课程目标:不仅是编写代码,还要培养学生计算思维,即如何系统化、量化、逻辑地解决问题。
- 学生可能会出于多种原因编写代码,例如:
- 开发应用程序或网页
- 构建桌面软件解决特定问题
- 编写数据分析程序用于预测股票市场、气候变化或地震等。
- 讲师们展示了编程的多种实际应用:
- John DeNero:利用代码分析文本,识别作者或进行语言翻译。
- Hany Farid:通过代码分析视觉信息,例如对图像进行处理和操纵。
编程与视觉信息处理的实际应用
- Hany Farid展示了如何通过编写代码操控图像,演示了编程的创意性和无限可能:
- 图像本质上是由像素和颜色值组成的数字矩阵,通过改变这些数字映射,可以产生不同的视觉效果。
- 例如,Hany将John的照片转换为彩虹色,或调整为更自然的色调,展示了图像处理的多种可能性。
- 法律案件中的图像处理:
- Hany Farid分享了一个关于银行抢劫案的真实案例。
- 该案中,警方通过摄像头捕捉到一张车牌的模糊照片,无法清晰识别车牌号码。
- 他利用了车牌的2:1宽高比和投影几何学(Projective Geometry)原理,通过图像扭曲反演,使车牌看起来像是从正面拍摄的,从而读取了车牌的最后四位数字,帮助警方抓捕了嫌犯。
-
该案例展示了如何通过编程技术解决实际问题,尤其是在视觉信息分析领域。
- Hany Farid分享了一个关于银行抢劫案的真实案例。
- 编程的力量:
- 编程不仅可以用来娱乐,还可以用于分析、解决重要的现实问题。
- 学生需要掌握基础工具和技能,进而应用于图像分析、文本处理、气候数据分析等领域。
课程结构与学习建议
- 课程内容:
- 虽然课程内容涉及编程,但真正的学习是在你独立解决问题时发生的。
- 课程包括:讲座、实验(Lab)、讨论(Discussion)和辅导(Tutorial),每个部分都非常重要。
- 讲座安排:
- 课程的讲座会提前发布视频。通常在星期一、星期三、星期五有讲座,但视频会在前一天的下午5点发布,给学生一个时间提前预习。
- 实验(Lab):
- 实验是课程最重要的部分之一。通过实验,学生可以练习解决实际问题。
- 周一下午2:00 PM会有实验的简介会,由助教帮助学生了解实验任务及如何获取帮助。
- 讨论与辅导(Discussion & Tutorial):
- 周三进行讨论与辅导,辅导课不需要使用电脑,目的是培养学生在没有计算机的情况下,独立思考和解决问题的能力。
- 每个辅导小组最多五人,提供了小规模的个性化帮助。
教学方式与资源
远程教学
- 虽然没有实体课堂,但通过远程授课,学生有更多的舒适性,不需要面对拥挤的教室。
- 虽然参与人数众多,但教学团队会尽量让课堂变得更加个性化,确保每位学生都能获得足够的支持。
课程的教学支持
- 编程中的独立思考:
- 编程学习的关键在于独立思考,要能够在不依赖计算机的情况下,用大脑推理出程序是否能正常运行。
- 课程提供了一对一的帮助。每个辅导课的最大人数为5人,已经相当小,但如果需要更小规模的帮助,可以通过办公时间(Staff Office Hours)获得一对一的指导。
- 办公时间安排:
- 下周起将提供正式的办公时间,本周也有一些针对设置计算机环境的帮助时间,安排会在Piazza平台上公布。
- 不同学生的最佳学习方式:
- 不同的学生在课程中可能对不同部分的学习感到受益匪浅,因此建议尝试所有部分,如实验(Lab)、讨论(Discussion)和办公时间,以发现最适合自己的学习方式。
实验简介会与讨论课
- 实验简介会:
- 实验简介会将由助教主持,帮助学生熟悉实验设置、展示示例问题,并介绍如何解决常见问题。
- 简介会后,学生可以选择独立完成实验或协作完成实验。
- 实验设计为一个半小时内完成,从简介到提交。
- 实验安排与其他学习任务:
- 实验通常在周一下午进行,实验简介后即开始实验。尽管实验可以在周一内完成,但建议按时参加实验。
- 讨论课与辅导课:
- 周三的讨论课与辅导课为学生提供解决问题的机会,讨论课重点是不用电脑,而是通过思考、阅读和书写解决问题。
- 学生应参加讨论课的介绍会,以便更好地理解和参与辅导课的内容。
课程的学习节奏与提醒
- 每周的节奏:
- 每周都有新的作业、新的实验、新的讨论和新的辅导。这些任务相互关联,建议学生按时完成每一项任务,以免积压。
- 实验设计为约1.5小时内可以完成,但作业通常会花费更多时间,因为作业问题更复杂且具有挑战性。
- 实验简介录像:
- 实验简介会将会录制并重复播放。如果无法参加2PM的直播,还可以参加6PM、7PM或9PM的场次。讨论的介绍也有相同的安排。
问题解答与联系渠道
- 提问方式:
- 当不在直播课堂时,最好的提问方式是通过Piazza平台。如果你发布私人问题,课程所有的工作人员都可以看到,这样通常可以更快地得到回答。如果发布公开问题,甚至其他学生也可以参与回答。
- 学生也可以通过[email protected]联系讲师和助教团队,这比直接发邮件给个人要有效得多。
- 每日Q&A与办公时间:
- 每周一、三、五早上有讲师的Q&A时段,可以在这些时段提出问题。如果不方便参加,可以观看录制的视频。
- 实验、讨论的介绍以及辅导的链接、时间安排都会在课程网站上显示。
课程网站与资源
- 课程网站(cs61a.org):
- 网站提供每周的课程安排、视频发布时间、讲座Q&A时间、实验和讨论的时间安排等。
- 还可以找到所有助教和导师的联系方式,以及课程材料的链接(包括幻灯片、演示、教材链接、实验、作业和项目)。
- 课程材料与自助学习:
- 所有的课程材料都是公开的,可以随时访问学习。通过网站,学生可以找到实验、作业、项目等的链接,以及相关的参考资源,如教材等。
计算机科学导论
计算机科学概述
- 计算机科学的核心是研究世界上最灵活的机器——计算机,以及利用计算来解决问题。
- 本课程主要讨论哪些问题可以通过计算解决,以及如何解决这些问题,并探索能带来高效解决方案的技术。
计算机科学的各个分支
- 计算机科学分为许多领域,如系统设计、人工智能、图形学、安全性、网络、编程语言、理论研究和科学计算等。
- 每个领域内部还包含许多细分领域。例如,人工智能下有专门研究决策、机器人、自然语言处理等子领域。每个研究者通常只专注于某个子子领域,例如John DeNero的研究重点是机器翻译。
计算机科学的挑战:复杂性与抽象
- 计算机科学中的一个主要挑战是处理复杂性,尤其是当你试图构建一个有趣或实用的系统时。
- 抽象是应对复杂性的核心工具。抽象意味着为复杂的事物赋予一个名称,并不关注其内部细节。比如,我们称呼某个人为”John”,而不必考虑他的身体由多少个碳原子组成。
课程介绍
- 编程范式:
- 课程将介绍计算机科学中的编程范式,这些概念已经在软件开发中经过时间的检验,能够帮助你组织大型程序。
- Python编程语言:
- 本课程将教授Python的基础,而不是深入探讨其最新特性或图形绘制、音乐创作等功能。我们关注的是编程语言的基本原理,这些原理在计算机科学的任何应用中都适用。
- 项目开发:
- 课程中的项目将挑战学生构建一些相对复杂的系统,其他学校的讲师可能认为这些项目难度太大,但伯克利的学生足够聪明并能在课程团队的支持下完成这些项目。
课程最终项目:解释编程语言
- 课程最后会讨论计算机如何解释编程语言,即如何将编写的程序转换为计算机能够理解的指令。期末项目将要求学生编写一个解释器,让他们亲身体验计算机如何运行代码。
多种编程语言
- 在本课程中,将涉及三种不同的编程语言,这反映了实际软件开发中常见的情况:不同的编程语言适合不同的任务。
- 本课程不会仅仅教两种相似的语言,而是会帮助学生理解不同语言如何在不同场景中更为有效。
课程难度
- 该课程对初学者来说时间要求较高,尤其是没有编程经验的学生。如果之前有编程经验,无论是AP课程还是自学,都会帮助你更快上手。
- 如果你完全没有编程背景,可以考虑先修CS 10: The Beauty and Joy of Computing,这门课程专为没有编程经验的学生设计。
CS 10: The Beauty and Joy of Computing
- CS 10课程介绍:
- 该课程使用了一个基于图形化编程环境的工具,学生通过拼接代码块来编写程序,避免了许多常见的编程错误,并逐步过渡到基于文本的Python编程。
- 许多从CS 10转入CS 61A的学生反馈认为,这门课为他们后续学习CS 61A打下了坚实的基础。CS 10是一门平缓引入编程的课程,并且目前还有空位,学生可以尝试这门课,同时继续了解CS 61A,决定哪门课程更适合自己。
其他外部资源
- INFO 206A课程:
- Hany Farid教授还在信息学院(School of Information)教授INFO 206A,这是一门为期七周的课程,假设学生没有编程经验。
- 该课程内容较CS 61A有更慢的学习进度,所有视频都已在线公开,可以作为额外的学习资源,帮助学生更好地理解基础概念。
课程政策介绍
学习过程中的挑战与合作
- 学习的本质:
- 本课程的重点是学习和掌握新知识,而不是证明你已经掌握了某些技能。在学习过程中,遇到困难并需要练习是正常的。学习的过程充满了挑战,在尚未完全掌握时也不要感到焦虑,这正是课程设计的目的——帮助你从未知走向已知。
- 如果有人在学习过程中因为不懂或未掌握某些内容而受到不友好的对待,请立即告知讲师。
- 互助学习的价值:
- 课程中的互助学习非常重要。虽然在线教学环境下与其他同学建立联系会变得更困难,但课程设计了辅导课等互动环节,帮助学生互相交流并共同学习。
- 向他人解释技术性内容是提升理解能力的好方法,帮助别人学习也是你学习的一部分。课程团队希望你在这方面与助教和同学积极互动。
课程政策与合作
- 提问与互动:
- 课程团队并不是来评判学生的,而是为了帮助学生获得最好的学习体验。不要害怕向助教或讲师提问,他们的职责是支持你的成功。
- 合作项目与限制:
- 部分项目可以与伙伴合作,建议从辅导小组中选择合作伙伴。你可以与合作伙伴分享一切,包括代码和思路,并进行共同讨论。但在作业和项目中,不能查看除合作伙伴之外的代码。
- 在实验(Lab)中,学生可以随意合作,因为实验的目的是学习,但在作业和项目中,你应该独立完成,确保自己理解代码的逻辑和实现。
- 避免直接给答案:帮助他人时,可以解释思路、指出问题,但不要直接提供答案或为别人编写代码,避免剥夺他们通过解决问题而学习的机会。
学习的关键:通过失败学习
- 学习过程中的挣扎:
- 正确的学习发生在你未能立即解决问题时,挣扎和失败是学习过程中必不可少的一部分。解决问题标志着你已经掌握了相关知识,但学习本身发生在挣扎和解决问题的过程中。
- 不要因为某些问题未能立即解决而感到沮丧,这正是学习的核心。如果有人为你直接解决了问题,你就失去了宝贵的学习机会。
学术诚信与违纪处理
- 违规后果:
- 违反合作和抄袭规则会导致课程失败。尽管课程很大,学生人数众多,但我们使用技术手段检测抄袭,并且每学期都会有人因违规行为被发现并受到处理。
- 无论是抄袭项目答案还是在考试中作弊,都会被追究责任。如果你发现自己卡在某个问题上,花费了太长时间,也不要独自苦战太久。寻求帮助,但请记住,要保留自己解决问题的机会。
最后的建议
- 培养良好的学习习惯:
- 现在是培养良好学习习惯的关键时刻,确保你遵守课程的合作政策,与他人合作时保持学术诚信。不要试图走捷径,因为我们会检测到违规行为,并且我们希望看到你通过真正的学习而获得成功。
- 尽管Github上可能有现成的作业答案,但真正的学习在于独立解决问题。抄袭可能会暂时蒙混过关,但在面对现实中的复杂问题时,将无法找到现成答案。
- 在伯克利建立的声誉非常重要,很多同学会成为你未来职业生涯中的同事。如果你被认为是那个“抄袭所有项目”的人,长期来看对你毫无益处。
编程演示与内容概览
- 课程演示:
- 为了展示本课程涵盖的内容,John展示了一个Python小程序。在课程的第一天,虽然不会解释所有细节,但演示将涉及Python中的一些基本概念,包括函数、数值运算和文本处理。
- Python编程语言:
-
本课程使用Python 3,这是目前最新的版本。Python的交互式解释器可以快速执行代码,例如计算数值、处理文本等。
-
Python不仅是一个高级计算器,它还能处理各种类型的数据,例如文本。John演示了如何读取莎士比亚的全部37部戏剧文本,并进行基本的数据操作,比如统计单词“the”在所有戏剧中的出现次数。
-
- 课程结构:
- 本课程将分为五个主要部分:
- 函数:如何定义和使用函数,这是课程前四周的重点。
- 数值与文本处理:Python中的各种数据类型和操作。
- 对象:表示现实世界中事物的编程概念。
- 解释器:了解计算机如何解释和执行代码。
- 数据处理:处理复杂的数据集,尤其是非数值数据,如文本和图像。
- 本课程将分为五个主要部分:
文本处理示例:莎士比亚戏剧
- 文本分析:
- John通过读取文件
shakespeare.txt
,展示了如何使用Python快速处理大量文本数据。 -
例如,统计莎士比亚37部戏剧中的单词总数,或计算某个单词(如“the”或“thou”)的出现次数。虽然Python无法理解这些单词的含义,但它能高效地处理和操作这些数据。
- 演示通过简短的代码揭示了如何用编程解决实际问题,这也是课程的核心内容之一。虽然现在的展示可能还不太容易理解,但在接下来的几周内,学生将会逐步掌握这些概念。
- John通过读取文件
- 莎士比亚文本分析:
- John继续展示如何用Python处理莎士比亚的文本,显示如何通过编程快速分析大量数据。例如,他统计了逗号的出现次数,发现莎士比亚文本中有81,000个逗号,占全部文本的8%以上。
- 随后,John展示了如何通过简单的操作将所有单词转换为一个集合,并统计莎士比亚作品中独特单词的数量为33,000个,这大大少于总的单词数量。
- 代码示例:
- 通过调用
text.count("John")
,John发现他的名字在莎士比亚的作品中出现了263次,他开玩笑地提到自己在莎士比亚文本中占据了一席之地。
- 通过调用
编程中的灵活性
- 操作字符串与单词:
- 编程语言的灵活性在于你可以随时修改或重新表达信息。例如,通过编写代码,John能够从每个单词中提取首字母,甚至可以将单词倒写。
- 他展示了如何利用程序找出莎士比亚文本中正读与倒读相同的单词(例如“redder”和“level”)以及倒读后仍为有效单词的单词(例如“spit”和“tips”)。
- 组合操作:
- 通过组合不同的编程操作,John展示了如何更深入地分析文本。例如,他编写了一个程序,找出莎士比亚文本中倒读后仍为有效单词且长度超过六个字符的单词,结果包括“drawer”和“reward”等。
编程语言的力量
- 编程语言的无限可能:
- John强调了编程语言的强大之处在于可以随意组合不同的操作,不局限于某些固定的功能。他通过展示如何组合代码片段来进行复杂的文本操作,演示了Python的灵活性和广泛的应用前景。
# 基本运算
2020
2000 + 20
1 + 2 + 3 + 4 * ((5 // 6) + 7 * 8 * 9)
abs(-2)
abs(2301 - 4321)
# 字符串操作
'Go Bears'
'Gob' + 'ears'
# 打开莎士比亚全集文本文件并读取其内容
shakes = open('shakespeare.txt')
text = shakes.read().split()
# 统计文本长度
len(text) # 输出:980637
# 显示前25个单词
text[:25] # 输出:['A', 'MIDSUMMER-NIGHT'S', 'DREAM', 'Now', ',', 'fair', 'Hippolyta', ',', 'our', 'nuptial', 'hour', 'draw's', 'on', 'apace', ';', 'four', 'happy', 'days', 'bring', 'in', 'Another', 'moon', ';', 'but', 'O']
# 统计某个单词的出现次数
text.count('the') # 输出:23272
text.count('thou') # 输出:4501
text.count('you') # 输出:12361
text.count('forsooth') # 输出:40
# 统计标点符号的出现比例
text.count(',') / len(text) # 输出:0.0834427010198473
# 将文本中的单词转换为集合以获得唯一单词的数量
words = set(text)
len(words) # 输出:33505
# 检查某些单词是否存在于莎士比亚文本中
'forsooth' in words # 输出:True
'computer' in words # 输出:False
'John' in words # 输出:True
# 统计特定单词的出现次数
text.count('John') # 输出:263
text.count('Hany') # 输出:0
# 操作字符串,获取单词的首字母
'draw'[0] # 输出:'d'
# 提取所有单词的首字母并去重
{w[0] for w in words}
# 输出:{'9', 'g', 'L', 'B', 's', 'W', 'b', '7', 'D', 'T', 'h', 'r', 't', 'i', '4', 'm', 'S', '1', 'f', 'p', 'F', 'G', 'C', 'R', 'q', 'l', 'a', 'v', 'V', '8', 'A', 'N', '2', 'M', '6', 'u', 'J', '5', '&', 'Z', 'H', 'o', ';', 'O', 'k', 'K', 'w', 'P'}
# 统计单词 "egg" 的出现次数
text.count('egg') # 输出:15
# 计算首字母的总数量
len({w[0] for w in words}) # 输出:71
# 反转单词
'draw'[::-1] # 输出:'ward'
# 找出正读与倒读相同的单词
{w for w in words if w == w[::-1]}
# 输出:{'wow', 'mum', 'refer', 'madam', 'sees', 'eye', 'deed', 'nun', 'bib', 'level', 'tot', 'peep', 'pip', 'gig', 'ere', 'dad'}
# 找出长度大于4且正读与倒读相同的单词
{w for w in words if w == w[::-1] and len(w) > 4}
# 输出:{'madam', 'refer', 'redder', 'level'}
# 找出正读和倒读后均为有效单词的单词
{w for w in words if w[::-1] in words and len(w) == 4}
# 输出:{'flow', 'pool', 'wolf', 'reel', 'spit', 'deed', 'port', 'star', 'keel'}
# 查找长度为5的正读与倒读后均为有效单词的单词
{w for w in words if w[::-1] in words and len(w) == 5}
# 输出:{'knits', 'stink', 'loops', 'spool'}
课程总结与下一步
- 课程后续安排:
- 辅导课将于今天进行,学生可以通过tutorials.cs61a.org访问相关内容。
- 周五讲座视频将在周四晚上或周五发布,建议学生及时观看。同时,周五2-3PM将有Q&A环节,学生可以随时提问。
- 本周没有实验或讨论课,因此学生不会错过任何关键内容。到目前为止,今天的讲座是唯一的课程活动。l