Archive for 2011年7月

Premature Optimization

2011/07/26

昨天在知乎上看到有人问某领域的基础学习是否可以有所侧重裁剪的问题,第一反应是:学习基础得不能再基础的东西还裁剪什么?由此不由得想到了简化字。从有草书和行书开始,简化字的存在其实也有几百甚至上千年了。建国后的汉字简化过程,其实只不过是正字废除过程而已。丢弃的知识不说,语言本身在某些方面反而被复杂化了,有些本来可以通过单字明了的意思,比如船只的「隻」和只有的「祇」,现在必须通过上下文分辨。

软件开发领域之外无数草率的裁剪,和软件开发的「 premature optimization 」本质上属于同一种行为,拥有共同特征。第一是基于假设的而非真正的 hotspot 。软件开发的 premature optimization 不经过 profiling ,所以经常发现辛苦优化的代码在使用中很少被调用,优化所得的效率提高完全被边缘化。简化字号称能加快汉字认读,其实以汉字认读为主的学习阶段只有两年左右(还是在兼学其它科目的情况下),而现代中国人以学习为主的过程持续九年到三十年以上。简化汉字牺牲文字带来的收益其实得不偿失。

最成功的软件系统是那些最终用途超乎设计者想像的系统,像 UNIX 操作系统及其各种工具,C 语言,Photoshop 等等。Premature optimization 大大降低了这种可能性,让系统能顺利经受预料之外情形的能力低下。至少,在外界情况发生变化时,premature optimization 所允诺的优势的往往烟消云散。今天学简化字成长起来的这一代人,认读正体字毫无困难。这是当年行书和草书的设计者们在长年积累中对认读心理的直观认识的结晶。这说明在认读方面正体简体并无区别。那么正体废除运动的优势似乎就只有书写一路了,偏偏今天的汉字书写又计算机化了。人类永远不知道自己预言未来的能力有多差,而勇于否认这点的莫过于 premature optimization 的施行者。

好在当年汉字拉丁化这个终极优化方案被否定了。这里不是要悲叹正体字在神奇大陆的消失,而是要借此说明 premature optimization 的本质邪恶。优化是我们可以清谈的东西,是可以做理论研究的东西,是可以边边角角尝试的东西,但绝不是指导下一大步的方针。

黑客的闲暇

2011/07/12

有时候空闲下来不知道该干些什么。这时要是能找到一个有意思的问题来研究会感觉很充实。若面对的不是纯粹知识理解的难题而是一个有实际需求的问题,并且又能做出点什么东西满足这个需求,那心情就更好了。但更多时候是,即使闲着难受,也会觉得时间太短不够解决意料之中和意想不到的困难而难以鼓起勇气真正动手。

上周一整周都在休假,其中不少时间花在读剩下的少半本《 Snow Crash 》上。这本书断断续续读了一年半的时间。这类小说让我兴奋的地方在于看过之后,再面对普通工作时感觉那些东西多多少少带了一点向 cyber 世界慢慢前进的味道。主人公 [1] 用代码构建和打破 Metaverse 的规则或者拿着电脑 hacking 是我最喜欢的情节。讲到 hacker 和 hacking [2] ,作者 Neal Stephenson 是个行家,虽然这是本带有很大政治和文化成分的科幻小说而不是像《 Hackers & Painters 》那样的专门讨论 hacker 文化的文集,而且是在 1992 年的 IT 石器时代 [3] 写成,但是其中蕴含的很多 hacking 的精髓是这两年我才渐渐了解的。这是我近一年来越来越喜欢这本书并且决心在一周里读完剩下半本的原因。

在小说里最后一场大战开始之前,Hiro Protagonist 乘坐的 Mafia 游艇被 Raven 所在的潜艇击沉,他们一行四人的救生艇飘荡在太平洋上。一个无聊的 hacker 会做的自然是 Hacking !

Hiro does not know what he is doing, what he is preparing for. That’s okay, though. Most of programming is a matter of laying groundwork, building structures of words that seem to have no particular connection to the task at hand.

Metaverse 是个三维的虚拟现实世界。不过在救生艇上,为了延长电池续航,Hiro 特地进入了自己的纯二维工作空间 Flatland。让我觉得自己为了节省电池在 09 款的 MacBook Pro 上 re-login 的切换到集成显卡是个挺酷的举动。读完整部《 Snow Crash 》,我最喜欢救生艇上这段情节。因为背个笔记本电脑到处乱跑就是我在大学读书就有的梦想。写完一个简单的工具之后,Hiro 开始准备在 Metaverse 里最重要的工具,一个『隐身』的 avatar :

To write a really good invisible avatar from scratch would take a long time, but he puts one together in serval hours by recycling bits and pieces of old projects left behind in his computer.

什么都从头写起也许是有些人刚出道时的野心,不过对大多数干过几年的程序员来说,有东西能被『 recycle 』并且能用这些零碎『 put one together 』才是真正的资本。所以,在有时间有精力的大项目里要 leave behind 什么东西,才能有朝一日在『救生艇』上 put together 一件趁手的兵器?这是个严肃的问题。

除了看书,休假的这一周还受朋友之托要写个简单的小工具。我没有大块时间可用。倒是如上所讲,有些时间看小说,不过休假前半个多月的工作到了这样的程度,那些时间不用来看看小说其实也支撑不了什么脑力活动。但答应的东西要做,好在不是什么和 Apple 竞争的商业界面。我决定用而且只用 Adobe Bridge 的 ExtendScript [4] 来搞这件事情。编码和读小说是交替进行的,当读到 Hiro 救生艇 hacking 这段的时候,小说和现实仿佛重叠了。最后我终于 put together 出一个还说得过去的东西。作为正式工具来说太粗糙了。我觉得很大一部分原因是以前从未真正考虑为这样的『 put together 』leave behind 什么像样的东西。

我考虑从现在开始应该为 leave behind 做点什么准备。看来最终在『救生艇』上 put together 一定是用『高级动态语言』来完成。但太粗糙的东西不行。最后用『高级动态语言』拼接的『 bits and pieces 』必须是称手的、精致的。所以得用『集成污染』最少的语言 [5] 打造最好的模块。所以,我要再深入的学习 Lua ,而且开始考虑给我的所有 code base 加上 Lua 集成。

脚注:

  1. 主人公就叫 Protagonist。
  2. 这里的 hacking 和 security 没有直接关系。是《 Hackers & Painters 》里说的那种 hacking 。
  3. 1990 年的时候父母要给我买台电脑,我为他们乱花钱感到极大的惊恐。1993 年我有第一台电脑,以为要解决问题必须用 BASIC 来编写程序。
  4. 一个 JavaScript 的定制版本。和普通的 JavaScript 不同,ExtendScript 运行在 Bridge 而不是 Web 浏览器中。DOM 也和一般操作 HTML 和 CSS 的 DOM 完全不同。它基本上是用来编写桌面 UI 的。
  5. 集成污染