我比较好奇,对于非软件开发者,编程是什么样子?他们在多大程度上能理解开发者的工作? 也许开发者对编程太熟悉,已经忘了庐山在身外者眼中的面目。
我说下自己的想法,猜想一下编程为什么难以被普通人理解,以及怎样解决,解决了又有什么好处。
计算机虽然有看得见摸得着的实体,但它的原理仍然是非常抽象的(毕竟它几乎无所不能啊)。
虽然人人能处理像“父母,亲戚,朋友,水果,箱子,变化,值”等数不清的抽象概念,但计算机软硬件的概念,明显不是普通人会遇到的。
计算机的底层是指令级的精确。程序就是一条条精确的指令的集合。计算机执行指令的过程,就如同一个鼠目寸光的人,取过一条指令,根据指令的内容,作出非常非常精确的动作,绝不增减。
这个指令,在不同的层级,可以有不同的抽象,
但不管是哪一个层级,指令仍然是精确的。上层的指令看起来比底层更复杂强大,只因它封装包含了更多的底层指令。
举例来说,应用层的一个对一组数排序的指令,包含的是编程语言层的操作数组元素、比较数大小、循环等很多指令的组合,对应的计算机底层则是更多的内存读写,寄存器读写等指令。
这种对精确性的苛刻要求,对于普通人来说,无疑是一个迥异的思维模式(开发者就见多不怪了)。
对于抽象性来说,
一般来说,越上层的抽象越容易理解。像是 UI 组件、应用层 API 这些上层的抽象概念,尽管也是计算机世界的抽象,但对于普通人来说,毕竟不像天书了。但仅仅理解这些,对于理解计算机的工作原理,甚至对于理解开发人员的日常工作,也是不够的。因为大多数的开发工作,至少要熟悉编程语言层面的抽象概念,比如循环、判断、数组、字典、变量、取值、赋值、函数、类,甚至协程、线程、进程、消息、同步、异步等等。对于普通人来说,这些抽象概念就比较复杂了。
对于精确性来说,
假设普通人已经理解了编程方面的抽象概念,也能够通过上述的概念来操纵编程语言了。他还是要面临接下来的困难:怎样把一件由现实抽象而来的任务,从上层的抽象,逐级精确的分解为他掌握的编程语言指令。
仍以给一组数排序作为例子,在明白了 for 循环,if/else 判断,明白了数组,明白了怎样读写数组里面元素,明白这些抽象概念后,怎样完成排序这一任务呢?
因为对于普通人来说,排序是毋庸置疑的简单,显而易见的容易。但恰恰是这个“显而易见”,让他感到分解任务到编程语言的指令时,出现了困难。由模糊的“显而易见”到“精确指令”是他难以跨过的一道门槛。
其实不止是普通人,即使是开发人员,在写代码时,仍然会为边界条件而犯愁。明明知道程序的基本逻辑是对的,但如果各种边界条件处理不对,精确无比从而“挑剔”无比的程序就会“罢工”。
那么怎样解决“抽象性”和“精确性”这 2 个难题呢?
仍然以一组数的排序为例,假设使用冒泡方法来排序,则会用到数组、获取数组长度、数组元素读取、数组元素修改、变量、数的比较操作、循环结构这 7 个抽象概念。
为了解决抽象性,需要把这几个概念具象化和可视化。现在想象在一个计算机模拟的具象化三维世界中,学习编程的人,作为用户,要在这个具象化的世界中,完成排序的任务。他可以具象化地操作这个世界里面的具象物体。
为了解决精确性,需要在这个具象化的世界里,尽可能隐藏所有具象物体暴露出的信息,减少不必要的可见信息对用户的干扰,迫使他使用指令去获取。比如对于具象化为一排箱子的数组,数组里面数的内容应该是隐藏的,数组的长度信息也应该是隐藏的。用户只有使用指令才能获取。这样迫使用户在解决问题时,必须使用编程思维,而不是利用视觉思维。
其他指令的具象化,也需要注意,比如获取数组的长度,怎样具象化这个指令呢?获取的长度信息又要放在哪里呢?应该是放在一个变量里,因为获取长度信息,不是让用户去看的,而是为了给后续的指令来使用的。
还有不少抽象概念需要具象化,目前我还没有想清楚。
当用户在这样一个把所有编程世界的抽象概念都具象化了的环境中时,他不需要去考虑那些编程的概念,所有的概念都具象化为类似现实世界的事物。而当他在这样一个虚拟的“现实世界”中找到了问题的解法,那么简单变换,就直接得到了对应的程序。
更重要的,他已经是在使用编程的思维了。
最重要的是,他理解开发人员的工作了。世界上又多了一份理解,多么美好。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.