人们常会看到有人提倡学习自己掌握的技能,或使用自己所用的流程。例如,史蒂夫·耶格有一系列博客文章,推荐阅读编译器书籍并学习编译器知识。他的理由大致是:如果你理解编译器,你就会到处看到编译器问题,并识别出那些人们正在用编译器知识解决编译器问题、却未意识到的情况。与其拼凑出一个永远行不通的半吊子解决方案,不如运用一点计算机科学知识,以更少的精力、更好的方式解决问题。这并非不实,但这也不是专门学习编译器的理由,因为你可以用同样的话来描述计算机科学和数学的许多领域,比如排队论、计算机体系结构、数学优化、运筹学等等。
针对这种反对意见的一种回应是,一个人应该学习一切。虽然做一个极其广泛的通才可能行得通,但“略知一二”并保持高效已经变得越来越难,因为随着时间的推移,知识在广度和深度上都不断增长。即使情况并非如此,我认为用“应该”这个词也过于强烈;一个人是否喜欢拥有这种广度,纯属个人品味问题。另一种同样可行、也更合我口味的方法是,正如吉安·卡洛·罗塔所说,学习几招技巧:
很久以前,一位年长且知名的数论学家对保罗·埃尔德什的工作发表了一些贬低性的评论。你和我一样钦佩数学的贡献,当那位年长的数学家直截了当地断言埃尔德什的所有工作都可以归结为他在证明中反复依赖的几招技巧时,我感到恼火。这位数论学家没有意识到的是,其他数学家,即使是最顶尖的,也依赖他们反复使用的几招技巧。以希尔伯特为例。希尔伯特论文集的第二卷收录了他在不变量理论方面的论文。我特意仔细阅读了其中一些论文。令人遗憾的是,希尔伯特一些优美的成果已被完全遗忘。但在阅读希尔伯特在不变量理论中那些引人注目且深刻的定理的证明时,令人惊讶地发现,希尔伯特的证明依赖于同样的几招技巧。即使是希尔伯特,也只有几招技巧!
如果你观察人们在各个领域如何取得成功,你会发现这是一种常见的方法。例如,对世界级柔道选手的分析发现,大多数人依赖少数几种投技,并得出结论1:
柔道是一项专精的运动。你必须使用最适合自己的技能。你必须坚持有效的方法,并练习这些技能,直到它们成为自动反应。
如果你看一部“关于”战斗的动漫或电视剧,角色们常常通过增加掌握的招式数量来变强,因为这样更容易在画面中表现。但在现实生活中,精进你已经掌握的技巧,往往比拥有一大堆“招式”更有效。
我曾得到过一个建议:放大你的优势。我们每个人都有长处和短处,而我们花了大量时间谈论“改进空间”。人们很容易觉得,进步的最佳方式就是消除所有短板。然而,如果某个领域确实是我们的弱项,投入大量精力和努力可能也收效甚微。显然,你仍然需要确保自己没有真正糟糕的领域,但假设你已经做到了这一点,那么不妨专注于放大你的优势。如何把你擅长的事情变成你的超能力?
我个人在多个领域都发现这是真的。虽然很难用客观的方式衡量程序员的效率,但对于我做过的一些事情,比如竞技类电子游戏(那是很久以前的事了,当时竞技游戏还没有“真金白银”的奖金),让我从一个相当不错的玩家变成顶尖玩家的关键,就是放弃练习我不太擅长的东西,专注于提升我在少数几个异常擅长的领域上相对于其他人的优势。
这在游戏和体育中之所以有效,是因为你可以通过更好地调整自己的位置,来发挥自己的长处,同时避开暴露弱点的情境。我认为这在工作中其实比在体育或游戏中更有效,因为与竞争性活动不同,工作中没有对手会刻意暴露你的弱点,并把你逼到你的优势毫无用处的境地。如果我选择研究排队论而不是编译器,一个竞争对手同事不会阻止我去做那些排队论知识有用的项目,也不会让我面对一堆需要编译器知识的项目。
值得一提的是,技能并不一定非得是人们眼中那些学科领域或具体技术。过去三年里,我主要应用和提升的一项技能,或许可以称之为“审视数据”;之所以加引号,是因为我找不到一个贴切的术语。我不认为这是大多数人理解的“统计学”——我很少需要做逻辑回归这类复杂分析,更不用说真正高深的方法了。或许有人会说这是数据科学家的工作,但对比我实际做的事、我们招聘的数据科学家的工作内容,以及面试中筛选的标准,我们似乎并不想招具备这项技能的数据科学家,他们做的也并非我所从事的工作(这个话题足够展开,或许以后我会单独写一篇)。
与Matt Might或Steve Yegge不同,我不会建议你采用某种特定方法,但我想说,专注于少数领域、不追求全面均衡,这在我涉足的多个不同领域都行之有效,而且对很多人似乎也同样适用。
如果你想采取这种思路,那么问题依然存在:该学哪些技能?这是我常被问到的问题之一,而我的答案恐怕并非人们真正想要的,也不够令人满意,因为它既显而易见又难以付诸实践。
对我而言,决定投入时间学习什么有两个要素:一是对某件事有相对的天赋(相对于我可能做的其他事,而非相对于他人),二是有良好的学习环境。说一个人应该寻找这些条件,这种说法太过模糊,几乎毫无用处,但它仍然比常见的建议要好——那些建议往往归结为“学我所学”,比如“职业进阶秘诀:如果你想在真实环境中精通设计复杂、有状态的分布式系统,那就学函数式编程。这几乎是完全相同的技能组合。”或者某些语言社区更极端的说法,比如Chuck Moore声称Forth的生产力至少是无聊语言的100倍。
我在职业生涯早期采纳了各种网络上的通用建议,包括语言方面的建议(当时这类建议大多还比较稚嫩,而且很难观察到:尽管很多人采纳了这类建议,但采纳者并未因此变得特别高效,而真正高效的人也不太可能采纳这类建议)。我学习了 Haskell、Lisp、Forth 以及其他语言。职业生涯中有一段时间,我和另一个人组成两人团队,实现了一个十年后可能仍是现存性能最高的 Forth 处理器(这是一个 2GHz 的 IPC 导向处理器),我还为它编写了程序(选择堆栈处理器有充分理由,因此 Forth 似乎和其他选择一样合理)。和 Yossi Kreinin 一样,我可以说自己在精通 Forth 上投入的努力比大多数人都多,但和他一样,我不仅没有发现它是 100 倍效率的工具,甚至不确定它通常能否达到 1 倍的效率。公平地说,其他一些工具确实超过了 1 倍效率,但总体而言,我认为遵循网络建议的回报率极低,而真正高回报的东西恰恰是人们不会推荐的。
回想起来,当人们说“Forth 非常高效”时,我怀疑他们真正的意思是“Forth 让我非常高效,但我没有考虑过这对不同能力或不同背景的人是否同样适用”。我认为 Forth(或 Lisp、Haskell 或其他任何工具或技术)确实可能对某些特定人群非常有效,但人们往往高估了对自己有效的东西对他人也有效的程度,这使得建议通常毫无用处,因为它无法区分针对特定能力或情境的建议与可推广的建议,这与那些真正讨论特定技术利弊的领域形成鲜明对比2。
虽然教练可以在 1 对 1 或小组中给出量身定制的建议,但在互联网上很难做到这一点,因此我在这里能给出的最好建议就是空洞的“选择适合你的技能”。举个例子,对我而言很契合的两项技能是“保持对抗性思维”和“审视数据”。一个或许不那么无用的建议是:如果你难以确定这些技能是什么,可以询问非常了解你的人——比如我的经理和 Ben Kuhn 都曾独立指出,我的一项常用技能是提出跨越多个抽象层级的解决方案(而我自己直到他们指出才意识到这一点)。
另一种找到这些事物的方法是,寻找那些你无法控制自己不去做、而大多数人似乎不会去做的事情——对我来说,“审视数据”和“保持对抗性思维”都是如此。举个对抗性思维的例子:在我曾任职的一家公司测试新版定制化缺陷追踪系统时,我提交了最早的一批bug,并在字段中填入异常内容来测试系统是否会崩溃。有些人完全无法理解为何要这么做,感到困惑、反感甚至震惊;但少数人(包括我明知不会介意的系统开发者)真正理解并乐于看到系统被推向极限。对我来说,试探系统的极限以发现其薄弱环节根本不像工作——如果我不想做这件事,反而需要刻意阻止自己。正因如此,花十年时间精进测试与验证技术,对我而言就像一件“难以不做”且“不算工作”的事。而深入审视数据这件事,我已经投入了超过十年时间,它同样让我觉得:如果不去提升这方面的能力,情感上几乎会感到不对劲。
这些事物之所以适合我,本质上源于我的性格,而非人类与生俱来的特质。其他人会有截然不同、让他们感到轻松/契合的事物——这其实是好事,因为如果所有人都沉迷于审视数据而无人热衷构建事物,那将带来严重问题(尽管在我看来,平均而言,审视数据的能力被低估了)。
在我尝试学习的另一个关键要素是:寻找能促进学习的环境,且这种环境需与我的技能相契合、对我有意义。虽然建议他人也这样做听起来像是一句显而易见、毫无用处的废话,但根据我观察人们选择团队和公司的方式,我认为几乎没有人真正践行这一点——正因如此,讨论这个话题或许并非完全无用。
一个典型的反面例子,恰好是我最近和一位经理聊天时发现的——他们的团队失去了新转正的实习员工。我之所以追问,是因为这位经理向来很擅长留住人才,团队离职率极低,这种情况实属罕见。原来,那位实习生原本想从事基础设施相关工作,却因为不知道可以主动申请加入符合自己偏好的团队,最终加入了这位经理的产品团队。经理得知后,为了让实习生开心,便协助其转到了基础设施团队。这个案例可谓双重打击:新人既没有考虑在适合学习目标技能的环境中工作,又加入了一家基础设施组织混乱、设计和运维普遍糟糕的公司——这意味着即使他最终没能进入基础设施团队,这家公司本身也不是学习基础设施知识的理想场所。虽然这个例子极端糟糕,但据我观察,多数情况下人们做出的决策并不会带来特别好的学习效果,尽管优质的学习机会恰恰是人们最常提及的诉求之一。
例如,Steve Yegge 曾指出:
应届生最常问的问题是:“你们提供什么样的培训和/或导师指导?”……一位华盛顿大学的面试者刚向我详细描述了福特汽车公司的导师计划——福特显然将其作为面试宣传的一部分。[此处省略细节,因与主题无关。——stevey 2006/3/1] 这位学生对细节的记忆惊人。这并不让我意外,因为这正是候选人最关心的事项之一。
就我个人而言,我的第一份工作(Centaur)非常幸运,那里是培养测试与验证对抗性思维的绝佳场所。对比该验证团队的成果,其他公司类似项目往往需要规模大得多的团队才能实现相近或更差的效果,这充分说明该团队效率极高,因此成为绝佳的学习环境。
而且,我觉得单靠自己摸索,或者试图遵循书本或网络上的建议,我不可能学得这么快。我认为真正精通某件事的人,脑子里关于如何做到的信息太多了,多到这些信息很难压缩成一本书,更不用说一篇博客文章了。在体育运动中,优秀的教练能够随着时间的推移传递这类信息,但据我所知,编程领域没有类似的方式。所以,我认为提高学习速度的最佳途径,就是找到一个充满专家的环境3。
至于“分析数据”,虽然我在那些人们并不真正重视数据的环境里磨练这项技能,也取得了不少进步,但过去几年里,我处在一个能与非常擅长理解数据局限性、同时又能用深厚领域知识指导数据分析的人交流想法的环境中,进步速度要快得多。可以说,在目前这份工作的每一年里,我在这个方面的提升,都超过了之前十年的总和。
或许值得注意的一点是,环境——你日常如何度过——本质上是局部的。我现在的雇主可能是我工作过的三家大型科技公司中最不重视数据驱动的,但我所处的环境却是提升数据分析能力的好地方,因为我相对较多的时间是和像Rebecca Isaacs这样精通数据的人一起工作,而相对较少的时间是和那些不认真对待数据的人打交道。
这篇文章讨论了一些策略,并着眼于它们为何有价值,但我必须承认,我向专家学习的动机并非为了创造价值。更多的是,我觉得学习很有趣,而且有些领域,无论环境如何,我都有足够的动力去应用技能。向专家学习是一个如此难得的乐趣,以至于很难抗拒。坚持这样做几十年,结果证明是很有用的,但这在很长一段时间里是我无法预知的(而且直到我从硬件转向软件,我才知道这能有效地迁移到一个新行业)。
我看到很多职业建议都围绕着职业、成功或成长展开。这类建议通常告诉人们要有一个长期目标或策略,并常常提出类似“随机行走只会让你在某个方向移动√n步,而有方向的行走则会让你移动n步”的论点。我不认为这有错,但我认为,对许多人来说,这种建议隐含地低估了找到适合自己领域的难度4,而我基本上是通过试错法做到的。
附录:本文未详细讨论的部分问题
一个未讨论的主要话题是如何平衡要提升的“技能层次”,这可能是高层次的,比如“分析数据”,也可能是较低层次的,比如“贝叶斯多层模型”,甚至是更低层次的,比如“打字速度”。这个话题足够大,值得单独写一篇比本文更长的文章,但目前,这里有一条Gary Bernhardt的评论,我认为也适用于这个话题。
另一个未讨论的主要话题是选择相对可能适用的技能。仅仅建议人们考虑学习自己有天赋的技能而不考虑适用性,有点过于天真。
虽然很容易挑出那些很难对世界产生影响、赚到可观收入或实现任何目标的技能,比如“篮球”或“拳击”,但在看似合理的技能之间做选择则更难,比如计算机体系结构与编程语言。
但我认为,半合理的技能如果适合某人,其回报很可能很高,因此在半合理的技能中进行试错是可以的,尽管能够快速尝试可能会有所帮助。
附录:相关文章
- Ben Kuhn 关于真正学习某样东西是什么感觉(从某种意义上说)
- Holden Karnofsky 关于以天赋为先的职业方法,而非以职业路径为先,这类似于思考“分析数据”或“拥有对抗性思维”等跨领域技能,而不仅仅是“编译器”或“排队论”等技能
- Peter Drucker 关于如何理解自己的优势和劣势,并从事与自己倾向相符的工作
- Alexy Guzey 关于建议的有效性
- Edward Kmett 关于如何思考学习的另一种视角
- Patrick Collison 关于如何最大化有用学习并找到自己会喜欢的东西
感谢 Ben Kuhn、Alexey Guzey、Marek Majkowski、Nick Bergson-Shilcock、@bekindtopeople2、Aaron Levin、Milosz Danczak、Anja Boskovic、John Doty、Justin Blank、Mark Hansen、“wl”和 Jamie Brandon 的评论、更正和讨论。
- 这是一份旧的分析。如果你今天再做一次,你会看到不同的投技组合,但专家们取得巨大成功的情况仍然存在,例如里内尔的内腿 [返回]
- 公平地说,那些笼统的、脱离上下文的建议,就学习某个特定主题而言,函数式编程确实让我豁然开朗。我可以想象,如果那种思维方式对我来说并非天生(因为我来自硬件背景),那么“你应该学习函数式编程,因为它会改变你思考问题的方式”这条建议可能对我有用。但另一方面,这也意味着这条建议同样可以是“你应该学习硬件工程”。[返回]
- 我没有足够大的样本量,也没有调查足够多的人,无法高度确信这能作为通用法则,但就寻找世界级专家群体而言,对我有效的方法是找到优秀的管理者。我工作过的两个世界级专家密度最高的团队,都是在非常出色的管理之下。我对优秀管理的标准比大多数人更高,而且通过与许多人讨论这一点,我交谈过的人中几乎没有人曾为或甚至认识一位我认为堪称优秀的管理者(通常,与我交谈的人也同意这一点,这表明并非他们拥有一个在我所不关心的维度上优秀的管理者,反之亦然);根据这些讨论,我猜测我认为优秀的管理者至少是99.9%分位数的。如何找到这样的管理者是一个很长的讨论,我可能会另写一篇文章。
无论如何,尽管我在这方面的样本相当小,但我认为其机制是合理的,因为我所了解的优秀管理者拥有非常高的留任率,以及大量希望为他们工作的人,这使得他们相对容易雇佣和留住拥有世界级专长的人才,因为其他环境如此糟糕。
一种更典型的策略——我认为通常行不通,而且我尝试时效果也不太好——是去解决听起来最有趣和/或最困难的问题。虽然我在尝试解决有趣/困难的问题时确实与一些非常优秀的人共事过,包括我合作过的最好的工程师之一,但我认为在与我真正想向其学习的人共事方面,这远不如寻找优秀管理者的方法有效。我相信这个算法的一般问题,与去游戏行业工作因为游戏很酷和/或有趣的问题是一样的。太多人想从事听起来令人兴奋的问题,这会导致功能失调的环境,并且这种环境可能持续存在。
有一次,我所在的团队在九个月内人员流动率达到100%,要不是有个人花了很长时间才找到团队转岗,这个时间可能缩短到六个月。而在我同期入职的同事中,平均每年的人员流动率约为50%,而且我认为大家离职的理由都相当充分。这种高流动率不仅表明工作环境往往令人相当不快,而且这类环境往往会导致那些我愿意共事或向其学习的人率先离开。例如,在我曾待过的一个团队里,技术主管不相信版本控制、自动化测试或流水线设计,而我与李益焕(Ikhwan Lee)共事过,他非常出色。当然,益焕很快就离开了,而那位技术主管却留了下来,六年后的今天依然在那里。
[返回] 4. 我在熟人圈中多次观察到一种现象:人们会在完全不了解某个方向是否适合自己之前就做出选择。往往过了相当长的时间(有时甚至超过十年),他们才会意识到自己其实对所选方向深感不满——有时是因为这与他们的性情不合,有时则是因为他们实际上并不擅长。无论如何,与其在一条让自己不开心的路上走得很远,不如随机探索,最终在一条让自己满意的路上走得不那么远,这似乎也不算太糟。[返回]