跳转至

CS 61B Data Structures

约 1966 个字 预计阅读时间 7 分钟


课程介绍

(基于2021Spring, 2022Spring/Fall)

作为CS61ABC的第二门课程,主要涵盖了数据结构与算法,穿插学习了JAVA的基本语法及数据结构,辅以优秀的Lab和Project,讲练结合,过程十分有趣。Project0会要求实现一个2048小游戏。从此,你就得规划好自己的算法,过于繁杂的实现将阻碍自己调试。通过JUnit的学习认识测试的重要性,并随着课程深入编写自己的测试,以保证通过Gradescope的考验(本地的测试并不完善)。

CS61B有多个版本,其中对外开放测试的是sp18与sp21,下面给出两个版本的邀请码,注意!选择大学的时候要选择UC Berkeley

Note

18sp:MNXYKX

21sp:MB7ZPY

其中sp21更加偏向软件工程,lab的任务量比较轻松,且基本都是为了project服务,而sp18更加偏向数据结构,有着更加丰富的lab来巩固自己的知识。所以大家可以根据自己的需求来选择对应的版本,当然我选择21sp的同学们也可以去写一写18sp的项目

可以说,CS61B是一门披着数据结构外衣的软件工程课。与国内大多数的数据结构课程不同,其作业有规范的API,autograder会对代码的风格进行判别,这意味着你想要的代码不仅仅是功能完善的,还要要拥有规范的缩进格式,不能出现Magic Number...

来自Delusion:看到Style扣了一百多分头都疼...

学习这门课程应该参考着红宝书(Algorithm4)进行学习,你可以通过Reading定位到相应章节,视频覆盖了Hug's book大多数的内容

(补充:建议有时间的朋友从头开始阅读这本书)

Project介绍

sp21中,Project1是要求实现一个双端队列,并且写出对应的unit test,最终可以得到一首由你自己算法实现出来的一首歌,Project2要求实现一个轻量版本的Git,Project3是实现一个基于tile的随机世界游戏,你可以在上面整活,把他变成2Dmc或者死亡细胞之类的游戏。

值得一提的是Gitlet,如果说你是一个时间紧迫,不想花太多时间学习CS61B的人,Gitlet绝对是这门课的精华。

来自Delusion:因为没有提前规划好整体结构,所以代码重构了两次...所以一定要先规划好结构!Design Document很重要!

关于Gitlet的感性推荐(降星驰)

这个项目是61B的历年精华,也是回访中被学生认为在未来学习工作中帮助最大的经历之一。

顺便一提,Josh在上课时说过自己其实并不是特别喜欢Gitlet,但是调查出来的学生大部分都给这个项目打了比较高的分数,所以他才加了进去。

坦率的讲,我觉得61B的Gitlet是我目前做过最难的一个project

(刚入门的萌新从少的可怜的框架代码开始,一点一点写出了代码量1000行左右的项目,说实话,这很困难)

里面各种各样的东西花了我40~50h的时间(可能更多)

但是学完真的非常有收获!!

我觉得我变强了,我这种刚入门的菜鸡居然可以写出这样的东西!如果你有一颗勇敢的心,一定要去试试(即使你不学61B)

一些项目相关的建议:

  1. 请好好的看一遍对应的项目说明文档,在此之前不要去使用我给你的推荐链接,项目对应的英文文档的阅读,也是编程学习的一个重要的软实力。

    你可能会惊恐的发现,你看了好久的文档,结果这个时候你看一眼进度条,结果你发现你还有好长的文档没有看。

    不要慌 --jyy

    Gitlet有1.4w的说明,看说明足足看了我两天。

    这是我第一次被项目说明杀死。自从死了这一次后,我看什么项目的说明文档都是眉清目秀的。(大概)

    冗长的英语阅读,以及抽丝剥茧总结出对应的逻辑,虽然很痛苦,但这个可能更加接近大型项目从零开始的过程。

    以后学习的很多项目都是不会有中文文档的,有一次这样的体验这绝对是值得的。

  2. 保持乐观的心态,UCB学生花费的时间中位数大概在 30h 左右(仅仅在intelliJ中),而第75%的人花费的时间大约是42h。Josh说过,即使自己来做可能也需要10~20h。

    不要慌 -jyy

有一说一看伯克利学生说Gitlet难的时候我还是非常开心的(你小子也有今天)

Gitlet共情时刻

这个项目足足把我碾了五遍!(第一次时读文档说明的时候)

总体代码总共经历了4次大改,每一次大改的时候我都感觉我删掉了我逝去的时光。

  • 第1次是逻辑都有问题,旧的框架没有考虑新功能的实现,写到后面人傻了。
  • 第2次是代码实在是太繁琐,如果接着写下去会导致这个项目彻底摧毁我都灵魂
  • 第3次是持久性乱写,存储的东西乱七八糟的。
  • 第4次是merge没有复用,把我写麻了。

(写了5h的代码说删就删了…)

我觉得做一个类似于这样的项目胜过千万书本上的描述,真的可以改掉很多人编程的不良风格,让一个人彻底反思自己那些不好的编程习惯(如果你愿意重构你的代码的话)

良好的风格本身就是为了节约时间,降低复杂度的。

你可以2000行,不断打补丁的写出一个项目,也可以1000行,比较优雅的写出一个项目,也可以更深入一点,尝试复用更多的代码去完成自己的任务。

没人想当猴子,做这个项目的时候我第一次主动的去了解了一些软件工程以及代码编写规范之类的知识,同时对自己的项目写了比较详细的注释(因为自己有点看不懂自己写的东西了)

Josh hug 在课程中提到paul(61A那个老教授)使用的Gitlet项目好像比这个要难的多,有兴趣的话你们也可以试试他的。 Ps.这门课Paul Hill finger 也教过(而且比较难)

补充

  • 环境配置方面,由于课程已经完结,在通过IDEA编写代码时,可以只配置一次Project Structure,在学习某个lab/project时将其设置为Source Root即可,可以参考这份文档V2.0
  • 网上的Gradescope邀请码可能会失效,记得仔细甄别
  • 2021Spring的lab较少,可以结合着学期其他学期的lab/project,2022Fall的内容不对外开放
  • 2022Spring并没有发放邀请码,但有朋友将其与Gradescope的所有测试爬入本地,你可以在Github找到它
  • CS61B结课笔记,感想,以及资源 b站的专栏--降星驰

以上内容选自cs-plan(感谢),并修改了少部分内容