Archive for 2011年6月

容忍度的拐点

2011/06/13

For the average user this new kind of [Web] software will be easier, cheaper, more mobile, more reliable, and often more powerful than desktop software.

—— Hackers & Painters, The Other Way Ahead

The intended role for the Macintosh was as a client operat-ing system for nontechnical end users, implying a very low tolerance for interface complexity. Developers in the Macin-tosh culture became very, very good at designing simple interfaces.

—— The Art of UNIX Programming

我有个朋友最近忙着补救项目中走弯路浪费的时间。在项目早期,他们的 team 里有过一次大争论:UI 是全部采用 native 代码还是部分采用 Flash 。最终的结果是 Flash 一派占据了上风。理由是大客户相信 Flash 的『成功案例』。当然,像我朋友这样做过『消费者』应用的人认为所谓大客户的意见都是『企业开发』的狗屎。

事情的发展是,虽然 Flash 方案确实比 native 方案有更多开发便利(比如更方便的内存管理,更可靠的 exception 处理,以及从上一个『大客户企业方案』中继承下来的部分 code base ),但是在这个项目里反而拖累了开发进度。整个 UI 没法形成一个整体。在早期争论中被祭出的『大客户』也渐渐让位给习惯了 Apple 产品和 Photoshop 之类软件界面的挑剔消费者。走过一段弯路之后,整个项目重新回到纯 native 方案。

这让我回想起 2001 年前后,我的程序员生涯中最『惬意』的一段。因为客户很『 resonable 』,我可以经常告诉他们这个或者那个『没法做』。为什么呢?因为客户相信 Java ,他们的整个 IT 基础建立在 Java 上,他们要求我们用 Java 。所以,当你证明了 Java 不能做一件事情之后,你就证明了宇宙的最高法则。所以,是这些家伙自己放宽了自己的容忍度。

最近有一本 Paul Graham 的作品集《 Hackers & Painters 》在国内出版,网上讨论和引用很多,总体来说这是本不错的书。其中第二篇《 The Other Way Ahead 》把 Web 技术描述为软件开发未来的趋势。如果审视一下这个『未来的趋势』,我们会发现同样的问题。你想关闭某个文本框的拼写检查,而在另外一些文本框里打开吗?Web 做不到。如果你无意中按住鼠标拖过页面,划过的文字可以不被高亮选中吗?Web 做不到。希望你的『 Web app 』支持 undo/redo 的快捷键吗?Web 做不到。你的 Web app 可不可以有一个真正的『护栏』防止用户做某些从任何意义来说都不合时宜的操作而不是仅仅规劝或者提醒吗(比如点浏览器的 Back 键)?Web 做不到。 ⋯⋯ 当然,用户不会因此特别不满意。他们会说:这是个网站,有什么办法。我经常听到有 Web 开发者说:我们能掌控整个 server ,所以我们可以自由选择合适的高级语言来完成任务,而不像可怜的 native 应用开发者。他们错了,是用户放弃了对他们的应用的品质的要求,用户认为那是个网站。

作为单独 app 的 Google Earth 和作为『网页』的 Google Map 有什么不同?那就是下面这种处理网络延迟的情形在任何一个 app 的 beta 版里都是不能容忍的:

面对这些问题,乐观的 Web 开发者经常说『情况已经不是那样了』或者『马上就不是那样的』。是啊,从 canvas 这样的机制引入 HTML5 可以看出 Web 提高用户体验的努力(但是暂且别说 canvas 的支持目前有多么脆弱)。可是,用户中最挑剔的那部分的容忍度也是变化的。以 version control 这个程序员的工具来说,以前字符界面就很好,今天很多人在用矢量图界面来处理复杂的 branching ,也许明天就会有 3D 化的 UI 。软件的一个基本要求是根据用户操作改变界面的状态,比如在 Word 里改变一下行宽,或者在 PowerPoint 里修改阴影,或者按 Cmd+T 让 Firefox 创建一个新 tab ,用户一开始对这些变化没有过多要求,所以软件都是从上一个状态突变到下一个状态;然后,用户开始要求在状态变化中显示一些重要的中间态;今天,大多数变化都要求用平滑的动画显示。而 Web 技术在追赶这些不断收紧的容忍度时,其实已经失去了一部分作为『未来趋势』的优势。比如,所谓 watching users 的优势,只对于像 CGI 那样每个操作触发一次 client-server traffic 的应用才有用。为了追求用户体验而不断引入 client-side script 和 AJAX 的 Web ,在这方面早就慢慢和 native 应用拉平了。

回顾技术的发展,其实没有什么焕然一新的方案能够在不牺牲用户体验的前提下大幅度减轻程序员的工作。那些所谓的快速开发手段,只是用 PR 攻势来催眠用户放宽容忍度。这个是 cross-platform 。那个是『云』。用这些概念来降低用户的期待。当然不否认,某些技术提供了一些当时用户急需的便利,可以认为它们要求用户放宽容忍度的方式在一定期限内是合理的。关键在于,开发者往往看不到用户为便利付出的代价(而且常常是程序员独有的便利)。当一些开发者抱着用户和开发者都获得了『免费』便利的错觉时,这种技术就成了他们眼里『未来的方向』(这个词是我从《 Hackers & Painters – The Other Road Ahead 》某些段落的字里行间中读到的。当然《 Hackers & Painters – The Other Road Ahead 》这篇文章里有很多观点是建设性的,比如对软件演进和技术支持和对团队士气的看法。对 Web 过于乐观的态度,考虑到其写作的时间也情有可原。只能说,如果作者到今天还是这些观点,就略显自大了)。开发者要避免这种自大,要清楚自己和客户为了一个方案各自付出了什么,用户何时会失去容忍度。失去这种自知之明是某些 Web 时代的人面对 native 程序回归时表现出吃惊的原因。

机械打字机

2011/06/04

纸质笔记本和机械打字机

高级动态语言与软件业 —— 交流与内省

2011/06/01

一直以来,我都认为编程语言是程序员之间的语言,是人和人交流的工具。主流编程语言最重要的特性是清晰、准确,开发者个人在使用中是否感受到的灵活、简洁、优雅则是次要的。这是把编程语言和同为交流工具的自然语言比较,同时又因为两者构建文化认同的程度有所不同,所得出的结论。

接触高级动态语言也已经有近四年,一直觉得虽然它们并不适合作为程序员交流的工具,但绝对是程序员的工具箱里不可缺少的一样东西。几个月前写了一篇《高级动态语言与软件业》,主要观点是,语言概念相对简单,用法相对固定的静态语言更适合构建商业级别的产品,而高级动态语言只限用于符号推导系统。之后是对 Lua 的学习和《集成污染》。高级动态语言并非我所能认同的交流工具,但又具有不可否认的必要性,我经常重新考虑『编程语言/自然语言』这个类比应该如何涵盖高级动态语言。

今天和别人讨论 Objective-C  vs. C++ ,突然回忆起到半年前看的《 What Technology Wants 》里对自然语言的描述:

The creation of language was the first singularity (注1) for humans. It changed everything. Life after language was unimaginable to those on the far side before it.  …  But the chief advantage of language is not communication but autogeneration. Language is a trick that allows the mind to question itself; a magic mirror that reveals to the mind what the mind thinks; a handle that turns a mind into a tool.

这时我想到自己从未把自然语言的『自省』功用和编程语言联系到一起。也就是上文引用里的所谓『 question itself 』,『 reveals to the mind what the mind thinks 』。如果把『自省』这个元素考虑在内,『编程语言/自然语言』这个类比就更完整。复杂的产品中用户定制和核心算法的符号推导部分更加接近『自省』而非『交流』。而且,很多有经验的程序员都说过,你不一定要用它来开发产品,但是学习一门高级动态语言能让你更了解编程的本质。这和自然语言的『自省』功用更接近。最后,自然语言的『自省』功用大于『交流』,编程语言的『自省』功用也很重要,但应该退居『交流』功用之后。因为毕竟程序员不是机器,他们的思考大部分还是通过自然语言完成的。软件产品也不是机器人,很多功能进化依然是通过用户反馈、迭代开发加更新发布而非简单的定制完成的。

脚注:

  1. 顺便说一下,在读到这段文字之前,尽管我知道『技术奇异点』之后和之前就像人和动物的区别,但是我从来没直接意识到自然语言就是史前的奇异点。