Skip to content

2.7 逻辑工具:概念图

在实际使用逻辑学技巧的过程中,我们可以借助一些思维工具。

概念图是指用图表的方法梳理概念之间的关系,不仅可以加深对概念的理解,还能避免因为概念混乱带来的诡辩。尤其是偷换概念是诡辩中最容易出现的一种,

学计算机的人大多有被人要求修电脑的经历。"你一个学计算机的修个电脑都不会"这种"大妈式"的暴力辩论逻辑实际上是一种典型的偷换概念,计算机维修和学计算机完全是不同的概念。

所以通过梳理概念之间的关系,可以清晰得到一个概念,可以通过使用概念图来描述概念的层次关系,上面使用的图即是概念图。

美国著名教育学家诺瓦克遇到了同样的问题,他需要一种清晰地方式给学生解释一些课程中需要用到的概念。同时,也需要了解学生在理解概念上的变化。他们的研究小组从拓扑分类学和语义学方面得到灵感,创造出"概念图"这一思维工具来表达概念。诺瓦克在他的著作《学习、创造与使用知识——概念图促进企业和学校的学习变革》一书中详细阐明了概念图相关的内容。

例如一个常见的逻辑问题是:联合国是否是一个国家?

因为"联合国"这个词的结尾有一个国字,而且中国是联合国成员国,所以有人想当然的认为联合国也是 "国"。这种谬误不仅发生在对世界不理解的少年儿童身上,甚至会出现在成年人的对话中。联合国是一个由国家构成的组织,而中国才是一个国家,为了避免谬误,合适的表述是"中国是联合国成员国"。

下面这张图为使用联合国是概念出发绘制的概念图,用来描述概念和概念之间的关系。

解释联合国的概念图

当然,你会发现"成员"的概念下面只有中国和美国,这是因为全球 200 多个国家和地区也画不下。到目前为止,概念图也没有标准,那么也就不存在概念图的"对错"。

"概念"的概念图

使用概念图的目的是为了将复杂的概念清晰的表述出来,因此甚至可以使用概念图表达"概念"这个概念本身。

在前面我们已经讨论过"概念"本身的内容了,如果通过概念图来表达就更清晰了。概念图的发明者罗瓦克对概念的定义非常朴素:从事件或对象中感知到的规律或模式,可以打上一个标签,这个标签就是概念。

那么为了描述这个标签就可以用概念的"内涵"、"外延"来描述,这个概念就可以在日常对话中阐述被描述对象的特征。当一个人无法清晰的描述概念时,可以通过概念图可视化表达出来。

关于概念本身的概念图

常见的概念图

为了说明概念图的意义,下面给出了几个编程中常用的概念图,来梳理日常并不是那么容易理解的概念。

有一天我回到办公室,有两个同事在讨论编程语言相关的内容。

同事 A:"我是做 Python 的,我现在想转 Java。"

同事 B:"编程思想都是一样的,什么语言都一样。"

同事 A 陷入迷惑中。同事 A 想从 Python 转到 Java ,可能是市场对 Java 的接受程度更高,但有时候会有人说"编程语言都一样"。看起来同事 B 说的很有道理,但他们说的是同一回事吗?

实际上同事 A 是想表达对编程职业生涯的担忧,"Java" 在他的意识里是指的相关整套技术体系,同事 B 想说的只是用来完成编码的计算机语言。我们用概念图看下"编程"这个概念,再来看他们讨论的是不是同一个东西:

关于编程的概念图

我们真的只是缺乏编程思想吗?

我们要完成编程这个活动,需要了解编程语言、框架、库以及阅读相关的文档、书籍和开源代码。切换技术栈的成本是巨大的,不只是切换编程思想这么简单。

往往我们在谈论 Java 时,谈的不仅仅是一个编程语言的 Java ,我们还在谈 JDK、JVM、Spring 等内容。甚至我们在谈论 Spring 的时候我们在谈论 Spring IOC、Spring Mvc 以及 Spring Boot。

谈论数据库的时候也会谈论 DBMS、SQL、JDBC、Driver、ORM 等概念,甚至包含了数据库连接的客户端工具例如 DBeaver,有时候也会谈数据库的具体实现:MySQL、Oracle 或者其他 NoSQL 数据库。

甚至谈论数据库这个概念本身往往都包含了多个含义:数据库管理系统(DBMS)、一个数据库实例(DB)。

我在刚刚学习 Java 技术栈做 Web 服务器开发时对很多概念非常困惑,Java 的生态非常完善,带来的概念也非常多包括:JPA、Servlet 容器、Tomcat 等,它们的关系对于初学者来说相当的微妙。在使用 PHP 开发网站时,往往只需要查阅 PHP 的文档和一个框架的文档,而 Java 生态圈充斥着大量陌生概念。

我整理了一份侧重于 Java、Servlet、Spring 家族一系列概念的概念图,这里主要关注几个比较难以分清的概念,真实的 Java 服务器开发领域所涉及的概念还是非常多的。

关于 Java 服务器编程概念图

作为语言的 Java 衍生出来的概念是相关的运行环境、库和框架。Java 字节码运行在由 JRE 运行环境提供的 JVM 虚拟机之上,Tomcat 是一个 Java 应用程序,并提供了 Servlet 容器负责处理 HTTP 的请求和响应,而我们做的应用程序(WAR)只是一个寄生兽,挂靠在 Servlet 容器上负责处理业务逻辑。

库最具有代表性的是 Spring。Spring 这个词最初只代表一个 IOC 库,后来不断发展,Spring 实际上衍生成 Spring IOC、Spring Mvc、Spring Data 等库的一个集合。最终由 Spring Boot 整合成一个完整的框架。

而对数据库的操作又是一堆概念。Java 程序使用 JDBC 的驱动(数据库具体的 Driver)连接数据库,人们又希望使用 ORM 技术让对象和数据库记录同步,这一实现主要有 Hibernate、TopLink,Java 社区做了规范称为 JPA。Spring data JPA 又对 JPA 做了封装,使之在 Spring 环境下更易用。

通过梳理这些概念可以给学习 Java 编程的新人推荐一个合适的学习路线:计算机基础 → 计算机网络 → Java 基础 → Servlet → Spring IOC → Spring MVC → Spring Boot。没有前置概念的铺垫,直接学习 Spring Boot 是相当痛苦的。

最近很火的 Vue 是一个框架还是一个库,亦或者是一个开发体系?

随着前端开发工程化的发展,现代前端开发体系爆炸性的增长,每天都在出现新的概念,那么学习前端到底该学些什么呢。下面我整理了一个前端常见概念点的概念图:

关于前端开发的概念图

前端开发在 Node.js 出现之前还是非常简单和容易理解的,在浏览器中运行的页面无非是 HTML、CSS、JavaScript。Node.js 把 Chromium 的 JavaScript 引擎单独拿出来运行 JavaScript 脚本,并提供了很多操作系统的 API,形成独立的运行平台。JavaScript 的应用场景从浏览器中脱离出来,变得无比开阔。

Node.js 提供了文件相关的 API,JavaScript 便能够具备文件生成、JavaScript 的压缩、Less 到 CSS 的转换等前端工程构建的相关能力。于是 JavaScript 可以反过来对 JavaScript 代码进行文本处理,构建 JavaScript 项目(无论前端还是后端)。从最开始利用 Grunt 对 JavaScript 代码进行简单的压缩、混淆、模板替换等,到后面的 Gulp 更灵活的构建工程,以及现在的 Webpack 对前端资源彻底的整合。

Node.js 平台上也可以运行包管理程序来对各种依赖管理,这就是 npm 和 yarn,这就是 Node.js、npm、JavaScript 的概念之间的关系。

同理,对于前端各种库来说,它们的关系通过概念图也能表达的更为清晰。React 和 Vue 都只是发布在 npm 中的一个库,前端项目需要这些库作为原料,并通过构建工具来做成蛋糕,并放到浏览器中呈现给用户。

以上就是前端开发生态发展的基本逻辑。

构建概念图的过程

你可以很容易的构建出自己的概念图。 一个典型的概念图主要有节点、连接线两种元素构成,分别对应了概念、概念的联系,两个相连的概念之间可以构成逻辑命题,命题应该能通过节点和连接线读出。

绘制概念的方法非常简单,你只需要在纸上或者绘图软件上罗列出相关概念然后使用连接点标记出概念的关系即可。诺瓦克给出了一个非常详细的构建概念图的流程,这非常适用于教育专家来处理日常遇到的大量复杂的信息和概念,但对于我们来说稍显冗长。我做了一点简化和改进,归纳如下:

  • 确定概念图需要解决的焦点问题。 例如我需要解决"鱼香肉丝里面有没有鱼"的问题,或介绍 "鱼香肉丝" ,围绕着鱼、动物、鱼香、调料、烹饪、口味、肉丝、鱼香肉丝、川菜等概念来构建概念图,然后得到命题 "鱼香是一种口味","鱼香的调料起源是用来烹鱼",从图中我们得不到 "鱼香有鱼" 这样的命题。在解决这个问题的过程中,鱼生活在池塘中,池塘、水草等概念就没有意义了。 确定概念图需要解决的焦点问题。 例如我需要解决"鱼香肉丝里面有没有鱼"的问题,或介绍 "鱼香肉丝" ,围绕着鱼、动物、鱼香、调料、烹饪、口味、肉丝、鱼香肉丝、川菜等概念来构建概念图,然后得到命题 "鱼香是一种口味","鱼香的调料起源是用来烹鱼",从图中我们得不到 "鱼香有鱼" 这样的命题。在解决这个问题的过程中,鱼生活在池塘中,池塘、水草等概念就没有意义了。

  • 罗列关键概念。 围绕着焦点为题来寻找概念,但是概念不宜多,在罗列概念时,尝试对概念进行定义,使用更准确的词替换模糊的词。例如讨论编程时大家喜欢用"语言"这个词,尽量使用"编程语言"这类准确的词。 罗列关键概念。 围绕着焦点为题来寻找概念,但是概念不宜多,在罗列概念时,尝试对概念进行定义,使用更准确的词替换模糊的词。例如讨论编程时大家喜欢用"语言"这个词,尽量使用"编程语言"这类准确的词。

  • 寻找概念的冲突和二义性,分化概念。 《公孙龙子》在三脚鸡的辩论中,"鸡有脚,数数时,鸡有两只脚,加起来有三只脚"。这里的鸡的概念有集合和个体两个内涵。可以分为"鸡"和"一只鸡"两个概念。 寻找概念的冲突和二义性,分化概念。 《公孙龙子》在三脚鸡的辩论中,"鸡有脚,数数时,鸡有两只脚,加起来有三只脚"。这里的鸡的概念有集合和个体两个内涵。可以分为"鸡"和"一只鸡"两个概念。

  • 构建联系,得到命题。 将分化后的概念,通过连接线连接起来,连接过程中给出一个合理的连接词,概念+连接词+概念成为一个完整的命题。例如"鱼香是一种口味"。 构建联系,得到命题。 将分化后的概念,通过连接线连接起来,连接过程中给出一个合理的连接词,概念+连接词+概念成为一个完整的命题。例如"鱼香是一种口味"。

关于鱼香肉丝的辨析

上面是从操作流程上归纳创建概念图的方法,另外在构建的逻辑上,概念的关系一般有下面两条线索:

  • 概念的抽象程度。 这种思考方式画出来的图往往是一个树状,从上到下是概念抽象层次的逐渐收敛的过程。例如计算机科学→计算机硬件 → CPU → Inter CPU → I5。概念从抽象逐渐到具体,这是一种理想的概念图构建方法,读者能从上到下找到清晰地逻辑关系和明确的命题。 概念的抽象程度。 这种思考方式画出来的图往往是一个树状,从上到下是概念抽象层次的逐渐收敛的过程。例如计算机科学→计算机硬件 → CPU → Inter CPU → I5。概念从抽象逐渐到具体,这是一种理想的概念图构建方法,读者能从上到下找到清晰地逻辑关系和明确的命题。

  • 概念的联系紧密程度。 画出来的图往往是一个网状,从上到下是概念联系逐渐从紧密到疏远的过程。Java → 编程语言 → 编译型语言,可能两个概念没有直接关联了。这是现实中很正常的情况,一术语往往具有多个概念,概念之间又不断延伸和交叉。 概念的联系紧密程度。 画出来的图往往是一个网状,从上到下是概念联系逐渐从紧密到疏远的过程。Java → 编程语言 → 编译型语言,可能两个概念没有直接关联了。这是现实中很正常的情况,一术语往往具有多个概念,概念之间又不断延伸和交叉。

概念图和思维导图的最大区别就在这两条线索上。概念图是用来表达概念的关系,节点之间应该具有逻辑关系,可以说是收敛的;思维导图是用来促进创造性思维的,条目之间具有引导的关系,可以说是发散的。

使用概念图的常见问题

做出取舍,解决该解决的问题,解决不了的问题收敛主题,并再画一张图。例如我想要辨析的主要内容是:Java、JVM、Spring 等几个概念的逻辑关系,我开始想绘制一个非常大的主题"服务器编程",这样的话我就必须把 PHP、Go 等其他语言纳入了,但这些内容和我想要辨析的主题关系并不大。于是我最终选择收敛主题到 "Java服务器编程",把焦点聚焦到 Java 和 Spring 上。

如果需要表达 Java、PHP 概念之间的关系,我需要发散主题 "服务器编程" 然后进行绘制,但是不会加入 Spring 相关的内容,概念图的深度也可能不会到达 Spring Mvc、Zend PHP 这样层次的深度。

概念图不必追求大而全。

把概念图绘制成流程图是最容易犯的错误。概念图是表达概念的抽象层次关系,用概念图表达多个时间关系不同但抽象层次相同的概念没有意义,你应该使用一个流程图来表达。

在电商领域中,购物车、订单、支付记录,下单流程中的几个关键概念。这几个概念在抽象上是类似的。上图的左边部分是一个不好的示例,虽然表达了概念之间的生成关系,但是这些概念的内涵和外延无法在图中表达。

诺瓦克在《概念图》一书中给出评价概念图的方法之一是利用拓扑分类学,主题应该体现出 "渐进分化"的特点。

概念图节点是概念,概念是认知世界的元素,按照诺瓦克定义来说,就是给印象中的事物打一个标签。概念应该有名词(包括抽象名词)、动名词、形容词,而概念之间的关系可以为动词、介词、副词。

好的概念图还需要对读者友好,阅读者能组合概念和概念的联系变成一条有意义的命题,例如 "马分为白马"。虽然不一定具有语法上的完整性,但是逻辑关系非常重要。

Released under the MIT License.