« November 2008 | Main | January 2009 »

December 31, 2008

让 Erlang 的控制台支持中文

Amazon 的书送的真快,原来以为周三才能到的,结果昨天就到了。表扬一下。

拿到《Erlang 程序设计》,花了一晚上读了 1/3 。今天实作了一下。

发现在 Ubuntu 下用 apt 装的 Erlang (5.6.5) 的 Shell 不支持中文,这让我郁闷了一把。:(

好在 Erlang 是开源的,有源码在手,有何畏惧。晚上,我卯足了劲研究 Erlang 的 source code ,想找到不支持中文显示的原因。

表现是这样的,我的环境是 UTF-8 ,当我输入汉字时,在 Erlang Shell 里立刻被转义为了 \xxx 这样的 8 进制数。在《Erlang 程序设计》的 2.11 / 21 页写道,“这实际上是显示终端的字符集和区域设定有问题”。我改了半天,都没有把汉字鼓捣出来,感觉不是我的设置问题。

但是,在同事的 Windows 机器上的 Erlang Shell 下却是可以正确显示中文的。

我想,读读源码也好,正好可以实际体会一下 Erlang 的代码风格。


在读代码的过程中绕了不少弯路,找到许多貌似会影响输出的地方,改过后都没有效果。

比如在 erts/emulator/beam/erl_printf_term.c 里有一个 IS_CNTRL 的宏,为 LATIN1 的字符集 hard code 了一些东西,有兴趣的同学可以看看,其中也有一些字符转换的工作。

类似的地方就不多说了,稍微浏览过 Erlang 底层的一些 C 代码后,感觉质量还不错,不过在可移植性和 C 语言标准上,没有 Lua 的源代码严谨 :) 。因为 Lua 里就没有为某些字符集特别定制的代码。好吧,我就看了几个小时而已,权当是一个偏见。

最终找到了关键的地方,一共有两处:

一处在 lib/stdlib/src/io_lib.erl 文件里,打开这个文件就可以看到前面有些关于 ISO 8859-1 / Latin-1 的信息。 搜索这个文件,会发现它把 $\240 到 $\377 之间的字符认为是可以打印的。但是对于 UTF-8 编码来说,这不够。把 $\240 改成 $\200 即可。

在 Erlang Shell 里,只有整个整数数组里的数字都是可打印字符,才会显示成 "xxxxx" 的形式,否则就是 [xxx,xxx,xxx,xxx] 这样的。做了这个修改后,就不会在有 UTF-8 的中文串被转换为 [数字] 了。

第二处在 C 代码里。

因为 Erlang 的内部是自己管理的若干进程(非操作系统进程),为了让用户输入和输出可以统一,所以实际上,和用户交互的 IO 是序列化在一个进程里完成的。因此,我们看到的 io:format 的输出,其实是向管理 IO 的进程发了一个消息而已。

为了找到这个最终真正处理输入输出的进程,我查看了 Erlang 的源代码,就是 lib/kernel/src 的部分。最后发现,是 user 模块做最终的汇总,然后交给 user_drv 去处理 IO 。

但是,我们知道 Erlang 自己是不可能完成 IO 操作的,必然会涉及 C 实现的代码,去跟 OS 交互。在 user_drv 里我们发现了一个叫 tty_sl 的东西。这就是 C 实现的终端部分了。

Erlang 和其它语言交互的方式很有趣,是用进程间(不一定是操作系统级的)通讯完成的,用二进制数据流交互。这跟我们游戏服务器的过进程结构很像。不得不说,Erlang 做的非常优美。今天太晚,不展开评论了。

回到主话题上,这个 tty_sl 的实现在 /erts/emulator/drivers/unix/ttsl_drv.c 。读一读这个源文件,大概就能理解 C 模块如何跟 Erlang 交互的了。

关于中文显示的问题,正在于,这个实现中,hard code 写死了当字符大于等于 128 时的处理方法:转换为 \八进制表示。

我简单增加了一个 ISPRINT 宏,替换掉原来的 isprint 调用,让大于等于 128 的字符也返回 true 。重新编译安装后,Erlang 的 Shell 就可以在 Ubuntu 下正确显示中文了。

不过还有一个问题,光标的处理不太正确,比如退格键可以消掉半个汉字。我想,比较简单并健壮的修改方法应该是把这个 tty 服务的内码改成 UCS-2 的,这样比较容易让单个汉字变成原子的。当然,想办法让它正确处理 UTF-8 的内码也行。

留到以后再改吧。

December 28, 2008

关于词典软件

从去年开始关注 Erlang ,我们组里已经有三个同事学习了好长段时间了,并有一个同事有实际的项目经验。前几天的 erlounge iii 我们有一个人过去听,回来后滔滔不决的跟我又咕叨了许多,这使得我周末突然有兴趣仔细读读 《Programming Erlang》这本书了。

btw, 原来打算去上海参加 erlounge 的。正好那个周末我们北京机房挪地方,导致我的域名解析服务器更换 ip ,那是件麻烦且必须快速处理的事情,迫使我留在办公室哪都没去。

网上订了一本《Erlang程序设计》,要到下周才送到,那么就先下载英文电子版研究一下了。

嗯,不过这篇 Blog 不打算写 Erlang ,只是谈谈电子词典软件的问题。

词典软件我用的 有道词典 桌面版。毕竟是自己公司同事开发的,有意见可以即时反馈。据说在屏幕抓词方面也好过金山词霸。可惜不能抓 Foxit Reader 的。在线问了一下,说是我的 Foxit Reader 版本太老了,而词典早就支持 Foxit Reader 2.2 了。

去官网下载了 Foxit Reader 3.0 版,发现取词还是不太稳定。把 OCR 模式打开好了一些。

我对屏幕抓词的功能本来就没啥兴趣,试了下不太满意,就作罢了。对于我来说,那个弹来弹去的取词框更多的时候是种干扰。我想,连我这种英文单词量极少的人都有这种感觉,那么更多的人相信也会有同感了。

如果我真的满屏幕一半的单词都不认识的话,干脆用翻译软件看好了。词典软件恐怕也帮不了什么忙。

对于这个问题,有道的同事的说法是,活用取词热键。只在需要的时候取一下。这样也不错,但我觉得不是根本的解决方案。

即使对于取词的形式,我也曾经提过一些建议,但是没有得到认同。那就是,提供一种模式,取消弹出的取词框,而是直接显示在词典软件的主窗口里。我自己爱把词典窗口放在哪都可以。最后,针对我的建议,给出的是一种折中的模式,这里就不详细说了。


今天,我想起了 10 多年前自己做的一个 DOS 小软件。打开一个英文文本文件,在屏幕的最下方显示当前光标行上的生僻单词的中文解释。那个软件是没有词典库的,而是靠人工在阅读的时候手工输入。但正是手工输入,可以判定,被输入的词一定是对于我自己的生僻词。

这样,词典对阅读的干扰是很小的,而且集中在屏幕下方的固定位置。当年,我就是这样翻译 Allegro 手册的。手边放一本字典,遇到不认识的词查一下,输入到机器里,下次碰到了,自动在屏幕下方显示出来。

现在,这个想法依然有价值。

如果我们可以根据用户的查询历史,根据整个软件的用户查询习惯,根据生词在网上出现的频率,猜测出哪些词可能是用户不认识且关心的。再根据当前屏幕上出现的英文单词,挑选出 5 个放在屏幕边栏上显示它们的翻译。我想,这是对阅读英文的用户来说干扰最小的方式了。

允许用户方便的点掉那些软件猜测错误的单词(比如显示了他已经认识的),将能协助软件更好的适应他。除了已有的屏幕取词定位功能外,还可以在查询单词的输入框里,结合屏幕上出现的生词,对用户的输入做联想,自动完成用户的输入。

这个模式甚至不需要特别精准的屏幕取词,或许用某种新方法去获得内存里的文本就行了。OCR 模式也可以更有效的在后台工作。用户在使用的时候,遇到不认识的词,第一反应是向词典软件窗口里瞟上一眼,这比动动鼠标要轻松的多,当然对软件实现也更有挑战。


前几年,popo 组的同事跟我闲聊的时候曾经说起,她觉得应该给 popo 的好友列表加上多级分组的功能。现在分组太多,寻找分组都是件麻烦的事情。我说,你的最终目的是找到你想找的那个联系人,定位更细的分组只是你完成这件事情的一个环节,不是你的目的。不如先把利用拼音声母定位用户的功能做出来更有意义一些。

为此,我还专门为 popo 组的同事制作了一份汉字声母的查询表文件。

前天,有个朋友问我,你认为 google talk 和其他 IM 软件的根本区别是什么?

我说,在我看来就两点。1. 智能排列的联系人名单。 2. 可以用不同的方式,同时多处登陆我的同一个 gtalk 帐号。

其他,所谓简洁的界面,开放的标准,和 email 结合,轻量的客户端,都不是重点。

gtalk 可以在我给一个人写过 email 后,接下来的几天,只要这个人上线,立刻窜到我的联系人首页;可以在我多年没联系的朋友上线后,优先停留在名单可见的地方;可以让那些我不常回复的联系人较低频率的出现在我的眼前。

而这些,是不需要我去滚动长长的滚动条,翻阅我的分组的。事实上,google talk 也因为此,“霸道” 的不提供联系人分组,并推荐只显示一页联系人,而在主界面上去掉滚动条。

有时候我发呆的时候,不经意的看着我的 gtalk 联系人列表,看着它缓慢的刷新那七八个名字,每每能给我惊喜。让我心血来潮的跟我那上百联系人中的某一个打个招呼。我几乎有种幻觉,这个软件可以猜到我心里在想什么,我想找个人,那个人就出现在眼前了。而别的 IM ,比如我已经很久不用的 msn ,只会不停的用飘窗骚扰我,XXX 上线了。


对于一个优秀的人机交互界面来说,软件应该尽可能的猜测用户想做什么,自动帮他去完成,从而把 交互 减少到最少;而不是堆砌一大把的工具,提供一套 友好 的交互方式,放在那里等用户自己拿出来组合起来解决问题。

用户需要的是解决问题,而不是欣赏工具。


ps. 写这篇 blog 的过程中 Chrome 崩溃了一次,导致大部分文字丢失,重新写的时候兴致小了很多,对原来想写的东西做了大量了删减。:(

我说,浏览器崩溃的时候,就不能想办法把输入框里的东西找个位置优先备份一下么?输入框里的用户输入,即时的放在内存中固定位置,直到用户离开页面再扔掉。如果一旦发生程序崩溃,Catch 住异常后,把固定位置内存里的数据写到 log 文件里,应该不是啥难事吧?

December 23, 2008

一种对汉字更环保的 Unicode 编码方案

Windows 早期默认支持的中文编码方案是 GBK ,它是对早期 GB2312 的一个扩展。后来国家又发布了 GB18030 标准,扩展了 GBK ,增加了一些 Unicode 里才有的汉字,这样就可以做到和 Unicode 字符集做完全的映射了。

而后来 Unicode 逐渐成为标准,几乎所有的系统处理多国语言时,都把 Unicode 做为默认设置了。Unicode 有两套编码集,UCS-2 和 UCS-4 ,后者是对前者的补充,虽说字面说写的 4,但实际上只用到了 3 个字节不到。

Windows 的内部其实是用的 UCS-2 标准,并用 UTF-16 来实现。而非 Windows 系统大多采用了 UTF-8 。UTF-8 在很多情况下更有优势,首先它不需要考虑大头小头的问题,其次,数据损坏的时候,不会有半个汉字的问题。并且 UTF-8 可以完整的表达 UCS-4 而不需要有额外的付出。

前几年,处于 Windows 程序员转型期,经过一些痛苦的实践,我终于意识到,VC 提倡的所谓为软件维护 UNICODE 和 非 UNICODE 两个版本是件巨傻 X 的事情。之后,我们的程序再也不为内码分版本了,一律采用 UTF-8

不过,UTF-8 的设计明显是用英文为主的西方人搞出来的东西。对于中文一点都不环保。所有汉字和中文标点都需要 3 个字节才能表达。而少量欧洲字母可以用 2 字节表达,英文的 ASCII 符号则可以只用单字节。

我不指责这个设计,因为兼容 ASCII 是 UTF-8 的最大优势。其它,则是 KISS 原则下的产物。

不过,若是内部使用的话,如果你介意这 1/3 的储存空间的浪费的话,是不是有改进的余地呢?下面我们来讨论这个问题。

观察 Unicode 的码表我们可以发现,实际大部分汉字是从 U+4E00 开始编码的,到 U+9FFF 结束。U+2000 到 U+3FFF 则有一些汉字标点符号等。稍加设计,我们可以定义出一种编码方案,对 UCS-2 或 UCS-4 做编码,让汉字可以用双字节表达,并保持对 ASCII 的兼容(U+0000 到 U+007F)段依然使用单字节。

作为牺牲,那些欧洲字母和韩文,就委屈到 3 字节甚至更长的编码了。

简述一下对 UCS-2 的编码方案(UCS-4 只需要做点小扩展)。

  1. 使用 大头方案(Big-endian)

  2. ASCII 部分 U+0000 到 U+007F 保留,用单字节 0x00 ~ 0x7f 表达。

  3. 对于 U+2000 到 U+9FFF ,除掉其中的 U+3F00 到 U+3FFF 部分(目前这个部分为空),做一个简单变换:即加上 0x6000 ,把编码转换到 0x8000 到 0xffff 部分。做双字节编码。由于 U+3F00 到 U+3FFFF 被除外(如果是 UCS-4 可以去除 U+3E00 到 U+3FFF),所以 0x9f 将成为一个 magic number 。

  4. 对于其它部分:U+0080 到 U+1FFF ,U+3F00 到 U+3FFF ,U+A000 到 U+FFFF ,一律编码到第 2 3 字节。并将第一字节直接设为 0x9F 。

这样,解码成 UCS-2 的算法非常简单(甚至不比 UTF-8 解码更复杂)。缺点是,缺乏 UTF-8 的容错性,有半个汉字的隐患。


这样的编码什么时候会有用?

  1. 网络传输时,对字符串做这样的编码(写一个 UTF-8 到这个特定编码方案的互转程序可以在 10 行 C 代码内完成,并非常高效),可以有效减少传输的数据。

  2. 如果需要做大规模的数据储存,比如搜索引擎抓取的网页时,可以节省不少储存空间。

至于源代码,和配置文件中,还是推荐使用 UTF-8 ,毕竟编辑器的支持更重要。


C 的实现见这里

December 21, 2008

在亚龙湾晒太阳

椰树林吊床 过去的一周非常的腐败,很奢侈的把一周时间漫无目的的荒废在海滩晒太阳上。不过这几乎是我出生以来,唯一的一次全家外出旅游度假,所以对于那些流逝的时间,不仅没有丝毫的负罪感,还足以留恋。

海滩 这是第二次到三亚。天气很好,海滩很漂亮。

海滩 老爸说,这是他第一次看大海,对于我们全家人,也是第一次度假。海水不太冷,但是海风很大,泡一下起来后,还是凉飕飕的。

沙滩排球 我大学体育课学的排球,不过那是室内的。而沙滩排球的感觉很不一样,跑跑跳跳相当消耗体力。已经很久没打了,小臂后来痛了一晚。

水上篮球 酒店的游泳池很漂亮,那个水滑梯很爽。还可以打水上篮球。一开始球被人打到树上去了,我爬到树上想摇下来未果。酒店的服务生见状又找了个球给我们。:D

红树林酒店 红树林酒店很不错,比我住过的天域和凯莱要好。大堂设计的很漂亮,水天一色。

红树林套间 这次订的一个套间,据说是红树林最好的一间。客厅很大,我在客厅加了张床(父母住在卧室),躺在床上,海景尽收眼底。

红树林海景 房间有三个阳台,望出去风景很完美。

冰与火之歌 客厅里有张足够大的桌子,晚上我们一伙人摆开冰与火之歌。这款桌面游戏很不错,这是我玩的第三盘,结局很惨,又被盟友背弃。失去了海岸线,龟缩在内陆,差点全军覆没。这次发现,虽然黑色的海军很强大,第一回合红色虽然海战不堪一击,但如果不幸遇见增兵,黑色会很被动。

December 15, 2008

离开工作的 12 月(五)

在北京时,余雪松在家里招待我吃了顿便饭。他是我认识的程序员当中,我最推崇的一位(加了最就没有之一)。

我们喝了一点点啤酒,平时我不喝酒的,大学毕业那会喝吐过。前段时间见了个老朋友,难得又喝了一点,不过居然被朋友灌了些许,有些伤了。缓了一整天才回过气来。

进门的时候,他的儿子在客厅里玩。客厅很大,一地的玩具。我知道他儿子虚岁八岁,我打算离开 kele8 的时候,听到了他儿子出生的喜讯。上次和小家伙在一起的时候,他还在娘肚子里。我和余雪松夫妻俩坐在南戴河的沙滩上,谈论着许多许多。

发现地毯上有许多卡片的时候,我有点诧异。我原以为,现在的小孩子,除了电脑和网络,不会有其它迷恋的玩具了。正好我随身带着 RFTG 的卡片,拿出来给小家伙看。等我们吃饭的时候,他还在那里一张张仔细的翻看上面的图案和文字说明。小家伙有点羞涩,不好意思直接问我,就问他妈妈,每张卡片上图案的含义。为什么有点左上角画了个圈,另一些则是菱形。我有点后悔没有把说明书带上,不然可以瞧瞧现在小孩的理解能力。

想到我们做的卡片游戏 ,由于公司不重视而几乎没有任何宣传,感到有点惋惜。其实这个游戏的玩家忠诚度还是满高的。我们有一千多注册用户,一周回访率居然高达 70% 。而且可以保持 100 多的同时在线。而玩这个游戏几乎是没有任何功利的,只是享受游戏的乐趣而已。现阶段必须找到人对战,而不能通过和机器玩增加用户黏度,我认为游戏本身还是展现了它的魅力。

对于门槛比较高的卡片类游戏,我们可能低估了它的市场。我没有精力做这个项目,它也不是我的主业。反而这个小项目已经消耗了我的不少精力。或许我应该交给一个合适的公司去宣传和运营它,这个公司不会是网易。


ps, 插播条广告 :) 我们现在有五个同事在这个卡片项目上,主策划对这个游戏非常有爱,致力于把它做到最好。技术上我们有很强的实力,可以保证项目的持续开发。开发人员都喜爱这个游戏,在适度引导用户,并找到合适的玩家群体之后,这个游戏能提供相当的深度和玩家忠诚度。比不上 MMO 那样可以大把的来钱,但是运营的好的话,我相信可以得到不错的经济回报。(不需要使用什么 BT 的收费手段克扣玩家,我们的开发人员也不希望因为赢利而影响游戏平衡,失去原本的游戏性)如果有公司想一起运营这款小游戏,可以和我联系。我已征得公司同意,有权利做出大部分相关决定。


原来打算教小朋友玩 RFTG ,但是跟老余话匣子一打开就收不住了。

这几年,我很少专注的倾听朋友的述说。大部分场合,都是我的话比较多。老余一直在谈我,而不是自己的那些事情。不过他在说我,其实也是在讲他自己。

我们甚至谈到了当年在 kele8 ,我曾做了半个多月的台球,一直都没完成。我的原因是,我一直认为台球在桌面滚动是一个二次方程,所以在计算球体碰装时硬去解一个四次方程,导致性能怎么都上不去。更别谈把游戏做出来。那天老余估计是急了,一个晚上做完了游戏,用的很简单的数学方法:微分成一个个很短的时间片,在每个时间片内,近似认为台球都是一次运动的。

这种事情后来我也干过,对于同事写了半年的程序百般不满意,一急之下,花了一周时间重新实现了一遍。然后永久了抛弃了那段,我看起来不可能改完 bug 的代码。

到今天,老余依然奋斗在编码的第一线,解决大部分碰到的问题。我听过无数人跟我说,程序员到了一定程度,就应该眼光放的高一些,有些编程的活不该由这个层面上的人去做。但是我最能理解亲力亲为的老(资历老而不是年龄老)程序员。对于某些人,我的同类们。对写程序和解决问题,是发自内心的喜爱,而不是成就事业的工具。

同样,我们也能理解那些不太愿意,或是“迫不得已”不再有机会写程序的老程序员们。

是的,有机会开开心心写程序玩玩就够了,何必追求别的东西。许多人不会这样想,甚至舒适的环境会让人懒惰。做为团队的领导者,我们得为每个人的想法和期望,每个人的目标去考虑。团队建设和管理,是那晚老余谈的最多的话题,我没有多发言。如果是去年或前年,或许我会侃侃而谈。但今天我学会了倾听。每个人面对的情况是不一样的,可本质上有共通之处。

其实,老程序员们即单纯,又不简单。他们想的很多,对计算机的理解可以扩大到对世界的理解。万事万物都有其共通之处,只是你见的角度不同罢了。


今天写了很多很多。因为今天我很空 :D 明天,就去三亚休假了。

今年的年度旅游我们工作室的意见很多。有想去台湾的,有想去日本的,有建议去东南亚的,有游说大家去新疆的,甚至有人动了去埃及看金字塔的念头。最后,我们相互妥协的结果是去海南晒太阳 -_-

我们这个团队是奇数人,最后说服不了任何单身的人带家属,为了不浪费那半间房,我决定支付多出的费用并带上家属了。

丁磊给我推荐了个酒店,非常非常的贵。他说酒店老板是他朋友,最终给了我一个很低的价格和最好的房间。盛情难却啊。

上次和父母一起旅游是什么时候的事情了?貌似是七八年前,而且还没出武汉。我爸是个绝对不爱旅游的人。他工作的时候去出差,同行的人都去出差地周边玩去了。他则一个人去办事,办完了就买火车票回武汉。并强调说,出差就是替公家办事,用公费给私人游玩成何体统?管不了别人,自己总是管的了的。

这次我让我妈说服我爸,瞥下他那些金贵的花花草草,出来晒几天太阳,看看大海。他老人家能挪挪窝,那是给我极大的面子了。 :D

老实说,订下一周 3000 RMB / 天的房间,是我这辈子做过最腐败的事情了。而且,所有的计划只是漫无目的的在沙滩晒晒太阳,够奢侈的。噢,我指的是时间。

离开工作的 12 月(四)

黄金时代是在我们的前面, 而不在我们的后面 —— 培根

在我可以被称呼为少年的时候,我经常想,如果可以早出生几年就好了。即使我早出生几年,我也绝对做不了马云,成不了丁磊;但是我有可能是求伯君,可能是马化腾,亦或是雷军。

但是,后面这些人在我现在的年龄已经逐渐不写程序了,我还在兴头上,所以,我还是我。事业会改变一个人的兴致,而兴致也会成就一个人的特质而不被改变,使得有些事情就该他去做,有些事情不该他做。这跟他所处的时代无关。

这次去北京多逗留了几天,我特地去见一个新朋友。说起来,我们真正在网上认识,又一次印证了六度理论。他是我的一个根本不会写程序的网友的同学的男友,而我正巧在读 他的 Blog ,如果不是他自己发的他女朋友的 Blog 链接,我压根不会想到这层有趣的关系,而主动去联系他。

在 SD 大会结束后,我搬到城里住。特地住进了北大。跟 Matrix67 约在北大门口见面,之前我没想到他如此年轻,他的 Blog 给我的感觉是研究生在读而不会是刚入大学不久;更想不到一个满是数学和信息学有关内容的 Blog 主人居然在读中文系。当然,如果让我今天选一个专业重新读本科的话,我也会选中文系或是历史系,而绝对不会去读计算机。但我有这个觉悟是在工作以后,我很难相信玩信息学竞赛的高中生会做出这样的选择。不过,聊了几句后,才知道,原来读中文他一开始也不大情愿的。:D

简单吃完中饭,我们在附近的 Starbucks 聊天。我仿佛看到 10 年前的自己。其中一个话题是关于密码学的,在 96 年高考前夕,我从 Bill Gates 的《未来之路》中读到了 RSA 算法,产生了浓厚的兴趣。97 年,在学校的论文集里翻出一篇师兄写的关于 RSA 的论文,仔细研究了一番。那个时候上互联网不太方便,我还热忠于泡 CFido 。记得当时连发了三篇长帖介绍 RSA 算法,估计这些文章不太可能找到了。

托互联网的福,现在获取信息比 10 年前容易的多。图书馆里的书籍也多了许多。10 年前的我的能力是远不及今天新一代的。当然,我在读书时,别说在同学间算上出类拔萃,学习连中等水平都赶不上。考入北大,那是想都不敢想的。

和 Matrix 同学聊天,很容易让我想到曾经 90 年代初参加信息学竞赛的美好经历。看起来,现在 NOIP 的题目要难多了,处理的问题的规模也大多了。我想,现在搞竞赛的同学会不会羡慕 10 年前的题目太简单 :D 那个时候,我还是觉得很难的。

自省非常的重要。我知道自己只是一个中等智力,容易犯错误,不少事情做起来,会比许多优秀的人慢一拍的人。但是我是一个容易专注的人,保持着单纯的好奇心的人,求知欲很强烈的人。所以我适合写程序,适合做软件,能够自发的从上至下的审视自己的作品,弄明白一切背后的原理,发现不足的地方去改进它。比起 80 年代末,90 年代初那些刚刚开始形成自己的思想的新一代来说,我多出的是 10 年的经验和自信。

我花了不少时间,让自己不太狭隘。眼光不放在一个小圈圈里,不光是做软件。很高兴,新的年轻的同学可以更快的做到这一点。并且有更好的基础去迎接挑战。当然,比年龄更重要的是心态。以一个过来人的角度对新人说点什么,我怎么都觉得可笑。我想,在心态上,我们是同龄人吧。难怪,那些老朋友总要把我划到所谓八零后里去。:D

btw, 这次在北京非常让我忿忿不平的是,无论是谁,碰到我都说,比去年瘦了。天啊,去年我参加 SD 大会的时候才 70KG ,今天有 76 KG 了呢。

这几年,结交朋友的欲望明显比以前淡了许多。老朋友大多也不联系了。我想跟心情有关吧,跟项目进行了太长时间也有关系。即使有朋友来了跟前,只要不特别联系,都不大愿意动。生活那是出奇的规律,每天都日程安排都是一样的。稍有变化就极不习惯。得改改了。


说到新一代,在北京特地去跟舅舅吃了顿饭,见到了小表妹。她 14 岁,在读初二。挺有思想的小朋友,这个我在 2000 年北京工作的时候就领教了。那年小妹妹 5 岁,已经可以跟我侃侃而谈她刚看的琼瑶剧了。去年过生日,我送了她一套《银河英雄传说》的小说,本以为小女生不爱看这个的,只是我自己喜欢而已,觉得那是个政治童话,挺适合给小孩子做政治科普的。没想到这次饭桌上,她告诉我已经读完了,对小说里的人名那是如数家珍。说是喜欢这本小说,绝对不假。还顺道去找了田中芳树的别的作品读。没想到我无意间居然培养了个田中迷。

我这个妹妹非常聪明,我相信过几年肯定无数男生追 :D 2005 年过年的时候,她 10 岁,我把我在美服的 wow 帐号给她玩,不一会她就把一个牧师号练到 6 级了,还自己跑去学了技能,完成了剧情任务。那可是全英文的游戏,wow 国服还没有开的年代。我把这个例子说给那些不相信 wow 会在中国成功的同事听:10 岁的小女生,玩英文版的 wow 都可以在 4 小时内上手,并爱上这个游戏,不肯听妈妈的话去睡觉,游戏的魅力可见于此。

她也印证了我对九零后的看法。网上所谓非主流,操着火星文的小朋友只是群体中的一部分。跟我们七十年代末出生的一代在十多岁年级的时候并没有太大的不同。我这个表妹从来不用火星文,甚至很多都看不懂。也跟大家习惯上网的年轻人一样,写 blog ,谈自己的思想和看法。以至于,我们不应该把她们简单当成小朋友,而应该看作和我们一样的年轻人。

他(她)们也追火影忍者,觉得蓝猫太幼稚;也读那些我们认为值得一读的书,而不仅仅读那些快餐文化下的连载网络小说;也写 Blog 发表自己对周遭事情的看法,而不仅仅是关注自己。只有直面他们聊天的时候,才能发现他们还是些单纯的孩子,却也能以平等的身份交流。

我们这个世界正在变的更好。

cousin.jpg 2000 年底在北京工作时留的张照片。有几个月,我跟我舅舅住一起。


饿了,吃点东西再继续写。

December 14, 2008

离开工作的 12 月(三)

话说这次 SD 大会,关于组织方的抱怨声音明显比去年多。不过我个人认为还是满成功的,讨论的气氛比去年好一些(去年也不错)。只不过去年是第一届,CSDN 花了更多功夫(同时也欠缺些经验)。去年的 SD 大会后的几天,还有一些私下的沙龙,今年就没有了(或者我不知道)。

第一天的抱怨最多,因为在九华山庄那个鸟不拉屎的地方,四周什么都没有,院子里的方便面都比外面贵上一倍。会议又是中午开始,不管大家的午饭,很多人是报道完,饿着肚子去听的。会场第一天的大屏幕上小一半都是对没有午饭的抱怨。我估计是赞助商太多,议程安排的太紧了,时间稍微一拖,下面就叫苦连天。我调侃了一句“ CSDN 快餐事业部祝大家吃好喝好”没有显示出来,估计被人工审核墙掉了:)

不过后来 google 的人上台卖他们的手机操作系统,强调开源时,我挖苦了一句,“ Chrome 都开源了,咋就还没有 Linux 版”,居然被讲台上 google 的同学看到了。他告诉大家,Chrome 的 Linux 版和 Mac 马上就要出了。这也算是个意外收获的好消息吧 :)

大家发现讲台上背对着大屏幕讲话的同学其实也在偷偷瞟着屏幕的时候,还是收敛了一点。

btw, 说到开源,对于开放源代码的个人来说,最大的好处就是,如果你的东西真的有用,会不断有人来帮你完善它。比如我前段时间发布的 manualgc,这几天居然收到两个 bug report ,督促我去 fix 它们。那块代码写的满晦涩,我原以为不会有同学去读的,我错了。:D 另外,还有两位同学稍微纠正了一下我写的英文文档里的拙劣的语法错误,在这里一并感谢。

另外就是,这九华山庄的入住退房手续不是一般的慢,工作流程绝对有问题。如果明年还办的话,去北京或上海的城区里找个地儿吧。我就不相信,若大的北京城,就找不到个供大家聚会闲扯的地方来?

国内这么多程序员聚在一起的机会不算太多。这次来北京的人比去年多一些,不过似乎换了一批人。去年认识的都是些在网上没打过交道的同学,而今年碰到了一些从来没见过面的网友,比如猛禽,我常去他那看八卦。见到真人时,还没打招呼,我就觉得见过照片。

我想大多数程序员都很珍惜几天交流的时间的。给我的感觉呢,刚毕业几年的同学会更注重技术细节一些。我们会很容易的找到一个技术点切入,比较详尽的讨论一些具体问题。时间做的久点的技术人员站的层面高一些,会谈产品,谈方向,谈构架,谈技术之外的东西更多。如果程序员抠在技术细节上,我想会更受新人欢迎一些,带小的技术团队也更有人缘;但是,这样的人不会受投资人特别重视(也要看是哪种投资人),大老板们估计很多也不会太喜欢。这是个挺浅显的道理:物以类聚,人以群分。我说的是喜欢或谈的来,从功利角度上讲,投资人或老板会刻意去找这样的纯技术人才,完成特定的事情。

好吧,我想说,大部分时间,我前者的成分多许多。这样是不是显得更年轻:)我觉得,研究技术问题会让人更有活力一些。当然,做的时间越久,也越能说明你是真爱这个,而不是把技术当成达成自己目的的工具。经常会接到新的猎头电话和 email ,让我觉得冬天并没有到来,外面还如火如荼找人做事情呢。大多数猎头会惊异我还在写大量代码,他们没想过他们帮助寻找的职位上的那个人需要亲手编码。我想,这就是国内猎头行业不成熟的地方了。

北京的那几天,跟人扯的最多的是关于搜索技术的。这也是因为我们公司在北京有一支很大的技术团队在做搜索。有道的同事都很热情,挺有干劲。Zhou Feng 是个相当专业的技术带头人。Google 的那场 session 我没去听,后来听说讲走题了,整场都在讲 big table ,让我们的同学挺失望。没做搜索这块,了解的也比较肤浅。搜索引擎的基础设施,外人从 google 的公布的信息看,就是 GFS/Big Table/Map Reduce 。我想,做搜索的一拨人,无论是哪家公司,内部其实都做了这个东西了。只是叫的名字不同。或许也有例外,我有个大学同学在国内某大公司负责搜索一块,据说他们做的就不太完整。不过这两年了解下来,有道内部这些基础设施已经很完备了。文件系统上放着超过一个 P 的数据,每天数据处理任务让上千台机器分布处理。这些的确曾经是 Google 的秘密武器,但是现在已经成为搜索行业的技术基础。

有道就有同学坦承自己的搜索质量不如 Google ,甚至也不如 baidu (纯属某人个人观点,同样在有道,也有同学认为自己做的不错的)。我的个人主观判断,Baidu 的大部分搜索质量是比不过 Google 的,某些特殊需求上比 Google 的强(我不听歌,所以不是指 Mp3 搜索)。至于 youdao ,没特别的比较过。

我们讨论了很长时间关于搜索的话题。谈到算法改善的问题,我这个外行的分析是:既然在既有数学基础上,公式还有大量的参数可以调整,但是我们却得不到这些参数的具体数学意义。就可以去尝试一些随机算法。但是无论是人工神经网络、遗传算法、模拟退火、禁忌搜索,除了大量利用随机因子做大量迭代尽可能的靠近最优解之外。都有一个前提,我们需要知道怎样的解更好。

对于改善搜索结果的质量来说,这一点也是必须的。可质量好不好,目前只能由人去判断。这里有很强的主观因素。这可能是我们采用自动化算法改善搜索质量的最大障碍。我提了个思路:统计每天或每周最热门的搜索词,这些往往是近期的热点。而热点问题在相关的领域肯定会在相关的权威网站中出现。这个所谓权威,不是由机器的 Page Rank 定出来的,而可以是人为去设定的。这些网站相对比较少,所以允许人为指定。然后,我们可以反过来在搜索结果里去统计这些词被搜索时,认为指定的权威网站出现的频率和次序。反过来可以以此来判断,我们对数学公式的参数调整,到底是朝好的方向发展,还是朝差的方向在发展。这样这个参数调整过程,就可以被自动化了。

如果认为为搜索结果做排序依据的数学基础是共通的,即对热点词汇和冷门词汇的检索没有特别巨大的差异,那么这个方法就是可行的。btw, 有道做搜索的同学的一个观点是:搜索引擎的质量好坏不在于能不能检索到相关信息,这个大家都容易做到,而在于能不能把最好的结果排在最前面。

Zhou Feng 同学聊天的兴致也很浓。那天晚上,我教他玩了一盘 RFTG 后已经 11 点了,我们四五个人还是在房间里侃到半夜。聊到搜索技术为公司内部产品服务,衍生了许多一开始意想不到的东西;聊了我们最近在网上谈论的比较多的 OpenID 的问题;聊了公司内部的技术资源分享的问题,Zhou Feng 同学自己在做一个类似 SoureForge 的东西在公司内部用,已经完成了,我这几天才去捧了场,上传了一些代码。当然我个人现在更喜欢 google code 的风格。ps. 网易的人都很技术化,看来不光是我们自己这样想

还聊到前几天我比较有兴趣的 XMPP ,嗯,这个东西我们已经在做了,希望明年初就可以拿出来。


必不可少的,关于金融危机这个热门话题,谈论的人也很多。Zhou Feng 同学说,现在连 P&G 的销量都下降了。我说,金融危机居然都导致大家减少洗头发的次数了,看来这链式反应的效应不小。我想呢,其实还有许多人还没有感受到其影响吧,反正我是没有直接感觉到。

只是有趣的是,这两天居然收到广州某大报的财经版的约稿,说我那篇关于 Sell Short 的文章有点意思,希望能谈谈关于做空股票的故事。这让我有点受宠若惊了。身为一个程序员,经济方面的东西我是外行。虽然我在美国股市上赚了点钱,但那是玩儿,而且本人是很反对以功利心去炒股的,也不断的劝告身边的朋友别去碰股票这个东西。所以婉言谢绝了这次约稿。

话说前几天写自己关于做空股票赚了点钱的故事,是很有点虚荣心作祟啦。大家某要被误导。

在我看来,做这个东西心态最重要。摆正位置,理性判断,是赢得游戏的关键。金融市场,短期的预测准确率其实很低,不比你丢硬币高多少。即使是做长期判断,也只是比 50% 高出一点。理论上,只要判断的正确性高出 50% 一点,就可以利用这个赚到钱了。为什么许多人还赔钱呢?那就是因为太不理性,自己违背了赢得游戏的原则。原本每次判断可以有 60% 的正确率,却一再固执己见,连续做出错误判断。所谓股票被套就是一种明显的表现。做出错误判断后,就应该纠正它,尽早做出下一次的独立判断。

理论上说,你做股票,是买入还是卖出,跟你帐户上的股票价格成本完全没有关系,不是吗?因为买入和卖出操作,取决于你对未来股票涨跌的判断。而股票的涨跌,跟你是多少钱买入的股票有关系吗?

其实如果有多余的精力和时间,我更愿意写东西跟大家分享一些我自己学到的有趣的知识。比如美国人创造的各种有趣的金融工具。我是外行,不过正因为是外行,所以明白其中的奥秘后,才方觉得更为有趣。比如说,Option 的买卖,一开始我就没弄明白啥叫 Buy To Open ,什么是 Sell To Close 。弄明白后就觉得挺有意思的。(当然 Option 这个概念不是美国人创造的,美国人在这个基础上又衍生了不少东西)

其实许多金融工具一开始都是为了规避风险用的,只是人的贪念导致了他们反而增加了风险。整个经济学的基础都建立在人都是很贪心的,希望在可能的范畴内获得最大的利益,这也未尝不对。只是何为最大利益这个问题很难定义,比上面提到的,如何定义搜索引擎的结果质量问题更加的难。

我们是看到一天以后,还是看到一年以后,还是看到一百年之后;是看到多大的群体对自己的影响;这些都影响着对“利益”的定义。

我已经慢慢的不太相信还原论了。或者最终我们会得到一个 42 的真理,却不明白 42 是什么。在当下,还是坚持一些简单基本的东西吧,无论是做软件还是做人,KISS 总是好的。


先去洗个澡,等下再接着写。-_-

离开工作的 12 月(二)

到北京前一天,在 taobao 上买的几套桌面游戏到货了。我拿了一套便携的卡片带在身上。中文版的《银河争逐》(RFTG : Race for the Galaxy) 。

花了一个晚上,学习了几个新游戏。RFTG 的规则有点繁杂,虽然是中文版,我们第一次接触这个游戏依然花掉了超过一个小时熟悉规则。初玩这个游戏时,老实说,有些失望。这跟我更喜欢有游戏板和小模型的桌面游戏有点关系。纯卡片类的除了便携(RFTG 的包装盒太大了,为此我自己做了个小盒子可以带在身上),就没有更多竞争力了。

到北京的第一个晚上,跟 Fenng 他们又玩了一盘。他们都是第一次接触 BG ,我对这个游戏也只有过一盘的经验。我们的那一盘玩的没什么激情。如果说他们玩的觉得有点意思,更可能是以前没玩过类似的游戏的缘故。反正我觉得跟我第一次接触桌游的感觉不同,我第一次玩的欧式桌游,如果不算强手棋的话,是《两河流域》。玩了几分钟,我就发掘出其中的乐趣,并且希望再来一盘。但是 RFTG 给不了我这种感觉。我也很难通过这个游戏传输这样的感觉给一个桌游新人。

晚上的时候,用酒店的电脑 google 了一下,找到一个 RFTG 的英文论坛 。我想知道 RFTG 的爱好者为什么喜欢这个游戏?毕竟它这两年卖的很好。这个游戏的乐趣是什么?我通过对游戏的直觉可以猜想到这个游戏的乐趣会在于对卡片的掌握,对赢得游戏的各种途径的计划,以及充分利用对对手行动的判断等等。但是我在完成的两盘游戏中,就是没能得到感性的触动。对于一个缺乏直接对抗的游戏规则(RTFG 里不能进攻对手的卡片,据说即将出版的第二扩展里会引入这个呼声很高的设定),几乎不需要考虑对手的行动而埋头自己发展的游戏,大家熟悉游戏流程后,可以沉默的完成游戏。一个如此沉闷的游戏,简直失去了桌游的主要乐趣。相反,类似以前我在 Blog 中提到过的:圆桌武士,冰与火之歌这些,几乎整场下来吵吵嚷嚷,好不热闹。

如我所料,英文的论坛上,RFTG 的玩家几乎也分成了两大阵营。极度热爱这款游戏的有之,非常痛恨,声称坚决不会再碰它的也有之。这种争议帖很热门,下面有着长长的回复。从对中文关键词的搜索上看,中文世界的玩家也是这样。我的困惑对于大多数 BGer 来说都一样。

我也用各种英文关键词搜索,希望找到各种对这款游戏的深入讨论文章,了解一下各种游戏里用到的竞争策略的深度分析。可能是我英文不太好的原因,没有太多收获。不过我相信了一点,只要你肯投入,RFTG 也能给你相当可观的回报。大多数人都在第八盘或是第九盘的时候有了感觉,就是那种突然见到了光体验,喜爱上它。(我很幸运,在之后的第三盘游戏就获得了这种体验)

无论什么游戏,熟悉规则是第一步,知道怎么玩不等于知道怎么从游戏中获得乐趣。同样,教会别人享受游戏的乐趣和教会规则也是两件事。这是许多游戏的教程做的不够的地方。游戏从业者应该明白这一点,并多做出努力。大家都明白,指望人人都像自己一样,是一个专业的游戏爱好者,知道挖掘游戏的内涵,自己为以后的回报做出投资,是一件很不靠谱的事。所以,才会有大量雷同的游戏,市面上最赚钱的游戏也是千篇一律。对于我来说,只要能证明,这个游戏是有深度的,那就够了。我会投入精力,而不会计较游戏的类型是否自己喜欢。其实对于我来说,也没有特别偏好的游戏类型。对于游戏大市场,肯定不适用。

第二个晚上,和 有道 以及雷火工作室的同事继续玩 RFTG ,我本来不抱什么希望。可是就那么突然,大家都找到点感觉,即使很晚了,还叫嚷着,再来一盘。我们一直玩到深夜。

从北京回来后,我们又在公司内部玩了几晚的 RFTG ,发现其实这个游戏是有很强的对抗性的。策略变化颇多。比较难得的是,每局时间不会太长。刚好在你意犹未尽的时候结束。在网上继续搜索了一下,我倒是很想买套扩展包 the Gathering Storm (可惜没见到国内哪里有代理)试试单人版的游戏,以及非常期待第二扩展了。


现在去健身,等回来后继续写。;)

离开工作的 12 月(一)

年底应该是工作比较繁忙的时段,但与我并不成立。似乎对于我来说,现在是几月,星期几,几点,似乎没有太大意义。好好做事,累了就休息,这样就够了。那么,在这 2008 年的最后一个月,几乎远离正职工作,也就不奇怪了。

上周开始就在北京,参加 CSDN 的 SD 2.0 大会。然后又在北京逗留了几天,是利用的年假,酒店的费用也是自己掏的腰包,除了拜访一些朋友,也没干太多事情。

所谓 SD 会议,从这次的议题重点:那虚无缥缈的“云”来看,对我的吸引力不大。事实看来也如此,会场上对这个真正有兴趣的人也不算多,相关的 session 远不如去年的热门火暴。我看,大多数人参加 SD 大会,主要目标是多认识些朋友多多交流为主了。第一天就被猎头公司的人递名片感觉很寒,尤其是,对方似乎对正在聊天的我们几个人一无所知。

从这点看,今年的会场布置比去年的强,课室外面的桌椅比去年的多,session 间的茶歇时间也比去年的长。餐桌上的气氛也更技术一些,我们一桌人议论的时候,就被隔壁桌的人插话过一次。

不知道为什么,大会的 session 也没有真正特别感兴趣的。难道真的要过冬了?而去年,关于 D 语言和 Lock-Free Data Structures 的两个 session 则感觉启发很大。这次陈榕的 session 也“收敛”了许多,没有特别多的八卦,喜剧效果不够,小失望了一把 :)我自己的那个 高性能健壮系统中的内存管理 也如预料中的平淡。当时有点感冒加低烧,没啥激情,差点就变成了全程朗读 PPT ,只到最后有了点感觉,不过已经没有时间发挥了。怪我自己,这是个不合时宜的题目,而且很难讲好。

这是个层次非常低的课题,大多数人都已经站在的很高的层次。即使不是他自愿的,如今发达的软件基础设施也使大家不必再在低的层面思考问题。我的初衷是从一个大家不太关心的层面上展现一些解决问题的方法,以此来影射整个软件开发各层次上的问题和解决方法。表面上的原因是我的演讲水平远远不够,达不到这样的效果;更深层次的因素还是自己的积累太少。谁说程序员干不过 30 岁?从接触编程的年龄上看,我入行比大多数程序员要早;但是到了而立之年,还只感觉刚跨过门槛。理出来给自己的工作做借鉴尚可,说给别人听依旧差点火候。中国的程序员,差的就是 30 岁以上的那部分群体。

值得高兴的是,毕竟有同学感觉有点收获。会后还有几个同学跟我讨论了很久,让我觉得准备这些东西的精力没有白费。

今年自己似乎有点对结识新朋友有点意兴阑珊。真正算是新认识,且交流比较多的是支付宝的 Fenng 和他的几个同事。再就是北京网易 有道 的同事,虽然一直在一个公司工作,但之前交流不够。借一个第三方会议,自己公司的同事之间有了更多的技术交流这件事情,看起来有点可笑。但不仅仅是网易,阿里巴巴他们也是一样。大的软件公司难道都有这个问题?


6 点了,先去吃饭。吃完饭回来继续写。