对于非软件开发者,编程是什么样子?多大程度上能理解?

2021-01-28 14:31:23 +08:00
 sillydaddy

我比较好奇,对于非软件开发者,编程是什么样子?他们在多大程度上能理解开发者的工作? 也许开发者对编程太熟悉,已经忘了庐山在身外者眼中的面目。

我说下自己的想法,猜想一下编程为什么难以被普通人理解,以及怎样解决,解决了又有什么好处。

计算机世界的特性

计算机虽然有看得见摸得着的实体,但它的原理仍然是非常抽象的(毕竟它几乎无所不能啊)。

  1. 硬件方面:内存,寄存器,总线,时钟,中断,处理器等等。
  2. 软件方面:汇编指令,数据结构,操作系统,线程,进程,编程语言等等等等。

虽然人人能处理像“父母,亲戚,朋友,水果,箱子,变化,值”等数不清的抽象概念,但计算机软硬件的概念,明显不是普通人会遇到的。

计算机的底层是指令级的精确。程序就是一条条精确的指令的集合。计算机执行指令的过程,就如同一个鼠目寸光的人,取过一条指令,根据指令的内容,作出非常非常精确的动作,绝不增减。

这个指令,在不同的层级,可以有不同的抽象,

  1. 在非常底层的层面来说,就是操作内存、寄存器、驱动器等等,
  2. 对于编程语言来说,似乎稍微好一些,变成了操作某个数据结构。
  3. 而对于应用层面,一个函数调用指令,可能会完成复杂的计算,发送一大串数据,绘制出完整的图形。

但不管是哪一个层级,指令仍然是精确的。上层的指令看起来比底层更复杂强大,只因它封装包含了更多的底层指令。

举例来说,应用层的一个对一组数排序的指令,包含的是编程语言层的操作数组元素、比较数大小、循环等很多指令的组合,对应的计算机底层则是更多的内存读写,寄存器读写等指令。

这种对精确性的苛刻要求,对于普通人来说,无疑是一个迥异的思维模式(开发者就见多不怪了)。

对普通人的困难

对于抽象性来说,

一般来说,越上层的抽象越容易理解。像是 UI 组件、应用层 API 这些上层的抽象概念,尽管也是计算机世界的抽象,但对于普通人来说,毕竟不像天书了。但仅仅理解这些,对于理解计算机的工作原理,甚至对于理解开发人员的日常工作,也是不够的。因为大多数的开发工作,至少要熟悉编程语言层面的抽象概念,比如循环、判断、数组、字典、变量、取值、赋值、函数、类,甚至协程、线程、进程、消息、同步、异步等等。对于普通人来说,这些抽象概念就比较复杂了。

对于精确性来说,

假设普通人已经理解了编程方面的抽象概念,也能够通过上述的概念来操纵编程语言了。他还是要面临接下来的困难:怎样把一件由现实抽象而来的任务,从上层的抽象,逐级精确的分解为他掌握的编程语言指令。

仍以给一组数排序作为例子,在明白了 for 循环,if/else 判断,明白了数组,明白了怎样读写数组里面元素,明白这些抽象概念后,怎样完成排序这一任务呢?

因为对于普通人来说,排序是毋庸置疑的简单,显而易见的容易。但恰恰是这个“显而易见”,让他感到分解任务到编程语言的指令时,出现了困难。由模糊的“显而易见”到“精确指令”是他难以跨过的一道门槛。

其实不止是普通人,即使是开发人员,在写代码时,仍然会为边界条件而犯愁。明明知道程序的基本逻辑是对的,但如果各种边界条件处理不对,精确无比从而“挑剔”无比的程序就会“罢工”。

解决办法

那么怎样解决“抽象性”和“精确性”这 2 个难题呢?

仍然以一组数的排序为例,假设使用冒泡方法来排序,则会用到数组、获取数组长度、数组元素读取、数组元素修改、变量、数的比较操作、循环结构这 7 个抽象概念。

为了解决抽象性,需要把这几个概念具象化和可视化。现在想象在一个计算机模拟的具象化三维世界中,学习编程的人,作为用户,要在这个具象化的世界中,完成排序的任务。他可以具象化地操作这个世界里面的具象物体。

为了解决精确性,需要在这个具象化的世界里,尽可能隐藏所有具象物体暴露出的信息,减少不必要的可见信息对用户的干扰,迫使他使用指令去获取。比如对于具象化为一排箱子的数组,数组里面数的内容应该是隐藏的,数组的长度信息也应该是隐藏的。用户只有使用指令才能获取。这样迫使用户在解决问题时,必须使用编程思维,而不是利用视觉思维。

其他指令的具象化,也需要注意,比如获取数组的长度,怎样具象化这个指令呢?获取的长度信息又要放在哪里呢?应该是放在一个变量里,因为获取长度信息,不是让用户去看的,而是为了给后续的指令来使用的。

还有不少抽象概念需要具象化,目前我还没有想清楚。

理解程序开发和程序开发者

当用户在这样一个把所有编程世界的抽象概念都具象化了的环境中时,他不需要去考虑那些编程的概念,所有的概念都具象化为类似现实世界的事物。而当他在这样一个虚拟的“现实世界”中找到了问题的解法,那么简单变换,就直接得到了对应的程序。

更重要的,他已经是在使用编程的思维了。

最重要的是,他理解开发人员的工作了。世界上又多了一份理解,多么美好。

4346 次点击
所在节点    奇思妙想
25 条回复
0o0O0o0O0o
2021-01-29 13:43:24 +08:00
「 难以被普通人理解」

我觉得你可以稍微定义一下「 普通人」和「 理解」

零基础借助搜索引擎装好 vscode 配好 python 环境写个循环成功跑起来,算理解吗?

比如有些没接触过编程的人,突然对编程感兴趣,可能只是想用编程平时搞搞自动化处理点文档,你上来就按照科班从业的标准来喂东西,大概率会让人厌倦和沮丧吧。

例如,作为普通人,我觉得连你举的例子都是下意识地「按照科班从业的标准来」而不是「 让非从业者在一定程度上理解从业者的工作」:

“我的确需要用到排序但我为什么要学那些乱七八糟的排序算法?会搜索能看着文档来写真的不行吗?现在还有多少高级语言不自带 sort 吗?没有的话我能换一门吗?”
grewer
2021-01-29 14:07:15 +08:00
多学数学 很多数学专业一转计算机就是大神了
sillydaddy
2021-01-29 14:29:57 +08:00
@0o0O0o0O0o #21,
你说的很好,我承认举排序的例子,确实是从开发的角度来考虑的,因为里面有各种编程的要素嘛。。这么看来,我已经变得不理解「 普通人」的思维了。。悲剧!

@BingoXuan
@php01
想到这个主意,是受到市面上一些游戏的启发,可以通过玩这些游戏来体会编程的思维。

比如下面这个,Cargo-Bot
https://www.douban.com/game/26393479/,可以在线玩耍,https://altermanchess.wixsite.com/cargobot

它不需要教你编程的概念,但在游戏过程中,自然而然体会到编程的概念。非常自然。有不同难度等级,循序渐进。
ohoh
2021-01-29 14:59:44 +08:00
用箱子从大到小排序举例, 用程序肯定首先就要搞清楚是按体积, 高度, 还是表面积.
普通人怎么排? 按感觉来咯. 什么你还要我搞清楚长度?
systemcall
2021-01-30 18:59:08 +08:00
看《系统化思维导论》

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/749227

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX