近几年来,科技行业有强烈的愿景去教会所有人编程。
“所有学校的每一个学生都应该有机会学习计算机科学”——CODE.ORG
每个人都应该有学习计算机科学的机会。对计算的理解,可以改变你的思考方式,并且它直接给你惊人力量去实现自己的创意。理解一些概念比如抽象、耦合、普适、复杂度以及伸缩,能够改变你思考以及定位问题的方式。运用通用性的编程工具改变你解决问题的方式。
自农业之后,现在软件比任何其它技术都更剧烈,更快地改变着世界。不管是在科技行业还是其他行业,现在它都是业务增长和创新的核心,并且快速改变着 人们的生活方式。软件已经主导了我们获取知识,存储及处理信息,发布及接收多媒体,处理商业事务,和朋友、同事、社区沟通的方式。世界上最大的图书销售商 和最大的视频服务商都是软件公司;主要的几家音乐公司也是软件公司;增长最快的娱乐公司和电信公司还是软件公司。那些非软件公司正越来越多的依赖软件来优 化物流、供应链、生产流程,和广告,亦或提供工具给员工去创造更多的价值。软件来到了这样的一个临界点,改变我们教授和学习知识,借款和贷款,了解和关心 健康,搜索和消费各种服务的方式。
尽管软件给我们的生活带来了空前的变革,但总有一天,编程将会变少。对编程的狂热以及编程的增长都是暂时的,编程是众多工具的产物。现在编程是实现 计算最好的技术,但是编程自身并不是计算机科学的必要部分。计算就是处理数据并通过一些算法来解决问题。当前编程是我们不二的选择,但是我们必须创造更好 的工具。将来一天,不需要写一行代码就可以处理数据以及驱动算法将变得习以为常。我已经迫不及待了。
编程是一项非常专业化的技能。处理复杂问题自然地是困难的,作为一个程序员,我经常写程序解决各种复杂度的问题。我对那些非程序员用来处理简单自动 化任务的技术怀有敬畏之心。我有幸接触过一个逻辑及语言工具,在我脑中模拟一台电脑并通过有着怪异规则的不常见的语言和它沟通(我不太善于模拟人)。很多 人并不适合编程,但大多数人还是需要解决复杂问题所带来的好处。编程相关的工具及方法使得通过编程解决问题复杂化,会把我们大多数人挡在通过计算解决问题 的大门之外。编程并不容易学习,并且和人们所希望解决的问题也无多大关系。人们不应该非得通过编程才能运用软件来解决问题。有那么几个工具,我认为能够给非程序员带来像编程一样解决问题的能力。
计算器
自上世纪70年代推出便携式计算器以来,计算器已经发展了很多。可编程的计算器让科学家和工程师能够解决一些比 普通算术更复杂的问题(尽管他们可能使用了一些代码)。图形化的计算器帮助他们直观的理解计算结果。自从个人电脑和笔记本电脑流行以来,软件化的计算器界 面已经朝着展示用户所处理问题的方向发展着,而不是不合潮流的累加风格实现方式(一次性从左到右敲一整行的表达式,而不是每次一个数据项目,一个操作符, 来来回回多次)。创新的设计(如Soulver和 Calca)把计算器内嵌其中,并在界面显示工作状态,提供改变输入参数及实时查看结果的能力。
电子表格
电子表格有30来年的历史了,但是依然像受书启发而发明的老祖先一样基础和重要。它依然最重要的轻量级记账工 具,并且证明是一个通用的计算和建模工具,同样也善于展示表格式的数据。表格格式如今依然足够通用,并可分饰多角,实时重算功能有助于问题的拆分处理。许 多和数据打交道的人有高超的电子表格技术,他们能够做一些非常非常疯狂的作品。 更复杂的,电子表格可以用来存储和研究数据(特别是数据透视表出现之后),帮助人们开发和计算复杂的多变量的表达式,探索模拟和假设的场景,并实时呈现结 果。电子表格是一个通用的工具,能做远超当初电子表格作者能够想象的事情。从某种程度上来说,它非常接近于人们使用的编程工具。
不过电子表格也有不足之处,特别是以今天对用户界面以及处理能力的标准来看。它在处理多维数据的时候就会显得力有不及,你得提前决定维度,否则需要 从头开始。可以通过使用多个连续的单元格以及重复交叉计算,来粗略模拟矢量和并行计算,但是它们并不能理解你的数据模型,也就没有能力提供更多的帮助。电 子表格把扁平化二维表格数据视图界面与数据本身和计算数据的公式合在一起。字母数字单元格的地址是不透明且易变动的,移动数据或者改变布局都有可能破坏其 他的单元格或者影响计算结果。公式是隐藏起来的且难以验证其正确性,如果你不是原作者,甚至理解其功能也很困难。
80年代中期有几个电子表格项目尝试解决其中的一些缺点,特别是把数据与表格化显示剥离开来。比如 Javelin、Trapeze 以及Lotus Improv,不过它们已经消失在我们的视线中很久了,遗憾的是在软件市场上并没有再看到类似的软件。
个人数据库
当你在处理复杂或者多维的数据时,有时候电子表格解决不了问题。对于大部分人们想解决的问题,对数据的操作、查 询和统计都是必要的。但是不像电子表格,令我印象深刻的是过去几十年间个人数据库的受欢迎程度大大降低。个人数据库不再流行了吗?还是说现在的我和大家不 在同一个圈子里面?可能是由于程序员不鼓励大家使用个人数据库吧,依”专家”的意见。还记得大学时候讨厌MS Access,实在是不屑于鼠标点点就能构建查询那些小技能,我是幼稚的,痴迷于SQL的强大能力。我们应该把个人数据库的功能都教给大家,而不是教大家 编程,至少也应该排到编程之前。
我最近发现MS Access可以很好的用来开发增删改查的应用,Filemaker也类似。等下次我想构建一个大数据量的应用的时候我倒是非常有兴趣试试Zoho Creator。尽管这些软件都发展了很多,但是如要构建真正的应用它们还是显得不够灵活,仅仅能处理一些简单的表单和视图。
还有好几个特定的领域,非程序员也有工具来处理类似编程能够处理的事情,但只需很少的代码。游戏开发就是一个很好的例子,游戏是提供特殊交互的计算 机程序。游戏通常是复杂的程序,由用户界面主导,但是游戏开发项目组却由美工和设计师主导,而不是程序员(视游戏需求而定)。美工和设计师使用程序员开发 出来的工具实现很大部分游戏包含的内容,如美术,结构,地图,模型,动画,情节,关卡设计,迷宫,对话,故事。假设这样的一个流程,关卡设计师提供图纸和 写好的规则让程序员用代码来实现,一遍遍的重复相同的流程直到关卡设计师满意为止,看起来很冗繁(当前大部分的应用用户界面都是这样实现的)。游戏领域不 是这样的,程序员先开发游戏引擎和关卡设计工具,然后设计师就可以在一个非常接近真实游戏的环境里面设计,并能够实时地把设计装载到游戏引擎中运行起来。
遗憾的是现在的界面设计工具不适合非编程人员使用,甚至是很多程序员。自鼠标发明以来,鼠标点来点去这样的小伎俩是被“真正的”程序员轻视的,就像 汇编程序员看不起早期的Fortran拥护者,C程序员看不起Java程序员,Vi/Emacs用户看不起依赖IDE开发的程序员一样。那些已经掌握高难 度工具或者流程的人总是很难接受新的更强大的事物。
长时间以来,GUI的构建工具就是一坨屎,现在依然是。它们通常只是简单的显示将要实现的界面效果,一方面不足够强大使得程序员可以用它实现他们所 想要实现的功能,另外一方面又复杂且充斥着各种编程概念,使得非程序员难以使用。程序员自然而然地回归到编写代码实现界面的方式,因为他们需要做一些工具 做不到的事情。这样做是错误的,虽然可以理解。代码带来一个视觉概念与思维方式的不一致的严重问题,特别是代码是过程式的,如果是申明式的还好些,你构建 你正设计的界面。重新编译、发布并检查界面变动实在是一个漫长的开发过程。我完全理解这种做法,但是设计师在Photoshop设计好作品,然后让程序员 用代码再次从头开始实现作品实在是一个人力的极大浪费。我们的GUI工具必须得提高,使得设计师设计GUI界面,随后程序员来接管界面与后台的交互(Spark Inspector和Reveal预示未来)。
其它一些提供给非程序员类编程能力的有批处理器(如Photoshop),多节点且分层的合成工具(如Shake、 Blender),苹果公司多节点图片处理以及显示工具Quartz Composer,为Mac OS录制脚本的Automator,用于科学和工程设计分析的Mathematica、Matlab、和LabVIEW,收集聚合互联网内容及API数据的Yahoo! Pipes和IFTTT,内容管理和展示工具wikis。特别值得一提的是HyperCard(1987-2000),迄今为止最有影响力的应用设计环境。我依然清晰的记得远在掌握编程的基础概念之前就能够构建栈及写HyperTalk代码。我做了一些自己觉得骄傲的事情,看到我们和父辈(在计算机出现之前接受的教育)做相同的事情。如果你错过了,请读一读reminiscence。超链接、互联网、wikis,都继承于HyperCard,LiveCode也是其中一个分支。
因此我们有应用于数学的分析及计算工具,糟糕的用户界面设计器,以及用于游戏、图形、黑客的特定领域工具。下一代能够让程序员和非程序员都不用写代 码就能完成应用功能的产品应该快速的增长,他们不帮你写代码,只是使得写代码不再必要。我希望这样的工具赶快出现,完成那些现在用编写代码方式实现的功 能,让大家都能够构建各种有用、高质量的应用。特别地,我们将达到一个更高的境界,这些工具有自我改进功能,非程序员可以用工具构建出新的工具,从而构建 更多的应用,包括更出色的工具。
那些六位数的工程师并不认为把Photoshop作品与一些指令合起来构建一个可用的用户界面是一件浪费时间的事情,从这可以看出解决此类问题有很重要的意义。如果你碰巧是一个程序员且我的言论让你感觉不快,请想想如果你不再需要花一半的时间去把PSD转化为HTML, 你将能够创造多少更多的价值。是的,我知道前端开发并不容易,它确实很复杂。但是绝大多数的复杂性都是由我们所使用的工具引起的,而这些工具并不是解决问 题所必需的。高深的软件工程技能和晦涩难懂的业务知识显得如此重要,那是因为构建一个用户界面需要几千行的代码。如果有一天不再需要那么麻烦,你就可以把 你的聪明才智用到更有意义的事情上面。
以前那些尝试帮助非程序员写代码的项目大多都不成功,尤其是通用型的那种。感谢现在正使用我们的界面并提出改进建议的数十亿的用户,最近从他们那里 我们学习到了很多关于用户界面的东西。开发创建型工具的挑战在于提供用户一个功能强大的界面但又不能复杂得让用户不知所措。然而在任何领域都有那么一些专 家在攻克不可能与简单之间的壁垒,就像工具能够让曾经要求专业知识和技能的人才能完成的事情变得普通人也能够处理一样。我们见证了业余的音乐和视频在数量 和质量上的爆发式增长,这都得益于生产音乐和视频的工具变得如此的好,如此的简单,如此的便宜。随着我们设计复杂业务界面的能力提高,我们将构建出更好更 简单的可以让非程序员也能设计和实现更多软件的工具,我对此表示乐观。在这个过程中,有些人可能成为发展的奠基者,但更多的人只需要使用工具来帮他们完成 工作。
程序员总是倾向于为程序员开发工具。为拥有较高专业技能的用户开发工具确实是件更容易的事情。但是非程序员能够使用的工具也能够为程序员提供帮助。 减少对驾驭计算的认知压力,将有利于程序员腾出更多的时间和精力去更快地解决更多的复杂问题。像虚拟世界里的成功员工一样,能够处理一些份外之事。我们依 然需要程序员,经验丰富的工程师以及充满创造力的问题建模、算法和数据结构设计、难关攻克、流程管理相关的实践者。但他们会像今天的农民一样,只占总人口 的一小部分,足以支撑全民的食物供给。
一个人人会编程的未来固然是好的,但现在代码只是驾驭计算的一个方法而已。当我们的技术达到每个人都拥有用来思考和创造的工具并且很少需要编码的时候,我们将能更好去攻克一些社会性的难题。程序员们现在就可以去构建那个技术了。
教会更多的人写代码是伟大的进步,但一个很少需要写代码的未来会更好。