年终,盘整,许愿
December 29th, 2007
2007年的最后一个工作日也结束了……真的,两年来没有像这一周这么累而紧张并且担惊受怕过。不过,不管怎么说,又是一年了。
- 做两个“理想中的”项目。现在回头看看CruiseControl.rb和RubyWorks,虽然和我去年的想法不同,但毫无疑问是令人愉快而骄傲的理想项目。何况,还有Stomperl和手上正在进行的项目。一年里面还能奢求更多么?
- 做一个网站。也和我去年的想法不同,感谢IceskYsl,iTechTag也是足以自豪的网站了。
- 出一本自己的书。偏偏是这个自以为最现实的愿望没有达成,只是把blog整理了一下,并且换到了现在的地方。兴趣一个接着一个,连写程序也来不及,真的就不想写书了。
今年,还是给自己三个愿望。要做好的咨询师,像学习编程一样的学习咨询。要用Erlang做一点有用的东西。要积累更多在大型组织和大型项目里工作的经验,总结出一些工具。
愿望一年比一年的朴实了。不过想想自己要在三年后变成的样子,不也是很朴实的么?
大师级著作
December 28th, 2007
本书的审阅者们给我的手稿提供了清晰而又及时的反馈,为此我要感谢Erich Gamma、Steve Metsker、Diomidis Spinellis、Tom deMarco、Michael Feathers、Doug Lea、Brad Abrams、Cliff Click、Pekka Abrahamson、Gregor Hohpe和Michele Marchesi。
什么样的作者能请得动这样一批审阅者?什么样的书当得起这些人来审阅?
Kent Beck的新书《实现模式》是一本关于如何撰写Java代码的书。本书中的模式,是基于Kent对现存代码的阅读以及他自己的编程习惯而形成的。这些模式来自他早年使用Smalltalk模式通过代码与其他开发人员进行沟通的过程。它们的级别相对设计模式较低,与Larman提出的GRASP模式处于同一粒度。本书中的模式试图为如何撰写大家都能看得懂的代码提供一个清晰明确的视角,并告诉你这些代码如何为人的需要和降低成本的需求提供保障。
那时正年少
December 21st, 2007
抛出一个匪夷所思的助攻,或者站在队友身后捧起金杯。
如果只能二选一,一个组织后卫更愿意要哪一样?

《佛罗里达哨兵报》搞过一个在线调查,“你喜欢现在的贾森-威廉姆斯,还是以前的那个?”报纸本想借机煽情一下——威廉姆斯在东部决赛最后一战中前8投全中拿下21分——来说明这支热火是多么的好,但是球迷很不给面子,八成以上选择了以前的威廉姆斯,确切的说是国王队的“白巧克力”。那么把这个问题抛给威廉姆斯本人呢,他的回答是:“这些都是生活的一部分。”
但,无论如何,还是怀念一下那时的55号,那个白色的幽灵吧。毕竟,那时我们正年少。
Announce Stomperl 0.0.2: Message Queuing And Transaction
December 20th, 2007
Dear all,
I'm glad to announce that Stomperl 0.0.2 is out. You can now check it out at http://stomperl.googlecode.com/svn/tags/0.0.2/ .
Since the first preview version [http://gigix.thoughtworkers.org/2007/12/12/announcement-stomperl-0-0-1], we've made some mentionable progress. The most significant one is the support to message queuing. Message destinations in Stomperl version 0.0.1 were only allowed to be topics. Now they are allowed to be queues as well: destination with its name starting with "queue^" would behave as a queue. (Check out the difference between a topic and a queue from "Enterprise Integration Patterns" [http://www.enterpriseintegrationpatterns.com/].)
Furthermore, Stomperl 0.0.2 supports transaction: messages in a transaction would be send all-or-not. It also supports ACK and ERROR frames. Actually it supports all commands listed in the protocol so far. Although we haven't got any official compatibility test suite yet, I feel it's fairly safe to say that Stomperl is a 100% Stomp compatible broker.
What's next then? I'd like to do some investigation to other Stomp brokers (as well as clients) and do some performance benchmarks. Besides that, I suppose there would be some defects and housecleaning need to be done. Still, any suggestion and feedback would be highly appreciated.
讲述iTechTag网站的故事
December 17th, 2007
继 InfoQ 之后,《程序员》杂志又发表了iTechTag网站的故事
时至今日,iTechTag仍然只是一个小网站,我们有的也只是一些小故事,我们的思考大多没有得到实践的检验。不过好现象仍然很多:我们起初的设想到现在大致不差,网站也一直在稳步发展。最重要的是,不管iTechTag是否真能像我们希望的那样帮助整个技术社区重建他们的声望,至少我每天看着自己blog上挂着的技能云暗爽,而且还知道有那么一群用户也跟我一样暗爽,这就足以抵偿我们付出的那些努力了。
IceskYsl在这个周末又做了重大的升级 ,加上之前发布的新特性(例如挂在我Blog右边的技能饼图),现在的iTechTag逐渐变得越来越丰富多彩了。注册用户也超过300了。
Announcement: Stomperl 0.0.1
December 12th, 2007
Dear all,
Stomperl 0.0.1 (the first preview release) is out.
Stomperl [http://code.google.com/p/stomperl/] is an implementation of Stomp [http://stomp.codehaus.org/] broker with Erlang. That means performance, scalability, reliability and elegance in concurrent programming are our goals. And since Stomp is simple enough, it's a good start point to learn Erlang/OTP programming.
Version 0.0.1 is the first preview release. The main purpose is to gather feedbacks from the community. So far it supports basic elements in Stomp protocol: CONNECT, DISCONNECT, SUBSCRIBE, UNSUBSCRIBE, SEND and RECEIPT. It passes acceptance tests built with both Java and Perl clients. That's why I consider it as "usable" and decide to announce it.
To give Stomperl a try (NOTE: EUnit later than 2.0 beta is required):
- Check it out with Subversion:
svn checkout http://stomperl.googlecode.com/svn/tags/0.0.1/ stomperl-0.0.1 - Kick off the broker:
make startup - Now you can connect to the broker at port 61613. However I suggest you run the test suite first:
make test
What's next? I suppose Stomperl will support full Stomp protocol in its 0.0.2 version, along with a better test coverage. We will do more acceptance test, compatibility test and performance test in the future. But first, any suggestion and feedback would be highly appreciated.
科学革命的结构
December 9th, 2007
托马斯·库恩:科学革命的结构
科学的发展分为两个阶段:常规科学和科学革命。前者实质上是解谜的过程,而后者是设定谜题的过程。
常规科学就是解谜:提出问题,随后用实验解答问题。
能提出怎样的谜题,取决于当前采用的科学范式。亚里士多德的追随者无法提出关于单摆的问题。
和证伪主义的断言不同,范式是自洽的。特例可以用补充来解释。未加转换的视角看不到异常。
由于实用主义或者别的什么理由,当越来越多的特例需要越来越多的补充才能解释、或者根本不能解释时,危机就出现了。
危机常常预示着范式转换。我们无法说究竟是谁在什么时候“发现”了氧气,因为我们真正关注的是范式转换。
范式转换带来崭新的谈论问题的方式。这是世界观的变化,这是格式塔转换。所以它是科学革命,而不是渐进发展。
科学文献习惯性地掩盖科学革命不断发生这一事实。德谟克利特意识到朴素的原子学说了吗?牛顿所说的“时间”和“空间”与爱因斯坦所说的是同一概念吗?
科学革命的价值不在于常规科学意义上的“发现”或“发明”。科学革命让人们能够谈论在原来范式下无法谈论的问题。
科学革命常常由进入领域不久的年轻人实现,因为他们的视角尚未被定型,他们看到异常。爱因斯坦在专利局工作。
在Erlang程序里处理状态
December 7th, 2007
从题外话说起:据我亲身经历,很多令人郁结的程序员最大的问题不是不熟悉语言和类库,不是不了解算法,不是不会用工具,而是对程序里的信息流没有概念——弄不清哪些信息应该在什么地方、信息从哪里来、经过怎样的转换、到哪里去。而顺序化编程语言(C、C++、Java、C#……)很大程度上加重了这个毛病:在一些不那么漂亮的代码里经常可以看到被滥用的static方法和变量,说到底还是不恰当的全局变量的延续,说到底还是没弄清楚哪些信息应该在哪些位置出现。
而Erlang的编程练习对此很有帮助。没有全局变量,变量赋值后就不能改变。于是一些常见的bad smell自然而然地就不会出现了,一些常用的重构手法自然而然地就用不上了。不过呢,这个世界毕竟是有状态的。比如说一个Stomp server就需要记住哪个client订阅了哪个频道。于是当你认真思考“什么信息应该在什么地方”这个问题时,Erlang的几种选择就显得很有意思了。
参数传递。只有当你认真思考的时候,你才会发现原来很多信息都是很容易得到的。要控制一个函数的行为,最简单也最常用的办法就是改变传递给它的参数。如果这个函数需要一种新的状态,也许那意味着给它增加一个参数。
进程字典 。调用put和get方法可以把信息放入一个“每个进程一个实例”的字典。例如random 在字典里放了一个名叫random_seed的变量,用来生成伪随机数。
ETS 。同样是一张二维表,ETS里的信息是所有进程都能访问的。例如Stomperl 需要记录哪个client订阅哪个mailer进程,显然所有监听socket的进程都需要了解这个订阅信息,才能正确分发消息。于是订阅信息就应该(至少)在ETS里保存。
DETS 。ETS只在内存中存在,这意味着两件事:第一,程序结束数据就消失;第二,数据只能在一个节点共享。DETS的API和ETS相似,但它是基于文件的,所以持久保存和多节点共享都是题中应有之义。注意,ETS和DETS保存的数据都必须是tuple。
Mnesia 。这是一个真正的数据库。功能齐备,并且仍然软实时。
以上四种方式的排列不是随机的。应该首先考虑靠前的手段,如果有明确的理由表明一种手段不能满足需要时才可以考虑比较靠后的手段。这很费脑子,有时让人沮丧。但经过深思熟虑的程序好过不假思索的程序,发现自己犯错好过犯错而不自知。
Stomperl: Stomp with Erlang
December 7th, 2007
Stomperl is an attempt to build something not-so-that-non-trivial (in this case, a Stomp server) with Erlang. To kick it off, I stole the server architecture from here and here. Currently it doesn't even support the full protocol: only CONNECT, SUBSCRIBE and SEND commands are supported. But anyway, it's moving forward and I'm learning from it.
To make it run:
make test, which hopefully succeeds.make start, then you'll get an Erlang console.- In the Erlang console,
tcp_server_sup:start_server(). - In another shell console,
make acceptance, which hopefully succeeds.
I created an extremely simple acceptance test with Gozirra.
What's the next? Well, I suppose I'll implement the full protocol, and fix some defects. As a newbie to Erlang, I made and am making stupid mistakes. Welcome to be stupid together with me.




