[关闭]
@jtong 2016-10-07T02:45:19.000000Z 字数 2110 阅读 449

所谓学习能力

教育


整个特训营,我们锻炼了一个能力:分析性思考。我们大量练习了分解和执行,这是分析性思考的基础。

然而,有另外一个非常重要的能力,我们在整个特训营里都没有专门的练习过,那就是概念性思考。我们要求大家快速学习,然而结果并不是特别好。大家得其形,并未得其神。导致特训营结束之后,我们让一部分同学进行实习的时候,依然做不到真正的快速。

本文就讲述一下概念性思考的关键和一些可能的训练方法。

概念性思考有两部分,一部分是造概念,这个是高级部分,对缺乏经验的人不做要求。另一部分是用概念,这个是很重要的,在概念疯狂增长的今天,如果不会用概念,工作不可能胜任的。

所谓用概念,不是使用具体的某个概念,这个能力一般人经过一段时间都会具备。指的是从第一次接触概念,只需非常短的时间就可以使用这个概念完成一般性工作,稍微熟练之后,就可以进行扩展和改进。

在简单的情况下,大家都能做到,当信息复杂的时候,能做到的人就不多了。

下面讲一下我的经验

引入概念

在我们接触一个东西的时候,我们要保持空杯的心态,不能拿着自己已有的知识在那里瞎套公式,最后套不上还浪费了很长时间。我们要先构造一个空白的思维世界。如果做不到就拿一张白纸,这张白纸代表了我的思维世界。

然后开始泛读,找到所有的资料,如果是文档,只看章节、目录、重点标出来的话、结论等。如果是源代码,则只看文件名,方法名。如果是软件,则要看各种导航菜单,关键的按钮叫什么等

在这个过程中,最重要的事情只有一件:提取所有重复出现的名词,找到核心概念。找到了,就写在纸上。

有时候这个重复是跨维度的,比如代码中可能不常见,但是在界面上你看到了一个很重要的功能的词,代码中也看到了这个词,那么这也算是一种重复。

有时候会有一些概念,你不知道要不要写下来,那也写下来,到最后,你自然会发现有些出现的多,有些出现的少。

梳理关系

核心概念已经找到了,接下来就是梳理关系,梳理关系我有几种梳理法

  1. 画关联关系
  2. 分析数据流
  3. 事件驱动的过程链

这三种方法的梳理过程中,我们会发现新的概念,可能是核心概念,可能不是核心概念。不管是不是核心概念,都可以加到我们的白纸上,然后继续分析。

画关联关系

往往是实体之间的关系,如果业务复杂,实体关系就很复杂,这时你会发现关系太多,必须选择一部分来关注。

在分析这个的过程中,要寻找关联点,如果你是数据库,则是通过外键,那外键就是你的关联点。关联点会保证你找的关系是真的,而不是臆想的。有时候关联关系是靠代码维持的,这个我们可以放在“事件驱动的过程链”里去分析,这里不关注他。

这里有个小技巧,需要需要找到一个层次,在那里,所有的信息都在一个层次上,且都展示在眼前。比如所有数据库表,或存放所有migration脚本的文件夹,或ER图,比如类图,或存放实体类的文件夹等等。

这个技巧叫做划分抽象层次,很多抽象能力差的人就是抽象层次找不对。实体类,表这些东西合起来表达了实体关系,然而实体类和表是在两个抽象层次上的表达同一个概念关系——实体关系,会有微小的不同,而这个不同弄晕了绝大多数人。

分析数据流

往往是从一个功能点出发,数据是如何流动的,把它画出来。往往流经的都是具体实现,而你画过几个具体实现后,总结出来的则应该是数据如何在抽象的概念之间流动。

当我们在分析数据流的时候,是最容易在抽象概念和具体实现中间来个三级跳。第一级,抽象概念,比如Controller;第二级在具体上下文下的具体概念,但还是概念,比如XXController;第三级真正的代码。每个点都可能是这三级,不能随便切换,不然在思考和交流的时候很容易晕掉。

即便是第三级,真正的代码,我的手法一般是从页面出发,查看源代码,从源代码中找到,搜索关键点。什么是关键点呢:
1. 响应事件的DOM元素
2. 事件处理函数
3. 请求的URL
4. 后台处理URL的函数
5. 用以渲染数据的template
6. 前台把数据放到哪里去了

找到这些关键点之后,整个数据的流向就基本清楚了。整个过程跟侦探小说中的破案过程是一样的,不停的大胆假设,再小心求证。

当然找的过程中需要一些基础知识的帮忙,比如我在一个基于Express和jQuery的论坛上作修改,我可能就需要懂Express和jQuery才能完成上述工作。比如用jQuery的DOM元素可能没有直接把事件处理函数写在DOM元素上,而是写在了某个js文件里,我看到DOM元素的id,就猜测,大概是通过id绑定的,然后下一步再搜索#id可能就能找到了。如果我不知道jQuery怎么找id,也就没法搜索。

事件驱动的过程链

当我们分析一个复杂系统的时候,各个事件之间会连成一个完整的系统。甚至表面上看像是一个过程的可能是由多个事件驱动的多个过程链接而成的。

这里比较复杂,我将来再找一个例子写在这。

刻意练习

这些方法如果你要靠有意识的去按照步骤一步步做,那说明你对这些方法还没有掌握,一切应该是下意识的。

所以我大概设想了几种训练

  1. 听/读需求画ER图,(听和读要分开练)
  2. 看界面画ER图和列URL及页面,从一个技术栈开始,切换到多个技术栈
  3. 拿到需求划任务,让有经验的人验收
  4. 用不同框架完成同样的工作,提取框架之间的相同点

以后想到再扩充。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注