跳转至

CS Plan

can't be a scientific CS Plan

这份指南是偏个性化的,如果有与你理念不合的内容,共同完善或者关闭页面都是不错的选择,但请尊重每位贡献者的内容


这份指南还在不断调整优化中,希望有想法的人一起参与贡献

TLDR

这份指南的内容分将为三个部分:

  • CS基础:这里将提供CS中最基础知识的课程学习建议
  • 基础深入:这一部分将按照不同方向展开,为每个方向的学习提供建议
  • 书籍推荐:我认为在CS的学习中,书本的阅读尤为重要,因而把这部分单独列出来

每个方向大都会设置一篇导览以及相应课程推荐(期待有人共同完善)


现状

对于许多初入大学的CS新生,没有学习的方向,渴望在本科教育下得到淬炼与成长,只可惜,很难。这方面的因素有很多,你只需要做好最坏的打算,本科教育并没有展现其应有的诚意。在国内外课程开源的盛势下,很多朋友都可以通过自学来弥补这些短板,当然,需要的付出也是巨大的:

  • 你需要学习好英语
  • 你需要使用更多课外时间
  • ...

很多情况下想要“用爱从零发电”来实现某个目标是不大现实的,或许需要某些功利性的理由来推动你,引一段之前写的内容,也是我对英语阅读的部分思考:

我认为,我们学习某些东西,一开始都是功利的,到了一定境界,做某件事情倒也不会形容是利益驱使什么的了。。。

做某件事情,需要一定的驱动力,没有驱动力以及一定的激励的措施,很难从头做到尾,认为自己不能进行英语阅读的同学,何不功利性的寻找学习驱动力,试着通过英语阅读得到一些收获

一些基本的概念要明白,基本的工具要学会使用(有点废话文学),在不断的学习过程中,总结出的经验也能作用到今后的学习之中。我很喜欢马原中的一个概念,这也是我唯一会的用来凑分的话:“实践、认识、再实践、再认识,是人们正确认识世界的必经过程。”(当然要根据上下文美化一下)

之后可以步入工具与策略了解。对于本科CS专业的学生,我有一条特别的建议:学习课外的知识尽量与当前正在/即将(1-2学期内)修读的课程相契合,帮助自己提前学习后续的必修选修课程,如果有其他剩余的时间,可以再学其他的。(能毕业比什么都重要)

我们需要拓展知识的广度,我们也要在适当的时候慢下来,探索感兴趣方向的更深处。你会想,我之前所学会不会忘记?会的,如果你不断的扩宽视野,很多概念会遗忘,即使不断回顾所有知识点,也会再遗忘。

我们需要对计算机学科的概览,这也是导论的作用。

我们在通关某门课程时会很兴奋,认为自己真真切切的掌握了这一切,然后接下去学习新的知识,但这种迭代真的合适吗?

因此,我自作主张,提供了一份供参考的学习路径,你或许会被文字中的热情感染,或许会满心期待接下来的学习,更或许(50%)会被这些话给无语到,但最终做出决策的人是你,至少你需要主动学习,突破怪圈。

前言

在开始之前,相信你有一个问题:为什么在CS自学指南之类的学习指南下,还要做这么一件事情?

如果有,请你暂时放下这个问题,让我在最后来回答你。

缘起

填好志愿的我终于要开始CS学习了。我即将顺利进入SCNU的计科!

说顺利是安慰自己的,当时的我认为自己不应止步于此,伴着一身傲气,还没踏进大学校园一步,便早早做好保研的打算。我心想:我对CS这么感兴趣,相信一定能获得不错的成绩吧,保研一定很轻松!

现在的我已经在捂嘴笑之前的想法了。

暑假通过SCNU,计算机等关键词,我发现了一个宝藏论坛0xFFFF,顺藤摸瓜发现到了0xFFFF Wiki(前身是一份语雀文档),一系列的阅读和探索,一个奇怪的班名出现在我面前:“图灵班”。第一个想法冒出头来:这不浙大的吗,仔细看,写着SCNU,看来没看错。

里面的内容(五核心)与安排深深吸引着我,在开学前便进入了先修班。

一本全英的《Think C》砸了过来,开始尝试阅读,对于一个CS小白,每天阅读十几页看似轻松,实则很难,没有技巧的阅读,全靠翻译辅助。论坛还开展了CS50的自学,可惜我只是观看了视频,甚至还听的云里雾里的(部分)。

大一开学捧着《GSLA》阅读,全英的线性代数把我搞的不知所措,想起一件很尴尬的事情:一开始看到书上 Figure 这个单词,到字典查时候注意到他的翻译是身材/数字,一时无法将 Figure 和 1.3 组合起来,偷偷微信私聊老师,等到老师点醒,翻开书下一页便看到了 Figure1.3 上显示着一张图,像是一盆冷水泼来,以后问问题我都“小心翼翼”,当然还是有犯错的时候...

《GSLA》:Introduction to Linear Algebra, Gilbert Strang

《Think C》:How to Think Like a Computer Scientist: C version

图灵班内虽然提倡自学讨论,但很多人没有太大推力,都在搞竞赛,拼命学高数...讨论的话题也越来越泛,起初的三十多个人也不断减少。直到一天,只有我一个人到场时,很不真实,内心中有种很奇怪的感觉。重整之后倒是维持了一段时间的讨论。在这期间,每当我学习到一部分内容时,都会适当的整理发到论坛/Notion上(别去考古了啊),这种有反馈的感觉帮助了我坚持CS的学习(适时的回顾真的很有帮助!)。寒假我学习了《CLRS》,也就是算法导论,其中的内容严谨,有的算法十分美丽,勾起了我OI之魂(没错,本人学过两年OI,没什么成绩),让我啃到大一下结束。

诶,你怎么没怎么提课内?这还用说吗[手动流汗黄豆],当我看到程序设计实验的老师对着老旧的VC6.0进行讲解,一个概念自己都弄不清还在硬讲的时候,我就知道自己的选择对了。再比如,用的教材是“(红色封面,C++程序设计)”时,再次[手动流汗黄豆]

还有还有,保研呢?与我无瓜,学不来学不来,高数差点要挂了,想着我高中数学还不错呢www

有一个契机,让我重新认识了自学,便是与CS61A的相遇,这段故事很奇怪,很早之前便看到CSDIY写的前言,关于CS61A的介绍很吸引我,点开CS61A官网一看,摸不着头脑,关上。过了一段时间,被一位网友拉进CS61ABC的q群,跟着群友的指引摸清了路数,在一个周日的晚上开始学习,此后一发不可收拾,上课都在看CS61A的资料或者写lab/project,可以说,身体是在教室的,心早就飞了~

我还清晰记得一个凌晨,当我跑通所有测试时的兴奋(少熬夜少熬夜),这样的鸡血持续了一周多,我也一直泡在61A上。当时的我学习这门课也是有私心的,想要学习更多面向对象的知识,并且对先前的学习进行回顾。这门课配套的教材(SICP in Python)刷新了我很多认知,在此之前,即使是上了导论课,对于编程语言的底层逻辑还是很模糊。完整学习下来的实感就是上头!

此后的我不仅阅读了很多专业书籍,也学习了很多课程,在与别人的交流与自我碰撞下,一个念想从我心中发芽,我是不是应该把我得到的经验以及资源分享给大家,也能为之后图灵班小朋友的学习提供帮助~

延续

大一暑假,我开展了一次学习企划,让更多人看到CS61A,也巩固我先前的学习,由于是第一次组织,多少也有些不足,看着群里有很多人(至少几十个!)都完成了61A的学习,加上群里讨论的热度变低,我将群聊解散,为这次企划画上了句号。

在大二时,Bintou老师同意我带着22级图灵班的朋友学习,我一开始便提出了CS61A的学习,并且组织学习了前五个week的内容,效果不错。这样的工作也会延续下去~

...

这份指南创立的初衷很简单,就是带着新朋友走一段路,这段路有许多前辈走过,留下了很多印记,我们想要记录下来,留给你,供你在选择困难时能够参考并做出决定。在这里的每门课,每本书,都有学习的价值,我们也会尽量让你少走弯路。

所以,我并不希望有太多相似的课程占满推荐目录,希望推荐的朋友能学习过它,并依此写下一些学习的感受,建议等等。或许大家的贡献便是激起其他人CS学习兴趣的引子。

五核心去哪了qaq?在写了在写了

展望(End)

让自己的思考变成文字流动看似很简单,但我一直没有这样的执行力,说句实话,当这份指南做到1/3时便有点无力感,不断的质疑自己到底要不要继续下去,结果是好的,但这份指南需要的不止是我的想法,还需要更多人参与进来。我也很欢迎大家来和我讨论。我也会在自学的路上把自己获得的资源尽力分享出来。

希望你在这里,在许多前辈们搭建的路上有所收获,再会!

我似乎还没有回答那个问题,让时间来解答吧...

特别感谢星驰,没有他,一开始的61ABC/CS70推荐可能只会 一直拖下去


改变

了解目标

我们应该做什么?我们在学习什么?

国内常常会把CS专业统称为计算机科学与技术,这两位(科学/技术)在一开始便提醒着我们。要去认识科学,也要拥有技术,CS基础导论部分会提及最最基础的内容,当你对某个领域感兴趣并愿意深入时,请找到合适的领路人(认真脸)。

请正视一件事情,如果想要真正学习CS,就不应该局限于简单的计算机技术,写一段代码,做一个网页...(一些几个月培训班就可以代替的事情)我们的目标是有能力构建大型系统。与其他人不同的是,我们需要接触数学,算法,数据结构,体系结构等。我们也应该深入学习这些内容并且构建自己的知识体系,而这需要我们用时间与努力沉淀。

很多技术内容的学习都有滞后性,更何况是学校的课程,我们需要拥有快速接受新事物的能力,而它会在你不断正确学习计算机科学时激发出来。

你可能会问怎么正确学习CS,抱歉,没有标准答案。

If you find that you’re spending almost all your time on theory, start turning some attention to practical things; it will improve your theories. If you find that you’re spending almost all your time on practice, start turning some attention to theoretical things; it will improve your practice.

--- Donald Knuth

计算机是一种工具,我们需要一定的素养才能了解它,也要真正的使用它,解决现实问题,而不是只停滞在理论,这些经验都不会体现在课本上。很多开源课程提供了Lab/Project,或许认真学习他们是不错的切入点。

你或许会说没有时间,这不是我会回答的问题。我也喜欢用没有时间找补,最后失去了很多。

希望大家在学习一门新的课程时,先搞清楚学习的目的与应用场景,并非浑浑噩噩学习后应付考试,在如今焦躁的大环境下,这样的自我对话似乎越来越少...

端正心态

这条路是困难的,对于现在的环境来说似乎是反骨的,因此,半途而废是可能的,不时的自卑/自傲是存在的,能不能坚持下去全凭自己的意志力。对于一个不了解环境更是如此,觉得这里的一切莫名其妙...

我们要成为什么样的人?我们应该成为精通某一方向,某一知识块的人才。站在最后的方向回顾之前的作为时,你可能会想,要是我没有做xxx事,会不会更厉害?没错,但这是你必须要经历的事情。

组队学习

在和其他学校朋友聊天时,他说:“我们学院的同学在看到别人学习好的课程时,也会主动提出来一起学习讨论。” 我很是羡慕,但这也开始牵扯到了一个问题:我要不要组队学习?

我是这样看待这个问题的,

  • 如果你有一群自制力强的朋友愿意和你一起学习,当然可以组队学习,但这一切也要基于合理的计划,每个人的水平不一,在学习时有没有人能够照顾一些学的慢的朋友...
  • 如果你找不到这样的朋友,你可以一个人自学,很多课程都有相应的讨论群活跃在各大社交平台上,他们都会愿意解答你提出的问题,当然,你需要有“提问的智慧”

我不会在一开始主动约束每个人有“提问的智慧”,似乎尴尬几下记忆会更深(实践出真知),对了,我都没看完过,是不是没有提问的能力呢...

关于提问,Bintou老师曾经有相关的分享,内容精炼,值得一看

这两种形式我都尝试过,我更喜欢第二个选项,我更喜欢由我自己把握。当然,对于一些新朋友来说,需要有人引导,这也是我们图灵班(SCNU)学长学姐们正在做的。

开始吧,时间不饶人,这条路上并没有人能一直带着你走下去,你要自己走上一段段独木桥,控制平衡,等到发现回头太晚时,那就太晚了🤣

鸣谢

首先感谢开源课程/书籍的老师、0xFFFF论坛、CS自学指南...没有他们,或许我们还会游走在国内CS教育的怪圈中;其次感谢学习路上遇到的老师与朋友,在我学习遇到问题时,他们都会积极与我讨论;最后感谢我的家人,他们作为我的后盾,也让我能够在CS学习中更加勇敢的碰壁、前进。

Real End

当然,忘不了的是为这份指南提供内容及建议的朋友,我并不能预见这份指南最后的走向,或许它会成为互联网的过去,一直滞留在那段时间,或许它会很受欢迎?我不知道,但只要帮到一个人,我认为这份指南就有意义。

信息爆炸带来了信息差,这个词或许大家都听烂了。我们并不能消除信息差,作为信息差的受益者,我不愿意看到一些人通过贩卖焦虑博以同情,让别人(尤其是小白)放下防备,然后推销相应的课程,盈利。

如果这份指南能为你提供一定帮助,那就足够了,也希望你们能在将来回来看看~

或许你会奇怪,为什么还会冒出CS Plan?相信时间会解释一切,也希望你能谅解这里的缺点(应该能不断完善下去)

我在编写指南的过程中,不会再强调编程环境的部分,我认为初期学习,你需要能够在Linux或MacOS(即类Unix)下进行编程,使用命令行进行基本的操作

  • 对于小白,我建议直接在虚拟机的环境中进行学习,隔离开你日常使用的环境,以免出现事故(我可不负责~)
  • 对于not(小白),不用我推荐了吧,可以玩出花来~

这份指南最后的预期形态是,在不同方向分享专业课程与书籍,尽量不重复推荐(虽然不同课程会有差异),推荐前期学习可以用到的工具,最后加入一些计算机文化的内容推荐


如果你能看到这里,很可能说明你看完了我前面的碎碎念(是真爱粉了hh),那再多聊一个话题吧:我自己实现的课程代码应该公开吗?

我认为不应该,很多人(包括我)也不配,语气有点偏激,但是现在很多开源课程因为学习者不加强约束自己,喜欢把自己的Solution公开,导致课程助教在调查学生学术诚信时有巨大的工作量,这一举动也会害了Enroll了那门课,看到并使用你Solution的同学,每个学期有些课程甚至需要调整代码框架以减少学生抄袭的概率。

这可能没什么,如果课程的Policy没有提及代码抄袭等评测机制那就算了。

如果你所学习的课程有提及相应的内容,请你加强约束自己,不要将代码公开,你能获得这资源本身已经是极大的幸运。你如果缺少某门课程的初始代码,很多地方可以提供~

我个人不公开代码的另一个原因,是我认为我的代码实现并不那么优秀,虽然能够通过测试,但还是有很多不足,不敢放到大家面前。私底下我们可以对着题目分享思路,可以对着看看各自的实现方式;放到自己的博客上可以介绍自己对题目的理解,实现的技巧,部分代码的摘要;如果别人有疑问,尝试点出或者和他一起解决...

说句不好听但是很有共识的话,很多课程变得“乌烟瘴气”,大多数都是因为不同情况的人涌入这类CS课程学习并且不约束自己造成的(国内的学习者尤其突出,不止我这样想),很多人都不想在之后的课程看到类似的情景。希望大家都能够约束自己,有很多途径能解决问题...

评论