Skip to content

zongwu's blog

[翻译]发明原则(inventing on principle)

找到并遵循你自己的原则。

持续地去解决工作生活中违背这些原则的事情,优秀的工具或者产品,不过是这个过程的副作用。

背景

该演讲最初由Bret Victor在CUSEC(Canadian University Software Engineering Conference) 2012上发表1

演讲稿

那么,与上一节演讲不同的是,我没有什么奖品可以发。我只是想要告诉你如何生活。

这个讲座其实是关于一种大多数人都没有谈到的生活方式。当你步入职业生涯时,你会听到很多关于追随自己的激情或者做自己喜欢的事情。我将谈论一些不同的东西。我将讨论的是:

遵循一个原则 -- 找到工作的指导原则,你认为重要、必要和正确的事情,并以此为指导。 本演讲有三个部分:

  1. (我的原则)我首先要谈一谈指导我很多工作的原则,并尝试使你体会其中的结果。

  2. (他人的原则)我将谈论其他一些这样生活的人。他们的原则是什么,他们信仰什么。

  3. (你的原则)但这只是示例,可以帮助你思考自己的信仰以及生活的方式。

我的原则

从我开始:想法对我来说非常重要

我认为将创意带入世界是人们所做的最重要的事情之一。而且我认为,伟大的思想,以伟大的艺术、故事、发明、科学理论的形式存在,这些事物可以独立存在,赋予我们生命的意义。因此,我对人们如何创造想法以及想法如何发展思考了很多。特别是,什么样的工具可以为想法的成长创造一个健康的环境。

这些年来,我花了很多时间来制作创意工具,使用创意工具,思考很多东西,这就是我所相信的:创作者需要与他们正在创作的内容有直接的联系。这是我的原则。创作者需要立即与其创造的联系。我的意思是,当你做某事,做出更改或做出决定时,你需要立即看到其效果。不能有延迟,也不能有任何隐藏的东西。创作者必须能够看到他们在做什么。

现在,我将展示一系列案例,在这些案例中,我注意到该原则受到了侵犯,我将向你展示我对此所做的工作,然后,我将讨论在更大范围内开展这项工作的情况。

一幅画的编程设计

首先,让我们考虑一下编程。编程的工作方式如下:你在文本编辑器中输入一堆代码,在脑海中想象每行代码将要做什么。然后编译并运行,结果出来了。在这种情况下,这是JavaScript绘制到Canvas上,并且用树绘制了这个小场景。但是,如果场景有任何问题,或者如果我去进行更改,或者如果我有进一步的想法,那么我必须回到代码,然后编辑代码,编译并运行,看看它是什么样子。发生任何错误,请返回代码。我的大部分时间都花在了代码上,盲目地在文本编辑器中工作,而没有与此之直接联系,而这正是我实际上想要做的。

我觉得这与我所拥有的原则背道而驰,创作者需要立即与他们所做的事情建立联系,因此我试图提供一种更符合我所拥有的原则的编程环境。所以我在这里的是,我的图片在侧面,代码在侧面,这部分画了天空,画了山,画了树,当我对代码进行任何更改时,图片立即改变。因此,代码和图片始终保持同步;没有编译和运行。我只是更改了代码中的内容,然后看到图片中的内容发生了变化。现在,我们已经在代码和图片之间建立了直接联系,我们可以开始考虑更改代码的方法,而不是输入代码。例如,如果此数字是分支的长度。如果要控制该号码,只需将鼠标指向该号码,按住控制键,就可以上下拨动调整。因此,我可以看到大树枝或小树枝的外观,并且可以集中于艺术上适合我的感觉。这对代码的任何部分都有效,我只是指向它,然后上下拨动。在这里,其中一些数字我知道他们在做什么,但是看到他们这样做确实令人惊讶。而其他的完全令人惊讶。

在这里,我有这个for循环,我要数到十六,在每个分支上都放十六朵小粉红花。而且我可以将其调低以获得更少的花朵,或者将其调高以获得更多的花朵。但是,看看我在这里做什么:我只是将数字上下移动了大约20左右:它具有这种非常有趣的闪烁效果;看起来好像风在吹过树。第一次看到此图像时,我立即开始考虑如何将这种效果用于动画。如果必须在每次更改之间进行编译和运行,我怎么会发现呢?如此多的艺术,那么多的创造就是发现,如果看不到自己在做什么,就什么也找不到。

我向你展示了如何调整代码,让我们添加一些代码。我想在天空中显示太阳,所以我要到drawSky函数的末尾,填充一个圆圈,我开始输入context.fillCircle,开始输入时,我会得到此自动完成列表(智能补全功能),其中列出了不同的填充方法。这些就是我可以在其中键入的内容:fillCircle,fillRect,fillText。当我在此自动完成列表中上下移动时,我立即看到他们每个人在做什么。因此,我不必从方法名称中想象它会做什么。我不必查看文档,只需立即查看即可。

所以我想要一个圆,然后我将调整x坐标和y坐标,稍微改变半径。看起来不错。可能应该是黄色的,所以我将设置填充样式context.fillStyle,与以前一样自动完成,选择fillStyle,默认情况下给我白色,并且我可以像更改任何数字一样更改颜色代码,我按下控制键,然后得到一个调色板。所以我可以选择适合自己的太阳的黄色。虽然我想白色很有趣。我有点没想到。但是有了白色,现在看起来像月亮,对吗?嘿,这是晚上的时间!因此,有了这种直接的联系,就可以以前所未有的方式浮现和发展思想。

但我认为这里仍然存在问题,那就是我已经有了这张图片,并且我已经在这里获得了这段代码,而且我必须保持两者之间的映射。我拥有所有这些代码,仅查看这一行,我就不会立即知道它的作用。所以这就是我能做的。我可以按住Option键,然后光标变成一个放大镜,现在当我在每一行代码上滚动时,它会高亮显示图片中该行的内容。因此,如果我想知道此函数的功能,只需滚动该函数并查看突出显示的内容即可。在这里我有两个调用用于绘制山川。我不知道哪个是哪个。好,这是那座山,那是那座山。这也必须以其他方式起作用。如果我看到图片的一部分,我必须知道什么代码负责绘制它。所以我做同样的事情;我按住选项键,现在当我在图片的每个像素上移动时,你会在右侧看到它正在跳转到绘制该像素的代码行。哦,那个绘制出了天空,那个绘制出了树,那个绘制出了花朵。因此,这对于维护该映射确实很重要,但是对于四处导航也非常有用。所以你知道,我想让太阳更大一点;我跳到那里,把它弄大一点。或者我想把树抬起来一点;我跳到那里,把树稍抬起来。我想稍微抬起山峰,所以我跳到那里,稍微抬起山峰;而且我可以按照自己的想法尽快进行这些更改,这对于创作过程非常重要。能够尝试你想到的想法。如果在思考和看到某事物之间以及在此事物之上建立反馈回路有任何延迟,那么整个想法世界将永远不会存在。这些是我们无法想到的想法。

想法对我来说很重要。关于想法的事情是想法从小开始,想法始于微小、弱小和脆弱。为了发展和成熟,创意需要一个创造者可以培育它们的环境。要照顾好他们,养活他们,并塑造他们的成长。对我而言,这就是直接联系的原则。而且因为想法对我来说是如此珍贵,当我看到违反这一原则时,或者当我看到想法死了或因他们的创作者看不到他们在做什么而被阻碍时,我觉得这是错误的。违反某些UI准则或违反某些最佳做法并不是错,从更深的意义上说是错的。我将回到这一点,但我想向你展示遵循该原理的另一个示例。

一个小平台游戏的编程设计

在此代码中,没有状态,没有持久状态,没有时间,没有交互性。我当时正在考虑如何以符合我所遵循的这些原则的方式来处理编程的这些方面:创作者需要直接的联系。所以我在这里有一个小平台游戏(超级马里奥)。这是我的小家伙,他可以跑来跑去,他可以跳跃,他可以死。代码在这里。这段代码使他四处奔走,使他跳起来,使他与事物碰撞……在这里,我有一些关于这只小乌龟的代码。乌龟现在能做的不多,因为我还没有完成编写他的代码,所以,我现在就要做。对于每个tick(游戏engine里的每一次tick),他的x位置加上方向等于时间间隔,即六分之一秒乘以某个速度,这就是 ... 我不知道?可能快,可能慢,如果为负,他会向后走。这些都是我可以用于其他敌人的想法,但我认为乌龟应该很慢,所以让我们为乌龟设置该速度。在这里,我有一些代码说,当我的家伙与乌龟碰撞时,他获得了一些Y速度,因此他弹跳到空中,乌龟被踩了。看起来像那样。然后乌龟站起来。

问题是,我不希望玩家能够上到这里来。我希望玩家从海龟身上弹开,然后穿过这里的小通道。而且他将必须四处走走,解决难题之类的东西,然后再回来获得星星。所以,乌龟现在太有弹性了。当然,现在我可以拒绝使用代码,现在可以尝试了,但现在还不够弹性。虽然可以在运行时调整代码而不必停止并重新编译并再次找到我的位置,这是很好的,但我无法立即看到我需要看到的内容,这就是他是否可以进行跳转。

所以这就是我要做的。我要(玩家)从乌龟身上弹开,然后暂停游戏。因此,我暂停了游戏,现在这里有一个滑块,可以让我时光倒流。现在,我可以在进行跳转之前倒回,并更改代码,使其不那么有弹性,现在当我向前移动它时,它将使用相同的输入控件,相同的键盘命令记录它来模拟之前,但是带有新代码。

这还不够好。我需要能够立即看到更改。我需要能够立即查看我的跳动是否正确。这些东西都没有。而且如果你有一个及时的流程,并且希望立即看到更改,则必须将时间映射到空间。所以这就是我要做的。我要弹起乌龟,暂停游戏,现在点击这里的按钮,显示我的轨迹。现在,我可以看到他去过的地方。当我回退时,在他面前的这条路就是他要去的地方。这是他的未来。当我更改代码时,我更改了他的未来。这样我就可以准确地找到所需的价值,因此当我点击播放时,他就滑到了那里。

因此,创作者需要能够看到他们在做什么。如果你要设计嵌入时间的东西,则需要能够控制时间。你需要能够跨时间看到,否则你将设计盲目。

当我玩这个游戏的时候,我注意到用重力玩很有趣。因此,我可以使重力稍微为负,然后他开始飘浮在空中。我可以和他一起玩,并设法让他留在那里。你可能只需要围绕机械手进行整个游戏,这就是重力操纵。实际上,我敢打赌我可以摆弄这段代码的任何部分,并提出游戏的想法。即使我只注释掉代码中的第一条语句,现在我的家伙也不能向左移动-他只能向右移动。听起来有些愚蠢,但是Terry Cavanagh实际上围绕着“不要回头”这个概念制作了一款精美的游戏。特里·卡瓦纳(Terry Cavanagh),他制作了另一本非常精彩的游戏,你可能会看到它,叫做“ VVVVVV”,六次拼写为字母v。而且,游戏的运作方式是你不能跳跃。只能上下颠倒,而且是向上跌倒而不是向下跌倒。所以有点像这样。你可以在天花板上走动,也可以在地面上走动。因此,你拥有这些看起来像这样的级别,并且你到处走来走去……你必须学习如何在这样的地形上导航。因此,如果你有一个类似的东西,你将无法跳过它。你将不得不翻身;他从这个概念中获得了惊人的游戏玩法。

再次像我刚才说的,要能够尝试你的想法。这个例子,以及上一个带有树的例子,都是非常直观的程序。我们仅通过查看图片的变化就能看到我们的更改。所以我在想,我们如何才能做更多符合此原则的抽象编程。

二分查找算法

我们如何以一种可以看到自己正在做什么的方式编写通用算法。举个例子,让我们看一下二分查找算法。关于二分查找算法的工作原理的超级快速复习:你有一个按顺序排列的值数组,并且有一个键,这是你要在数组中查找的值。然后,你将跟踪两个变量,它们是你认为该值可能存在的上限和下限。现在,它可能在任何地方。而且你看起来正处于该范围的中间–如果发现的范围太小,则目标必须在此之后。查看范围的中间位置,如果发现的范围太大,则目标必须在此范围之前。并且你会不断细分范围,直到你缩小要寻找的值。在代码中,二分法搜索算法看起来像这样。从我的角度来看,你在这里看不到任何东西。你什么都看不到。我看到了“数组”一词,但实际上没有看到数组。因此,为了编写这样的代码,你必须在脑海中想象一个数组,并且实际上必须玩计算机。你必须在头脑中模拟每行代码在计算机上将执行的操作。在很大程度上,我们认为是熟练的软件工程师的人员仅仅是真正善于玩计算机的人员。但是,如果我们在计算机上编写代码……为什么要模拟计算机在脑海中会做什么?为什么计算机不只是这样做……并向我们展示?

让我们编写二分查找算法。“二分查找算法”功能需要一个目标和一个数组。然后在这边说,“好吧,它需要一个目标和一个数组,例如什么?得举个例子。我需要一些与之合作的东西。例如,我的数组可能是“ a”,“ b”,“ c”,“ d”,“ e”,“ f”。假设我们正在寻找“ d”。现在开始编码。下限开始为零。在这里,它说“低等于零”,这没什么好奇怪的。上限从数组的末尾开始,因此上限等于数组长度减去一。在这里,它说“高等于五”。所以我在代码中有我的抽象公式。在这里,它为我提供了与这些示例参数相对应的具体值。因此我不必将这张照片保持在脑海中。

现在我需要将索引放在数组的中间,我将取这两个的平均值。中值等于两个之上的低点和高点,并且……嗯,这显然是不对的。两点五不是有效的数组索引。所以我想我需要四舍五入。所以我要添加floor函数并将其四舍五入到两个。而且我在键入错误的第二个字面上就抓住了这个错误,而不是在二十个单元测试中编写了整个函数。因此,现在我从数组中获取了值……然后需要细分我的范围,因此有一个if语句,我将其粘贴到此处。因此,在这种情况下,我找到的值小于键,因此它采用了if语句的第一个分支。这是在调整下限。当然,如果目标值较小,那么它将使用if语句的此分支并调整上限。或者,如果值为“ c”,那么我们将刚好在第一遍找到它,然后返回索引。

这是该算法的第一次迭代。现在我们需要做的是循环。我们已经细分了数组,我们需要继续细分,直到我们寻找所需的内容。我们需要循环;我会循环。现在,我们有三列对应于此循环的三个迭代。因此,这里的第一列正是你之前所看到的。高低跨整个数组,我们发现一个'c',它太低了,所以我们调整了下限,然后循环到这里。第二次迭代,边界更紧密;我们找到一个“ e”。调整上限。第三次迭代,循环到此处;低和高是相同的。我们将其范围缩小到了一个候选对象–这确实是我们正在寻找的目标值,我们返回了该索引。这里没有任何隐藏的东西。你会确切地看到算法在每个点上都在做什么。我可以转到这里尝试不同的键,这样我就可以了解算法对于这些不同输入参数的行为。

通过查看这些数据,我可以直观地了解该算法的工作原理。因此,我在这里尝试使用其他目标值,假如说我尝试查找“ g”。这看起来有些不同。它实际上并没有返回。这样做的原因是,我正在寻找实际上不在数组中的键值。打破此循环的唯一方法是找到目标值。所以它一直停留在这里,永远循环。我们可以对此进行研究,看看出了什么问题,算法出了什么问题。前几个迭代看起来不错,但是这个迭代看起来很奇怪,因为低大于高。我们的范围已完全崩溃。如果到了这一点,那么我们知道找不到目标值。所以我看到了这种错误的情况,然后我说:“哦,那不对。低必须小于或等于高。” 好的,我将其作为while语句的条件。低位小于等于高位,然后就会跳出循环,我将返回一些标志说找不到它。在这里,我们进行了三个循环迭代,找不到了,我们返回了一个未找到的值。这就是编写没有蒙上眼睛的算法的样子。

我再次有了这个原则,即创作者需要能够看到他们在做什么。他们需要与他们正在建立的这种直接联系。我试图通过三个编程示例来展示该原理,这仅仅是因为这是一次软件工程会议,所以我认为我应该谈论编程。但是对我来说,这个原理与编程无关。它与任何类型的创作有关。因此我想向你展示更多的演示,只是为了向你展示我在此构想的广度。

电子电路设计

因此首先让我们看一下工程的另一个分支。这里有一个电子电路。我还没有完成绘制,所以让我完成它。我们放2。现在我们有了工作电路。我的意思是我认为这是一个正常的电路。我实际上看不到这里有什么工作。这与编写代码完全相同,我们以静态表示形式工作。但是我们真正关心的是数据。变量的值,所以我们在这里看不到。现在在电路中,变量是这些不同导线上的电压。因此,每条导线的电压都会随着时间而变化,我们必须能够看到这一点。现在如果我要在实验室工作台上构建该电路,然后进行物理构建,我至少可以带一个示波器,然后四处戳一下,看看不同导线中发生了什么,这里或这里发生了什么。因此,至少我应该能够做到这一点。所以我在这里得到的是该导线上的电压随时间变化的曲线图。你会看到它的高,低,高和低,因此这很明显在振荡。如果以物理方式构建它,那么我也将能够看到电路在做什么。在这种情况下,我在这里有两个LED。这些是LED的小灯,大概是有原因的。我可以点击播放,然后观看它实时模拟。现在,你可以看到电路的功能。是该导线上的电压随时间变化的曲线图。你会看到它的高,低,高和低,因此这很明显在振荡。如果以物理方式构建它,那么我也将能够看到电路在做什么。

为了设计这样的电路,你必须了解每条电线上的电压。你必须了解整个电路中所有电压的变化情况。就像编码一样,环境要么向你显示,要么在你的脑海中对其进行仿真。与模拟电子在做什么相比,我的头要好得多。所以我要做的是,将它们散布开一些。因此,相同的电路散布了一点,我将在每个节点上增加电压。因此,现在你可以看到整个电路中的每个电压。我什至可以点击播放并观看各种实时模拟。

虽然,我更喜欢做的是,只需将鼠标移到它上面,然后我便可以查看对我感兴趣的区域并查看其值。我可以比较任何两个节点。如果你看一下这里的节点,当我将鼠标悬停在该节点上时,你会看到我要移动的节点的阴影覆盖在该节点上。我要悬停的那个阴影实际上覆盖了所有阴影。因此,我可以将任意两个节点悬停在一个节点上,然后查看另一个节点,从而进行比较。

同样,我可以立即看到更改的结果。所以我这里有70k电阻。我要更改其值,只需单击并拖动它,现在我看到波形立即更改。你会注意到,当我单击并拖动时,它会在开始拖动之前留在波形的阴影后面,因此可以进行比较。我可以立即看到更改的结果。

信息设计的两个黄金法则:显示数据。显示比较。这就是我在这里所做的一切。但是这还不够好。我们在这里看到的是电压,但是在电子产品中实际上有两种数据类型。有电压,有电流。我们看不到的是流过这些组件中每个组件的电流。为了设计电路,你需要同时了解电压和电流。你需要了解两者之间的相互作用。这就是模拟设计。

所以我要做的是将这些散布开一些。现在,我将用电流随时间推移绘制的图表替换所有这些组件。每个蓝色框代表一个组件。你可以看到它是哪个组件,因为它的拐角处有一个小徽章,还有一个小图标,但是现在你可以看到电路中发生的所有事情。你可以看到电流如何变化,可以看到电压和电流如何变化。没有隐藏的东西,没有什么可以模拟的。

我们在这里有另一种表示电路的方式。通常,你可以使用这些模块绘制任何电路,而不是由小小的弯曲符号构成,而是由数据构成。我认为重要的是要问:为什么我们首先要使用这些弯曲的符号?它们为什么存在?它们的存在是因为它们很容易在纸上用铅笔绘制。这不是纸。当你有了新媒体时,你必须重新考虑这些事情。你必须考虑这种新媒介如何使我们与正在制作的内容建立更直接的联系。这种新媒介如何使我们能够以一种能够看到自己正在做什么的方式工作。

编程情况也是如此。我们当前对计算机程序的定义是你交给编译器的文本定义列表,这些概念直接源于上世纪50年代的Fortran和ALGOL。这些语言是为打孔卡设计的。因此,你需要在一叠卡上键入程序,然后将其交给计算机操作员(下图中的那个人),稍后你会回来。因此,那时没有交互性之类的东西。这个假设已经融入了我们当前关于编程是什么的概念。

C语言是为电传打字机设计的。那是肯·汤普森和丹尼斯·里奇。里奇(Ritchie)创造了C语言。此图片中没有视频显示。里奇基本上是在花哨的打字机上打字,然后回传给他。每当你使用控制台或终端窗口时,你都在模拟电传打字机。即使在今天,人们仍然认为REPL或交互式顶层是交互式编程。因为这是你可以在电传打字机上做的最好的事情。

交互式动画设计

我还有一个演示要展示,因为我想强调一下这种直接联系的原则甚至与工程无关,它与任何类型的创作有关。我想完全搬到另一个领域,让我们考虑一下动画。

我这里有这幅画,上面有一棵树和一片叶子,我想拍点短视频,叶子从树上飘落。在Flash之类的常规动画程序包中,这样做的通常方法是通过关键帧。因此,你基本上要设置出你希望叶子在不同时间的位置,然后单击“播放”以查看效果。所以,我要说:好的,在第20帧,我要创建一个关键帧,并且叶子应该在其中。在第40帧处,创建一个关键帧,并且叶子应该在其中,而我在这里完全是猜测。我看不到议案。我感觉不到时机,我只是在时空里扔东西。

我在不同的时间点都设置了一片叶子,我将添加一个补间动画,它告诉Flash将点连接起来。然后我要点击播放,看看它是什么样子。而且看起来很荒谬,看起来像是台球来回弹跳。

事情是我有点知道我想要什么,对吗?它是一片叶子。我要一片叶子从树上飘下来。而且我甚至可以用手完成:叶子从树上飘落下来。但是Flash不知道如何监听从我的手部动作。但是,也许有一种新媒介确实能监听我的手部动作。

我在这里向你展示的是我为执行动画制作的一个小应用程序。而且我们还没有真正准备好在iPad上进行实时演示,所以我只想播放一下我制作视频的视频。这个场景的播放方式是树叶会从树上飘下来,场景会翻过来,兔子会做点什么。还有两件事:其一,这将移动的很快;其二,我将几乎总是用双手。我有这些不同的层,背景,中间地面和前景。我正在使用左手拇指选择要移动的图层。我要把叶子移到它的位置。我要把兔子从舞台上移开,开始滚动时间。现在我要表演从树上飘落的叶子。回去 看看外观如何。动作看起来不错,但是叶子需要来回摆动。因此,我要拔出一个旋转控制器,将其运行回去,找到叶子将要折断的位置,并记录旋转。我在那儿添加了一点翻转,只是因为此刻感觉正确。甚至没有计划。停下来,因为我想平移。因此,我要一次拖动一大堆图层,将所有图层抓到一个列表中,然后降低背景图层的灵敏度,以使它们移动得更慢以产生某种视差效果。我只想水平移动,所以我拉出一个水平拖动器并查看它的外观。我不太喜欢视差,所以我稍微调整了一下感光度,然后再试一次,我比较喜欢,所以我准备好了,我将其重新开始,这样我就可以重新回到乐曲的节奏上。叶子飘落,我等待一会儿,然后开始平移。而且我不知道我等待了多少帧,不知道已经等了多久,感觉合适时我就行动。

我把镜头移到了这个冬天的场景上,然后放慢了速度,停了下来。然后我把它放回去,因为我想用兔子做点什么。扔掉这些工具,因为我已经用完了。然后等到我认为我的兔子应该移动,然后它就跳开了。而且我的兔子还有几种不同的姿势。所以我把那些工具拉出来。然后我找到了兔子即将起飞的地步。在那里。当他跳开时,我切换了他的姿势,并且在姿势之间切换。然后我把它放回原处, 因为我想看看它的样子,我就把它全屏显示出来给你看,就是这幅作品。

所以我在2分钟内做出来了,就像用手演奏乐器表演一样。我和我想做的东西之间有非常直接的联系。

该工具的灵感之一是几年前我尝试制作的动画。不是那一个,但它也是从一片叶子从树上飘下来开始。我花了一整天在Flash中尝试设置该叶子的关键帧,没能做到,所以这就是它的结局。我还保留着我的故事板,有时我会播放我为作品写的音乐。但是作品本身被深深印在了我的脑海里。所以我总是在想,数以百万计的作品,它们被锁在数以百万计的脑海里。不仅是动画,不仅仅是艺术,还有各种各样的想法。包括至关重要的想法,改变世界的发明,挽救生命的科学发现,这些都是必须发展的想法。如果没有他们可以成长的环境,或者他们的创造者可以通过这种直接联系来培育他们,这些想法很多都不会出现。或者说它们会发育不良。

因此我有一个原则,即创作者需要立即联系,而我刚刚向你展示的所有这些演示都是来自于我的观察,注意到一些地方违反了这一原则,并试图解决这个问题。这其实就是我所做的一切。我只是遵循这个指导原则,它引导我去做我必须做的事情。

但是对于这个故事中最重要的部分,我还没有说太多,这就是为什么。为什么我有这个原则。我为什么要这样做。

我为什么要这么做

当我看到违反此原则时,我不会将其视为机会。当我看到创作者被他们的工具束缚时,他们的想法受到了损害,我不是说:哦,好,一个创造产品的机会,一个创业的机会。或者是进行研究或为某个领域做出贡献的机会。我对找到要解决的问题并不感到兴奋。我不是为了创造事物而感到高兴。想法对我来说非常宝贵。当我看到想法消逝时,我很痛心。我看到的是一场悲剧。对我来说,这感觉像是道德上的错误,感觉像是一种不公正。而且,如果我认为我有什么可以做的,我认为这样做是我的责任。不是机会,而是责任。

现在这只是我的事。我并不是要你像我一样相信这一点。我要说的是我使用的这些词语:不公正,责任,道德错误,这些不是我们在技术领域通常听到的词语。我们确实听到了这些与社会原因有关的词。诸如审查制度,性别歧视,环境破坏等。我们都承认这些事情是道德上的错误。我们大多数人不会看到侵犯民权的行为,并认为“哦,好,机会来了。” 我希望不是。

相反,我们非常幸运的是,在整个历史中都有认识到这些社会错误并将解决这些错误视为己任的人们。所以就有了这种积极分子的生活方式,这些人致力于为他们相信的事业而奋斗。本演讲的目的是告诉你,这种积极主义的生活方式不仅仅是针对社会活动主义的。作为技术专家,你可以认识到世界上的错误。你可以对一个更美好的世界有一个愿景。你可以全力以赴争取原则。社会活动家通常通过组织斗争,但你可以通过发明进行斗争。

他人的原则

Larry Tesler

现在我想向你介绍从拉里·特斯勒(Larry Tesler)开始的其他一些人。

拉里(Larry)在他的一生中做了很多很棒的事情,但是我要告诉你的有关他在70年代中期在施乐PARC所做的工作。那时候没有个人计算机这样的东西。个人计算的概念还很年轻,PARC的Larry和他的同事认为他们具有变革性的潜力,即个人计算可以改变人们的思想和生活方式。而且我认为我们这个会议室的所有人都同意事实证明他们是正确的。

当时软件界面是围绕模式(mode)设计的。例如,在文本编辑器中,你不仅可以打字,而且还可以像打字机一样在屏幕上显示单词。你将处于命令模式,如果要插入文本,则必须按I才能进入插入模式,然后退出以退回到命令模式,或者你可能会按A进入追加模式。或者,如果你想移动文本,请按M键进入“移动”模式,然后必须选择,然后进入该模式进行选择和移动。拉里(Larry)会观察人们使用计算机的情况--他们实际上率先提出了软件用户研究的概念,这是他做的另一件事--但他会观察人们使用该软件的情况,他发现即使经过培训和使用数周,仍然有很多人没有适应使用计算机。

他认为应该归咎于这些模式。模式的复杂性是许多人无法跨越的障碍。这种形式对个人计算机可能实现的梦想构成了威胁。因此,Larry将消除软件模式作为自己的个人使命。他形成了一个原则:任何人都不应陷入一种模式。他会四处说的口号是"Don't Mode Me In"(别模我,不要让我陷入模式),他把它印在他的T恤上。这个原则贯穿了他所做的一切。他所做的所有工作都在思考这个问题。最终,他提出了一个名为Gypsy的文本编辑器,它基本上引入了我们今天所熟悉的文本编辑。有一个光标点,当你键入内容时,屏幕上会出现文字。为了选择文本,他发明了通过单击和拖动的无模式选择。你只需单击并拖动你想要选择的文本,就像使用荧光笔一样-- 拖动的最早用途之一。为了移动文本,他发明了称为“剪切,复制,粘贴”的命令。你选择并剪切以后,只要准备好就粘贴。永远不会陷入模式,也不必在模式之间切换。当你在键盘上按W时,屏幕上显示W,总是如此。

他观察人们使用他的软件,他发现,一个从未见过电脑的人--也就是当时的大多数人--可以在半小时内完成操作。所以这显然是一个让人们与电脑连接的革命性变化。而他关于无模态的想法也传播到了当时在PARC发明的其他window界面上。而今天,它们在计算体验中已经根深蒂固,以至于今天的我们觉得它们是理所当然的。

现在我说拉里将消除模式作为自己的使命。这实际上是他的话,如果你认为他太夸张的话,这是过去30年里拉里的车牌。当然,如今拉里(Larry)拥有一个网站,nomodes.com,并且在Twitter上:@nomodes。就像我说的那样,拉里在他的职业生涯中做了很多了不起的工作,但他的自我身份显然与此原因有关。

所以我想问:拉里到底做了什么?就像我们如何最好地描述拉里的所作所为?典型的传记可能会说拉里·泰斯勒(Larry Tesler)发明了剪切、复制、粘贴。的确如此,但我认为这确实令人误解,因为这项发明与托马斯·爱迪生(Thomas Edison)发明留声机的说法大不相同。爱迪生(Edison)基本上只是偶然发现了录音技术,他将其建立为一种新颖性。他提出了自己的技术可能应用的清单,但他没有任何文化意图。拉里所做的完全是对特定文化背景的反应。

因此你可能会听到的另一件事是Larry Tesler解决了无模式文本操作的问题。解决了问题。显然,这是事实,他在这个问题上研究了很长时间,最终解决了这个问题。但是我认为这也确实令人误解,因为他解决的这个问题只存在于他自己的脑海中。没有人认为这是一个问题。对于其他人来说,模式就是计算机的工作方式。就好比我们认为拥有两只手臂有什么错。这只是生活中的事实。

拉里所做的第一件事是,他认识到一种错误,这种错误在文化中是未被承认的。事实是,这带来了许多巨大的社会变革。在150年前,伊丽莎白·卡迪·斯坦顿(Elizabeth Cady Stanton)必须站起来说:妇女应该投票。每个人都说'这太疯狂了,你在说什么'。今天,我们认识到性别歧视是错误的。那时候,它是社会的一部分,它是无形的。她必须认识它,并且与之抗争。

对我来说,相对于托马斯·爱迪生(Thomas Edison)发明了许多随机技术获得专利的模式,这是一个更接近于拉里(Larry)所做的发明模式。

要说明的是,我没有对这两个人的相对重要性或影响做出任何判断,我只是在谈论他们的动机和方法。他们都认识到了一种文化上的错误,他们憧憬着一个没有这种错误的世界,并致力于为一个原则而奋斗。她通过组织而战,他通过发明而战。

Doug Engelbart

在计算领域,许多其他开创性的人物也有类似的动机。比如道格·恩格巴特(Doug Engelbart)。Doug Engelbart基本上发明了交互式计算,将信息放在屏幕上的概念。以不同的方式查看浏览信息。指向事物并操纵它们。在几乎没有听说过与计算机进行实时交互的时候,他提出了所有这些建议。今天他以鼠标的发明者闻名,但他真正发明的是这种全新的知识处理方式。他从一开始就明确的目标是使人类能够解决世界上的紧迫问题。在他的愿景中,他具有所谓的知识工作者愿景,即使用复杂的强大信息工具来利用他们的集体智慧。他之所以进入计算机是因为他有一种直觉,即这些称为计算机事物的新事物可以帮助他实现这一愿景。他所做的一切,几乎都是为了追求这个愿景而一心一意地推动。

Alan Kay

这是艾伦-凯 艾伦-凯在施乐公司的PARC实验室工作,在那里我们得到了window界面,例如像窗口和图标,命令菜单这样的东西,他还发明了面向对象的编程和很多其他东西。他的目标,我引用他的话,是“扩大人类的影响力,并为迫切需要它的步履蹒跚的文明带来新的思维方式。” 这很好不是吗?他的方法是通过孩子。他认为,如果孩子们能够熟练地使用计算机进行思维,这意味着如果编程是一种基本的读写能力,就像阅读和写作一样,那么他们就会以崭新的批判性思维和理解世界的新方式成为成年人。 我们将拥有一个更加开明的社会,类似于识字给社会带来的差异。他所做的一切,他所发明的一切,都是为了追求这个愿景,这个与孩子们有关的目标。遵循他从伯爵(Piaget)和蒙台梭利(Montessori)杰罗姆·布鲁纳(Jerome Bruner)采纳的原则,这些人将研究儿童如何思考。

Richard Stallman

理查德·斯托曼(Richard Stallman)可能是与软件行动主义最广泛相关的人物。Stallman启动了GNU项目,该项目如今已构成任何Linux系统的很大一部分。他还创立了自由软件基金会,撰写了GCC,GPL等许多其他内容。他的原则是,软件必须像自由一样自由,并且他具有与该声明相关的非常精确的含义。他一直很清楚,软件自由是道德上对与错的问题。而且而他在自己的人生中,对此也采取了特别不妥协的态度。

所有这些有巨大影响力的人,都是以非常明确的是非观,把自己的一生献给了一个特殊的理想,为之奋斗。通常是在与没有意识到自己的错误是错误的权威或主流斗争。如今,世界距离他们的理想还很遥远,所以他们仍然看到一个危机四伏的世界,他们持续在战斗着。他们一直在战斗。

你的原则

我并不是说你必须这样生活,也不是说你应该这样生活。我想说的是,你可以这么生活。这种生活方式是可以供你选择的一个选项。这不是你经常听到的一个选择。你的职业顾问不会说你应该开始一个人的征战了。在社会领域,他们可能会,但在技术领域却不是。相反,世界将尝试使你通过技能来定义自己。

这就是为什么你有大学专业,这就是为什么你有一个职位。你是一名软件工程师。而且你可能会专门成为数据库工程师或前端工程师,并且将被给予一个前端样式,对其进行工程设计。那可能是有价值的,如果你想一生追求卓越并练习技能,那么你可以做到。那是工匠的道路。那是最普通的道路。你真正了解到的唯一其他途径是问题解决者的途径。

我将企业家精神和学术研究视为硬币的两个方面。存在着一些领域。领域里存在一系列问题或市场需求。你进去,选择一个,在其中工作,就可以在这里做出自己的贡献。也许以后,你选择另一个问题,然后解决它,你在那里做出贡献。同样,这可能是有价值的,如果你要这样做,那么你可以走这条路。

但我没看到Larry Tesler在这两条路上。我不会说他是在为用户体验设计领域做贡献,因为没有这样的事情。他没有选择一些开放性的问题来解决,他提出了一些只存在于他自己脑海中的问题,甚至没有人认可。当然他也没有用手艺来定义自己。他用事业来定义自己。由他所坚持的原则而奋斗。我相信如果你看维基百科,会说他是一个计算机科学家或者用户体验什么的,但对我来说,这就像说伊丽莎白-卡迪-斯坦顿是一个社区组织者一样,不,伊丽莎白-卡迪-斯坦顿建立了妇女选举权的原则,这是她选择的身份。而Larry Tesler建立了无模式的原则。他有这个愿景,他把世界带到了这个愿景中。

所以,你可以选择这种生活。或者也许它最终会选择你。它可能不会马上发生。你可能需要时间来找到一个原则,因为找到一个原则本质上是一种形式的自我发现, 你试图找出你的生活应该是什么。你想作为一个人站在什么地方

我花了十年的时间才真正理解了我的原则。

那是我二十几岁的时候,当我还年轻的时候,我觉得我必须这样生活... ...我会得到一些对我来说很重要的东西,但没有大的前景。(前途)真的不清楚。这让我很苦恼。我要做的就是做很多事情。做很多很多类型的事情。研究很多东西,经历很多很多的事情。用所有这些经验来分析自己。体验所有这些经历问自己,这能引起我的共鸣吗?这让我排斥吗?我不在乎吗?回顾那些具有强烈感受的经历, 并试图去理解这些经历,找出原因。我对这些经历的反应如此强烈的更底层的原因是什么?

我想每个人都是不同的,我上面讨论过的那些人... ...他们都有自己的起源故事,你可以读到。我只想说,把自己局限在练习一种技能上,会让你很难获得广泛的经验,而这种(广泛的)经验对于这种工作来说似乎是非常有价值的。

最后,如果你选择遵循一个原则,原则不能只是你相信的任何旧的东西。你会听到很多人说他们想让软件更容易使用。或者他们想让用户满意。或者他们想让事情变得简单。这是一个非常大的远景,每个人都想让事情变得简单。这些都是不错的想法,也许能给你一个方向,但它们太模糊了,无法直接付诸行动。Larry Tesler喜欢简洁。但是他的原则是这种特定的洞察力:任何人都不应该陷入一个模式中。而这是一个强有力的原则,因为它给了他一种看待世界的新方式。它以相当客观的方式划分了世界的对与错。因此他可以看着某人选择文字,然后问:这个人是在一个模式中吗?是还是不是?如果是,他就得做点什么。而同样的,我相信创作者也需要强大的工具。这是一个很好的想法,但它并没有真正让我得到任何好处(因为这个想法太空洞了)。我的原则是,创作者需要这种直接的联系。所以,我可以看着你修改一行代码,我可以问: 你是否立即看到了改变的效果?有还是没有?如果没有,我得做点什么。

再说一遍,我给你们看的那些演示都是我做出来的,遵循这个原则,让我领会到我真正需要做的事情。所以,如果你在引导一个原则和特定的见解,它就会引导你。而且你总会知道你所做的事情是否正确。

生活有多种方式。这也许是你一生中能意识到的最重要的事情,你生活的每一个方面都是一种选择。但也有默认的选择。你可以选择在你的生活中梦游,接受已经为你安排好的道路。你可以选择接受这个世界的现状。但你不必这样做。如果这个世界上有什么你觉得是错误的,而你又对一个更好的世界有憧憬,你可以找到你的指导原则,而且你可以为一个事业而奋斗。所以,在这次谈话之后,我希望你能花一点时间,想想什么对你来说很重要。你相信什么。还有你可能为之奋斗的东西。

谢谢大家。

参考