透明思考


Transparent Thoughts


  1. 了解,思考,选择,行动

    为一些事情闹情绪是没有用的。因为闹情绪无助于生存。要注意的是学习所有东西,分析情况,选择行动路线,然后是大胆的行动。了解、思考、选择、行动,整个过程里没有“感觉”的位置。不是比恩没有感觉。他不过是拒绝想到它们、谈论它们、让它们影响自己的决定。特别是当作出重要的决定的时候。

    安德的影子


  2. Highlights of WPF

    (From the bookWindowsPresentation Foundation Unleashed)

    Broad integration

    Resolution independence

    Hardware acceleration

    Declarative programming

    Rich composition and customization

    Easy deployment

    In short,WPFaims to combine the best attributes of systems such as DirectX (3D andhardware acceleration), Windows Forms (developer productivity), Adobe Flash (powerfulanimation support), andHTML(declarative markup and easy deployment).


  3. 从Py2Erl开始的半天搜索

    (昨天发在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)学习人家的先进思想;(2)混合语言编程。Ruby在这方面的努力,包括Ruby-Erlang bridging和自己实现Actors Model。
    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/


  4. Is Concurrent Ruby Better?

    Code withThe Omnibus Concurrency Library

    require ‘concurrent/actors’include Concurrent::ActorsMessage = Struct.new :ping, :pongping_thread = Actor.spawn doloop doActor.receive do |f|f.when Message do |m|puts “PING”sleep(1)m.pong  Message.new(m.ping, m.pong)endendendendpong_thread = Actor.spawn doloop doActor.receive do |f|f.when Message do |m|puts “PONG”sleep(1)m.ping  Message.new(m.ping, m.pong)endendendendping_thread  Message.new(ping_thread, pong_thread)while(true)puts(“WAITING…”)sleep(5)end

    Also, it runs…forever.


  5. Is Stackless Python THE Way?

    Code withStackless Python

    ## pingpong_stackless.py#import stacklessping_channel = stackless.channel()pong_channel = stackless.channel()def ping():while ping_channel.receive(): #blocks hereprint “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 blockstackless.tasklet(ping_channel.send)(‘startup’)stackless.run()

    And it runs…forever.


  6. Break Out a Method Object (From a Monster Method)

    (From the bookWorkingEffectively with Legacy Code)

    Sensing variablesare very powerful tools in our arsenal, but sometimes you notice that you already have variablesthat 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 instancevariables, but, in many cases, that can be confusing. The state that you put there will be commononly to the monster method and the methods that you extract from it. Although it will bereinitialized every time the monster method is called, it can be hard to understand what thevariables will hold if you want to call methods that you’ve extracted independently.

    One alternative isBreak Out Method Object (330). This technique was first described by WardCunningham, and it epitomizes the idea of an invented abstraction. When you break out a methodobject, you create a class whose only responsibility is to do the work of your monster method. Theparameters of the method become parameters to a constructor on the new class, and the code of themonster method can go into a method namedrunorexecuteon the new class. When the code has been moved to the new class, we’re in a great position torefactor. We can turn the temporary variables in the method into instance variables and sensethrough them as we break down the method.

    Breaking out a method object is a pretty drastic move, but unlike introducing a sensing variable, thevariables that you are using are needed for production. This allows you to build up tests that youcan keep. SeeBreak Out Method Object (330)for a detailed example.


  7. InfoQ中文站大篇幅报道iTechTag网站

    InfoQ对iTechTag的团队——实际上也就是Iceskysl和我俩人做了个采访:技能云:两人两周的Web 2.0网站

    因为Ruby onRails的出现,借用互联网创业的人越来越多,虽然不能说全是RoR的功劳,但至少说明技术门槛的降低加速了互联网的发展。从前从一个点子的产生到实现可能要耗费少则几个月,多则几年的时间,而现在几天或者几周就可以看到原型。

    但Web2.0网站的成功之处很大程度上在于创意的新颖与否。根据熊节的介绍,“释放程序员声望的价值”这一理念已经被人提出了好久,但却没有人借助于网络实现。正是抓住这一点,才有了技能云这个“创意+技术”的结合产物。虽然我们不能预测这样的网站前景如何,但事实证明它们确实有效:在不到两个月的时间内,已经有107个用户提交了51个项目,标识了77个技能。

    iTechTag于我,是一个真正好玩的“玩意”。把自己想到的东西做出来,才真够有意思。这就是Web2.0的力量,这就是Ruby on Rails的力量。


  8. 关于盲从和怀疑,以及对Erlang的怀疑

    李剑在InfoQ中文站的新闻里提了一个好问题,

    “信仰”这个词从广义来讲说范围太大,如果对其进行细化,至少可以分成两类:一种是自己并无亲身体验,只是听到众多技术专家、敏捷推动者对TDD的宣传、推崇,就陷入了对这个“魔咒”无限的狂热中,这个可以算是盲从;另外一种,则是在实际开发过程中有过使用TDD的丰富经验,并且对TDD所带来的益处深有体会,所以才会坚定不移的继续使用TDD,并致力于它的推广。那么,你对敏捷和TDD的感觉应该属于哪一种?

    实际上James Coplien的抱怨——“我们被告知‘只有做TDD你才是一个专家’……,却不告诉我们为什么要相信这一点”——很多时候恰好是由于像ThoughtWorks这样的咨询公司被误解的好意:我们真的知道,在那个情景下TDD(或者别的敏捷实践)会有所帮助;但要拿出证据来证明这一点,或者说清楚具体应该怎么做,我们没有这么多(免费的)时间和精力了。有时候说话说一半确实会造成误解,不过我仍然认为:信息多一点总比少一点的强。

    另外某同志在给客户的信里说Erlang会是web开发的下一个王子。可他举的例子真算不上有吸引力:第一,用Erlang做这种东西怎么看也觉得是大炮轰蚊子;第二,这个SlideAware怎么看也觉得是个过度设计的Web 2.0作品——至少我个人还是比较倾向于Google Doc。所以这事情仍然很tricky:多少网站当真需要“9个9”的可靠性?为了一个关键部位的完美实现而提高整个网站的开发(和维护)难度,这事情在什么情况下会划算?ErlyWebRails还有多远?


  9. 黄亮的Blog也太重量级了……

    黄亮的Blog:Test Everything

    这个……作为个人Blog来说,WordPress未免也太重量级了吧……居然还可以注册用户的……

    黄亮同志早晚会成为TDD一代宗师的,照这样发展下去。


  10. 虚拟货币经济体的技术问题和非技术问题

    猛禽大叔也掺和到虚拟货币经济体的讨论里面。而且还——非常敏锐地——指出虚拟货币对现实经济体造成影响的可能性。

    当用户向腾讯购买Q币的时候,相当于腾讯向用户贷款,以未来用户购买的虚拟物品为偿还物。因为从包括虚拟经济与实体经济的整个经济环境里考虑,用户购买Q币后,用户的资产总额没有改变,只是一部分资金从实体世界进入虚拟世界,但是作为实体世界一员的腾讯资金得以增加,也就是说整个经济体中的“钱”出现增量。

    不过“用户的资产总额没有改变”有一个前提,那就是用户能够把Q币——不论直接还是间接地——兑换成人民币。这用一个很简单的例子就能看明白:如果你花50块钱去做个马杀鸡,你不可能说你的资产总额没有改变,因为你没办法把自己买到的东西(按摩服务)再换回人民币。汽车行业有个笑话,说一辆汽车一生中最悲惨的一天就是它被卖出的那一天,因为它当天就要贬值20%。所以猛禽大叔的这个“贷款论”实际上暗含着一个非常英明的措施:保证Q币一定能以某种官方的或者民间的汇率兑换成人民币,而这就意味着虚拟货币与真实货币锚定。而且即便如此,从腾讯的角度来说,资金的增量同时也就意味着应付账款的增量,整个经济体中的“钱”还是不会因为这一兑换而增加。

    而一旦锚定真实货币,虚拟货币的发行者就会面临更多的非技术问题——当然技术问题是显而易见的,因为滥发货币就会导致用户挤兑最终把这家公司给兑垮。然而非技术层面的问题在我看来恐怕更麻烦。首先,这就会让腾讯成为一家实际经营信贷业务的金融机构,那么它的监管会归到银监会还是别的监管机构呢?它的存款保证金率该怎么规定?它的审计怎么做?它的资产负债表会发生多大的变化?其次,一旦虚拟货币和真实货币锚定,就意味着网络安全不再是一个网络技术问题,它瞬间就变成了一个金融安全问题。所以从技术上来说,锚定真实货币固然是解决虚拟经济体通货膨胀的最佳办法;但之所以大多数网游(包括QQ)不做这件事,恐怕还是出于非技术因素的考虑。

    这也就是我为什么在前一篇文章里提到支付宝的原因:支付宝实际上就是一个地下钱庄,它毫无疑问是有信贷功能的,所有这些人放在支付宝帐户上的余额就是存款,也就是银行的负债。既然支付宝能得到政府的认可,至少说明有现实的途径来解决这些非技术问题,最起码阿里巴巴对自己的资产负债表和存款保证金率就得有个说法。这实际上是给别的虚拟货币经济体提供了一个开路的参考。