跳到主要内容

如何练习

本文是高效练习的理论介绍,针对特定的主题可以浏览:

《刻意练习:如何从新手到大师》这本书提到了如何利用刻意练习来提高学习的效率,这个技巧对于面试准备很有帮助,本节也会引用该书的一些观点来阐述如何进行有效的练习。

高效练习的重要性

20世纪20~30年代,芬兰运动员帕沃·鲁米(Paavo Nurmi)在1500米~20千米的跑步项目上创造了22项世界纪录。在几年时间里,他只要选择训练哪种距离的跑步项目,便会在那个项目上所向披靡,无人能敌;其他所有的运动员只能为竞争第二名而努力。但到最后,其他运动员意识到,鲁米的优势源于他研发了新的训练方法,例如用秒表测定他的步子、运用间歇训练法来提高速度,以及遵循为期一年的训练体制,以便自己总是能够坚持训练。当这些方法得到其他运动员的广泛采用时,整个领域的整体成绩都得到了提高。

人类努力钻研的所有领域的门槛都在急剧变高。拿音乐领域来说,1826年,当弗朗茨·李斯特创作了《十二首超级技巧练习曲》,那时人们认为这些曲子几乎是无法演奏的;而今天,每位顶级钢琴家都会弹奏。在体育领域也是如此。1900年奥运会男子100米的最快速度是11秒,在那时是个奇迹;而在今天,这个速度的选手连进入全国高中总决赛的资格都没有。1924年奥运会跳水项目禁止空翻两周这一动作,因为太过危险;而如今,它已成为必做动作。1896年奥运会马拉松的最快速度只比今天波士顿马拉松的门槛速度快几分钟,如今上千名业余马拉松爱好者都能达到。

学术界的入门标准同样急剧上升。13世纪的英国学者罗杰·培根(Roger Bacon)认为掌握数学至少需要三四十年;而如今,每个大学生都会学习微积分课程。各个领域都是如此。 但重点是,各个领域内之所以会出现这些进步,不是因为人们的天赋越来越高,达尔文进化论发挥效用的时间跨度远长于此。因此,进步的出现是因为人们肯花更长的时间去练习,下了更大的苦功(人们也越来越专业),而且头脑更加聪明了。是大量高质量的练习,而不是基因,促使进步出现的。

几年前,算法面试极少会出现 Hard 难度的题目,但是现在在 OA 和面试中大概 15% 的题目都是 Hard 难度。随着时间的推移,大家懂得如何更有效地训练后,整个行业的面试门槛都提高了。Moishe Lettvin - What I Learned Doing 250 Interviews at Google 提到,有一次 HR 选了数位求职者的面试反馈交由谷歌的招聘委员会商议是否批准 Offer,得到的答复是全部拒绝,但是 HR 选择的面试反馈正是这些招聘委员会成员当初面试谷歌的反馈!

练习的心态

“学习既应持久(需要坚持)又宜灵活(需要将知识应用于更广阔的领域),追求快速和简单正是问题症结所在。”

也许你听过一些“三个月刷题进谷歌”的故事,但是我们要告诉你,这些故事虽然真实发生,但是却并不符合现实。原因有三:

  1. 幸存者偏差:谷歌每年面试数万位工程师,总会有一些幸运者在面试中遇到自己做过的题目或者简单的题目,但是这样的运气并不是我们能够掌握与控制的。
  2. 过分报道:一个这样的故事可能会被重复或夸张地进行报道,也会被一些培训班或者写手用作赚钱的工具。
  3. 只见树木,不见森林:该面试者虽然只是花了三个月做题,但是可能 Ta 之前有数理化竞赛的背景,高中或者大学做了无数数学竞赛题,这种情况下,Ta 只需要利用刷题来学习数据结构以及基础算法就能快速掌握了。

一个合适的面试准备时间应该在半年左右,每天固定两三个小时专注学习,但是这不代表你每天花六个小时就能在三个月准备好,因为理解和吸收是需要时间的。而且每天花太多的时间在上面,很难做到完全专注,效果反而不好。

避免天真的练习

天真的练习指的是盲目,没有针对性,没有反馈的练习。以篮球为例,如果你想提高投篮的命中率,可能觉得每天花大量时间练习投篮就够了。但是如果你仅仅在机械地重复投篮,没有根据投篮中出现的错误而进行调整,那么即使练习更多也对提高命中率没有帮助。相反,过多练习反而会强化你原有的坏习惯,错误的站位以及错误发力方式。算法也一样,想通过大量地做题来掌握某个题型的练习方法是低效的,如果只关注花在上面的时间或者题目数量,缺乏思考与观察自己的问题,很难能够得到提升。

避免单一指标

同样是篮球的例子,为了提高命中率,你可能会设定每天投进 100 球罚球的计划,你或许也听过一些 NBA 球星设定类似的目标。但是对于初学者来说,这并不是一个好的计划,

  1. 仅仅注意球是否投中而忽略投球所需要的其他因素,例如是否脚是否正确发力,手是否举在正确的位置。
  2. 你可能不会注重每次投球的质量,而是转为增加投球的数量,只为了更快完成计划。
  3. 如果花了很多时间还没有完成计划的话,会影响你的心态,因为你的计划就是进固定数量的球。

一个更好的方式是使用更多指标来观察你计划的成效,例如命中率,连续命中数量。虽然看起来只是增加了两个指标,但是对于初学者的练习却有极大的影响:

  1. 因为你现在需要关注多个指标,所以每投一球都需要观察错误的地方并做出调整,这样才能达成计划。
  2. 你不会有赶快投进 100 球就能完成任务的迫切感,而这样所形成的良好心态能够给你持续练习的动力。

在算法练习中,你可能会只关注完成的题目数量这个单一指标,但是实际上,你需要关注其他指标从而设定更好的计划,如何练习 - 算法有更详细的介绍。

使用模型思维

什么是基本的普世智慧?首要法则就是,如果你只是记住一些孤立的事实,试图把它们硬生生地拼凑起来,那你就是什么也不知道。如果这些事实不能在一个理论框架中彼此联系起来,你就没法把它们派上用场。 你的脑海中要有一些模型,还要将自己的经验分门别类地纳入这个模型框架,无论那些经验是间接获得的,还是直接获得的。- 《思维模型》

对于算法来说,使用数据结构以及常见的最佳实践帮助解题,对于系统设计来说,则是使用系统设计的设计模式帮助分解问题。

学会观察

表现好的求职者与表现差的求职者最主要的区别是,他们能否观察到自己的问题,针对性地进行改正,并且持续下去。有的时候,你可能根本不知道自己的问题在哪里,这时候,进行模拟面试,或者找一位有经验的导师能够帮助你找到问题。要知道,最好的选手以及运动员都需要教练,并不是教练能够做得比 Ta 要好,而是教练能够观察到问题并且给出反馈与建议。为了说明教练与普通选手观察能力的区别,这里有一个小试验,下面两张图片是投篮的姿势,阅读下文之前,尝试观察并且列出要学习这个投篮姿势需要注意哪些要点:(图片来源《篮球投篮技术指导》)

shoot

这里列出所有的要点:

站姿:

  • 双脚与肩同宽
  • 投篮侧的脚对准另一只脚的脚弓
  • 投篮侧的脚尖对准篮筐
  • 膝盖与臀部弯曲

手臂:

  • 投篮手掌心向上,手掌不与球接触
  • 球举到头部的位置与投篮臂呈字母“L”的形状
  • 手肘不要突出,尽量为直线
  • 辅助手轻放在球上,不要发力

如果你没有接受过专业的篮球训练的话,那么你可能只观察到其中几个要点,有些非常细的点可能被你忽略了。但是只有当每一个要点都做好之后,才算是一个正确的投篮姿势。当然,有的时候,你不需要满足所有要点也能保证高命中率,就像一些 NBA 球星一样,但是你需要保证满足大部分的要点。在面试过程中,有经验的面试官能够观察到许多要点,并且针对这些要点对你进行评测。所以在整个面试准备的过程中,你需要了解这些要点,并且通过自我观察以及模拟面试针对自己的问题进行调整。

分解问题

了解到自己的问题之后,你可以列出这些问题以及对应的练习方法:

问题导致的问题练习方法
双脚没有与肩同宽投篮不稳定投篮前检查双脚的位置
投篮侧的脚尖没有对准篮筐投球偏出投篮前检查脚尖指向
投篮时手掌与球接触投篮不稳定投篮前检查手掌与球的空隙

你可以看到,通过将投篮命中率低划分成几个小的问题,针对每个小问题进行独立训练会更有效果。从算法的角度,如果你观察到自己没有掌握二叉树的题目,那么可能的问题是:

问题练习方法
没掌握递归的基础概念学习递归的基础概念,专门练习递归题目
不熟悉二叉树类以及节点类学习二叉树的数据结构类型
不熟悉二叉树的常见遍历方式使用递归以及非递归练习二叉树遍历

针对这些问题选择该方向的题目进行练习,会更有效果。

追求刻意练习

本文最后引述了刻意练习的一些特点:

  1. 刻意练习发生在人们的舒适区之外,而且要求学生持续不断地尝试那些刚好超出他当前能力范围的事物。因此,它需要人们付出近乎最大限度的努力。一般来讲,这并不令人心情愉快。
  2. 刻意练习包含得到良好定义的特定目标,通常还包括目标表现的某些方面;它并非指向某些模糊的总体改进。一旦设定了总体目标,导师或教练将制订一个计划,以便实现一系列微小的改变,最后将这些改变累积起来,构成之前期望的更大的变化。改进目标表现的某些方面,使得从业者能够看到他的表现已经通过练习得到了提高。
  3. 刻意练习是有意而为的,也就是说,它需要人们完全的关注和有意识的行动。简单地遵照导师或教练的指示去做,还不够。学生必须紧跟他的练习的特定目标,以便能做出适当的调整,控制练习。
  4. 刻意练习包含反馈,以及为应对那些反馈而进行调整的努力。在练习过程的早期,大量的反馈来自导师或教练,他们将监测学生的进步、指出存在的问题,并且提供解决这些问题的方法。随着时间的推移,学生必须学会自己监测自己、自己发现错误,并做出相应调整。这种自我监测,需要高效的心理表征。