But I can only show you the door.

You have to walk through it.

在宁理学计算机的现状 & 心态准备

前言

绝大部分同学,在宁理的一开始都会抱着很大的积极性参与学习活动。但是随着时间的推移,绝大部分同学都会成为上课低头玩手机甚至翘课的那一部分。同时,课程的教学上一方面是跟不上目前的技术发展趋势,另一方面是要照顾成为上课低头玩手机甚至翘课的那一部分同学会轻易挂科。所以,课程的教学对于想进一步学习的同学是不够的,是否要听成了一个问题。同时,对于进一步学习的同学,通过学校可以获取的资源是远远不够的,最好的资源或许也仅仅是联合培养。但联合培养的对口高校也不能保证教学的质量是否能满足想进一步学习的学生。“大学,大不了自学”这句话值得思考。本文档就是作为一个指南,指引宁理计算机学院(尤其是蜘蛛人计算机网络服务队)那些想进一步学习的同学。本文档内容主要选自华南师范大学0xFFFF CS Wiki并加以补充。文档会采用软件迭代一样的方式不断更新并分享在蜘蛛人计算机网络服务队官网和APP(APP本人正在开发)。

认识大学现状

-- 节选自《计算机入门指南-心态篇》https://0xffff.one/d/358,作者 @0x0001 ,内容有所调整

中小学在学习目标上的异化

我们知道,学习与成长是自己的事情,大致上,可以是一个借助前人对世界的理解与自己在外界中的体会把握这个世界,找到属于自己的位置的过程。在现代社会中,这个过程也伴随着外界的力量的辅助。同样面对着现有的知识体系,在小学的时候,认知水平不足,缺乏自我的学习动力,家长与老师是占学习的主导地位的;随着人的成长,自我意识的萌发,个人的思想也越来越复杂,外界(家长、老师)对学习的控制能力越来越弱,学习也需要从被动地压力下渐渐过渡到自我主导的状态;到了大学,学习的过程也应该完全由自我为主导了。

以上描述的是较为理想的情况,然而现实并不像物理题里小滑块一样一切都那么顺利。实际上,人口在逐年上升,优质的教育资源依然还在稀缺状态。于是,在资源的分配上,竞争也越来越激烈。竞争之下,人们的重心,也不再着力于学生自我的学习和成长,更多的是把人们的学习过程中的一部分能够量化和比较的指标——“小升初、中考、高考分数”作为了刻意追求的目标,能察觉到此中差异的人,也只有少数。

在目标的异化与人们的刻意追求之下,无形中家长和老师合力承担了其中本该学生承担的一部分成长的责任,如《吾国教育病理》作者郑也夫教授所述:“过度复习是摧毁创造力的利器”,大多数的学生陷入了一种考试驱动的被动学习状态,习惯于在现成的轨道中重复重复,也没有动力去主动思考未来应该要创造什么,这种状态成为了思维定势,直到到高考结束仍然没有转变过来。高考过后,原本简单的“考高分”的目标已经失去,该如何确立下一步的人生方向,如何准备新一轮的学习,可以说是一片空白。学生和家长们也随之陷入迷茫之中,这也是为什么在专业的咨询群中会出现许多类似“师资如何”,“教学如何”这样的问题,而鲜有其它的类似“图书馆条件如何”这样的提问。

然而,对于大学来说,大学还是那样的大学,它并没有因为参加高考竞赛的人数的增加而有什么大的变化。对于即将面对大学的新生来说,这里就产生了一个问题:在过去经历的目标异化的教育之下,如何回归学习的本源,与大学应有的准备接轨起来?这里的回归学习本源的过程,对于学生来说,也成为了面对大学的第一道槛。

能否顺利跨越这一道槛,因人而异。有的人异化的程度很小,可能还没开学就已经迈过去了,有的人可能花了一两个学期的时间才意识到,有的人,直到大学结束都还没意识到这个问题,继续追逐着GPA、竞赛、考/保研、考证等等可以量化和比较的目标,或是把时间交给了游戏、电视剧、睡觉,麻痹着自己,直到要面对社会的时候,迎来当头一棒。

如今大学生的普遍状态,在这篇知乎回答可以说表现得淋漓尽致~

img

在这里你可能会有疑惑,大学生如此多样,大学对我们来说是一个什么样的存在呢?

我们面对的大学是什么样子

从物理的角度来看,大学和中小学并没有太大的差别,宿舍楼、图书馆、教学楼和各个院系的大楼。

它提供幽雅舒适的环境,为深处其中的人们的思考、交流和沉淀提供适宜的空间。同时提供了丰富的藏书与文献、快捷方便的网络等各种各样的资源。它招收老师和学生,也为其中学习、工作的人们设立了各种各样的资源分配、毕业、升学等等机制。

乏味的介绍到此为止。问题来了,一所大学仅仅就是这些吗?大学与中小学存在差异,差异在哪里?分班和专业?想到身边的老师同学常提到的“学术”,背后冥冥之中似乎藏着一些东西,它究竟是什么呢?一直一来我也有在思考这方面的问题,最近在《禅与摩托车维修艺术》这本书中发现了我认为是关于大学的十分准确的表述。

在《禅》书的观点下,真正意义上的大学,在于一个心灵的世界,它着眼于理性的自身,也是苏格拉底所认为的“真理”,当人们为了“真理”而投入到求知和探索之中、投入到与他人之间交流、碰撞和沉淀之中的时候,真正意义上的大学便会出现。物理意义上的大学,也是为了维持和发展这个心灵的世界的存在的。

在这样的心灵世界中的大学之下,认识自我、认识世界,找到合适自己的位置和继续奋斗的方向,为之做出努力,便是身处其中的人们的使命所在。

由此引出了一个话题,既然人们在大学追求的都是一种心灵的世界,那大学与大学的差异究竟体现在哪里呢?宁理和交大、浙大、北大清华等有何差距?这里我也做一些简单的分析。

大学之间的差异所在

大学的心灵世界本质

大学与大学之间的差异,量化的说是具体的资源的多少,在社会中名声的 title 响亮程度(“211”,“985”,“双一流”之类),取得“院士”、“教授”等等 title 的人数的多少,论文数量,影响力的大小之类等等的指标。在面对社会的竞争机制,学校的 title,是一个最低成本的筛选因素,某种意义上来说,是一种环境给你带来的光环,从社会竞争角度而言,这是一个很有力的资源优势所在。

正如上一小节所述,大学最最实在的地方,在于给人带来真正的心灵的影响的部分。其它的各种各样的指标,不过是这个最实在的地方在某些固定的体系之下的表现而已。当我们深入到心灵的层次的角度去看,大学的核心的任务都是追求“真理”。不同大学之间的差别,更多是在于人们在其中探索自我、探索真理的过程中遇到的现实阻力的大小、以及在身边遇到同样在探索着的人们乃至于真正能够指引你的探索的人的概率。对于一名本科生而言,思考的层次并不会太深,图书馆这么多的书一年都看不了几本,又怎么触及到这方面探索的天花板?(因为书本的质量和出版时间过久等问题本人也不建议去看我们学校图书馆的书)

由此来看,除去“社会地位”方面的因素,从一所大学对一名本科阶段的学生思考空间、以及能调动的资源的角度来看,大学之间的差异并不是很大。若内心有足够明确的方向,不同的学校对于个人的思考与探索的阻力是非常非常小的。

然而人的视野毕竟有限,一开始的懵懵懂懂,容易让人误入歧途,所以就有了另一个重要的因素,便是这所大学的人文环境能给学生带来多少积极影响。这里的人文环境的影响,主要在于负责教学的老师、还有周围的学术交流与沉淀的氛围

教学与交流氛围缺位的现状

我们知道,在教学方面,目前的确有一个遗憾的现实。无论在什么大学,能真正精心安排好课程的老师并不是都那么容易遇到。在人与人都存在着巨大的差异的背景之下,教学的好坏很多时候是缺少即时、客观的反馈的。这方面的利益相关,只有学生本人。缺位之处,也只有学生默默承受。

在学生中的讨论交流的氛围方面,这里也需要有这方面的追求的人带领,在一个强调量化的环境,许多老师和同学为了那些关系到生存的硬性指标的东西已经殚精竭虑,如果不是有着强烈的情怀和充沛的精力,是难以做到带领这样的氛围的存在的。于是一年又一年的大学生,继续被社会的浮躁、被资本市场的压力、title 等东西所裹挟。

这些东西也很难由一个在这里生活一两年的学生意识到和改变,同样,即使是意识到问题的存在,也因为大三大四,几乎要考虑投身社会或是读研深造,而无力去推动这样的事情的进步。也正如《万历十五年》中所描述的,张居正的十年首辅生涯,不过只能是把明朝文官体制存在的问题看清楚,而自己在此之后已经无力改变,反而惹得一身骚。一年又一年,学生们前仆后继地进入大学,经历着相似的迷茫。渐渐地,所谓“大学生”的头衔的光环也越来越弱,人们在感慨本科学历的含金量缺失,却又没有什么很好的办法改善。

大学只有短暂几年,这几年又恰恰是人生中最关键的几年,面对问题的存在,期待着环境的改变并不现实(无论是宁理还是东大,上课仍然存在一大片低头玩手机的而不是在自学或听讲的),难道我们只能默默用短暂的靑春作为代价去承受教学与交流氛围的缺位?

显然,这么承受,始终都不是一个办法,所以我也在尝试着把我在这几年的挣扎的感悟记录于此,供后人参考,至少希望能让你知道,如今我们身边的“大学”就是有这样的问题存在的,这是你来到这里面临的第一个暗坑所在。

暗坑虽在,但情况还不算糟糕,目前针对这些问题的确还有一些可行且有效的解决方案。

应对教学与交流氛围缺位的解药

刚刚有提到了不同的大学之间存在 title、教学水平、讨论氛围的差异所在,title 的光环这个社会层面的问题,短期内我们只能通过考入拥有更好 title 的学校解决。而其它的自我发展相关的问题,在如今信息高度互联时代,这些问题实际上都有对应的比较好的解决方案的,主要集中在以下亮点。

开放融合的趋势

在授课资源上,如今的教学正走向一种开放与融合的趋势,能够让差距逐步缩小。正如中国大学MOOC的广告词一般:好的大学,没有围墙。通过 MOOC (大型开放式在线课程) 等方式,我们可以发现许多分散在各个大学的优质的课程资源,足够主动的情况下,我们仍然是有机会找到更合适的学习资源的,至于如何找到,这里需要的是互相的不断体验和踩坑和积累,为后人留下经验。

在互联网的环境下,你所需要的,仅仅是一台电脑和一条能连通 internet 的网线,缺少的讨论交流氛围,可以通过互联网跨越时间与空间的距离来弥补,本人也在尝试使蜘蛛人计算机网络服务队转型成为一个线上学习为主,线下交流为辅的一个校内社区。

在资源开放与共享的角度来看,计算机相关专业具有得天独厚的优势。得益于开放协议和开源社区,通过互联网开放的计算机相关的资源,可以说是比其它任何一个专业都要丰富。

至此,接收良好大学计算机教育的障碍,你都找到了对应的解决办法,只需一一打通即可。

理性探索气息与浮躁现实交织下的泥淖

在探索过程中,最关键的是,保持着一颗独立面对,主动探索的心,去追求心中的理性部分的存在。我们个人的心中需要有自我的意识,来到大学,是在“求学”,而不是“等老师求我们学习”。若你有了这样的心态,现实的大学环境的这一点阻力,可以说是微不足道。

当一个人意识到了自我的存在,一切的类似于师资、志同道合的朋友等等的占比问题也将只剩下一个遇见的概率的问题。在这里我们需要清晰地明确一点,一个人的视野始终是有限的,一般来说只能注意到自己认知范围内的东西。当一个人主动地去靠近,在周围的圈子的作用下、加之如今的人与人之间的连接越来越高效,遇见的概率实际上越来越高,从而很快就能形成一个新的圈子,发展到后面,这个问题也不再是问题。若没有自我的主动,则将会被环境的潜移默化所左右。如今许多“大学”也因为理性探索的气息太弱,在社会浮躁气息裹挟之下,环境也变得不那么纯粹,潜意识给人带来许多不好的影响。

在如此的现实条件下,各种各样的成长与发展的问题便推给了来到大学的每一位新成员们。人作为一种后知后觉的动物,一开始是难以意识到这一点。当面对大学的种种责任无形中转到了个人身上以后,我们在最初没跨过槛的过程中的迷茫之下,所面对的大学,也如烟台大学贺利坚老师在《逆袭大学》一书中的形容一般,就像一滩富有营养、但也危机四伏的“泥淖”。

关于这滩泥淖,贺老师的书讨论了很多,总体来说,自我意识的觉醒,学会独立面对人生之路所遇到的问题,是其中解药。在独立面对这个主题下,不少前人也为我们留下了许多的心得和经验的参考。

上海交大曾经流传过一份名为《上海交通大学生存手册》的文档,推荐阅读(可点击链接直达),以下为其序言。

在上海交通大学的四年生活中,我目睹和经历了太多的荒谬,太多的错误,太多的茫然,太多的无奈,太多的失败。自诩为天之骄子的高中毕业生,站在大学的门槛上,有时竟会显得像低龄儿童一样幼稚。

年轻的同学们还为自己那充满无限可能的青春而沾沾自喜,却不曾意识到,一生仅此一张的白纸,绝不可以随意地涂抹。本书希望能为同学们树立正确的人生观和价值观,并在具体政策上,提供各种切实可行的建议,帮助同学里那一部分有志青年完善自我,实现内心的追求。

回首四年大学时光,我一直保有一种强烈的对科学知识的虔诚。这份虔诚迫使我重新思考每天那本应“司空见惯”的生活;这份虔诚让我站出来,以我认为正确的方式贯彻自己的追求。

在此,我把我这四年,和生活斗争的点点滴滴的经验和感悟记录下来。一方面,我希望我能为那些像我一样压抑中的灵魂尽一点义务。另一方面,也希望这本书本身,能成为推动各种不合理制度进步的一种动力。

现实总是令人遗憾的。我们当中太多人已经习惯于沿着那一成不变的“典型成功道路”前进:中考,高考,考研,出国......数不清的人们在埋头赶路。走在前面的已然迷失,跟在后面的却还未开始思考。这不应该是一个国家、一个时代的精神。

这本书不是《逃课手册》或者《考前突击宝典》。我希望帮助各位读者做到的,绝不是简单的拿高分、或者顺利毕业。我衷心希望这本书能够带给读者一些新鲜的思考,让同学们能看到人生道路上不同的风景。至少在读过本书之后,各位读者应该能够有勇气、有智慧,去发现并挑战那些比上课更为重要的追求。

从文档中可见,即使是在上海交大,依然和我们一样,面临着相似的泥淖,等待体制的改变是漫长的。今年是2023年,距离这份小册子的发表已过去15年,我们仍然面临着相似的问题。大学的阶段仅有短暂几年,等待于我们个人而言并不现实。一生仅此一张的白纸不可随意涂抹,那么也需要更加慎重地去对待,真正发挥自己人生的主动权。

某种意义上来说,贺老师的博客、《逆袭大学》、华师Bintou老师的博文、还有《上海交通大学生存手册》、和我这里关于大学存在的问题的表述,可以说是殊途同归,正如王小波写给柯云路的信一般:近代以来,科学有很大的成就,任何人想要有所创新,总要从学习开始。

img

王小波致柯云路的一封信

来源微博:https://www.weibo.com/1496070307/I2k49hBHb

知识点组成的巨型网络

大学的学习,需要抱着一种“理性”、抱着对科学知识的虔诚去追求。在大学的开始,若对这个体系有一个基本的印象,能对我们以后的探索之路,带来许多助力。

以我的理解来看,科学知识的存在形态,在于各种各样的知识点与知识点之间连接而成的网络。这个面向全人类的知识网络,是在“理性”的框架之下,人们不断探寻着真理的研究与实践之中组成的。它不断地在更新和丰富,其中也蕴含着错综复杂的联系。也为我们对于世界的把握搭建了一个稳定的骨架。如 曲卫国老师这篇文章所述,科学的理论,相当于一副能够助我们自然的眼睛一臂之力的眼镜一般的存在。

人是一种“碳基生命体”,与计算机这类可以精确地实现“复制”和“粘贴”的“硅基体系”不一样,人的知识的传授,需要不断地探索和学习,最终在脑海中以自己的方式萌发出来。在这个过程,包含着人类共有的知识与每一个人过去的独特经历的碰撞,在这里的碰撞与平衡之中,就存在很多萌发新的想法的可能性,这是人之所以差别于机器的特别之处。

于个人而言,人的生命有限,人类的个体的认知始终是局限的,正如庄子所说“人生而有涯,而知也无涯。以有涯随无涯,殆已! ”,每个人只能是在自己的角度去认知事物,而不可能掌握一切的知识。

于世界而言,人类通过分工合作,聚集与沉淀的知识,搭起了认识整个世界的框架,这个圆圈的模型可以让你对其中人类的知识与分工有一个感性的把握。

img

原图很长很长,详情 点击链接查看

以科学为主题的全人类的知识网络,也是在专注着的人与人之间互相的碰撞、融合沉淀而成。“世事洞明皆学问,人情练达即文章”,在地球上的每一个人,只要好好拥抱每一天的生活,以自己各自的角度去做到最好,即可丰富其中联系,为人类整体的认知和对世界的把握添砖加瓦。若条件允许,有动力的情况下,你还可以去参与挑战更为深度的部分,乃至于突破人类现有科学知识的边界,这就是硕士、博士这一角色的存在。

人类在体系下的分工

在知识的网络中,每一个领域,都是一个繁杂的体系,我们不可能做到凭一己之力就能穷尽所有的知识体系。于是需要有对应领域的前人,带我们理清某些方面的迷障。

除了在前沿探索着的人,还有许多人在背后做着支持方面的工作。其中有一部分工作者,致力于更好地保存学术探索的成果,方便大家的检索,这是图书馆员的存在;其中有一部分工作者,它致力于理清现有的知识的结构,设计出适合该领域的入门路径,这是教师的存在。即使在支持方面的工作上,要想做好也会有许多学问所在,于是又开辟了一个个新的研究领域(如图书馆学专业)。所谓大学之大,也是如此。

当某些领域方向的实践足够成熟,形成了一些固定的模式以后,就有了一个“专业方向”,得到了一个类似“软件工程”、“人工智能”、“网络空间安全”的专业名字。大学某一个专业和其背后培养体系,也是在这巨型的知识网络中,为你选取和界定了一部分必须完成的知识的目标,一系列的目标集合起来,便是类似“哲学、经济学、法学、教育学、历史学、理学、工学、农学、医学、军事学、管理学、艺术学......”等等的学位。它们的复杂,你可以通过标准文档《中华人民共和国学科分类与代码表 GB/T 13745-2009》建立一个大体的印象。

到这里我们知道了,那些专业名字与概念,在这里的作用,只是用来认识和准确把握某些事物的工具。真正需要关注的,而是应该这些名字的背后所蕴含的学习的方向。知识工作者们构筑的是同一个知识网络,其中的基本的方法是相似的,我们也没有必要因为专业的名字而产生什么隔阂或偏见,有时候在不同的专业领域的不同的表述,最终指向的,仍然是同一个东西。

如何把握知识网络? — 关注培养计划

进入了大学的世界,你需要破除那些对于类似“人工智能”的名头的局限,着眼于你脑海中的知识网络的发展。在开始学习之前,需要借助于一些类似培养计划之类的资料,对你所入坑专业涉及到的那部分知识网络、必须完成的目标等建立一个宏观印象,同时能明确一个大概的探索方向。

对计算机相关的领域,我们大概需要学习什么样的知识呢?我们该如何了解这方面的信息?

近在咫尺的,便是我们当下的专业培养方案,其中有对于课程、学习节奏的设定,通过它你可以大致对各个学期需要修的课程,以及整个知识网络的大致构成有一个把握。更具体的介绍,可以参考贺老师的《逆袭大学》中关于培养方案的章节

如今网上也有计算机相关课程在线课程的一些学习路径的展示,如网易云课堂的大学计算机专业课程体系,它的设置,与我们的专业培养方案实则大同小异,结合一起来看,对于建立一个大体认识也是有帮助的。需要留意的是,培养方案提供的仅仅是一个基本的要求,若想在这方面有更深层次的造诣,你需要付出更多的努力去达到。

若对这方面仍有疑惑,你还可以参考 ACM/IEEE-CS 的会议报告《计算机科学课程体系规范 2013》。这一份正是世界各地顶级计算机学者们经过思考、讨论与权衡后所划定的大致范围和学习目标。通过它我们可以大致了解标准的计算机专业设置上,对自身需要达到的能力的目标与要求的预期,更好地把握自己的学习方向。

进入大学的心态准备

-- 本文摘自《计算机入门指南-心态篇》https://0xffff.one/d/358,作者 @0x0001,内有所调整

通过上一节“认识大学现状”,相信你对大学在学习方面所面临的严峻现实已经有了一个基本的勾勒。这一小节,主要也是聊聊这里你需要做好的心态方面的准备。其中的核心在于,保持一种对理性、科学知识的虔诚,以及对真理的不懈追求。具体来说,大致是几个注意的地方:

逐渐适应独立面对的状态

开头有说过,学习与成长是自己的事情,其他人都无法代替你的成长。世界并不是理想的小滑块,你所面对的,可能会有许多不尽人意的事,没有任何人有义务和能力去为你化解这些事情,帮你背负成长的责任。独立面对,去适应当下的环境,解决自己的问题,争取让自己的收获最大化,也是你在当下的唯一选择。

在独立面对的原则下,在日常的活动中,给自己留下专注与思考的空间,把握好自我与外界接触的平衡,也变得重要了起来。现实并不是完美的,我们在探索这个不完美世界的过程中,常会遇到许多迫不得已要花时间做的事情,正如《上海交大学生生存手册》中举的例子:效率低下的课、毫无组织的集体活动、难以推脱的临时工作等等。若没有对自我的把握,则可能会人云亦云,陷入其中,难以脱身。

对未知的领域始终保持信心

把握当下的自我,在独立面对的探索开始的时候,你可能会发现,并不是所有的事情都存在如视频播放一般的进度条一般的固定轨道。面对某个新的术语时候,有很容易陷入一种对于未知的恐惧之中,诸如“这个好难啊,我肯定不懂”,严重的情况下可能会持续停滞不前。

上一节有提到,一个个点连接起来,组成了一个巨大的知识网络,学习的过程,也是在脑海里构建出这样的知识网络的过程。不明白一个东西,仅仅只是这方面的知识还未反映至你的大脑中而已,并没有什么好惧怕的。对未知存在恐惧是人的本能,消除这种恐惧的最好办法便是——增加信息量。

刚开始面对某个未曾接触的事物,我们常常能听到一些前辈的只言片语。下意识也常因只言片语而在内心断定了全部,直到很久以后才反应过来。老舍的《四世同堂》中的一段话。

img

生在某一种文化中的人,未必知道那个文化是什么,像水中的鱼似的,他不能跳出水外去看清楚那是什么水。假若他自己不能完全客观的去了解自己的文化,那能够客观的来观察的旁人,又因为生活在这种文化以外,就极难咂摸到它的滋味,而往往因一点胭脂,断定他美,或几个麻斑而断定他丑。

好与不好,并没有那么简单的原则可以判断,但恰恰也因为这种下意识的恐惧造成的断定,而让我们拒绝了许多东西,否定了人生更多的可能性。小学时我们便学过“小马过河”的故事,可惜的是,到了大学,我们许多人仍然还继续犯着类似的错误。

在计算机领域,WWW 网络与开源社区,也正给了这种勇于探索未知领域的强大底气,理论上来说,我们不应该失去信心的。

关于这个话题的更多信息,在 华师Bintou 老师的帖子 “你是否需要做学霸?” 已经有很详细的讨论。

生而有涯 vs 信息爆炸

人类知识的庞大体系,不是你我可以穷尽的。《庄子·内篇·养生主》有云:“吾生也有涯,而知也无涯。以有涯随无涯,殆已!已而为知者,殆而已矣!”。著名计算机作者侯捷老师在《二十年目睹之怪现象》写下,“弱水三千,独取一瓢,并且安心好好地饮这一瓢”(“弱水三千,只取一瓢”出自《红楼梦》)。接受自己在很多方面无知的事实,放下穷尽所有的执念和焦虑,做好手上的事情,自己一点点成长起来就好。这一点也如胡适所言:“怕什么真理无穷,进一寸有一寸的欢喜”。

“弱水三千,只取一瓢饮”,但在如今这信息爆炸的年代,四处充斥着各种各样良莠不齐的信息,很多时候你很难判断舀起来的那一瓢是否值得安心地好好饮下去。这时候就尤其需要这样的能力:能够判断什么时候需要信息,并且懂得如何去获取信息,如何去评价和有效利用所需的信息。这些能力统称起来,被前人命名为“信息素养(Information Literacy)”。

信息素养本应是一种从小到大应当培养的基本能力,对标的是中小学阶段的《信息技术》课程。然而现状是,小学到高中的《信息技术》课程,在很多学校常常会因为一些缘故被换成自习或文化课,不知道在各种教育资源的竞争压力下,又有多少同学掌握了这门课程本该传达的技能?(参考:中小学信息技术教师的出路在哪里? - 知乎

甚至大学对标的培养信息技术老师的专业,给人的感觉也总是“学校打杂”,连老师和同学也是如此认同,于是也很难感受到这样的气息和使命感的存在了,实在是信息技术普及领域的一大悲哀。

在大学,在学术界,特别是计算机类的专业,我们尤其需要重视这项能力的培养。我们的编程生涯中,可能会遇到许多各种各样大大小小的问题,但其实有许许多多的前辈其实已经踩过你现在正在踩的坑,并且留下了记录。这些记录正分散在图书馆和互联网的各个角落。如何快速准确地找到它们,这样的意识和技巧综合起来,着实是一门学问。这门学问所体现出来的,也正是“信息素养”。

经得起时间检验的东西总带着一些理性的气息,寻找经得起时间检验的信息的技巧也是如此。网上已有大量这方面的教程和课程。

总结与沉淀的意识

日常的学习与交流中,我们获得的信息总是零零散散的,人的大脑的瞬时记忆并不稳定,许多东西唯有沉淀下来,反复消化后才可能成为我们自己的一部分,为未来所用。

学习的过程中,我们常会想当然地觉得自己明白一个东西,很容易陷入一种知识错觉和能力错觉之中,乃至于掉进眼高手低的怪圈。勿以浮沙筑高台,此时的想当然,便是其中的浮沙。

为了真正地消化知识,用自己的话语去尝试发自内心地表达出来是一个很好的做法。在总结、沉淀、尝试表达的过程中,为了保证表达的质量,不知不觉便会把涉及到的一个个概念都梳理一遍,知道自己对这个事物的认知与它的本来面貌的差异,并尝试去填补,从而减少很多想当然的情况。

类似的过程也有一个名字:「费曼学习法」。

费曼学习法 - MBA智库百科

更进一步地说,大学也需要关注的是,如何构造属于自己的知识体系,借助 DIKW 模型,可以很好地帮助我们把握这一整个过程。

DIKW 模型是啥?简单的说是一个关于人类的认知与学习的一个观察角度,它把广义上的知识分为四层结构:

Data (数据) --> Information (信息) --> Knowledge (知识) --> Wisdom (智慧)

关于 DIKW 模型的更多信息,可参考:知识体系的构建与 DIKW 模型

多多交流

人生而有涯,认识也始终有所局限,在知识的巨网的探索中,每个人的认知都会有差异。于是对于同一个东西,不同的人就有着各自独特的视角,互相之间知识的碰撞,常常可以为你脑海中知识的网络添加不同维度的更加完善的联系,乃至于打破思维定势,更好地把握一个事物的全貌。

除了碰撞之外,如上一节说的,沉淀也是一个重要的环节,交流过后通过笔记总结,以博文、帖子等等方式实现沉淀,便于未来的回顾。其中,通过邮件和BBS帖子的交流,是一种能让交流得以沉淀、跨越时空的方式。

告别了中小学的完全统一安排,每一个人的时间安排都不一样,凑在一起的机会越来越少。这时候,参加或组织一些固定主题的定期线下沙龙,在准备内容和聚在一起聆听内容分享的过程中,互相锻炼表达能力,在同一时间和同一空间实现更多元的想法碰撞,会是一件非常有意思的事情。

读计算机专业需要把握的事情

前面两节说了很多,总体比较务虚,这一篇则着重于实际行动。最最关键的还是需要保持专注和思考,让灵魂能走上探索的道路。

为了保持这样的探索,有些事情是可以很快开始落实起来的,这里也列举一些我想到的几个大的点:

  • 大量阅读
  • 走在课程前面 - 预习
  • 训练信息素养
  • 重视英语环境适应
  • 习惯折腾
  • 培养表达输出能力

这其中每一个点的回报周期都很长,涉及到的具体目标和完成计划需要你自己根据自己的实际情况去落实。长期保持和积累之下,未来才可能感受到变化。

大量阅读

深圳宝安中心区图书馆一角的墙上,有这么一段话。

img

世界有多复杂,书就有多复杂;人有多少种,书就有多少种

不要害怕深度阅读的苦,那是你去看世界的路

书是人类进步的阶梯。我们不可能靠着自己就能完全把握这个世界,通过读书的方式,汲取前人的经验与想法,在心灵中经历一些现实生活没有条件去经历的事,是现代社会的人们的必经之路。

胡适有一句话:为学当如金字塔,要能广大要能高。我们每一个人也像是一个金字塔一般,有对世界的大体把握,也有塔尖的那一个独特部分。要把握灵魂的金字塔底部的对世界的基本的认识、寻找属于自己的塔尖部分,是离不开阅读的。

读什么

阅读无处不在,学校的图书馆有着大量的书籍资源,和舒适的阅读环境。除此以外,如今的电子阅读也非常发达,通过 Kindle、微信读书等 APP 同样可以实现。

阅读也不局限于书本,还可以是比较好的博客文章,微信公众号推文,互联网上各种各样的文档。只要有一个追求真理的内心,慢慢地就能聚集一批适合你的信息源。

值得一提的是,如今移动互联网信息爆炸时代,需要注意碎片阅读与大块时间的平衡,不知不觉你的时间就可能被朋友圈、知乎动态、各种迎合当下情绪的文章、短视频等碎片信息给吞噬。所以你还需要注意尽可能留出大块的专注时间,交给书本为妙。

书本世界多了许多沉淀,但同样也是浩如烟海,一年 365 天时间,能读下的书其实不多,如何选择书籍也是一个问题。专业和课程相关的书籍目的性强,找书不是难事;对于专业之外的“博雅教育”,学校图书馆在行使着倡导大家阅读的职能,在这方面也是有所沉淀的,列举几个不错的书目来源:

  1. 南京大学与超星公司联合推出了一个 “悦读经典计划” 专题网站,精选了许多刷新你的认知的经典作品
  2. 港中大的图书馆有个 好书角 的专题推介。
  3. 网上流传的一份「香港中文大学推荐书单」逸夫书院的分享

氛围比较好的高校,基本上都在图书馆建设方面有所投入,有意识地去挖掘各个大学的图书馆的官网,说不定可以遇到许多让你惊喜的东西,这并没有什么硬性的门槛,也和你高考考多少分一点关系都没有,毕竟,“好的大学,没有围墙”。

如果你不知道你想读的书是否是一本好书,那么你可以上豆瓣 (douban.com)去查找这本书的评分。

怎么读

拿起一本书,如何判断是否值得花时间读、如何掌握各种类型书籍的阅读方法和基本的参考原则等技巧,在《如何阅读一本书》 都已有清晰的阐述,可以说是大学生的必读书目之一。

阅读并不是要把每一本书都奉为圭臬、咬文嚼字,把每一个点都捋得清清楚楚。一书一世界,读一本书也正如经历着一场旅行。刚来到一个陌生之地,我们不可能一开始就能关注起这个地方的一草一木、一砖一瓦的细节,很多时候知道有它的存在就够了。在其中某个角落安顿下来,慢慢地越走越熟悉以后,此时的细节才会慢慢地在你的大脑中反映出来。

领略过书中风景,未来也许在某个契机,你想起了过去看到的某本书也有这样的表述,再回头翻翻,说不定又能产生了新的共鸣,这便是阅读给未来带来的许多不经意的惊喜瞬间。

走在课程前面

相信你对“预习”这两个字并不陌生,在这里,相比于中小学,大学学习对“预习”的要求也更高了一个层次。在过去有老师手把手教,“预习”是一个辅助的角色,到了大学绝对是需要上升到主旋律的地位的,下面我来讨论一下为什么。

首先,目前许多课程与教材本身是存在滞后的情况。在非 top 的大学专业,有很大一部分课程的教学并未跟上时代的潮流,而且在如今缺失的学习氛围、在大部分学生的毕业压力之下、在对绩点等外在指标的刻意追求之下,课程对学生的要求也几乎压缩到了最低的限度。这种情况甚至拖住了课程更新的脚步,拖住了老师的热情与精力,加剧了这种滞后的现状(比如说某些课程的课件甚至停留在了2006年)。于是产生了许多平庸甚至水水的课程,把学习的节奏完全交给它被动地驱动显然是非常不靠谱。

需要强调的是,这里不是一棒子打死学院开设的所有课程,而是需要你自己有一个清晰的判断,对宏观的比例与个例有一个清晰的区分,并非所有课程都那么一无是处。目前的教学也在往翻转课堂的方向改革,老师渐渐转变为教学的组织者角色,安排学生先在课下通过各种材料学习,在约定时间的课上互相交流与碰撞。这与“预习”的要求也是殊途同归的。走在前沿的课程自然也是有价值,但既然是改革,便涉及到众多的调整,并不是一蹴而就就能完全达到。所以,目前来说,即使是在课程往逐步革新的方向发展的背景之下,依然还会有许许多多低效的传统课堂存在。这是一种什么样的低效呢?

人与人交流的通信模型

让我们认清传统大学课堂的本质。它大致是一个信息单向传递与传递的信息在学生的脑海中加工的过程。类似于一个通信模型,在《通信原理》课程中可以了解到,这个过程的参与者。包括 信源→发送编码过程→传输介质→接收解码过程→信宿。

img

人与人之间的交流,抽象下来也是类似这样的一个模型。

img

加点图片,让它更具体一些:

img

(图源《跨文化交际》课程的讲稿)

可以看出,人与人之间的交流需要建立在一些过去的一些相似经历的基础上完成的,任何一个环节没有打通,都可能会把整个过程变成“鸡同鸭讲”、“跨服聊天”。

传统大学课堂的弊端所在

大学理工科课程涉及到各种各样的术语,每一个术语都是丰富的内涵的浓缩。人不可能一下接收太大的信息量,一些浓缩得厉害的高阶的概念是需要一些前置的基础来表达。可以这么理解:随着课程的进行,授课老师的 Encoding 与你的 Decoding 的模型也是在不断地高速更新。一旦没跟上这个节奏,就会失去了许多共同的语言,结果导致后期的难以理解,努力变成了无用功。

让我们把目光从一对一的交流之中走出来,在传统的课堂上课,类似于一个一对 n 发散的通信模型。从刚刚的描述中我们知道,一对一的交流都需要满足这么多个环节,也就是说存在许多让交流出现问题的因素。在一对多的情况下中,这样的问题就更严重了,面对人与人之间认知的不同,一门课程只能从参与者的不同认知的交集的角度去设计和限制,总会有一部分人当前的认知的基础是被迫放弃的。

优秀的老师可以把这种一个老师对 n 个学生的树状结构优化到学生与学生之间的互动交流,但这个优化的过程是需要花大量的时间精力根据具体的知识点去设计的。中小学的知识尚不能完全把握,对于大学理工科专业课程的巨大信息量来说挑战更为巨大,加上如今高校老师们主业在于科研,能有动力讲课、并且能把一门课讲得好的老师并不多。

一对n交流低效的这种现象在小学到高中其实一直存在。只是因为升学压力,人们都投入大量人力财力补习的缘故,大部分人是习惯了反反复复地被动去接受某个东西,把这种被动的大量输入也当作了理所当然。如前文所描述的那样,许多人在目标异化以后,眼睛已被成绩和排名的前与后所蒙蔽,而不去思考背后是为什么。

面对成长过程中人们越来越大的认知差异,中小学时期的做法是强调集体主义,统一行动,企图拉平学生的认知差异,极端情况则类似衡水模式的军事化管理(参考这个视频:“复读时去了传说中的衡水中学,看到了很多匪夷所思的事,三观被颠覆了... - bilibili)。从老师的角度来说,学生强行拉平了,好教,但人毕竟还是人,再怎么军事化,都不可能是一模一样的机器。许多人也是在压抑着自我的存在的情况下读书,当考试过去,就什么都忘了。大学作为一个自我探寻的空间,更不可能再做到拉平,强行的集体主义,带来的效果也是昙花一现。况且,如今互联网正高速发展,个人的自我意识也更加强烈,以至于现在大学课堂连浅层的信息传递作用也开始走向崩盘。

说了这么多,这里主要也是聊的是老师与学生传达信息的大致模型与可靠性,显然这里的结果是不尽人意的。要能在传统课堂里有所收获,必须保证自己的 Decoding 过程能与老师的要求接轨,在课上极短时间内就能 get 到老师想表达的东西,提前预习便成为了唯一的一条路

翻转课堂

当提前预习这条路走到了极致,便出现了“翻转课堂”的形态。在这个模式下,信息传递的过程交给课外,课内则专注于在统一的时间和地点营造更高质量的交流与思考。这个过程学生是完完全全发自内心地去进步,避免了基础不一的差异,也压根不存在需要统一行动抹平个体差异这样的需求了。

“翻转课堂”的模式,在现今信息时代,是非常好做到的。特别是计算机这个如此开放的研究领域。各种书籍、网络文章、视频材料等可以跨越时空的东西,都可以成为你的学习的信息源。(比如说,各大高校的 MOOC 课程、还有 bilibili 上发表或转载的许多的教学视频、文章,更进一步,还有 YouTube 和 WikiPedia )。完全没有老一辈所担忧的缺乏学习材料的问题(当你拥有了这样的意识,相信也不会再依赖谭浩强 C++ 入门书这样的信息匮乏时期的产物)。

在预习中创造回想

讨论了传统课堂的缺点和预习加成下的翻转课堂的形式。现在我把目光转向另一个角度,谈谈预习带来的好处。这里的关键词是两个字:「回想」

关于回想,乔布斯在斯坦福大学的演讲中的一段话,关于人生的一个个点之间的连接。

img

"Connect the dots"

乔布斯说:你展望人生的时候,不可能把这些点连起来;只有当你回顾人生的时候,才能发现它们之间的联系。所以你必须有信心,相信这些点总会以某种方式,对你的未来产生影响。

人类就是这样的一个后知后觉的动物,即使我现在写下这么多,许多东西还需要你自己体会,便是如此。

关于回想这个话题,有许多心理学方面的研究成果。人类的记忆可以分为不稳定的工作记忆和持久的长期记忆,以目前的研究结论来看,它们存在一个转换的过程。这个转换的过程,便是,我们平时应该有听说过的,间隔重复理论(也许你可以叫它”人类的本质是复读机理论“)。对于某一个记忆片段反复进行间隔一段时间再次激活的过程,可以逐步将它从工作记忆转移至长期记忆,已存在长期记忆的部分则会不断巩固,抵挡遗忘的进程。(基于这个理论,有一个记忆辅助工具 Anki,推荐一试)

人类作为”碳基生物“,大脑与计算机存在着本质区别。曾经在尼古拉斯·卡尔的《浅薄》看到过一段十分精确的表述,可以说与间隔重复是互相呼应的。

img

回想在生物学层面的作用

如书中所说,生物记忆一直处于不断更新的状态,对记忆内容的每次回忆都会重新启动巩固记忆。突触与突触间的联系,也正像是这一个个点之间的联系。通过不断地调动,实现建立、完善。由此可见,更好地学习,需要我们尽早对于要学习的知识在脑海里建立印象,建立了印象,以后的学习都是一个基于长期记忆的回忆过程,巩固效果也会更加理想。

强势地预习,走在课程前面,乃摆脱泥淖的一个非常好的做法。

经过刚才的讨论,可以总结出未来学习该有的状态:让课程成为你的其中一个信息源和激发你的回忆、思考、交流的平台。既然是一个平台,自然有它的客观条件的限制。而对于对你自身的助力的角度而言,平台的大小并不会阻碍你的探索之路。正如之前@wzpan 师兄分享的 Derek Sivers 的一句话:Do not accept their speed limit.

如何做到预习

强调了预习的重要性,你可能会意识到,预习不仅仅是课前花几分钟看看课本那么轻松。没错,这里的预习,至少需要做到两个目标:

  1. 把握这一次课程所涉及到的知识点脉络,在脑海里能建立基本的 Overview
  2. 搜集与课程内容相关的话题信息,尽可能弄懂这个知识点,记录其中疑问和想法

做到这两点以后,到了课程约定的时间,与老师和同学的互相交流碰撞,听老师表达观点、阐述你的想法、提出你的疑问,与其他人的认识一起,迸发出更加深入或有趣的想法和联系。课程就不会再是单调的一个老师 -> n个学生的低速率高丢包的通信过程。

实现这两点目标,主要障碍在于学习材料的获取和筛选。对于计算机的同学来说,资源的获取是非常容易的。若对与自己的操作还是迷茫,求助老师和身边的前辈会是一个不错的选择。

训练信息素养

资源获取容易,但如何利用好它们,如何在时间有限的情况下,从节奏越来越快的社会中信息爆炸的荆棘中劈出一条路来,也不是一件容易的事情。这时候将涉及到现代社会大众的基本能力——信息素养。前文聊了很多信息爆炸的应对思想,信息素养强调的则是如何驾驭信息。

图书馆作为负责理性知识归档、梳理的后备角色,对此也是有很深入的研究,也有设计相关的系统的课程。关键字是:「信息检索」

其中最有名的莫过于武汉大学黄如花老师的《信息检索》课程,每个学期都会开课,值得一报。

站长所在的华南师范大学,也有一门这样的课,名为《信息检索与利用》,亲测收获巨大。

另外推荐清华图书馆员常薇老师开的微信公众号【我查查看】和知乎专栏,其中有整理许多相关的文章。

搜索引擎的选取,日常网络资源挖掘等领域,有一个值得推荐的网站,上面聚合了不少不错的搜索引擎:虫部落快搜

重视英语环境的适应

英语在计算机中具有重要的地位,计算机发源于美国,语言源自于英文,最基础的语言和字符也在 ASCII 码表之中定义。那些在计算机领域有所沉淀的东西,某些领域更好的教材,课程,技术大会演讲,某些领域的开山鼻祖前辈的个人网站等,基本都是以英文的形式存在。不得不承认的是,国内的计算机水平是落后国外较多的,许多较好的资料只提供了英文版。克服了英语这一关,你才能接触到这个世界上最好的资料,才能更好地看英语教材,听英语专业课,以及进行国际交流。

鉴于大家过去的高强度英语”学习“留下的阴影,推荐贺老师这篇的这篇文章。

回到大学生英语学习的话题上。说学英语没有用的人,我不想再浪费热情写些什么了。身处在这个发展最为迅速、交流最为广泛、国际化最为迫切的重要学科与行业,如果还在这么认为,也算是“无畏”的勇士了。在编程中声称看不懂英文错误提示的同学,我和他一起看时,很多人惊奇地发现,原来耐住性子是可以看懂的。遇到不认识的词,蒙一蒙,基本靠谱;有些词,用在线词典查一下,意思很明确;省事的办法,直接用搜索引擎搜,错误的解释是能对应上的。原来看不懂的原因非常简单,是没有看!没有看的原因不是看不懂,而只是觉得看不懂!潜意识中有个名叫“看不懂”的小人,就这样吓唬住了十八、九的大姑娘、小伙子!

英语并不是什么非常恐怖的东西,作为交流的工具,最最重要的目的是尽快发挥其交流的作用,而不是去研究茴香豆的n种写法,那种难也正是因为关注点偏离了语言的本来作用。在初高中词汇基础的浸泡之下,借助于翻译工具,如 @LittleboyHarry 所说:你已经没有任何理由再去畏惧阅读英语了。

英语学习其实很容易开始,有意识地看英文书(各种英文教材、小说等),各种语言和框架的英文官方文档,提炼英文关键字在 Google 搜索技术问题,用起 StackOverflow 和 Github, Linux 命令行, BBC 6 minutes English, medium, Quora, 还有各种英语练习的 APP 等等都是不错的环境。

此处为语雀内容卡片,点击链接查看:https://www.yuque.com/0xffff.one/cs-learning/klp8n1

习惯折腾

折腾是什么?简单地说,是一个在不熟悉的领域之中干某些事情的过程。这样的事情常带有探索与钻研的性质,需要消耗一定的时间和精力,带来的往往也是不确定的结果。

抽象的概括背后往往掩盖了不少具体的事情,若没有这样的背景,可能难以体会这背后代表的活动。所以我这里也随意列举一些我想到的自己折腾的例子:尝试在虚拟机里安装 Windows,搞 Adobe 全家桶,捣鼓 Excel,装 Linux,在 Linux 中安装主题、浏览器、用 wine 运行 QQ,在服务器中部署网站,科学用网,捣鼓自己的博客和编程环境,还有本站前段时间在尝试的从本地搭建的 lnmp 迁移到 Traefik 反向代理,后端用 Docker 容器部署,尝试加入HTTP/2,CDN 去优化通信效率,配置中文搜索等等等等......

折腾的结果不确定,可能达不到你的预期目标,看似一件费力不讨好的事情。但实际上它给你的回报存在于方方面面,你的人生的与众不同之处,也正是这样的不确定性所决定的。事实也是,未来有很多事情不一定会按照你想象中那样进行,折腾便是一个不断检验自己和完善自我对世界认知的过程。前面很大的篇幅其实都讲到了自我驱动的学习的重要性。相比于在已知的体系下按部就班的学习,折腾往往会给你带来许多和平时完全不一样的视角。乃至于发现已知体系的滞后之处,不被它的一些东西所局限,实现真正的”站在巨人的肩膀上“。

更多关于折腾的重要性,推荐阅读此文:

聊过折腾的重要性的问题,接下来也聊聊怎么做。折腾,并不是为了折腾本身而折腾,而是一种刻在脑海里的意识,不针对具体的事物。折腾精神要求人们保持住自己对未知的好奇心,面对一个问题的时候,不轻易放弃、或不屈服于现有的解决方案,找到更优解。

比如说,你手上收集了一系列的数据,需要排序,直观地说,你可以把这些数据放在 Excel,用它的排序功能。若你有大批量的数据,或是你对 Python 感兴趣,你也许会想”我可以用 Python 实现这个需求吗?“,”还有没有其它的方式实现呢?“等想法。即便你对 Python 不了解,在好奇心的驱动下,你去搜索文档,然后逐步了解 Python 的输入输出,list 数据结构,和它提供的 sort() 方法。然后解决这个问题的同时,又学到了不少的东西。

这是比较顺利的情况,对于一些少有人触碰的问题,常遇到绞尽脑汁到最后还走不通的情况,在尝试的过程中,你可能接触了许多此前完全没有接触过的工具、文档,这样内心驱动下获得的知识,是只属于你的宝贵财富。

探索未知,也就意味着弯路的存在,一个人的折腾是辛苦的,需要付出大量的时间和精力。如今大学可支配的时间是比不上中小学生的。若能聚集一群相同爱好的人,日常互相交流在各自领域的折腾,可以少走许多弯路的情况下收获得更多。这便是最为朴素的开源社区的存在。

如今开源的理念也已深入至商业,如今大厂的商业模式已从卖软件转向了卖服务,技术从各自封闭走向开源协同,与竞争对手的壁垒也从注重处处保密的信息封闭走向了争夺更深一层次突破的赛道上。在带来更大财富的同时,对于技术领域的探索也有着巨大的贡献。

技术领域的探索之路,从折腾开始,一开始可以折腾什么呢?

首先值得我们关注的,当然还是 Linux 操作系统和它涉及到的体系。到目前为止,Linux 几乎统治了云计算的领域,以 Kubernetes + Docker 代表的容器技术遍地开花,各种后台应用也基本上在 Linux 之下运行。Microsoft 也注意到了拉拢 Linux 开发者带来的商业价值,甚至把 .NET Core,MSSQL Server 产品也移植到了 Linux 之下,搞出了在 Windows 之下支持 Linux 系统调用的 WSL 乃至于直接运行 Linux 内核的 WSL 2。

Linux 以 Unix 操作系统为原型而创造。尤其需要注意的是, Linux 只是一个操作系统的内核,在目前 Linux 内核驱动之下的许多体系里,有许多用于 Unix 的必要的自由软件工具是由 GNU 工程创造的,它承载着许多 GNU 的自由软件理想。只是,这个世界并不那么纯粹,不是所有的软件都能达到 GNU 工程之中的人们所想象的那种自由,具体可以关注这些链接,了解GNU在其中的贡献。

我们仰望星空,但也要脚踏实地。在掺杂着利益的世界中爬行的同时,试着创造更多高质量的自由软件,向这样的自由靠拢,可以说是一件十分美好的事情。

在 Linux 内核之下,配合众多的软件,形成了一个真正可以投入使用的操作系统。这样的一个集合又叫 Linux 发行版。对于入门的新手来说,第一要务不是折腾各种具体的细节,而是通过对 Linux 的使用,对 Linux,GNU 工程的软件、X Window 等体系有一个大体认识。鉴于此,Ubuntu 是非常值得推荐的,它解决了许多让人痛苦的问题,也适合作为通用的日常编程开发的环境。关于 Ubuntu 的安装过程,这里我在 Step 2 具体介绍。

Linux 为代表的体系下,绝大多数的程序都是开源的,有兴趣的话你可以直接研究其内部的工作原理,乃至于开发自己想要的功能,把你的修改分享给别人。花了很大篇幅介绍,也是因为它就是这样的因折腾而起的世界,是你在计算机领域折腾的可靠基础,在这其上,你可以安心去折腾你喜欢的编程语言,工具等等。这对于了解计算机的方方面面有着非常巨大的好处。

作为站长,我平时折腾的最多的,最为熟悉的领域也是 Web 了,这同样也是一件很有意思的事情,在这个过程中你可以接触到一个 Web 系统的方方面面,不限于 Web 前端,网络协议,后台 Web 服务器、数据库,Linux 运维以及各种云计算相关的技术,其中当然也涉及到各种编程语言,是一个完整成熟的体系,在这个过程中,甚至你还可以认识到许多天南地北的网友,接触到更多技术领域有所追求的黑客们。若你对网站折腾感兴趣,一开始可以考虑 Hexo, WordPress, Typecho 等工具,Step 5 会介绍博客的搭建。

一些在某些领域形成垄断存在的闭源软件,也存在着很多折腾的价值,重点不仅仅在会用它们,在于它所代表的工作模式。比如说 MS Office 的 Word, Excel, PowerPoint, Outlook 等套件,Adobe 系列的各种软件,AutoDesk 系列等等,比如说了解各种 Excel 函数,写 VBA 实现文档处理自动化,P图,做动画,软件原型设计等等,这里就不详细介绍了。

能折腾的东西很多很多,只要保持住那一颗好奇与探索之心,行动起来,无论在哪儿折腾,世界都会是开阔的。

学会在计算机角度的提问

在计算机世界的折腾之中,我们常常会遇到很多问题和障碍阻碍着我们。遇到问题,自然是需要向外界求助寻求更多有用的信息辅助问题的解决。好奇心是人的本能,问问题也是与生俱来的能力,但问出一个大家乐意帮助的问题,还是需要有一些技巧的。

这里所关注的提问属于一种知识的碰撞,面对同样的话题,不同的人有不同的认识,你是一个独特的视角的存在。作为回答者,更关注的是针对这个问题的视角给ta带来的认知的进一步发展,发现一些以前未曾注意过的角度。

由此,从知识的碰撞的角度出发,提问前应尝试尽你的力量去从你的角度查找相关的资料,尝试自己解决。在提问中,尽可能地描述出问题的同时,也应当表现出你的信心和思考,还有你为此做过的努力,这样其他人才可以帮助你理清思路。只在问题之中强调自己”啥也不懂的小白“会让人失去回答你的兴趣。

需要再次强调的是,没有人有义务为你理解负责,大学已不再是小学到高中的家庭单位的竞争之下的被动学习。”这道题我看不懂啊“之类的抱怨并不会对解决你的疑问产生任何作用。

关于这方面的话题,已经有人总结得很完善,这里只作蜻蜓点水,具体的操作指南,可以参考以下帖子:

其中,《提问的智慧》这篇指南对于如何提出一个让人愿意回答的问题,已有了非常完善的总结与建议,提问前最好尽可能从其中提到的角度去优化。

培养表达能力

接受和理解一个东西,到能表达一个东西,是存在着一定的距离的。尝试表达出来的过程,也是一个要求自己更充分地理解一个事物的过程。就像是无形中费曼技巧的应用。

在表达的载体上,虽然说如今视频十分发达。但阅读效率高,能长时间沉淀和快速搜索的载体,目前还只有文字与图片的形式,为了思想的沉淀和高效回顾,练习写作也是一件有必要的事情。写作,并不要求说像过去学语文那样的做作地表达,大多数时候只需要简单地针对某些知识或踩坑的经历的总结即可,偶尔灵感来了可以用上一些简单的文学的方法作为修饰。这种写作一般称为”古典风格“。

关于古典风格的写作,著名认知心理学家、语言学家、科普作家史蒂夫·平克写过一本写作指导书,名为《风格感觉》,这本书里对这种风格有一个极其精准的论断:

写作之难,在于把网状的思考,用树状的结构,体现在线性展开的语句中。

这个过程,也正是花时间把思维网完善,抓住某个主题形成句法树,然后表达成词语串的过程。往这个方向去努力,慢慢地你对于某个事物的认知会更加完善,给你带来更多的力量。

当然,这里的表达不仅仅是写作,某个主题的分享,演讲等等,其中的思路也是类似的。我们可以试着总结一些主题,从小组内的分享开始,锻练这方面的表达能力。

辅助表达的工具有很多,例如以 Xmind 为代表的脑图工具,演讲与分享最常用的 PowerPoint 为代表的幻灯片工具,辅助组织文字的 Markdown 语法,更强大的 LaTeX,MS Word 等等,若你仔细研究其中的设计细节,你可能会发现,它们无不体现出这种表达过程中所涉及到的树状结构。某种意义上,可能和我们的大脑的神经元和突触的模型相似有关系。

辨别合适的学习资源

以下图片皆为案例

一:斟酌标题吸引你情绪的学习资源

image-20230831194651526

二:培训班的学习资源是下下策(黑马、尚硅谷、马士兵等培训机构)

image-20230831194628261

三:成为大神没有捷径,只有合适的路线与训练,捷径类资源(包括那种标题带比刷剧还爽的或者某某大学名号的中文视频)都需要斟酌

image-20230831194911169

学会如何学习**(Learning How To Learn)**

芭芭拉·奥克利 Barbara Oakley 教授关于学习技巧与方法的研究与总结。从脑科学与心理学的角度出发,讨论掌握复杂学科的方法和思维模式。

大致介绍可以参考此文:学习如何学习 - Limboy's HQ

●英文原版:《A Mind for Numbers》 - Barbara Oakley

●中文翻译:《学习之道》 - 教育无边界字幕组译

MOOC 课程

●原课程:Learning How to Learn: Powerful mental tools to help you master tough subjects | Coursera

●中文翻译版本:学会如何学习:帮助你掌握复杂学科的强大智力工具(Learning How to Learn) | Coursera

课程笔记(复习巩固用):《Learning How to Learn》课程笔记 - 知乎

相关链接

1Barbara Oakley 教授的主页

2可能会重塑你的学习方法的 MOOC:Learning How to Learn - 0xFFFF

3学习如何学习 - Limboy's HQ

4Barbara Oakley: "Learning How to Learn" | Talks at Google - YouTubeB站搬运

5Learning how to learn | Barbara Oakley | TEDxOaklandUniversity - YouTubeB站搬运

6学习如何学习 - 产品沉思录

计算机科学是一门怎样的学科

[][闲谈] 给计算机系新生:计算机科学是一门怎样的学科

一张图了解计算机科学

计算机科学速成课 [40集全/精校] - Crash Course Computer Science

计算机科学领域中的兴趣方向有哪些(主要)?

计算机科学是一个广泛而多样化的领域,涵盖从理论到实践的计算的许多方面。

应用导向

应用导向的计算机科学侧重于开发和改进软件系统,以解决实际问题或提供有用的服务。这个方向通常涉及使用现有的技术、工具和框架,并将它们应用到各种领域,如商业、教育、健康、娱乐等。一些应用导向的计算机科学领域的主要兴趣方向有:

  • 软件工程:设计、开发、测试和维护满足客户或用户需求和规范的软件系统的学科。 例如:微软 Office,一套软件应用程序,使用户能够创建和编辑文档、电子表格、演示文稿等。

  • Web 开发(网络开发):创建在互联网或内部网(Intranet)上运行的网站和 Web 网络应用的过程。 例如:淘宝,一个电子商务网站以及Web应用,允许用户在线购买和销售各种产品。

  • 移动开发:创建在智能手机和平板电脑等移动设备上运行的应用程序的过程。 例如:小红书,一款社交媒体应用程序,允许用户在移动设备上分享和查看照片和视频。

  • 数据科学:使用统计、机器学习、数据挖掘等各种方法从大型复杂数据集中提取见解(insight)和知识的领域。 例如:哔哩哔哩(B站)、抖音、拼多多、淘宝等主要平台利用数据分析和机器学习向用户推荐个性化内容。

  • 人工智能:创建能够执行通常需要人类智能的任务,如推理、学习、规划、决策等的系统的领域。

  • 网络安全:保护信息和系统免遭未经授权的访问、使用、修改或破坏的领域。

应用导向的兴趣方向通常需要编程语言、软件工具、框架、库等方面的实践技能和经验。就业可以作为软件开发人员、软件工程师、网络开发人员、移动开发人员、数据分析师、数据科学家、人工智能工程师、网络安全分析师等。

研究导向

研究导向的计算机科学侧重于推进计算及其应用方面的基础知识和理解。这个方向通常涉及探索新的思想、概念、模型、算法、技术等,并为具有挑战性的问题或问题提出新颖的解决方案或方法。一些研究导向的计算机科学领域的兴趣方向有:

  • 理论计算机科学:研究计算的数学基础和限制,如可计算性、复杂性、算法、数据结构、逻辑等。例如:P vs NP 问题,一个著名的开放问题,询问是否每个可以在多项式时间内验证其解决方案的问题也可以在多项式时间内解决。
  • 计算机体系结构:研究计算机硬件组件和系统的设计和组织,如处理器、内存、缓存、总线等。例如:量子计算,一种利用量子力学现象对数据进行运算的新计算范式。
  • 计算机图形学:研究使用计算机和算法创建和操作视觉图像和动画。例如:光线追踪是一种模拟光的物理行为以创建逼真的图像和动画的技术。
  • 计算机视觉:研究使计算机能够理解和解释来自图像或视频的视觉信息。例如:人脸识别是一种可以从数字图像或视频中识别或验证人的身份的技术。
  • 自然语言处理:研究使计算机能够处理和生成自然语言文本或语音。例如:机器翻译,一种可以自动将文本或语音从一种语言翻译成另一种语言的技术。
  • 人机交互:研究设计和评估人与计算机之间的用户界面和交互。例如:虚拟现实,一种创建三维环境的沉浸式交互式模拟的技术。

研究导向的兴趣方向需要强大的分析能力和创造性的问题解决能力。主要可以成为研究员、教授、科学家、顾问等职业。

以上这些兴趣领域也可以交叉后成为子兴趣领域

这些兴趣方向学什么?

计算机科学的知识领域

按照理论和应用的区分,计算机领域的知识领域可以分为两大类:理论计算机科学和应用计算机科学。理论计算机科学主要研究计算和可计算性的本质和限制,以及与之相关的数学和逻辑基础。应用计算机科学主要研究如何利用计算机技术解决实际问题,以及与之相关的工程和设计方法。

按照ACM和IEEE-CS制定的计算机科学教育指南,计算机领域的知识领域可以分为18个子领域,分别是:

  • AL-算法与复杂度(Algorithm and Complexity):研究设计、分析、实现和评估有效的解决问题方法的原理和技术。
  • AR-体系结构与组织(Architecture and Organization):研究计算机系统的结构、功能、行为和性能,以及硬件和软件之间的接口。
  • CN-计算科学(Computational Science):研究利用数值方法、符号方法和可视化方法解决科学问题的原理和技术。
  • DS-离散结构(Discrete Structures):研究离散数学中与计算相关的概念、模型和方法,如集合、图、逻辑等。
  • GV-图形学与可视化(Graphics and Visualization):研究生成、操作、呈现和交互二维或三维图像的原理和技术。
  • HCI-人机交互(Human-Computer Interaction):研究人与计算系统之间的交互方式、效果和评估方法。
  • IAS-信息保障与安全(Information Assurance and Security):研究保护信息和系统免受未授权访问、使用、修改或破坏的原理和技术。
  • IM-信息管理(Information Management):研究存储、检索、组织、管理和处理大量数据的原理和技术。
  • IS-智能系统(Intelligent Systems):研究使计算系统具有智能行为或模拟人类智能的原理和技术,如搜索、推理、规划、机器学习等。
  • NC-网络与通信(Networking and Communication):研究网络系统的设计、实现、管理和评估,以及网络协议、服务和应用。
  • OS-操作系统(Operating Systems):研究操作系统的设计、实现、管理和评估,以及操作系统提供的抽象层次、资源管理策略和服务接口。
  • PBD-基于平台的开发(Platform-based Development):研究利用特定平台(如移动设备、嵌入式系统等)开发软件系统的原理和技术。
  • PD-并行与分布式计算(Parallel and Distributed Computing):研究利用多个处理器或多个节点协同完成计算任务的原理和技术,以及相关的并行编程模型、同步机制等。
  • PL-程序设计语言(Programming Languages):研究程序设计语言的设计、实现、分析、描述和分类,以及程序设计语言提供的语法、语义和功能。
  • SDF-软件开发基础(Software Development Fundamentals):研究软件开发过程中的基本概念、方法和工具,如需求分析、设计模式、测试方法等。
  • SE-软件工程(Software Engineering):研究软件开发过程中的高级概念、方法和工具,如软件生命周期模型、软件质量保证、软件配置管理等。
  • SF-系统基础(Systems Fundamentals):研究计算系统的基本组成部分,如数字逻辑、微处理器、编译器等。
  • SP-社会问题与专业实践(Social Issues and Professional Practice):研究计算机科学与社会、法律、道德和职业责任之间的关系,以及计算机科学的历史、趋势和影响。

前述兴趣方向涉及的基础知识和核心技能

  • 应用导向的计算机科学领域所涉及的基础知识和核心技能:
    • 软件工程:软件工程要求掌握软件开发的基本原理和方法,如软件生命周期、软件需求分析、软件设计、软件测试、软件维护等。此外,还需要熟练使用至少一种编程语言,如Java, C++, Python等,以及相关的软件工具,如IDE, Git, Debug等。
    • 网络开发:网络开发要求掌握网络编程的基本概念和技术,如网络协议、网络架构、网络安全等。此外,还需要熟练使用前端和后端的编程语言和框架,如HTML, CSS, JavaScript, PHP, Ruby on Rails等,以及相关的网络工具,如Web Server, Browser, Database等)。
    • 移动开发:移动开发要求掌握移动平台的特点和要求,如Android, iOS, Windows Phone等。此外,还需要熟练使用移动平台的编程语言和工具,如Java, Kotlin, Swift, Objective-C, Xcode, Android Studio等。
    • 数据科学:数据科学要求掌握数据分析的基本理论和方法,如统计学、机器学习、数据挖掘、数据可视化等。此外,还需要熟练使用数据处理的编程语言和工具,如Python, R, SQL, MATLAB, Excel, TensorFlow等。
    • 人工智能:人工智能要求掌握人工智能的基本概念和技术,如智能代理、搜索算法、知识表示、规划、自然语言处理、计算机视觉、机器学习、深度学习等。此外,还需要熟练使用人工智能的编程语言和工具,如Python, C++, Java, Prolog, Lisp, TensorFlow, PyTorch等。
    • 网络安全:网络安全要求掌握网络安全的基本原理和方法,如密码学、身份认证、访问控制、防火墙、入侵检测、恶意软件分析等。此外,还需要熟练使用网络安全的编程语言和工具,如C, Python, Java, Assembly, Wireshark, Nmap, Metasploit等。
  • 研究导向的计算机科学领域所涉及的基础知识和核心技能:
    • 理论计算机科学:理论计算机科学要求掌握计算理论的基本概念和结果,如可计算性、复杂性、算法、数据结构、逻辑等。此外,还需要熟练使用数学证明的技巧和方法,如归纳法、反证法、归约法等。
    • 计算机体系结构:计算机体系结构要求掌握计算机硬件的基本结构和功能,如处理器、内存、缓存、总线等。此外,还需要熟练使用硬件设计的技术和工具,如数字逻辑、电路设计、汇编语言、Verilog等。
    • 计算机图形学:计算机图形学要求掌握计算机图形的基本原理和方法,如光栅化、光照、纹理、动画、渲染等。此外,还需要熟练使用图形编程的语言和工具,如OpenGL, DirectX, C++, Java, Blender, Maya等。
    • 计算机视觉:计算机视觉要求掌握计算机视觉的基本概念和技术,如图像处理、特征提取、目标检测、人脸识别、场景理解等。此外,还需要熟练使用视觉编程的语言和工具,如Python, C++, MATLAB, OpenCV, TensorFlow等。
    • 自然语言处理:自然语言处理要求掌握自然语言处理的基本理论和方法,如词法分析、句法分析、语义分析、机器翻译、文本生成等。此外,还需要熟练使用自然语言处理的编程语言和工具,如Python, Java, NLTK, Gensim, TensorFlow等。
    • 人机交互:人机交互要求掌握人机交互的基本原则和技术,如用户界面设计、用户体验评估、交互模式、虚拟现实、增强现实等。此外,还需要熟练使用人机交互的编程语言和工具,如HTML, CSS, JavaScript, Java, C#, Unity, Unreal Engine等。

如何选择这些兴趣方向?

分流专业的选择并不重要,重要的是选择的方向,因为分流后的课程设置学不到多少,所以大部分知识都是靠自学

强烈建议等学习并掌握了基础知识,例如掌握基础必学课程:程序设计基础、面向对象程序设计基础、计算机网络、数据结构与算法、计算机组成原理、操作系统等并完成每门课程的实验和课程设计之后再选择方向。

选择方向需要考虑以下几个因素:

  • 你的个人兴趣和爱好。不同的方向涉及不同的知识和技能,也有不同的应用领域和挑战。你应该选择你感兴趣和擅长的方向,这样才能保持学习的动力和乐趣。
  • 你的基础知识和能力。不同的方向对你的数学、逻辑、编程等方面的要求也不同。你应该选择你有一定基础和优势的方向,这样才能更容易地掌握和运用相关的理论和方法。
  • 你的学习目标和规划。不同的方向有不同的学习难度和深度,也有不同的就业前景和发展潜力。你应该选择符合你的学习目标和规划的方向,这样才能更好地实现你的职业发展和个人成长。

参考建议:

  • 多了解各个方向的内容和特点,可以通过搜索网上的资料、阅读相关的书籍、观看相关的视频等方式,增加自己对各个方向的认识和理解。
  • 多尝试各个方向的实践,可以通过参加相关的课程、项目、比赛等方式,体验自己在各个方向上的学习和工作,发现自己在各个方向上的兴趣和优势。
  • 多咨询各个方向的专家,可以通过联系相关的老师、导师、同学、前辈等方式,获取他们对各个方向的看法和建议,借鉴他们在各个方向上的经验和教训。

自学长期目标 & 学习计划的确认

每个计算机科学专业应该知道的

What every computer science major should know (might.net)

What every computer science major should know (might.net)

自学计算机科学

本文档是对 TeachYourselfCS 内容的中文翻译,原作者为 Ozan OnayMyles Byrne。如需了解翻译相关信息或帮助改进翻译,请参见 本文档结尾

This document is a Chinese translation of TeachYourselfCS, which is written by Ozan Onay and Myles Byrne. For more information about this translation, please refer to the end of this document.

如果你是一个自学成才的工程师,或者从编程培训班毕业,那么你很有必要学习计算机科学。幸运的是,不必为此花上数年光阴和不菲费用去攻读一个学位:仅仅依靠自己,你就可以获得世界一流水平的教育💸。

互联网上,到处都有许多的学习资源,然而精华与糟粕并存。你所需要的,不是一个诸如「200+ 免费在线课程」的清单,而是以下问题的答案:

  • 你应当学习 哪些科目,为什么?
  • 对于这些科目,最好的书籍或者视频课程 是什么?

在这份指引中,我们尝试对这些问题做出确定的回答。

简而言之

大致按照列出的顺序,借助我们所建议的教材或者视频课程(但是最好二者兼用),学习如下的九门科目。目标是先花 100 到 200 个小时学习完每一个科目,然后在你职业生涯中,不时温习其中的精髓🚀。

科目 为何要学? 最佳书籍 最佳视频
编程 不要做一个「永远没彻底搞懂」诸如递归等概念的程序员。 《计算机程序的构造和解释》 Brian Harvey’s Berkeley CS 61A
计算机系统结构 如果你对于计算机如何工作没有具体的概念,那么你所做出的所有高级抽象都是空中楼阁。 《深入理解计算机系统》 Berkeley CS 61C
算法与数据结构 如果你不懂得如何使用栈、队列、树、图等常见数据结构,遇到有难度的问题时,你将束手无策。 《算法设计手册》 Steven Skiena’s lectures
数学知识 计算机科学基本上是应用数学的一个「跑偏的」分支,因此学习数学将会给你带来竞争优势。 《计算机科学中的数学》 Tom Leighton’s MIT 6.042J
操作系统 你所写的代码,基本上都由操作系统来运行,因此你应当了解其运作的原理。 《操作系统导论》 Berkeley CS 162
计算机网络 互联网已然势不可挡:理解工作原理才能解锁全部潜力。 《计算机网络:自顶向下方法》 Stanford CS 144
数据库 对于多数重要程序,数据是其核心,然而很少人理解数据库系统的工作原理。 Readings in Database Systems (暂无中译本) Joe Hellerstein’s Berkeley CS 186
编程语言与编译器 若你懂得编程语言和编译器如何工作,你就能写出更好的代码,更轻松地学习新的编程语言。 Crafting Interpreters Alex Aiken’s course on Lagunita
分布式系统 如今,多数 系统都是分布式的。 《数据密集型应用系统设计》 MIT 6.824

还是太多?

如果花几年时间自学 9 门科目让人望而却步,我们建议你只专注于两本书:《深入理解计算机系统》《数据密集型应用系统设计》。根据我们的经验,投入到这两本书的时间可以获得极高的回报率,特别适合从事网络应用开发的自学工程师。这两本书也可以作为上面表格中其他科目的纲领。

为什么要学习计算机科学?

软件工程师分为两种:一种充分理解了计算机科学,从而有能力应对充满挑战的创造性工作;另一种仅仅凭着对一些高级工具的熟悉而勉强应付。

这两种人都自称软件工程师,都能在职业生涯早期挣到差不多的工资。然而,随着时间流逝,第一种工程师不断成长,所做的事情将会越来越有意义且更为高薪,不论是有价值的商业工作、突破性的开源项目、技术上的领导力或者高质量的个人贡献。

全球短信系统每日收发约 200 亿条信息,而仅仅靠 57 名工程师,现在的 WhatsApp 每日收发 420 亿条。

— Benedict Evans (@BenedictEvans) 2016 年 2 月 2 日

第一种工程师总是寻求深入学习计算机科学的方法,或是通过传统的方法学习,或是在职业生涯中永无止息地学习;第二种工程师 通常浮于表面,只学习某些特定的工具和技术,而不研究其底层的基本原理,仅仅在技术潮流的风向改变时学习新的技能。

如今,涌入计算机行业的人数激增,然而计算机专业的毕业生数量基本上未曾改变。第二种工程师的供过于求正在开始减少他们的工作机会,使他们无法涉足行业内更加有意义的工作。对你而言,不论正在努力成为第一种工程师,还是只想让自己的职业生涯更加安全,学习计算机科学是唯一可靠的途径。

23333 然而他们……pic.twitter.com/XVNYlXAHar

— Jenna Bilotta (@jenna) 2017 年 3 月 4 日

分科目指引

编程

大多数计算机专业本科教学以程序设计「导论」作为开始。这类课程的最佳版本不仅能满足初学者的需要,还适用于那些在初学编程阶段遗漏了某些有益的概念和程序设计模式的人。

对于这部分内容,我们的标准推荐是这部经典著作:《计算机程序的构造和解释》。在网络上,这本书既可供 免费阅读(英文版),也作为 MIT 的免费视频课程。不过尽管这些视频课程很不错,我们对于视频课程的推荐实际上是 Brian Harvey 开设的 SICP 课程(即 Berkeley 的 61A 课程)。比起 MIT 的课程,它更加完善,更适用于初学者。

我们建议至少学完 SICP 的前三章,并完成配套的习题。如果需要额外的练习,可以去解决一些小的程序设计问题,比如 exercism

中文翻译新增:

自从 2016 年首次发布这份指南以来,最常被问到的一个问题是,我们是否推荐由 John DeNero 讲授的更新的 CS 61A 课程,以及配套的书籍 Composing Programs,这本书「继承自 SICP」 但使用 Python 讲解。我们认为 DeNero 的课程也很不错,有的学生可能更喜欢,但我们还是建议把 SICP、Scheme 和 Brian Harvey 的视频课程作为首选。

为什么这么说呢?因为 SICP 是独一无二的,它可以——至少很有可能——改变你对计算机和编程的基本认识。不是每个人都有这样的体验。有的人讨厌这本书,有的人看了前几页就放弃了。但潜在的回报让它值得一读。

如果你觉得 SICP 过于难,试试 Composing Programs。如果还是不合适,那我们推荐 《程序设计方法》(中文版英文版) ;如果你觉得 SICP 过于简单,那我们推荐 Concepts, Techniques, and Models of Computer Programming。如果读这些书让你觉得没有收获,也许你应该先学习其他科目,一两年后再重新审视编程的理念。

新版原文删除了对 Concepts, Techniques, and Models of Computer Programming 一书的推荐,但这本书对各种编程模型有深入的见解,值得一读。所以译文中依然保留。 — 译者注

最后,有一点要说明的是:本指南 不适用 于完全不懂编程的新手。我们假定你是一个没有计算机专业背景的程序员,希望填补一些知识空白。事实上,我们把「编程」章节包括进来只是提醒你还有更多知识需要学习。对于那些从来没有学过编程,但又想学的人来说,这份 指南 更合适。

计算机程序的构造和解释

计算机系统结构

计算机系统结构——有时候又被称为「计算机系统」或者「计算机组成」——是了解软件底层的的重要视角。根据我们的经验,这是自学的软件工程师最容易忽视的领域。

我们最喜欢的入门书是 《深入理解计算机系统》。典型的 计算机体系结构导论课程 会涵盖本书的 1-6 章。

我们喜爱《深入理解计算机系统》,因为它的实用性,并且站在程序员的视角。虽然计算机体系结构的内容比本书所涉及的内容多得多,但对于那些想了解计算机系统以求编写更快、更高效、更可靠的软件的人来说,这本书是很好的起点。

对于那些既想了解这个主题又想兼顾硬件和软件的知识的人来说,我们推荐 《计算机系统要素》,又名「从与非门到俄罗斯方块」(Nand2Tetris),这本书规模宏大,让读者对计算机内的所有部分如何协同工作有完全的认识。这本书的每一章节对应如何构建计算机整体系统中的一小部分,从用 HDL(硬件描述语言)写基本的逻辑门电路出发,途经 CPU 和汇编,最终抵达诸如俄罗斯方块这般规模的应用程序。

我们推荐把此书的前六章读完,并完成对应的项目练习。这么做,你将更加深入地理解,计算机体系结构和运行其上的软件之间的关系。

这本书的前半部分(包括所有对应的项目)均可从 Nand2Tetris 的网站上 免费获得。同时,在 Coursera 上,这是一门 视频课程

为了追求简洁和紧凑,这本书牺牲了内容上的深度。尤其值得注意的是,流水线和存储层次结构是现代计算机体系结构中极其重要的两个概念,然而这本书对此几乎毫无涉及。

当你掌握了 Nand2Tetris 的内容后,我们推荐要么回到《深入理解计算机系统》,或者考虑 Patterson 和 Hennessy 二人所著的 《计算机组成与设计》,一本优秀的经典著作。这本书中的不同章节重要程度不一,因此我们建议根据 Berkeley 的 CS61C 课程 「计算机体系结构中的伟大思想」来着重阅读一些章节。这门课的笔记和实验在网络上可以免费获得,并且在 互联网档案 中有这门课程的过往资料。

深入理解计算机系统 计算机系统要素

硬件是平台。

— Mike Acton, Engine Director at Insomniac Games (观看他在 CppCon 上的演说

算法与数据结构

正如几十年来的共识,我们认为,计算机科学教育所赋予人们的最大能量在于对常见算法和数据结构的熟悉。此外,这也可以训练一个人对于各种问题的解决能力,有助于其他领域的学习。

关于算法与数据结构,有成百上千的书可供使用,但是我们的最爱是 Steven Skiena 编写的 《算法设计手册》 。显而易见,他对此充满热爱,迫不及待地想要帮助其他人理解。在我们看来,这本书给人一种焕然一新的体验,完全不同于那些更加经常被推荐的书(比如 Cormen、Leiserson、Rivest、Stein 或 Sedgewick 的书,后两者充斥着过多的证明,不适合以 解决问题 为导向的学习)。

如果你更喜欢视频课程,Skiena 慷慨地提供了他的课程。此外,Tim Roughgarden 的课程也很不错, 在 Stanford 的 MOOC 平台 Lagunita,或者 Coursera 上均可获得。Skiena 和 Roughgarden 的这两门课程没有优劣之分,选择何者取决于个人品味。

至于练习,我们推荐学生在 Leetcode 上解决问题。Leetcode 上的问题往往有趣且带有良好的解法和讨论。此外,在竞争日益激烈的软件行业,这些问题可以帮助你评估自己应对技术面试中常见问题的能力。我们建议解决大约 100 道随机挑选的 Leetcode 问题,作为学习的一部分。

最后,我们强烈推荐 《怎样解题》。这本书极为优秀且独特,指导人们解决广义上的问题,因而一如其适用于数学,它适用于计算机科学。

算法设计手册 怎样解题

我可以广泛推荐的方法只有一个: 写之前先思考。

— Richard Hamming

数学知识

从某个角度说,计算机科学是应用数学的一个「发育过度」的分支。尽管许多软件工程师试图——并且在不同程度上成功做到——忽视这一点,我们鼓励你用学习来拥抱数学。如若成功,比起那些没有掌握数学的人,你将获得巨大的竞争优势。

对于计算机科学,数学中最相关的领域是「离散数学」,其中的「离散」与「连续」相对立,大致上指的是应用数学中那些有趣的主题,而不是微积分之类的。由于定义比较含糊,试图掌握离散数学的全部内容是没有意义的。较为现实的学习目标是,了解逻辑、排列组合、概率论、集合论、图论以及密码学相关的一些数论知识。考虑到线性代数在计算机图形学和机器学习中的重要性,该领域同样值得学习。

学习离散数学,我们建议从 László Lovász 的课程笔记 开始。Lovász 教授成功地让这些内容浅显易懂且符合直觉,因此,比起正式的教材,这更适合初学者。

对于更加高阶的学习,我们推荐 《计算机科学中的数学》,MIT 同名课程的课程笔记,篇幅与书籍相当(事实上,现已出版)。这门课程的视频同样 可免费获得,是我们所推荐的学习视频。

对于线性代数,我们建议从 Essence of linear algebra 系列视频开始,然后再去学习 Gilbert Strang 的 《线性代数导论》视频课程

计算机科学中的数学

如果人们不相信数学是简单的,那么只能是因为他们没有意识到生活有多么复杂。

— John von Neumann

操作系统

《操作系统概念》(「恐龙书」)和 《现代操作系统》 是操作系统领域的经典书籍。二者都因为写作风格和对学生不友好而招致了一些批评。

《操作系统导论》(Operating Systems: Three Easy Pieces 是一个不错的替代品,并且 可在网上免费获得(英文版)。我们格外喜欢这本书的结构,并且认为这本书的习题很值得一做。

在读完《操作系统导论》后,我们鼓励你探索特定操作系统的设计。可以借助「{OS name} Internals」风格的书籍,比如 Lion's commentary on UnixThe Design and Implementation of the FreeBSD Operating System,以及 Mac OS X Internals。对于 Linux ,我们推荐 Robert Love 的 《Linux 内核设计与实现》

为了巩固对操作系统的理解,阅读小型系统内核的代码并且为其增加特性是一个很不错的方法。比如,xv6,由 MIT 的一门课程所维护的从 Unix V6 到 ANSI C 和 x86 的移植,就是一个很棒的选择。《操作系统导论》有一个附录,记载了一些可能的 xv6 实验项目,其中充满了关于潜在项目的很棒想法。

操作系统导论

计算机网络

鉴于有那么多关于网络服务端和客户端的软件工程,计算机网络是计算机科学中价值最为「立竿见影」的领域之一。我们的学生,系统性地学习了计算机网络,最终能够理解那些曾困扰他们多年的术语、概念和协议。

在这一主题上,我们最爱的书籍是 《计算机网络:自顶向下方法》。书中的小项目和习题相当值得练习,尤其是其中的「Wireshark labs」(这部分在网上可以获得)。

如果更喜欢视频课程,我们推荐 Stanford 的 Introduction to Computer Networking,可在他们的 MOOC 平台 Lagunita 上免费观看。

对于计算机网络的学习,做项目比完成小的习题更有益。一些可能的项目有:HTTP 服务器,基于 UDP 的聊天 APP,迷你 TCP 栈,代理,负载均衡器,或者分布式哈希表。

《计算机网络:自顶向下方法》

你无法盯着水晶球预见未来,未来的互联网何去何从取决于社会。

— Bob Kahn

数据库

比起其他主题,自学数据库系统需要更多的付出。这是一个相对年轻的研究领域,并且出于很强的商业动机,研究者把想法藏在紧闭的门后。此外,许多原本有潜力写出优秀教材的作者反而选择了加入或创立公司。

鉴于如上情况,我们鼓励自学者大体上抛弃教材,而是从 2015 年春季学期的 CS 186 课程(Joe Hellerstein 在 Berkeley 的数据库课程)开始,然后前往阅读论文。

对于初学者,有一篇格外值得提及的论文:Architecture of a Database System。这篇论文提供了独特的对关系型数据库管理系统(RDBMS)如何工作的高层次观点,是后续学习的实用梗概。

Readings in Database Systems,或者以 数据库「红书」 更为人知,是由 Peter Bailis、Joe Hellerstein 和 Michael Stonebraker 编纂的论文合集。对于那些想要在 CS 186 课程的水平更进一步的学习者,「红书」应当是下一步。

如果你坚持一定要一本导论教材,那我们推荐 Ramakrishnan 和 Gehrke 所著的 《数据库管理系统:原理与设计》。如需更深一步,Jim Gray 的经典著作 Transaction Processing: Concepts and Techniques 值得一读,不过我们不建议把这本书当作首要资源。

如果没有编写足够数量的代码,很难巩固数据库理论。CS 186 课程的学生给 Spark 添加特性,倒是不错的项目,不过我们仅仅建议从零实现一个简单的关系型数据库管理系统。自然,它将不会有太多的特性,但是即便只实现典型的关系型数据库管理系统每个方面最基础的功能,也是相当有启发的。

最后,数据模型往往是数据库中一个被忽视的、教学不充分的方面。关于这个主题,我们推荐的书籍是 Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World

Readings in Database Systems 数据库管理系统:原理与设计

编程语言与编译器

多数程序员学习编程语言的知识,而多数计算机科学家学习编程语言 相关 的知识。这使得计算机科学家比起程序员拥有显著的优势,即便在编程领域!因为他们的知识可以推而广之:相较只学习过特定编程语言的人,他们可以更深入更快速地理解新的编程语言。

我们推荐的入门书是 Bob Nystrom 所著的优秀的 Crafting Interpreters,可在网上免费获取。这本书条理清晰,富有趣味性,非常适合那些想要更好地理解语言和语言工具的人。我们建议你花时间读完整本书,并尝试任何一个感兴趣的「挑战」。

另一本更为传统的推荐书籍是 《编译原理》,通常称为「龙书」。不幸的是,这本书不是为自学者而设计的,而是供教师从中挑选一些主题用于 1-2 学期的教学。

如果你选择使用龙书进行自学,你需要从中甄选主题,而且最好是在导师的帮助下。我们建议依据某个视频课程来设定学习的结构,然后按需从龙书中获取深入的内容。我们推荐的在线课程是 Alex Aiken 在 MOOC 平台 edX 所开设的

编译原理

不要做一个只写样板代码的程序员。相反,给用户和其他程序员创造工具。从纺织工业和钢铁工业中学习历史教训:你想制造机器和工具,还是操作这些机器?

— Ras Bodik 在他的编译器课程伊始

分布式系统

随着计算机在数量上的增加,计算机同样开始 分散。尽管商业公司过去愿意购买越来越大的大型机,现在的典型情况是,甚至很小的应用程序都同时在多台机器上运行。思考这样做的利弊权衡,即是分布式系统的研究所在,也是越来越重要的一项技能。

我们推荐的自学参考书是 Martin Kleppmann 的 《数据密集型应用系统设计》。与传统的教科书相比,它是一本为实践者设计的具有很高的可读性的书,并且保持了深度和严谨性。

对于那些偏爱传统教材,或者希望可以从网上免费获取的人,我们推荐的教材是 Maarten van Steen 和 Andrew Tanenbaum 所著的 《分布式系统原理与范型》(中文第二版英文第三版)。

对于喜欢视频课程的人,MIT 的 6.824 是一门很好的在线视频课程,由 Robert Morris 教授的研究生课程,在 这里 可以看到课程安排。

不管选择怎样的教材或者其他辅助资料,学习分布式系统必然要求阅读论文。这里 有一个不错的论文清单,而且我们强烈建议你出席你当地的 Papers We Love(仅限美国)。

数据密集型应用系统设计

常见问题解答

这份指引的目标受众是?

我们面向自学的软件工程师、培训班学生、「早熟的」高中生或者想要通过自学补充正式教育的大学生。关于何时开启这段自学旅程,完全取决于个人,不过多数人在有一定的职业经历后深入学习计算机科学理论会获益匪浅。比如,我们注意到,如果学生在工作中曾经使用过数据库,他们会 喜爱 学习数据库系统课程;如果学生从事过一两个 Web 项目,他们会 喜爱 学习计算机网络。

人工智能/计算机图形学/XX 主题怎么样?

我们试图把计算机科学主题清单限制到那些我们认为 每一个软件工程师 都应该了解的内容,不限于专业或行业。拥有了这些基础,你将能更加轻松地挑选教材或论文,然而无需指引地学习核心概念。在这里,我们给出一些其他常见主题的自学起点:

一定要严格遵守推荐的学习次序吗?

事实上,所有主题之间都有一定程度的重叠,彼此循环引用。以离散数学和算法的关系为例:先学习数学可以帮助你更深入地分析和理解算法,然而先学习算法可以为学习离散数学提供更大的动力和应用背景。理想情况下,你将在你的职业生涯多次重温二者。

因此,我们所推荐的次序主要是为了帮助你 起步……如果你出于某种强烈的原因而倾向以不同的顺序学习,那也没有关系,勇敢开始吧!不过在我们看来,最重要的「先决条件」是:先学计算机体系结构再学操作系统或数据库,先学计算机网络和操作系统再学分布式系统。

和 Open Source Society、freeCodeCamp curricula 等比起来,这份指引?

OSS 指引 涵盖太多主题,在许多主题中推荐劣质资源,没有就特定课程哪些方面有价值提供原因或指引。我们努力对这份指引中的课程加以限制,仅仅包括那些你作为软件工程师 确实需要了解的,不论你的专业方向,并且对每门课程为何必要做出了解释以帮助你理解。

FreeCodeCamp 主要关注编程,而不是计算机科学。至于你为什么要学习计算机科学,参见 上文。如果你是个新手,我们建议先学 freeCodeCamp 的课程,一两年后再回归本指南。

XX 编程语言怎么样?

学习一门特定的编程语言和学习计算机科学的一个领域完全不在一个维度——相比之下,学习语言 容易缺乏价值。如果你已经了解了一些语言,我们强烈建议遵照我们的指引,然后在学习的空当中习得语言,或者暂且不管以后再说。如果你已经把编程学得不错了(比如学完了 《计算机程序的构造和解释》),尤其是如果你学习过编译器,那么面对一门新的语言,你只需要花一个周末稍多的时间即可基本掌握,之后你可以在工作中学习相关的类库/工具/生态。

XX 流行技术怎么样?

没有任何一种技术的重要程度可以达到学习其使用足以成为计算机科学教学的核心部分。不过,你对学习那门技术充满热情,这很不错。诀窍是先从特定的技术回退到基本的领域或概念,判断这门流行技术在技术的宏观大局中位于何处,然后才深入学习这门技术。

为什么你们还在推荐 SICP?

先尝试读一下,有些人觉得 SICP 让人神魂颠倒,这在其他书很少见。如果你不喜欢,你可以尝试其他的东西,也许以后再回到 SICP。

为什么你们还在推荐龙书?

龙书依旧是内容最为完整的编译器单本书籍。由于过分强调一些如今不够时新的主题的细节,比如解析,这本书招致了恶评。然而事实上,这本书从未打算供人一页一页的学习,而仅仅是为了给教师准备一门课程提供足够的材料。类似地,自学者可以从书中量身按需挑选主题,或者最好依照公开课授课教师在课程大纲中的建议。

如何便宜获取教材?

我们所建议的许多教材在网上都可以免费获得,这多亏了作者们的慷慨。对于那些不免费的书籍,我们建议购买旧版本的二手书籍。广而言之,如果一本教材有多个版本,旧版本大概率是完全足够使用的。即便新版本的价格是旧版本的 10 倍,新版本也绝不可能比旧版本好 10 倍!

中文翻译新增: 事实上,比起美国,在国内购买技术书籍可以说是相当「廉价」了。如果仍旧寻求更加便宜的购买渠道,可以参考这篇 V2EX 上的 讨论帖子,其中提到了一些不错的购买渠道。

这份指引是谁写的?

这份指引由 Bradfield School of Computer Science(旧金山)的两位教员:Ozan OnayMyles Byrne 编写,并由 Oz 于 2020 年更新。这份指引基于我们对数千名自学成才的工程师和培训班学生教授计算机科学基础的经验。感谢我们所有学生对自学资源的持续反馈。

只要有足够的时间和动力,我们非常有信心,你可以自学完以上所有课程。如果你喜欢一个集中式、结构化、由教师指导的课程,你可能对我们的 计算机科学强化班 感兴趣。我们 不建议 你去攻读硕士学位。

https://teachyourselfcs.com/)

CS自学指南

一个仅供参考的CS学习规划 - CS自学指南 (csdiy.wiki)

该书前言一定要读,同时并不是每一门课程你都要学,要选择最适合自己的

分享:计算机本科学习经验谈(参考)

21年底 @0x0001在华师计算机学院面向 21、20级 学生的一场分享会,关于个人经历、计算机专业入门、学习和未来发展的方方面面(其实就是本 Wiki 所提到的话题)。

讨论话题:

1个人大学经历

2大学生的心态准备

3通识技能的培养

4CS 的入门与进阶

5未来方向和发展规划

相关信息

介绍链接:主题分享:「计算机本科学习经验谈」 - 0xFFFF

Slides:📎计算机本科学习经验谈 - final - update.pdf

录像:

参考资料

  1. 如何评价现在的大学生? - 知乎
  2. 0xFFFF CS Wiki (yuque.com)
  3. 关于 | 0xFFFF Wiki
  4. github
  5. 顶尖高校:绩点考核下的人生突围 - 《三联生活周刊》2020年第37期
  6. 《上海交通大学生存手册》 新版本链接:SurviveSJTUManual
  7. 王小波写给柯云路的信 - 微博(微博是原稿的照片,在王小波《爱你就像爱生命》也有收录
  8. 《学问与问学》- 曲卫国 - 微信公众号「学问批判」
  9. 画个圈圈告诉你本科、硕士、博士的区别 - 原载于人民日报微博
  10. 《中华人民共和国学科分类与代码表 GB/T 13745-2009》
  11. 规定“学什么”的培养方案——《逆袭大学》- 迂者·贺利坚
  12. 顶尖中文大学计算机专业课程体系 - 网易云课堂
  13. ACM/IEEE-CS Joint Task Force - 《计算机科学课程体系规范 2013》 - 0xFFFF
  14. 关于“IT学子成长指导”专栏及文章目录 - CSDN博客
  15. 逆袭大学——传给IT学子的正能量-图书-图灵社区
  16. 《逆袭大学——传给IT学子正能量》CSDN连载目录
  17. CS自学指南 (csdiy.wiki)
  18. 如何更好地构建“知识体系” - 聊聊 DIKW 模型 - idealclover
  19. 小马过河的故事内容 - 皮皮少儿阅读频道
  20. 你是否需要做学霸? - 0xFFFF
  21. 中小学信息技术教师的出路在哪里? - 知乎
  22. 费曼学习法 - MBA智库百科
  23. “为学当如金字塔,要能博大要能高” - 0xFFFF
  24. 南京大学“悦读经典计划”网站
  25. 好书角 | 香港中文大学图书馆
  26. 「香港中文大学推荐书单」是否真的是香港中文大学推荐的? - 知乎
  27. 如何阅读一本书 (豆瓣)
  28. 写给大一新生的一番话 - 0xFFFF
  29. 乔布斯在斯坦福大学的演讲-翻译
  30. 你是否需要做学霸? - 0xFFFF
  31. 信息检索 武汉大学 - 中国大学MOOC(慕课)
  32. 英语学习也可以“做中学”_迂者-贺利坚的专栏-CSDN博客
  33. 【转载】聊聊【折腾】的重要性 - 知乎
  34. 提问的智慧 - 0xFFFF
  35. 计算机科学速成课 [40集全/精校] - Crash Course Computer Science
  36. TeachYourselfCS-CN/(github.com)

0 comments

No comments so far...