从问题开始,而不是从语言开始#

我不是程序员。没上过计算机课。栈和堆的区别我说不清。但两年前,我需要一个网站——一个简单的作品集网站来展示我的摄影作品——我不想花两千美元请人做。

于是我自己做了。前后花了大概十八个小时,分散在两周里。它不漂亮。代码让专业人士看了大概会皱眉。但它能用。加载很快。能展示我的照片。人们可以通过它联系我。它做到了我需要它做的事。

我没有学编程。我学的是解决一个碰巧需要代码的具体问题。这个区别——先问题还是先技能——彻底改变了你跨过门槛的速度。

两种学法:系统式 vs. 需求驱动#

大多数正规学习是系统式的。从头开始,走完中间,到达结尾。第一章在第二章前面。基础在应用前面。理论在实践前面。

系统式学习有它的优势。全面、扎实、不漏概念。如果你要成为专业人士——外科医生、结构工程师、商业飞行员——系统式学习必不可少。生命依赖全面的知识。

但你不是在培训成为专业人士。你在尝试用二十小时跨过能力门槛。对于这个目标,系统式学习往往是最慢的路线。

替代方案是需求驱动学习(demand-driven learning)。不问"我应该先学什么?",而问"我需要完成什么?“然后从答案倒推。只学完成目标需要的东西,其余的全部等着。

需求驱动学习不是捷径。它是不同的方向。 系统式学习走遍整张地图。需求驱动学习从你所在的位置到你需要到达的位置画一条直线。

在学任何东西之前,先定义问题#

需求驱动的方法从一个不可省略的步骤开始:定义你的问题。清晰地。具体地。写下来。

不是"我想学摄影”。那是一个领域,不是问题。

不是"我想拍更好的照片"。那是一个模糊的愿望,不是问题。

试试:“我想用手机和公寓窗户的自然光,为我的网店拍出光线好、曝光准确的产品照片。”

这才是问题。它有边界。它指定了工具(手机相机)、对象(产品)、光线条件(自然光,公寓窗户)和质量标准(光线好、曝光准确)。这些边界精确地告诉你该学什么——以及,更关键的是——该忽略什么。

问题一旦定义,你就能立刻排除摄影知识的整条分支:你不需要学影棚闪光灯、风景构图、人像摆姿、夜景摄影、胶片冲洗或镜头选择。那些都很有趣,但没一个跟你的问题相关。至少现在不相关。

问题定义模板#

对任何你要学的技能,填写这个模板:

  1. 我需要什么具体结果?(要具体。“一个能用的网站"比"学网页开发"好。)
  2. 我有什么工具或约束?(预算、设备、时间、已有知识。)
  3. “完成"是什么样的?(我怎么知道问题解决了?)
  4. 哪些东西明确不在范围内?(我刻意不去做的是什么?)

第四个问题最重要。范围是二十小时学习者的头号敌人。你往学习清单上加的每一个主题,都会稀释你的专注力、延长你的时间线、增加你在跨过门槛之前就停滞的概率。

定义你"不做什么"的边界。你的速度来源于此。

Tomás 和电子表格的故事#

Tomás 经营一家小型园林绿化公司。他用纸质笔记本记客户、发票和日程。能用,但很慢。他经常忘记谁还欠钱,周六上午的活儿也会排重。他想要一个更好的系统。

一个朋友建议他学电子表格。Tomás 在网上找了一个 Excel 课程。47 节课,涵盖数据透视表、VLOOKUP、条件格式、宏、图表、数据验证和快捷键。课程总时长 12 小时。

Tomás 没有 12 小时空闲。他有生意要做。而且他不需要数据透视表。他需要三样东西:

  1. 一份客户名单,包含姓名、地址和电话号码。
  2. 一个发票追踪表,显示谁付了钱谁没付。
  3. 一个周历,显示哪些活排在哪天。

所以他没上课,直接打开一个空白电子表格,在 A1 单元格里打了第一个客户的名字。B1 打地址,C1 打电话号码。加了表头,加了更多客户。二十分钟后,他有了一份客户名单。

发票追踪表需要知道一件事:怎么加一列自动求和。他搜了"怎么在 Excel 里对一列求和”,看了一个 90 秒的视频,搞定了。

日程表需要知道怎么给单元格上色。他搜了"怎么在 Excel 里给单元格上色”,30 秒找到答案,搞定了。

总学习时间:大约两小时,分散在三天里。Tomás 从没学过数据透视表,从没学过 VLOOKUP,从没学过宏。他学的恰好是他的问题需要的,多一点都没学。

六个月后,他的电子表格系统还在运行。他加了几列,搞明白了怎么按日期排序,学会了冻结表头行让它滚动时始终可见。每一次添加都来自一个具体需求——“我想看哪些发票过期了”——而不来自课程大纲。

Tomás 没有学 Excel。他学了刚好够解决问题的那点 Excel。 问题驱动了学习。问题解决了,学习就停了。结果是一个每天服务他生意的实用系统。

最小知识路径#

问题定义好之后,下一步是识别最小知识路径(minimum knowledge path)——从你现在的位置到问题被解决之间的最短学习线。

这不是一份全面的课程大纲,是一个精准的序列。

第一步:列出子问题#

把主问题拆成小块。以网站为例:

  • 注册一个域名
  • 选一个建站平台
  • 创建一个基本页面布局
  • 把照片放上去
  • 加一个联系表单
  • 在手机上看起来过得去
  • 发布让别人看得到

第二步:对每个子问题,识别所需的最少知识#

不是你能学的所有东西,只是最少的。对于"创建基本页面布局":

  • 怎么加标题
  • 怎么加板块
  • 怎么让元素并排排列
  • 怎么加背景色

就这些。不是 CSS Grid 理论,不是响应式设计原则,不是无障碍标准。那些重要——但不是在你第一个项目的第三个小时。

第三步:即时学习#

不要提前学完所有子问题。到哪个就学哪个。准备放照片了,搜"怎么在[你的平台]上添加图片"。准备加联系表单了,搜"简单联系表单[你的平台]"。

即时学习(just-in-time learning)是需求驱动学习者的主要模式。你不囤积知识以备将来使用,你在需要的那一刻获取知识。这种方式高效,因为它消除了学和用之间的时间差。学了就用,用了就记住了。

最小知识路径图#

画出来。真的画。在纸上或文档里:

问题:[你的具体问题]
    │
    ├── 子问题 1:[描述]
    │   └── 学:[具体要搜/读的东西]
    │
    ├── 子问题 2:[描述]
    │   └── 学:[具体要搜/读的东西]
    │
    ├── 子问题 3:[描述]
    │   └── 学:[具体要搜/读的东西]
    │
    └── 子问题 N:[描述]
        └── 学:[具体要搜/读的东西]

这张图就是你的学习计划。它不按主题组织——按需求组织。你按顺序推进,每一步都让你可衡量地更接近问题被解决。

学习范围控制:不多学的纪律#

需求驱动学习中最难的部分不是学习本身,是抵抗学更多的诱惑。

你在做项目的时候会撞见有趣的东西。一个你不知道存在的功能。一个看起来很强大的技巧。一个承诺更深理解的兔子洞。诱惑很强:“这个可能有用。让我探索一下。”

别。现在别。

在起步阶段,每一条岔路都是完成的威胁。每一次绕道都在延长你的时间线。每一次"看一眼"都会变成三十分钟的浏览,而你一步都没靠近目标。

这不是反智。这是策略。探索的时间以后会有——跨过门槛之后、项目完成之后、有了可用成果之后。从有能力的位置出发去探索是高效的。从零的位置出发去探索是分心。

在起步阶段,知道得越多,分心越多。 精确知道自己需要什么、忽略其他一切的学习者,几天内就能完成项目。追着每条有趣线索走的学习者,几个月后还在"学习",手里什么都没有。

范围控制三条规则#

  1. 相关性测试: 学任何东西之前,问:“这对解决我定义的问题有直接帮助吗?“没有的话,收藏它,继续走。
  2. 计时器规则: 如果你发现自己研究某样东西超过 15 分钟还没应用它,停下。你已经偏离了需求驱动路径。
  3. “以后"清单: 维护一份你想探索的有趣东西清单——项目完成之后再看。这份清单给你的好奇心一个去处,同时不会让进度脱轨。

项目是学习的容器#

需求驱动方法之所以这么管用,有一个原因:它把学习包在了一个项目里。

项目有开始和结束。有明确的产出。有截止日期——真实的或自设的——推着你前进。它在终点给你一个实在的东西:不只是知识,而是成果。

成果比你想的重要。没有应用的知识很脆弱。学了、觉得不错、然后忘了,因为从来没用过。项目强制应用。你获取的每一块知识都立刻投入实践。用过的知识才留得住。

项目还提供动力。“我在学编程"是抽象的、无尽的。“我在做一个作品集网站"是具体的、有限的。你能看到进度,能衡量它,能拿给别人看。

怎么选项目#

如果你用的是需求驱动方法,你大概已经有项目了——就是那个启动整个过程的问题。但如果你要把这个方法用在一个没有明显问题附着的技能上,这样来创建一个:

  1. 做小。 能在 10-20 小时工作量内完成的东西。
  2. 做具体。 “做一个鸟屋"比"学木工"好。
  3. 做对你有意义的。 如果成果对你重要,你更容易熬过挫折。
  4. 做可展示的。 能给别人看的东西——一个网站、一顿饭、一首歌、一张照片、一件家具。

项目是你的容器。你学的一切都装进去。项目做完了,你就跨过了门槛——不是因为你精通了这项技能,而是因为你用这项技能做出了一个真实的东西。

需求驱动学习循环#

完整的循环如下:

  1. 定义问题。 要具体。设边界。写下来。
  2. 拆成子问题。 小的、有顺序的、具体的。
  3. 对每个子问题,学最少的。 搜、读、看——刚够尝试这一步就行。
  4. 尝试这一步。 别等到完全理解。带着不完美的理解开始。
  5. 卡住时,搜具体的错误或缺口。 不是"CSS 怎么用?“而是"为什么我的图片没居中?”
  6. 进入下一个子问题。 重复。
  7. 所有子问题解决了,项目就完成了。 你跨过了门槛。

这个循环快,因为每一分钟的学都连着一分钟的做。理论和应用之间没有缝隙。没有为假设的未来用途囤积知识。只有:问题、学、做、下一个问题。

你不需要理解整门语言才能说出你想说的话。 从那句话开始。学它需要的语法。说出来。继续下一句。

我不是程序员。但我需要一个网站。那就够开始了。那就够完成了。而这——一个具体问题、一个定义好的范围、一条最短路径——对你来说也够了。

今晚就定义你的问题。写下来。列出子问题。明天开始做第一个。你需要的技能,就藏在你已有的问题里。