了解,思考,选择,行动
October 30th, 2007
为一些事情闹情绪是没有用的。因为闹情绪无助于生存。要注意的是学习所有东西,分析情况,选择行动路线,然后是大胆的行动。了解、思考、选择、行动,整个过程里没有“感觉”的位置。不是比恩没有感觉。他不过是拒绝想到它们、谈论它们、让它们影响自己的决定。特别是当作出重要的决定的时候。
Highlights of WPF
October 28th, 2007
(From the book Windows Presentation Foundation Unleashed)
Broad integration
Resolution independence
Hardware acceleration
Declarative programming
Rich composition and customization
Easy deployment
In short, WPF aims to combine the best attributes of systems such as DirectX (3D and hardware acceleration), Windows Forms (developer productivity), Adobe Flash (powerful animation support), and HTML (declarative markup and easy deployment).
从Py2Erl开始的半天搜索
October 24th, 2007
(昨天发在ECUG的一个邮件,想了一下,还是放到自己blog上)
今天上午,尝试用ErlyWeb做一个petstore,最终被击败了。CaoYuan的blog帮了很大忙:
http://blogtrader.net/page/dcaoyuan/entry/from_rails_to_erlyweb_part2
结论:ErlyWeb在开发便利性方面距离Rails不是一点半点。尤其是view可用的工具太少,有太多东西要从头做起。用来做web前端,不仅有高射炮打蚊
中午写InfoQ的这个报道,其间看了一遍"Py2Erl"那个讲稿,兴趣起来了。
InfoQ报道:http://www.infoq.com/cn/news/2007/10/cn-erlounge-ii
讲稿:http://www.erlang.org.cn/ecug/071013-erlparty2/071014-py2erl/
找到了Stackless Python,写了一段小程序。好玩,靠谱。
Stackless Python:http://www.stackless.com/
抄一段小程序:http://gigix.thoughtworkers.org/2007/10/23/is-stackless-python-the-way
有人做了benchmark,差强人意吧
http://muharem.wordpress.com/2007/07/31/erlang-vs-stackless-python-a-...
函数式编程,现在已经不成其为卖点了。Erlang最吸引我的是"那种"对并发程序设计的建模方式。从stackless那里看到,原来这个模式叫Actors Model,有年头。
C2的解释:http://c2.com/cgi/wiki?ActorsModel
这篇文章非常好看:http://www.cypherpunks.to/erights/history/actors/AIM-410.pdf
这篇也好看,就是太玄虚了点:http://www.cypherpunks.to/erights/history/actors/AIM-691.pdf
好吧……Ruby咋样呢?继续人肉搜索……要说Ruby(和/或Python)社区从Erlang那里得到什么,直接转过去是可能性不大滴,主要还是(1)学习
Erlectricity是一个bridge:http://code.google.com/p/erlectricity/
Rebar是另一个bridge,成熟度更低:http://rubyisawesome.com/2007/4/30/calling-erlang-from-ruby-teaser
Omnibus实现了Actors Model,成熟度也很低:http://groups.google.com/group/ruby-talk-google/browse_frm/thread/ec4...
拿着Omnibus玩了一会儿。这个语法写出来就等而下之了。看了看源代码,没有什么奇妙的,只是把Thread封装了一下而已。倒是future的概念,是用native C代码实现的。
又搞了一段小程序:http://gigix.thoughtworkers.org/2007/10/23/is-concurrent-ruby-better
什么是future? http://www.ps.uni-sb.de/alice/manual/futures.html
听说Ruby 1.9要加入一个叫做Fiber的东西。这个,把语法糖扔掉以后,和Omnibus基本上同一回事……
http://www.infoq.com/news/2007/08/ruby-1-9-fibers
还有一个围绕着Ruby线程模型的讨论。GIL会对并发编程造成什么影响呢?没认真去想。
http://www.infoq.com/news/2007/05/ruby-threading-futures
以上。
--
Jeff Xiong
Software Journeyman - http://gigix.thoughtworkers.org
Open Source Contributor - http://rubyworks.rubyforge.org
Technical Evangelist - http://www.infoq.com/cn/
Is Concurrent Ruby Better?
October 23rd, 2007
Code with The Omnibus Concurrency Library
require 'concurrent/actors'
include Concurrent::Actors
Message = Struct.new :ping, :pong
ping_thread = Actor.spawn do
loop do
Actor.receive do |f|
f.when Message do |m|
puts "PING"
sleep(1)
m.pong << Message.new(m.ping, m.pong)
end
end
end
end
pong_thread = Actor.spawn do
loop do
Actor.receive do |f|
f.when Message do |m|
puts "PONG"
sleep(1)
m.ping << Message.new(m.ping, m.pong)
end
end
end
end
ping_thread << Message.new(ping_thread, pong_thread)
while(true)
puts("WAITING...")
sleep(5)
end
Also, it runs…forever.
Is Stackless Python THE Way?
October 23rd, 2007
Code with Stackless Python
#
# pingpong_stackless.py
#
import stackless
ping_channel = stackless.channel()
pong_channel = stackless.channel()
def ping():
while ping_channel.receive(): #blocks here
print "PING"
pong_channel.send("from ping")
def pong():
while pong_channel.receive():
print "PONG"
ping_channel.send("from pong")
stackless.tasklet(ping)()
stackless.tasklet(pong)()
# we need to 'prime' the game by sending a start message
# if not, both tasklets will block
stackless.tasklet(ping_channel.send)('startup')
stackless.run()
And it runs…forever.
Break Out a Method Object (From a Monster Method)
October 21st, 2007
(From the book Working Effectively with Legacy Code )
Sensing variables are very powerful tools in our arsenal, but sometimes you notice that you already have variables that would be ideal for sensing but that are local to the method. If they were instance variables, you could sense through them after a method runs. You can turn local variables into instance variables, but, in many cases, that can be confusing. The state that you put there will be common only to the monster method and the methods that you extract from it. Although it will be reinitialized every time the monster method is called, it can be hard to understand what the variables will hold if you want to call methods that you’ve extracted independently.
One alternative is Break Out Method Object (330). This technique was first described by Ward Cunningham, and it epitomizes the idea of an invented abstraction. When you break out a method object, you create a class whose only responsibility is to do the work of your monster method. The parameters of the method become parameters to a constructor on the new class, and the code of the monster method can go into a method named run or execute on the new class. When the code has been moved to the new class, we’re in a great position to refactor. We can turn the temporary variables in the method into instance variables and sense through them as we break down the method.
Breaking out a method object is a pretty drastic move, but unlike introducing a sensing variable, the variables that you are using are needed for production. This allows you to build up tests that you can keep. See Break Out Method Object (330) for a detailed example.
InfoQ中文站大篇幅报道iTechTag网站
October 20th, 2007
InfoQ对iTechTag 的团队——实际上也就是Iceskysl和我俩人做了个采访:技能云:两人两周的Web 2.0网站
因为Ruby on Rails的出现,借用互联网创业的人越来越多,虽然不能说全是RoR的功劳,但至少说明技术门槛的降低加速了互联网的发展。从前从一个点子的产生到实现可能要耗费少则几个月,多则几年的时间,而现在几天或者几周就可以看到原型。
但Web 2.0网站的成功之处很大程度上在于创意的新颖与否。根据熊节的介绍,“释放程序员声望的价值”这一理念已经被人提出了好久,但却没有人借助于网络实现。正是抓住这一点,才有了技能云这个“创意+技术”的结合产物。虽然我们不能预测这样的网站前景如何,但事实证明它们确实有效:在不到两个月的时间内,已经有107个用户提交了51个项目,标识了77个技能。
iTechTag 于我,是一个真正好玩的“玩意”。把自己想到的东西做出来,才真够有意思。这就是Web2.0的力量,这就是Ruby on Rails的力量。
关于盲从和怀疑,以及对Erlang的怀疑
October 18th, 2007
李剑在InfoQ中文站的新闻里提了一个好问题,
“信 仰”这个词从广义来讲说范围太大,如果对其进行细化,至少可以分成两类:一种是自己并无亲身体验,只是听到众多技术专家、敏捷推动者对TDD的宣传、推 崇,就陷入了对这个“魔咒”无限的狂热中,这个可以算是盲从;另外一种,则是在实际开发过程中有过使用TDD的丰富经验,并且对TDD所带来的益处深有体 会,所以才会坚定不移的继续使用TDD,并致力于它的推广。那么,你对敏捷和TDD的感觉应该属于哪一种?
实际上James Coplien的抱怨——“ 我们被告知‘只有做TDD你才是一个专家’……,却不告诉我们为什么要相信这一点”——很多时候恰好是由于像ThoughtWorks这样的咨询公司被误解的好意:我们真的知道,在那个情景下TDD(或者别的敏捷实践)会有所帮助;但要拿出证据来证明这一点,或者说清楚具体应该怎么做,我们没有这么多(免费的)时间和精力了。有时候说话说一半确实会造成误解,不过我仍然认为:信息多一点总比少一点的强。
另外某同志在给客户的信里说Erlang会是web开发的下一个王子。可他举的例子真算不上有吸引力:第一,用Erlang做这种东西怎么看也觉得是大炮轰蚊子;第二,这个SlideAware怎么看也觉得是个过度设计的Web 2.0作品——至少我个人还是比较倾向于Google Doc。所以这事情仍然很tricky:多少网站当真需要“9个9”的可靠性?为了一个关键部位的完美实现而提高整个网站的开发(和维护)难度,这事情在什么情况下会划算?ErlyWeb离Rails还有多远?
黄亮的Blog也太重量级了……
October 17th, 2007
虚拟货币经济体的技术问题和非技术问题
October 17th, 2007
猛禽大叔也掺和到虚拟货币经济体的讨论里面。而且还——非常敏锐地——指出虚拟货币对现实经济体造成影响的可能性。
当用户向腾讯购买Q币的时候,相当于腾讯向用户贷款,以未来用户购买的虚拟物品为偿还物。因为从包括虚拟经济与实体经济的整个经济环境里 考虑,用户购买Q币后,用户的资产总额没有改变,只是一部分资金从实体世界进入虚拟世界,但是作为实体世界一员的腾讯资金得以增加,也就是说整个经济体中 的“钱”出现增量。
不过“用户的资产总额没有改变”有一个前提,那就是用户能够把Q币——不论直接还是间接地——兑换成人民币。这用一个很简单的例子就能看明白:如果你花50块钱去做个马杀鸡,你不可能说你的资产总额没有改变,因为你没办法把自己买到的东西(按摩服务)再换回人民币。汽车行业有个笑话,说一辆汽车一生中最悲惨的一天就是它被卖出的那一天,因为它当天就要贬值20%。所以猛禽大叔的这个“贷款论”实际上暗含着一个非常英明的措施:保证Q币一定能以某种官方的或者民间的汇率兑换成人民币,而这就意味着虚拟货币与真实货币锚定。而且即便如此,从腾讯的角度来说,资金的增量同时也就意味着应付账款的增量,整个经济体中的“钱”还是不会因为这一兑换而增加。
而一旦锚定真实货币,虚拟货币的发行者就会面临更多的非技术问题——当然技术问题是显而易见的,因为滥发货币就会导致用户挤兑最终把这家公司给兑垮。然而非技术层面的问题在我看来恐怕更麻烦。首先,这就会让腾讯成为一家实际经营信贷业务的金融机构,那么它的监管会归到银监会还是别的监管机构呢?它的存款保证金率该怎么规定?它的审计怎么做?它的资产负债表会发生多大的变化?其次,一旦虚拟货币和真实货币锚定,就意味着网络安全不再是一个网络技术问题,它瞬间就变成了一个金融安全问题。所以从技术上来说,锚定真实货币固然是解决虚拟经济体通货膨胀的最佳办法;但之所以大多数网游(包括QQ)不做这件事,恐怕还是出于非技术因素的考虑。
这也就是我为什么在前一篇文章里提到支付宝的原因:支付宝实际上就是一个地下钱庄,它毫无疑问是有信贷功能的,所有这些人放在支付宝帐户上的余额就是存款,也就是银行的负债。既然支付宝能得到政府的认可,至少说明有现实的途径来解决这些非技术问题,最起码阿里巴巴对自己的资产负债表和存款保证金率就得有个说法。这实际上是给别的虚拟货币经济体提供了一个开路的参考。
The Legacy Code Change Algorithm
October 15th, 2007
(From the book Working Effectively with Legacy Code )
When you have to make a change in a legacy code base, here is an algorithm you can use.
1. Identify change points.
2. Find test points.
3. Break dependencies.
4. Write tests.
5. Make changes and refactor.
What Is Legacy Code
October 15th, 2007
(From the book Working Effectively with Legacy Code )
To me, legacy code is simply code without tests. I’ve gotten some grief for this definition. What do tests have to do with whether code is bad? To me, the answer is straightforward, and it is a point that I elaborate throughout the book:
Code without tests is bad code. It doesn’t matter how well written it is; it doesn’t matter how pretty or object-oriented or well-encapsulated it is. With tests, we can change the behavior of our code quickly and verifiably. Without them, we really don’t know if our code is getting better or worse.
自组织的网游金融体系
October 11th, 2007
恶魔看了我那篇从游戏看货币以后找我随便聊了几句:
TrustNo1: 事实上,它应该做的是维护一个玩家自由发行货币的制度。就是玩家可以自行发行自己的货币。我发行我的trustno1元,你发行你的gigix元。
Gigix: 等会,你这个还是说不过去。比如说大家在游戏里发行金本位货币,那作为游戏运营商你还是得把游戏黄金和现实人民币锚定,不然问题还是一样。
TrustNo1: 锚定不锚定是玩家自己的事情。也就是一个虚拟货币和实物的交易平台。你愿意锚定黄金可以,你要愿意锚定你家的草纸也没问题,反正到最后锚定不了的自然关张歇业。
Gigix: 于是商业银行就浮现了。央行就在商业银行的博弈中浮现了。游戏运营商就创世了。
TrustNo1: 类似央行的组织,未必就是运营商,极为可能的是行会。运营商会沦为打手。事实上我觉得游戏本身就不因该有钱币掉落的机制,货币应该产生于玩家之间的借贷。事实上运营上可以利用网络的优势提供信贷保证和追债,也就是说在网游里,小额的贷款的风险也是比较低的。
最有意思的是,这个设想离现实并不太远,因为它只需要两个前提条件。首先是一个虚拟物品和现实货币的交易平台,这样玩家就可以把自己认可的一般等价物(或者说穿了,虚拟货币)与人民币锚定。比如说恶魔发行T1元,他可以保证说:只要有人在这个平台上以1RMB兑10个T1元的汇率出售T1元,他就一定全额买入,这样他就绕过了游戏运营商,建立了自己的信用货币体系。而这个交易平台已经存在了,那就是Goodhope好望角——我还参与这个平台的开发了呢。
有了交易平台以后,下一个问题就是货币本身了。用作货币的一般等价物其获得成本应该极其低廉,同时又具备不可伪造性,这样才能充分降低交易成本以获得足够的流动性。网络游戏在这个时候体现出了与真实世界最大的区别:真实世界有无穷多的物品,一张白纸、一个贝壳、一片树叶……都可以成为信用货币的载体;而游戏世界里所有的物品都是受控的,你没办法随手抓一张白纸来写一份借据,除非游戏设计允许你这样做。所以前面说的玩家自组织的金融体系,其实只缺这一个条件:玩家自由创造物品。
想象这样一个情景:一个玩家可以到杂货铺花一个金币购买一千张白纸,然后把每张白纸裁成十六份,然后用一个小法术在每个小纸片上写上“100 T1元”。如果游戏允许玩家做这样的事,游戏本身不断贬值的阿兹台克金币就会失去其虚拟货币的地位,我们就会看到整个金融行业的进化史。这会是真的吗?
天地不仁,通货在膨胀
October 9th, 2007
云风写了一个“网络游戏的技术基础”,作为对我说的“技术派路线”的回复。当然毫无疑问技术最终是一切制度得以实施的保障。“技术上能做的,也是首先要做的,是建立一些可以被实现且简洁的基本规则出来。它的首要目标不是对现实模拟的拟真度,而是可实现性”——从云风这句话可以产生很多联想,譬如说,天地不仁,以万物为刍狗。
《计算中的上帝》有些东西会让人对神祗很感恩,比如说电磁力和引力之间的平衡只要偏差10的负40次方,这个宇宙就不会有任何碳基生命存在。但感恩的同时也会隐隐的有些遗憾:如果采用了另一组规则,这个世界会是什么样子?很多大手笔的科幻小说和YY小说和穿越文以“改变简单规则的后果”为题材,可见这种遗憾心态之存在的普遍性。
真实世界里没有的机会可以在网络游戏里出现——我上大学的时候写过一句话:科幻让我做梦,编程让我梦想成真。而相比电磁力强度之类比较难想象并且造成的后果太过剧烈的调整,对经济规则的调整更具现实意义。比如说一个滥发金元券的社会是什么样子?我大一的时候就知道了,而且有趣的部分是这样的社会能养出一批崇尚清谈的有闲特权阶层。如果上帝真在天上看这个世界的话,我觉得他未必会认为这样的世界就不好。再比如说我老爸每天玩联众台球,他并不在意自己的分数有多少,为什么,因为这个世界的价值体系不同。
但另一方面,如果打算把现实世界的价值体系代入游戏世界,这事情就变得有意思了。比如某同学在云风的blog上回复的“打怪掉东西,卖东西赚钱……打怪不要掉钱”,明眼人一看就知道这个行不通:掉东西跟掉钱是同一回事,玩家自会找到这个游戏世界的一般等价物。另一个貌似有道理的回复“游戏世界加以通过一定手段,固定消耗玩家通过买卖东西得到的金钱(回收央行放出的货币),避免通货膨胀”同样行不通:且不说央行有没有这个动力去避免通货膨胀,首先从技术上他就做不到,因为他根本没有依据来判断是否正在发生通货膨胀。
(云风可能会说,借助精妙的技术可以做到完美监控货币发行。这事情中国政府干过,失败了,所以云风要干难度也必然不小。)
所以如果要代入现实的资本主义价值体系,解决通货膨胀的办法简单并且唯一:虚拟货币与人民币锚定,游戏央行确保虚拟货币能以汇率兑换成人民币,那游戏的通胀就决然不会超过CPI。这才正经是以万物为刍狗。用精妙技术调节,那是大道废有仁义智慧出有大伪。当然从游戏的角度来说,资本主义价值体系是不是合适这本身就是非常值得讨论的一个问题,比如说暴雪似乎就不这么认为。
(故事到这才刚开始。昨天我太太无意中说了句:“这腾讯俨然就是个地下钱庄啊。”哎,正中要害。虚拟货币和人民币一锚定,拥有几千万玩家的网游运营商不就成了金融机构?不过既然支付宝都能扶正,这个问题至少在技术上是能解决的,虽然难度非常的不小。)
咨询是一种心理状态
October 6th, 2007
刚才看到一篇blog:如何运营发展一个科比球迷网站
我是什么时候做科比球迷网站的?大概是98年或者99年吧。现在那些科比的小球迷们,还有多少人记得Eddie Jones和Nick Van Exel呢?那时候大家还不用Google,在搜狐搜索“湖人”或者“科比”,我的网站都曾经是排第二名的。
但就是没坚持做下来。我觉得这是我、以及很多ThoughtWorkers、或者说这些自认为很聪明并且确实很聪明的人的一个大毛病。我们只喜欢做最刺激的部分,但一个成功的事情不仅包含最刺激的部分,甚至最刺激的部分并不是最重要的部分。只有在最难的时候坚持住,在觉得特别没劲的时候还一直做下去,把最琐碎机械的事也做到好,事情才能做成。
比如说,在科比表现不佳的时间里,在夏季休赛的时候,也一直坚持着维护他的球迷网站。这没有任何刺激的部分,从山间小树的帖子就能看出来。我有时候想,如果我能这样做事,现在中国最好的科比球迷网站大概就是我的吧。
所以,这就是为什么我只适合做咨询的原因。这种情况至今没有变化。这也挺好的。
从游戏看货币
October 3rd, 2007
云风在七月时写的“游戏中的货币”,今天我才看到。恶魔以前就经常说,网络游戏是研究经济学的一个绝佳场所,因为它纯粹并且快速。像云风这样有兴趣研究又有大量的第一手资料,在经济学领域有所建树的机会非常大。
第一个问题是:货币的产生并不完全是靠央行对商业银行的借贷。或者准确点说,这种借贷只是货币创造过程中的一个现象。实际的货币产生过程比这还要简单:利率就是流动性的摩擦力,央行通过调低利率就可以增加流动性从而实现货币的发行(即使央行本身并不增加任何额外的贷款);同样的道理,通过加息就可以实现货币的回收。现代金融体系是信用体系,通过控制流动性就可以调节货币供给。(这本《货币银行学》的第11章“银行信贷与货币创造”应该会包含所有的技术细节。)
第二个问题是:云风的解决方案始终都是技术性的,甚至还说“与人民币挂钩并没有和打怪、做任务领取奖金这些玩家自由投放有本质的不同”——从实现层面上来说确实如此,但从制度层面上来说就完全不同了。云风自己也意识到,虚拟货币与人民币挂钩会使虚拟货币投放量变少。那为什么会变少呢?没有信用锚定的货币很容易通货膨胀。七个人分一盆粥,你可以用精妙的技术来实现平均分配,但其实还有更容易的办法,不是吗?
即便云风坚持自己的技术派路线,第三个问题也同样严重。根据宁波的这个案例,虚拟财产也是财产,同样受法律保护。这事就很有意思了……如果虚拟货币不与人民币锚定,云风等人身上的责任可就更加沉重了:一旦发生通货膨胀,袁大头变成了金元券,游戏运营商就难辞侵犯玩家虚拟财产之罪——有宁波案例在先,那就不光是玩家起哄投诉的事了。用技术弥补制度缺陷,这事一向不好办,所以云风的工作是伟大而值得尊敬的。



