——想象一个人人都会编程的时代。

这是一个关于未来趋势非常大的话题,和我一些还未成熟的想法。

编程会成为通用技能吗?

早在二战之后,年轻的 Douglas Engelbart 就在一直畅想一个能够扩展人类大脑的机器。这个机器能够记录一个人所阅读的所有书籍通讯,作为一个辅助思考的助手。这个在他脑海里萦绕不去的想法推动了他一生对个人计算机的发展的贡献。他早在 1968 年的“所有演示之母”(Mother of All Demos)中展示了鼠标的概念,展示了一个有视频对话,双向协作编辑文档的计算机系统,震动了计算机界,也鼓舞了一代年轻学者和爱好者对个人计算机概念的关注和推崇。(更多关于个人计算机的故事,可以参考我的读书笔记《睡鼠说》。)

过去几个年代里个人计算机加互联网的发展对人类社会的改变是史无前例的。两者对个人和商业的生产力都是一个极大的提升。今天计算机已经小到能够放在我们的口袋里,计算性能也超过了当年登月控制中心算力的总和,所有的应用功能可能早已超过了 Engelbart 当年的想象。但有一点可能是永远不变的:寄托机器对人类大脑思维和能力的提升会是一个永恒的主题。

这些年计算机和互联网发展的一个结果是,这两者发展对我们思维也有很多潜移默化的改变。很多的用语已经深深植入我们日常的思考,学习,和工作当中。比如最早的“复制”,“粘贴”,到后来的“谷歌一下”,“百度一下”,PhotoShop 一下,再到后来的语音智能识别一下,等等。如今你可以在和朋友交谈当中拿出手机查找相关的新闻、信息,和资料,让整个互联网成为你记忆的储备。这些思维在计算机出现之前都是我们难以想象的。不难想象在不远的将来我们会有更多的方式挖掘计算机的用途增强我们的思考方式。

而通过编程指导计算机完成我们需要的任务很可能会成为非常这个过程中一条重要的途径。

这篇博客并不讨论:是否会有更多的职业程序员,或是如何成为职业的程序员;而是为了想象:未来的社会,对编程的要求有没有可能会成为今天社会对计算机基本操作的要求一样,作为一种基本技能逐渐被重视?

编程是一种什么样的技能

编程并不是一种高深莫测的魔法。简而言之,编程就是指导计算机如何执行任务。这一篇非常有趣的博客对编程的描述,介绍了编程最核心的部分:对现实世界任务的抽象和描述。

在本文里所提及的“普及编程”的概念并不会包含艰涩的计算机架构、底层,和复杂的软件工程模型。因为其目的也并不是为了制造更多的职业软件工程人员:而是增强计算机对人工作和思考的协助。

普及编程的目的应该是理解最核心基本的计算机知识,如:

  • 对数学问题的处理;
  • 对数据的处理,通过搜集,处理,和分析数据理解一个话题;
  • 对数据结构和基本算法的了解,并通过基本的原理对现实世界中的概念和任务进行抽象和建模;
  • 对计算机基本运行原理的理解,对网络和服务的理解;
  • 对未来信息技术发展趋势的理解;

可能在某些职业中你们已经涉及了一定的自动化步骤和数学上的分析。比如利用软件的数学,统计上的计算,某些专业软件,甚至 Word 和 Excel中的公式,自动化脚本,和宏,等等。

取决于编程语言和编程风格的不同,你可以通过过程,对象,描述性语言对你需要描述的现实世界概念进行抽象。你需要完成的任务,可能在今天的编程语言中只需要简短几句语句就能高度抽象地描述和执行。比如如下,利用 Python 和相关的库用短短几行描述实现输入和输出数据的绘制。

JupyterBook 中用 Python 绘制散点输入和拟合结果的图像

所以,在不久的将来,使用计算机软件和编程很有可能会进一步靠拢,非职业编程和职业程序员的界限也会更加模糊。就像数学一样,各行各业都可以通过编程作为一种理解、描绘,和控制世界的思考工具,扩展计算机在其中的应用。

为什么学习编程

每个人都应该学习一些如何在计算机上的编程,因为它可以教会你如何思考。

史蒂夫·乔布斯(1995)

可能你会问:为什么我会想要学习编程?显然,对于大多数人,大多数情况下并不是为了成为一名职业程序员。

最直接的答案可以是:它能够提升你的思考。

1995 年乔布斯在采访中提到,他认为编程能够成为你思考的一面镜子,它能够教会你如何思考和解决问题。

图灵奖得主 Alan Kay 是发明面向对象编程的先驱,提出推广了计算机图形界面,是整个计算机界的领袖级人物。同时他多年来也一直致力于计算机在教育中的应用。在这个 TED 演讲中它演示了,如何通过计算机快速地在教育中展示呈现复杂的概念。他曾经提出过:计算机能够比阅读写作更加精确地概括你的想法,并更加快速地通过模拟和实验验证你的想法。这两点对你的思维有很大的启发。

另一个重要的原因是,它能够让你真正发掘计算机作为一门技术的潜能。

比如:

  • 生物,地理,水利,等等理工专业的研究人员能够通过数据分析,和模型仿真对某个科研方向进行研究;
  • 产品设计可以建造最小可行的产品试错,并通过数据分析用户的行为决定更好的设计;
  • 研究文学的学生可以借助自然语言处理工具,和统计方法等手段分析大量文档中出现的模式。比如,通过数据考证文章的作者是谁;
  • 记者和媒体从业人员可以从浩瀚的新闻资料中遴选出有价值的信息;
  • 艺术和设计专业可以通过设计个人网站展示自己的作品,等等。

如今各个行业的专业软件都已经具备了很多上述的功能。如果这些软件能够具有支持编程的能力,用户可以通过程序更加精确地描述自己所需要的功能,将会给用户更多选择,甚至能够让用户将不同的软件功能串联起来,提供更大的创作和自定义的自由。

最后,学习一门新的技术能够给你带来快乐。编程能够让你在在一个新的平台享受自由思考和创作的乐趣。就像 Paul Graham 在《黑客与画家》中所表达的一样,技术和艺术往往是相通的。

为什么是现在

软件正在蚕食世界。

Marc AndrEessen

为什么编程的重要性会在今天和不久的将来逐渐凸显出来?

最重要的应该是,计算机的普及。如今对绝大多数职业,计算机都是一个重要的平台。过去的很多功能也逐渐被软件替代,或是成为软件的一部分。在今后可见,软件将会更深更广地渗透到各个行业中。

另外一点是计算机易用性的发展,和编程语言的发展。早期的计算机更对用户不友好,就和早期的计算机语言一样。早期的编程语言更加贴近计算机,也更晦涩难懂,比如汇编。但随着计算机性能的提高和计算机语言的发展,如今很多脚本语言都已经具有了非常快的速度,非常强大的功能,和高度抽象化底层复杂的计算机系统的能力,有着很高的易用和表达性,也为初学者提供了很多机会。

计算机将更理解人类

计算机中一门方向“人机交互界面”(Human Computer Interface, HCI),属于认知学,心理学,和计算机的交叉学科,主要研究目的就是:如何让计算机对人类更加易懂和易用。编程语言的发展也一直是 HCI 学科研究重要方向之一。今天计算机界面和编程语言的易用性都得益于这个学科的发展。在不久的将来,可以预见编程的门槛将会进一步降低。

更多计算机相关技术的发展也会使得使用计算机变得更加重要。比如,人工智能的发展,可能会让计算机给我们带来更多,更强大,我们今天难以想象的功能。编程语言将会是我们调用这个力量的关键工具。

这不是一个全新的趋势,计算机始终都在变得更加强大和易用,所开发的应用范围也更广。从最早技术宅们的玩具,到后来的网站,移动应用等的开发热潮,更加易用的技术将会打开更多创新的可能性。

比如最近我关注到的一个非常有趣的现象:很多网络上的志愿者为了应对疫情而快速建立有用的网站,很多最小功能的网站原型避开了复杂的数据库作为后端,而是采用了谷歌的在线表格软件 Google Sheet。由于 Google Sheet 提供可编程的开放接口,程序员可以将获取的数据直接写入表格,并在表格中进行统计分析,如表格自带的可视化工具,等等。比如这个搜集疫苗数据的网站

尽管这样的网站在性能、功能上会比成熟的大网站有差距,但大大减少了开发的时间成本,给了创作者更多试错的空间。这应该是最近兴起的一个趋势,即“No Code/Low Code”运动,通过现成的组件和无代码,或是很少的代码完成网站原型的开发。另一个类似服务的例子是 Bubble。可以参考它们最近在一个线上会议的演示对这个趋势的介绍和分析。虽然 Bubble 的软件是收费的。

计算机和编程教育的普及也会加快计算机和人融合的趋势。美国的非盈利组织 code.org 组织的“编程一小时”活动,K12 CS 组织提供的中小学计算机教育的框架,都在推动计算机教育的普及。也许明天计算机和编程会逐渐成为通识教育的一部分。

所以,一个可以预见的趋势会是:下一代的孩子将更加理解计算机,而下一代的计算机会变得更加强大,也将会更加“理解”人类。人和计算机的合作将变得更加“友好”。

一个人人编程的社会?

编程如果真的开始普及了,会如何改变这个社会?

工业世界的政府们,你们这些令人生厌的铁血巨人们,我来自网络世界——一个崭新的心灵家园。作为未来的代言人,我代表未来,要求过去的你们别管我们。在我们这里,你们并不受欢迎。在我们聚集的地方,你们没有主权。

约翰·佩里·巴洛, 《网络独立宣言》

这是我最近萌生的一个想法:公民的数字能力(Digital Literacy)和信息的获取能力对一个信息化的社会举足轻重。它将推动构建更好的数字社区,让社会整体做出更好的决定。新生技术在新社会中的研发、应用的流程等等,都需要有掌握足够信息的公民进行公开的讨论和决定。这是编程和整个计算机教育都会具有的促进作用。

编程教育的普及化,可以让所有人都具有一定的定制自己使用计算机方式的力量。这可能会改变软件生产集中在少数软件公司和巨头手中的现状。市场上会有更多灵活定制软件和服务的需求,而不是被动地接受现成软件功能。从这个角度看,这可以让我们拥有从商业化和垄断化的软件巨头手中争取回一定自由的能力。也就是说,未来的软件和服务可能会更加地开放,人人都可以定制、发布自己使用软件服务的能力。而这一点可能会进一步避免一个领域垄断的形成。定制和使用计算机、软件、服务的权力将会进一步分散在每一个人手里。

开放的新开发工具也会带来新的线上社区和社区合作。我们可能会见证更多不同行业的人以前所未有的方式进行合作和交流。

另一点可以肯定的是:技术的发展将发掘更多创新机会。计算机能力的普及也会进一步减少创作产品和试错的成本。这也就意味着,我们会看到更多通过快速搭建原型的建成的网站、服务和商业模式的创新。

另外,计算机在不同的专业领域上带来会进一步带来生产力的提高,使用计算机所带来的思路和新的交叉领域上带来我们今天无法想象的灵感。

这些仍然是不成熟的一些想法,是一个带着一点技术人天真的美好的愿景。我们需要更多的软件领域的工程师和研究人员考虑:“如何将计算机从各方面成为对更广泛的创作者提供更加安全、易用的创造和生产力工具”,并将这些想法付诸现实。

所有对技术型社会关心的人需要更多地关注技术和社会的这个交叉点:技术的进一步普及会如何塑造我们现有的社会,而我们又应该如何应对。

Alan Kay 曾说:“预测未来的最好方法就是发明它”。为了实现这个愿景,我们需要更多人的想象和贡献。