Skip to content

拆解

32 / 44

在学习编程的过程中你会不由自主地学会一个重要技能

拆解

这么简单的两个字在人生中的作用重大到不可想像…… 而且它也的确是自学能力中最重要的底层能力之一

横向拆解

我很幸运,12 岁的时候有机会学习编程习得了最基本的概念那时候学的编程语言是 BASIC),所以相对其他人在拆解任务方面有更强的初始意识

后来,15 岁开始学着玩吉他的时候发现道理其实是一样的

有个曲子很难当然也非常好听),曲名是 Recrerdes Da La Alhambra 阿罕布拉宫的回忆你看看曲谱就知道它多难了

那怎么办怎么办?!—— 我的办法听起来看起来都很笨

  • 每次只弹一个小节
    • 而且还是放慢速度弹刚开始很慢很慢
    • 等熟悉了之后逐渐快起来直到正常速度
  • 再开始弹下一个小节
    • 同样是放慢速度弹刚开始很慢很慢
    • 等熟悉了之后逐渐快起来直到正常速度
  • 再把两个小节拼起来
    • 有些小节拼起来相对容易另外一些需要挣扎很久才顺畅

如此这般最终就把这个很难的曲子弹出来了 —— 其实所有的初学者都是这么干的

可以听听这个曲子放松一下当然肯定不是我弹的哈哈):

python
from IPython.display import IFrame

IFrame('https://www.youtube.com/embed/OOsRMECWKAE?', width='800', height='450')
plaintext
    <iframe
        width="800"
        height="450"
        src="https://www.youtube.com/embed/OOsRMECWKAE?"
        frameborder="0"
        allowfullscreen
    ></iframe>

提起这事总是会不由自主地叹口气 —— 因为在这事上我运气太差刚把这个曲子练完没多久还没来得及找人显摆就摔断了掌骨和指骨给我的手指灵活性造成了不可修复的损伤于是后来只能用拨片玩玩吉他了……

话说回来自学的一个重要技巧就是

把那些很难的任务无限拆分 —— 直至每个子任务都很小小到都可操作为止

比如正则表达式这个你必须学会的东西学会学好真的不那么容易一切的技能都一样没学会之前都是很难很难的可学会之后用熟了你就会发现那东西其实也没多难……

那刚开始的时候怎么办你其实需要运用拆分的本领

  • 先囫囵吞枣至少读一遍教程
  • 给自己搭好测试的环境或许在 Regex101.com 或许用一个编辑器比如 VS Code);
  • 先不管什么意思找一些 Regex 自己试试
  • 正式进入精度状态每一小节每一小节地突破
  • 搞定一小节之后就把它与之前的小节再反复翻两三遍
  • 把学习任务拆分成若干块再重新逐个突破比如匹配替换在编辑器中使用 Python 代码中使用
  • 把各种操作符与特殊字符拆分成若干个组而后熟悉到牢记而不用将来反复回来查询); ……

事实上当你习惯这么做了之后就会发现一切的自学任务其实都不是”,不过是繁杂程度不一而已

很多人最终自学失败要么是不懂拆分任务要么就仅仅是怕麻烦而已 —— 还是那句话人活着就挺麻烦的……

纵向拆解

拆解的第一种方法是把某个任务拆分成若干个小任务正如上面的讲解那样我称它为横向拆解”。

另外一种方法我称它为纵向拆解”(有时我也会用分层拆解这个说法)。

这种方式在自学复杂的概念体系时特别管用

编程这种东西之所以刚开始觉得难学是因为其中涉及的概念除了之前我们强调的过早引用之外还有个特征

有的概念虽然并不同属一个层面却常常纠缠在一起没有明确的提示……

比如常量变量字符串函数文件等等的概念其实并不是某个特定的编程语言的专有概念它们是所有编程语言都会涉及到的概念因为计算机处理的就是这些东西而无论哪个编程语言最终都要通过计算机去处理这些东西

又比如说分支与循环每个编程语言都有对应的语句所以分支循环在逻辑判断流程管理这个层面而分支循环的实现应该划分到另外一个层面中去而每个语言实现分支循环语句的语法多少有点差异 —— 这些细节属于那个编程语言本身

python
# Python 这么写:

for i in range(n):
    ...
javascript
// JavaScript 这么写:

var i;
for (i = 0; i < n; i++) {
  ...;
}

自学正则表达式的时候也如此最基本的规则是属于 Regex 自己的而后各种语言的实现各不相同那是各个编程语言层面的在各种编辑器中除了基础的规则之外也有它们自己的定制…… 看起来细节很多但分层分类之后就会变得很容易理解很容易记住

遇到面向对象编程也是如此实例对象继承多态…… 这些其实并不属于某一个编程语言但它们也确实在几乎所有编程语言中被实现被应用 —— 所谓的难无非是因为属于两个层面甚至多个层面的概念被拧在一起教……

再比如说在我把这个用编程当作习得自学能力的第一个实战项目之时甚至要把分成两个层面先照顾”,至于”,要等到有了基本的的能力之后再说即便是到了”,还要划分至少两个层面首先是从简单的函数开始而非上来就要写个大程序”…… 这种拆分层面的技能好像可以用在方方面面呢

所以要在自学的过程中不停地想办法把它们从层面上区分开来 —— 不能总是把它们混在一块儿大锅烩”。

日常生活中我们会遇到被评价为理解能力强的人而另外那些不被如此评价的人就很不理解很迷惑

我到底差在哪儿了你不说我理解能力强难道我的理解能力很差吗

当老师当久了经常被这种现象震惊

原来很简单的东西竟然可能成为很多人一生的障碍

—— 并且这话重复多少遍都不过分

大多数人不太在意自己脑中的概念之间的关系因为平日里这也不怎么耽误事但一旦遇到复杂一点的知识体系就完全搞不定了…… 而所谓知识体系的复杂无非就是新的概念多一些概念之间的关联更复杂一些…… 而概念之间的关联更复杂一些无非是各个概念之间不仅只有一种联系最后会形成网状连接……

—— 通往财富自由之路那本书里我几乎用了整本书的篇幅去讲解厘清概念及其之间关系的重要性

复杂吗其实并不复杂 —— 在横向纵向分别逐步分清之后

可问题在于脑子里概念关联一团糟的人自己并不觉得甚至无法知道 —— 他们是那种跟你一块去看一场电影却能看到另外一部电影的人说他们理解能力差过分吗他们不能理解被评价为理解能力差难道不是很自然吗

分清概念的方法是什么其实也不难就是不断拆解不断主动整理每次用图表整理那些概念的时候就会发现比原来更清晰一些多次整理最终就谙熟于心了

想要再举更恰当更惊人的例子很难勉为其难再举个例子

当我在 2011 年遇到比特币的时候现在回头看在当时的情况下我平日里习惯对概念及其关联进行各种纵向横向的拆解这件事给我创造了巨大的好运后来我在INBlockchain 的开源区块链投资原则里提过这事

比特币这个概念可以有多重的理解 —— 这也是为什么人们感到迷惑或者相互之间很难达成一致理解的根本原因

首先比特币是世界上第一个也是迄今为止最成功的区块链应用

其次比特币是一家世界银行只不过它不属于任何权威管辖它是由一个去中心化网络构成的

另外这家叫做比特币的去中心化的世界银行发行了一个货币恰好也叫比特币”。有些人更喜欢使用相对小心的说法把这个货币指称为 BTC,而不是比特币”(Bitcoin)。

最后即便在比特币横空出世的七年后(2017),也很少有人意识到比特币或者 BTC)其实也可以被理解为这家叫做比特币的去中心化的世界银行的股票

—— 这无非就是把一个概念拆分成若干个层面再对每个层面准确理解而已

但毫无疑问这点靠很简单很简单的方法练就的理解能力帮了我大忙

触类旁通

无论听起来多么简单的任务落实成代码肯定没那么简单没那么容易

以后你会越来越清楚的写程序的主要工作量往往并非来自于在编辑器里敲代码那个阶段

更多的工作量其实在于如何才能在脑子里把整个流程拆解清楚考虑到各个方面……

所以编程更多是拿着纸笔梳理细节的工作一旦所有的细节都想明白了落实成代码其实是飞快的 —— 越是工程量大的项目越是如此

这个道理在哪里都是相同相通的不说编程说写书也是一样的

随着时间的推移你花在拆解上的时间会越来越多因为所有大的工程都可以被拆解成小工程 —— 于是也为了做出大工程拆解的工作首先是必须其次是最耗时费力但最值得的

我身边很多人包括出版社的专业编辑都慨叹过我的写书速度”。我猜实际上把他们惊到甚至惊倒的并不是他们以为的李笑来写书的速度”,而是李笑来打字的速度而已

当我告诉他们我要写一本什么书了的时候实际上有个工作早就完成了:“系统梳理要写的那本书的所有细节”,剩下的只是落笔把那些东西写出来而已 —— 当然我是敲出来用我那几乎无以伦比的输入速度敲出来 —— 那当然显得很快了

创业也好投资也罢还是一样的因为我这个人脸皮厚不怕人们笑话所以我可以平静地说这事

我参与或投资很多失败的创业项目……

对所有复盘的结果无一例外根源都是当初立项的时候很多重要细节还没搞清楚甚至没想到要去搞清楚就已经开始行动…… 于是在成本不断积累的情况下没完没了地处理各种意外”,没完没了地重新制定目标没完没了地拖延没完没了地重新启动”…… 直至开始苟延残喘最后不了了之

拆解得不够就容易导致想不清楚想错想歪……

也许有人可能会理直气壮地反问,“怎么可能从一开始就把所有情况都想清楚么!” 是呀以前我也是这么想的…… 直到吃了很多亏很多很多亏很多很多很大很大的亏发现且不得不痛下决心去接受事先想不清楚的就不要去做

这是一种特殊且重要又极有价值的能力现实生活中后来我也见过若干有这种能力的高人比如你可以到网上搜一个人名庄辰超他就是我见过的能做到干什么事之前都能全都想清楚的真人活人之一

自学的时候拆解任务的重要性更是如此

这本的一个特点就是把自学”(或者平日里称为学习”)这个流程拆解为”、“”、“”、后面还会讲到总计四个环节来处理 —— 从内容编排本身就这么干甚至在开头相当一部分就明确说明,“根本不指望你读过一遍就会了”,还反复提醒,“要重复读很多遍虽然第一遍必须囫囵吞枣”……

对于初学者常面临的尴尬我们也从一开始就提醒编程语言和你之前在学校里学的语文本质上没什么区别先学会读而后在多读多读再多读的同时开始练习写 —— 这才真的很自然

即便是开始讲如何写我们的做法也是从写函数开始而不是让我们写个程序……” —— 这一点点看起来不起眼的差异作用是很大的因为从小而完整的东西开始做任何事非常重要

“小” 无所谓,“完整” 才是关键