算法入门布满荆棘?这份小白学习心得你值得看看
前言
缓慢而乏味的学习过程,每个人都经历过。信誓旦旦要学好一门编程语言,于是在知乎上查了大神们推荐的学习路径,买了教程里推荐的教材,下好推荐的IDE,一切准备就绪,心想着刷级打怪之路就此开始,结果书还没看几页,困意先盖过了求知欲。即便是认真敲了几天代码,基本的语法都学了一遍,到实际应用的时候,却完全无法下手,让人不禁开始对自己的学习能力产生怀疑。
现实生活中,更是经常会有以下情形:老师布置的任务,完全是我没有接触过的领域,怎么办?如果直接开始实战,我所学过的知识怕是完全不够解决遇到的问题,效果怕是不太行,还是先把任务里用到知识都先学一遍,啃完入门秘籍,再开始做任务吧!结果任务还没开始,就已经像上面描述的那样跪倒在了漫长的自学之路上。
这些都是作为算法小白的我亲身经历过的问题。在日常的学习中,带着高中的思维,我们总想着在搭建完整个知识架构后再去解决我们遇到的问题,完成老师布置的任务,以确保自己能够有把握地搞定问题。但是在大学学习中,往往没有那么多时间给你搭建整个知识架构,每一个领域所涉及的知识太多了,你不可能在短短的时间里搞定整个知识体系,这就需要我们转换思路,采用任务式驱动的学习方式。恰巧最近我在做一个老师布置的任务,这里以我个人的学习过程为例,给大家谈谈关于任务式学习的心得。
什么是任务式学习?
先来聊聊传统的学习和任务式学习有什么区别。
身为经历了「五年中考,三年高考」在大学继续求学之路的学生党,我们的脑子里遵循着传统的教学大纲式学习模式,也就是如下的学习路径:
学习新知识 → 练习巩固 → 知识架构日趋完善 → 检验学习成果(考试/尝试解决问题)
大学的学习,也往往是这样,只是更多的需要我们在课后自学后解决一些不存在固定解的问题。相应的,我们思考的深度也会更深,但更多的还是会倾向于先搭建知识体系,再去解决问题。
搭建知识体系本身,没有任何问题,我们都需要笃实的基础来为后面的运用做准备。但,学习知识框架的过程,往往缓慢而乏味,尤其是对于编程这种需要大量实践的领域,我们缺少一些更直接的动力来驱动自身的学习。在这一点上,任务式学习给出了很好的解答。它以任务的完成和问题的解决为导向,能够有效地提高我们的学习效率和学习效果。任务式学习推进的逻辑如下:
尝试解决问题 → 遇到不懂的、无法解决的地方 → 学习相关概念与方法 → 知识架构日趋完善 → 检验学习成果(解决问题)
为什么说这样的逻辑,能够提高我们的学习效果呢?
首先,它给出了学习具体的目标。很明显,我们的学习目标是解决给定的具体的问题,而不是为了解决那些还未到来的不确定的问题。管理学中的SMART法则中提到了Specific(具体性),人们往往不愿为那些不确定的目标而迅速行动起来,而任务式学习给定了我们具体的目标,为了达到这个目标,我们会更有动力去进行学习。
再者,以任务为导向,我们更容易走出「自己已经学了很多」的舒适圈,进行更深层次的思考。平常的自学虽然也需要进行深入的思考和探究,但由于大脑自身对困难的厌恶,我们更容易选择去进行浅层次的学习,而不愿意问自己为什么是这样并费上一番精力去思考其背后的原因和机理。而在任务式学习中,我们在尝试解决问题的过程中遇到的难点都需要我们自己对其背后的原理有足够的了解,因而解决问题本身,为我们进一步思考提供了动力,在问题的推动下,我们更容易走出沉溺舒适的怪圈,建立起基于自我思考的深层次的知识网络。
学习过程中,我们可以怎么做?
在实际的任务式学习中,由于是从尝试解决问题开始,我们可能会遇到很多的不懂的地方,遇到这些不懂的地方,我们可以通过以下方式进行解决:
借助强大的搜索引擎和海量资料进行学习
相比于高中,互联网的使用为大学学习提供了更易获得的、更完备的资料,前有 CSDN、博客园等网站提供的学习教程,后有 GitHub 提供的大量开源源码,再结合知乎上的一些学习经验和心得分享,可以说尝试解决问题过程中遇到的任何不懂之处,我们都可以优先诉诸搜索引擎寻找解答。
在搜索的时候也有一些小窍门:在搜索的时候尽量不要把我们遇到的难点写成问题的形式直接搜索,这样得到的搜索结果会相对较少。我们可以对于问题提取几个重要的关键词,用空格符隔开进行搜索,相对得到的结果就会更多。
此外不要忘记了编程中最有效的工具:
帮助文档(API Documentation)
官方的帮助文档,可以解决你关于不认识的类、对象、方法的一切问题,只要搜索 「语言+api」 就可以找到对应的官方文档。很多的编译器内都附有自动查询鼠标悬停的代码的帮助文档的功能,以IDEA为例,在 Settings 内的 Editor 里就可以开启这个功能。
倘若在博客文章内还找寻不到答案,就可以借助相关的论文和教材针对性地搞清其背后的原理和逻辑,重点突破这些陌生的、不理解的障碍,这样也有助于加深我们的记忆。
同学、学长学姐是最好的求助对象
上面提到我们可以借助搜索引擎和海量资料进行学习,那么,倘若我们依旧无法通过个人能力解决遇到的难点,应该怎么办呢?
「向有经验的人求助。」
有经验的人是指有在相关领域内领域知识更丰富的人,可以是一起学习的同学,通过思维碰撞可能可以得到答案;更好的选择是你求助所在的团队里的学长学姐们,他们可能是代码的提供者,也可能是该领域内的高手。
不要怕去和学长学姐交流,身为过来人,他们理解你们的苦衷,更愿意细心解答作为小白的你的问题。此外,通过问问题,你既结识了厉害的学长学姐,也可以打听到一些学习生活上的经验,何乐而不为呢?
当然,如果代码不是由你所在团队提供的,你也可以寻找代码作者的联系方式。作为这一切的「始作俑者」,他们能够提供的帮助自然是巨大的。
此外,一定不要憋着问题选择自己逞强解决,这样既拖慢了团队整体的进度,也容易使自己陷入漫长的焦虑之中。尝试求助于他人,可以让你绕开很多的坑,更快地到达目的地。
解决问题之外的一些体会
在任务式学习的过程中,除了以上解决问题的几种有效途径,还有一些其他令我受益的思考:
遇到任务不要怕,犯错不可怕
我们在接到任务的时候,往往会对老师给的任务产生畏难情绪:「我能够在规定时间内完成这个任务吗?」「我的基础很差怎么办?」「老师会不会因此而质疑我的能力?」。
一旦陷入了以上的思维,就很容易产生拖延和焦虑,并迈入之前提到的传统学习思路,越学越畏难,举步维艰。
首先,我们要知道,老师布置的任务,往往是基于他对你能力的认知和预期确定的。因而,很少会存在无法克服的困难,如果确实有很大的挑战,你可以和老师交流来调整任务的配置。
其次,不要怕犯错。仍处在学习阶段还未迈入工作阶段的我们有着最低的试错成本,你不会因为做错一件事就被「逐出师门」,做的慢不可怕,可怕的是不敢做、不去做。
最近读到感触很深的一句话,「要允许自己写/做出垃圾,不然你连垃圾都写/做不出来」。既然我们尚且还在学习,犯错就不该是我们的耻辱柱,而应该是我们的勋章墙,无论如何都是在前进。重要的是,要好好做你手上的事。积累了足够多的确定,之后的不确定,才会一点点减少。
要敢于抓住机会,主动寻找机遇
在大一的时候,我是一个相当恐惧走出舒适圈的人,比如演讲答辩,比如和教授互动。一旦触碰到我的禁区,我就会选择沉默和退缩。但也是从那个时候开始,我开始尝试在圈边缘尝试迈出一小步,又一小步,一方面是出于压力,一方面是出于老师和自己的期许。
教授们有着最为丰富的资源,他们给我们提供任务,是在期许我们能够从中学习到更多得到成长,从而合作输出更多的成果。不要惧怕和教授的交流,他们不是你可望不可即、束之高阁的boss。倘若你在任务进行中遇到问题,可以和教授多交流,而不是畏畏缩缩,在担心影响他们对你印象的漩涡中自怨自艾。生活中的教授大多都是很可爱的人,他们会侃天侃地,也愿意和你分享一些有益的经验。
况且,能够得到教授的信任和支持,拿到接到任务的机会,本身就是对于你自身价值的一种肯定。勇敢地抓住机会,说不定就能为你赢得一个更好的未来。
结语
以上就是我个人关于任务式学习的一些思考,当然以上的这些经验心得并不仅仅限于学习编程,任何需要解决问题的学习过程,都可以采取以上的方法。也就是说,想要学习新的知识,不妨先为自己寻找一个具体的问题和任务,而后再以解决具体问题为导向,利用我们对未知的好奇心,驱动自身的主动学习。此外,接到老师的任务,不必害怕,更应将其视作一次实践任务式学习的契机,从中获得更多的成长。