良心能够保护你自己!

沉默了很久,但是这句话要喊出来!良心能够保护你自己,问问自己的良心吧。

老婆写了一篇文章很不错的日记发生在我身上的小故事来谈谈信用问题,里面记录了上个周末我们逛灯具市场的时候遇到的一些“信用”问题,我们总是需要费神的侃价,才能稍微看清我们买的到底是个什么档次的灯。之所以感叹这个司空见惯的事情,是因为我们去澳大利亚旅游的时候看到了很多的诚信,而诚信在商业上体现在定价的自信上。我们看到的澳大利亚商人,尤其是小商品市场的商人,他们对自己的定价充满了自信。我们经常可以看到如冰箱贴这样的小商品,在他们的摊位上可能明确的写着一个3元,两个5元,3个7元。我们习惯侃价,所以问老板是否可以优惠,老板会指指板子上写的价格。那么我们会追问,那4个呢,老板会拿出计算器,3+7=10元,完全按照他写的规则来。这种死板的定价方式体现的是老板对定价的一份自信。回忆起来那里的大部分人都有这种自信。

而继续回忆,在澳大利亚我们不仅看到“自信”,更多的还是信任。比如,我们去住他们的度假村,我们说我们要出海去玩,老板就拿出两条大浴巾给我们,说出海这个用的上,当然他们信任我们会在离开的时候还给他们。街边的饮水机旁边还有抽拉纸巾,遛狗人多的地方有免费的宠物便便袋子,国家植物园是开放的,公园里面的芒果树上掉下的芒果大家也可以自助,社区里面也有公用的烧烤架,众多的方便实际上都是基于信任,大家都回按需消费这些东西,支付的是“信用”,积累的也是“信用”。

我们宏观的问问自己,“诚信”和”信任“哪里来?我觉得从良心里面来。用良心这个词是因为它非常朴素,我们也可以说它是”道德标准“。我相信朴素的感情里,人都回体现出良心。

上周和ThoughtWorks的胡凯,是我在Cruise的队友,热爱背包客文化。他和我说起曾经背包在云南步行过3个月,经常是走饿了就去田边的老乡那里讨口饭吃,老乡经常就分享出自己的”馍馍“来,并且绝对是不要胡凯的钱的。遇到好客的,胡凯还被邀请去人家一起吃过午饭,临走还拿到了老乡现采的很多脐橙,然后又拿脐橙作为报酬搭了顺风拖拉机。听起来感觉很美好,背包客非常崇尚”缘分“。我认为,”缘分“在这里其实就是朴素的良心的体现。我记得动物世界说大象是不愿意看到同类的尸骨的,他们会远远的忘着其它大象的尸骨,并且哀鸣,即使完全不认识这些尸骨的主人,并且他们走近尸骨的时候都回被“吓跑”。我觉得大象的本能是一种设身处地的朴素感觉,他们怕自己死掉,所以会对死者表示哀思。那么对于人类,这也可以更加高级的表现为看到别人有难愿意帮助,看到别人高兴自己也会高兴。

看来完全不相关的事情,其实都是良心。有良心,你可以看到朴素美好的感情,没有良心,你可以看到互相的不信任,欺诈,甚至是幸灾乐祸,还有很多到了恶毒程度的感情。

现在,还没有解释为什么一定要写这篇blog。因为有毒奶粉的问题。因为我怕我也成为沉默的大多数。

在我们公司,因为零食和饮料是免费供应的,所以冰箱里面的东西往往是提前储备好的。这次的毒奶粉事件我刚听到的时候没有在意,因为我国的食品安全问题是常事了,常见也就容易麻木。前天收到我们公司的一位新妈妈给公司集体发的一封信,提醒大家不要让声音就这样越来越小,提醒我们要注意身边的各种奶制品的安全。同事她也说到我们公司冰箱里面的蒙牛奶已经全部更新为三元的了,而提醒我们公司更换奶的人是我们一位国外的PM。听到此事有点感慨,我们公司的外国同事在公共问题上都有很强的责任感。以前有人上班用音箱放音乐,我的同事bobby就发信解释因为每个人的品味问题,所以可能每个人对所放的音乐的反应不同,所以提醒大家最好用耳机。后来有人用P2P软件看电影,网管出来说希望大家不要用了,bobby也站出来写信跟大家解释为什么。我的意思是说,我们不能沉默(龙应台的文章:中国人,你们为什么不生气?),我们要负起责任。公共责任也是良心的体现。

我的文笔不好,写点文字总是形散神也散。上周周末我们非常成功的又举办了一次Beijing Open Party活动,我这次又当了主持,回家的时候我感觉非常累,身体累,但是精神上非常满足。因为我感觉我为社区贡献了我的力量,这是我的责任,我认为它是我能做也应该做的一件事。我又想起我平常面对我的工作,不管是我在新浪的时候做新浪邮件,还是到了ThoughtWorks工作在Cruise和Mingle项目之间,都有一种良心在驱动我所写的程序,我怕我写的代码会对后来维护代码的人带来麻烦,所以我感觉我没有写出什么不负责任的代码。我怕,但是怕的感觉让我按照了良心做事,没有出轨。

那么如果我们的同胞都能保持孩童时的朴素感情,我想他们一定不会越轨去制造这么多可怕的食品安全灾难,那样我们就可以有足够的自信,有足够的自信为自己的服务定价,我们就可以在离开世界前都无愧于良心了。从我们自己做起,不要再带来新的灾难了。我们不能闭嘴,我们不能保持沉默!我们要告诉自己,也要告诉别人,我们有权生气,有权表达我们的想法。

去澳大利亚旅行

要和老婆去澳大利亚旅行了,这是我们第一次出国旅行。前前后后准备了有3-4个月了。

目的地是悉尼和凯恩斯,主要的亮点是大堡礁,这次可以看到以前在动物世界里面看到的奇妙世界了。

可惜错过了这次Beijing Open Party的活动,下次回来还会继续技术征途。但是在这次旅行中,完全没有技术,只有用心的去感受这个世界了,希望我能够好运!

说说我以为的RIA与Rich client

中午徐X和米高讲了一下Rich client的架构。其中徐X讲的是如何从单机分层系统到Rich client。

实际上最早的单机分层系统的UI部分激发了OO作为界面的编程模型。然后分层模型为了C/S结构发生了一些变化,目的是共享数据和通信,但是由于OO在远程调用上面的失败应用(Corba,EJB,Dcom),所以让人对OO产生了怀疑(实际上只是用错了地方)。而后又发生了B/S的变化,是一种完全的中心共享方式,原因是HTTP的无状态性造成客户端很难保存state,所以就有了完全中心共享状态的架构。而后通过通讯的增强(Ajax),客户端的状态保持逻辑通过异步通信来增强,所以产生了更好的用户体验。但是对状态同步的进一步要求和对会话状态保持的进一步要求让Ajaxian了的应用还是有点难以承受,所以Rich client又回归了。当然回归的时候同时带来的还有新的编程模型,如基于标记的声明式编程模型,还有更方便View-Model同步(通知)的数据binding机制,布局管理器,绘图支持能力,多线程能力,内嵌的视频编解码能力。其实WPF作为Windows上的新型UI编程模型他的确从Mozzila的XUL还有Adobe的mxml吸取了一些经验。上面这些是徐X阐述的主要内容,很精彩(最后的编程模型是我加的注释)。

而后米高做了一些技术层面的对比,主要是对比了Web和rich client的区别,不过我比较失望^___^,因为对比有失偏颇,原因是米高只用了5分钟准备ppt。

最后是我的意见。我现在已经不想割裂的分开Rich client和Web上的RIA,实际上目前他们已经有走向统一模型的趋势。

去年在InfoQ写文章的时候我就表达过这个意见。今天徐X也强调了,经典的MVC实际上很重要的是解决了数据共享(同步通知问题)与状态(会话)保持的问题,所有的架构问题其实都围绕了这个问题。首先RIA里面已经开始了layout数据分离的加强过程,比较明显的就是声名式的组件组合配置,还有数据绑定模型,这个在Flash和Silverlight还有JavaFx都有着重的解决,而且方向都很类似。其中Silverlight其实是一个减缩版的WPF。然后我们从架构方面来思考,解决状态共享和传递是通过增强的双向通信能力来完成的,很多RIA框架在开始提供web socket模型,这样让通讯超过无状态的且单向的HTTP,包括HTML5(目的是扩展Web上常用的一些Object,增强Web的编程能力,且让很多元素得到正确的语义,这个与XHTML2的关注点不同)的草案里面也有Web socket(类似socket的编程对象,可以实现二进制协议的面向连接的通讯)的提案。当然些努力就是让实现消息传递的开销更小,时效性更高,配合线程概念的支持,就可以实现复杂的基于消息的异步界面逻辑(这会极大的扩展RIA应用的能力)。因为通讯其实是解决状态共享的一个方向,通过高效的消息通知达到多个消费端的状态共享。另外一种解决Browser端状态同步(这里主要指客户端与服务器的数据库同步)的方法就是离线存储能力,这样削弱客户端对服务器的依赖。这种解决方案的代表就是各种Gears,Google gears,dojo offline等等,他们在浏览器里面嵌入sql lite一类的数据库,让客户端有自己的结构化存储能力,对于没有多客户端数据同步要求的应用来说离线方式可以让客户端形成完整的编程模型,通过sync机制在连线的时候进行数据同步是一种非常帮的RIA发展方向,从这个角度它已经是Rich client了。

那么可以扩展一下。我们知道Lotus Notes有服务器端replication的模式,离线会存在本地,连线的时候再同步。而对于另一些应用,极端地如Skype,他对实时的同步要求很高(当然它属于通讯类应用,也就是3C中的Communicate,而不是Content system),Skype的解决方案就是p2p。如果RIA有了socket(当然还有跨域支持),有了多线程,那么p2p是不是也不算难事了呢?状态同步通过p2p来实现,虽然不是可靠的通讯方式,但是却符合Internet的最大努力原则,所以我觉得这两种技术的结合的确很容易让RIA和Rich client不在有明显的界限,未来的目的就是融合。所以,要注意的是为什么微软拼了命在推Silverlight,而且拼了命的公布了Mac和Linux版本的Silverlight,其重要原因就是让WPF的模型渗透到RIA,用Rich client围攻RIA,来解决Adobe用超级NB的Air这个RIA衍生来围攻Rich client的困难。

这样,我们知道2年前开始声音渐强的Offline storage和越来越强的绘图,data binding的意图了吧,融合已经开始了,目标当然就是吃下这个大平台,然后成为最大的赢家!

关于Javascript的入门图书

犀牛书绝对的过时,也绝对的不友好。在开始的时候,作为一本系统讲解javascript的书,它非常注重阐述规范,所以在那个时代它是最好的图书。但是现在,作为js技术的入门图书,我们有一些更好的从javascript的精髓和基本理念入手的图书,读完他们你就可以体会到规范为什么是这个样子,从记忆角度来说理解后的记忆要强过死记硬背,所以用这些图书入门是更好的选择。

Update: 有位Sina的同事说道犀牛书还是要有一本的,目的是作为参考书。我倒是觉得这个完全可以依靠网络,因为大部分时候我们就是想索引一下方法,或者看看方法签名和解释,这个时候通过在线服务绝对要好过翻书。服务里面gotapi是个不错的选择!

在国内看翻译的推荐看:

1、大辫子nicholas写的Javascript高级程序设计

2、John Resig写的精通Javascript (Pro javascript)

ppk on javascript这本书也不错,比较实用,但是个人感觉没有精通Javascriptt这本讲的清楚。

如果看原文可以期待:

1、John Resig的Javascript Ninja,未出版,但是有样章。

2、Js大神Douglas Crockford的Javascript The good parts.

上周和钱钱讨论Programming Ruby这本书的时候我们也持这个观点,它曾经是一本非常棒的入门书,因为那个时候它是第一本非日文的Ruby图书。但是这本经典书到了现在已经有了很多不一样的竞争者,像钱钱同学推荐的Every day scripting with ruby就更偏实践,更容易让你入ruby的门。

防止脑子坏了

Limo说我总喜欢把twitter的内容和google reader贡献也聚合到我的wordpress (blog)里面是个非常不好的“恶习”。可是我觉得实在是没有办法,因为现在我能产生的唯一一些有价值的信息估计都在twitter的bitching里面或者google reader的人肉过滤结果里面了。当然,如果3个以上的朋友在twitter或者邮件里面也同意Limo所说我就停止这样的做法。

博文标题说“防止脑子坏了”是因为最近一年经常发生上下文丢失的事情,就是说本来是想做事情A,但是实际上却转去做了事情B、C、D,结果最后一件也没有做好。还有一种情况是要实现一个目标,结果遇到了问题A,结果为了解决问题A又发生了问题B,我又调查了问题C、D、E都没有解决问题B,造成最后很疲惫的一件事情都没做好。我觉得这种情况发生的原因是“思路的丢失”。在一个人的思考习惯有问题的时候就容易发生这种丢失思路的毛病。

这种丢失思路对于我这种看到什么都感兴趣的人来说就造成了什么事都做不专。可是我一直以来是以做事情做的专业自居的(为了我的自信心,不要反驳我的这个说法)。在和Limo pair一些东西的时候我也发现了这种情况,他说你做事的方式有改进的空间。因为我这个人本性里面缺少决断力,所以做事犹豫,所以就需要更多的理由来支持自己,所以非常容易发生分支思路。如果所有的分支思路都去cover一遍,那么付出的努力就会很大。无法让问题收敛并最终达到一开始的目标。

我现在已经意识到了这个问题,我正在思考解决的方法。我听说钱钱同学在学习决断力的课程,我相信用处不大,因为人的思考方式没有那么容易就通过学习班提高。今天我尝试了冥想的方式,自己感觉身体的每一个部位的存在,发现这种类似健康治疗的方法对于集中注意力非常有好处,感觉这是个路子。然后开始执行的就是在电脑工作的时候开一个文本记录思路和所有做过(要做,尽量让要做的分支工作进入堆栈,推后处理),在其它地方做事就尽量用本子记录同样的事情。短期看,已经发现了做事效率的提高,起码减少了不少分支的发生。待续…

一端简单的向iframe里面注入css的javascript

随手实验了一下这个是好用的(当然这个iframe要同源,否则安全限制无法修改)。原因是我们的系统里面有iframe输出后台的log,里面的样式都是默认的,为了后台无侵入,所以用js修改样式。这样就可以(也可以注入css文件,这样更干净)。注意contentWindow的写法在IE略有不同。

var css = $('testframe').contentWindow.document.createElement('style');
css.type = 'text/css';
css.innerHTML = 'body {font-size: 7px; color: red;}';
$('testframe').contentWindow.document.getElementsByTagName('head')[0].appendChild(css);

短小精悍的Javascript模板引擎

今天看到Jonh Resig的博客里面提到了他在他的Secrets of the JavaScript Ninja这本书里面介绍的一种简单的模板,代码如下:

// Simple JavaScript Templating
// John Resig - http://ejohn.org/ - MIT Licensed
(function(){
var cache = {};

this.tmpl = function tmpl(str, data){
// Figure out if we're getting a template, or if we need to
// load the template - and be sure to cache the result.
var fn = !/\W/.test(str) ?
cache[str] = cache[str] ||
tmpl(document.getElementById(str).innerHTML) :

// Generate a reusable function that will serve as a template
// generator (and which will be cached).
new Function("obj",
"var p=[],print=function(){p.push.apply(p,arguments);};" +

// Introduce the data as local variables using with(){}
"with(obj){p.push('" +

// Convert the template into pure JavaScript
str
.replace(/[\r\t\n]/g, " ")
.split("<%").join("\t") .replace(/((^|%>)[^\t]*)'/g, "$1\r")
.replace(/\t=(.*?)%>/g, "',$1,'")
.split("\t").join("');")
.split("%>").join("p.push('")
.split("\r").join("\\'")
+ "');}return p.join('');");

// Provide some basic currying to the user
return data ? fn( data ) : fn;
};
})();

这段代码非常简单,但是却有不少trick。而且这些trick十分的优雅(John resig一向擅长写优雅的javascript)。非常值得读一下。思路就是把一段模板引擎里面的求值代码标记出来,将其余代码用单引号包裹起来,所以代码会分为文本和求值两种部分,压入一个Array,最后join。把这个逻辑用string的形式初始化一个Function对象,然后cache起来就成为一个高效的javascript模板引擎了。不过这个引擎只有求值赋值的功能,没有更加复杂的逻辑控制如if, else, for这些循环,但是在求值部分增加一些正则判断来处理这部分逻辑也是可行的。我非常喜欢的Trimpath Javascript Template估计也是这个思路(虽然经常用,但是由于代码可读性的问题一直没有仔细阅读它的源码)。

这段代码里面的闭包用法也很不错,可以防止命名冲突和全局变量的污染,不过这个写法估计大家都比较熟悉了。

模板的用法就不赘述了,如果你想用这个微型模板可以看看John Resig的JavaScript Micro-Templating

路与两人谈广告

刚才路上听到了一段谈话,让我怀疑了广告的作用。
一个女的说,你看功夫熊猫了没有?男的说看了。女的继续问你看最近IBM做的那个广告没有?就是拿功夫熊猫为主题做的(实际上是HP,所以说这个广告费就是白花了,对于这部分人来说IBM就是电脑的代名词,所以所有的电脑广告都是给IBM做的,HP多么亏呀。)
然后男的说是么?我还以为你说IBM讽刺苹果那个广告呢,因为IBM笔记本的R系列也是超轻薄,有光驱…(实际上Thinkpad不是IBM的品牌了,是Lenovo的,这次联想哭了。而且超轻薄的是X系列,不是R系列,估计因为R系列便宜所以卖的好,深入人心。)
幸好那个男的最后说苹果那个Macbook Air特薄(而且发音还特标准),心想Think different所以逃离了IBM的魔爪…

所以,联想到的是,对于这些先入为主的品牌,如果做了特别吸引眼球的广告,最后却帮别人作了深入人心的宣传…可惜可惜。做别的营销也要注意这个问题呀。
所以,反观恒源祥、脑白金这一流强化了品牌意识,所以从来不为别的品牌挣骂名,坏名声都在自己头上,钱可是一分都没有百花。这就是高!

雨夜的离别,送马波

今天外面下雨了,但是与前面的连阴雨天之间间隔了两个闷热的艳阳天。又一位同事离开了,他是我的sponsor。心里第一次有了点不舍的感觉,原因在于钱钱。钱钱(moxie)是我在TW遇到的第一个没有见过面的朋友,而且他人很好,我们这里所有的人都说钱钱人很好。君子之交淡如水,钱钱绝对是个君子,不用多说,我心里把他看得好重,他是我的好朋友。上周一次和钱钱pair修改bug的时候听说我的sponsor马波要走了,当是我很震惊,可是也觉得意料之中,这要从我们一起吃饭说起。
我们的sponsor就是在公司内部的一个比你资历深的师傅,不能说是传统的“师傅”,因为他不教我技术,他只是帮我做职业生涯规划还有帮我协调一些需要的资源。这种制度在我了解和呆过的公司中是独一无二的。sponsor会帮你做review,帮你进步,所以会有sponsor meeting,也就是一顿饭。之间我了解到马波原来是博士,这与他粗俗的外表形成了反差,从外表上来说绝对是一个农转非。之间记忆深刻的是马波说公司就是有组织的赚钱的人的集合,目的是赚钱,所以方法并非最重要的,而我们TW目前并不注重结果,所以和传统的公司有些不同,或者说不太像公司。那么这样说其实我们失去了一个本质的目的,这样不一定可以长久,起码对于在这里干活的程序员来说这里不是所谓久留(我们是说久,久指十年八年)之地。所以我心里推断马波要走,而且从他有些悲凉的表情上来说我确信不是今年就是明年,没想到也就是2个月以后我就和我这个新sponsor告别了。
同时,还有巧合,同桌吃饭的另外一名女同事也离开了TW,她是个人原因,和发展或者认同无关,但是我觉得很巧合,没想到我们散的如此之快。不要扯远,继续说。
天要小雨人要嫁人,随它去吧。所以,我不会说什么挽留的话,虽然我的心里有一丝伤感。那么为什么有一丝伤感呢?
因为马波是个牛人!非常非常非常牛的人!为什么牛呢?
因为TW从来不是缺牛程序员的公司,但是马波不是非常牛的程序员,但是他是一个非常懂程序员与非程序员的喷子,他的思维敏锐,有深度,所以他是一个咨询公司的王牌!狮屎胜于熊便,马波就是熊便。他能把死人说活。
为什么如此说,因为和朋友说话我是个话唠。但是一次城铁偶遇马波我俩聊BDD,他的确把我喷晕了,估计他占了70%的说话时间,给我深刻印象。再后来我和马波pair时发现他编码能力并不如嘴那么牛时我更震撼了,因为他说的太生动了,给我的巨大影响比经验老道的程序员更有启发!所以我认为他就是一个心法高手,通过看和思考就升华了我所看到的东西,他是个有绝佳聆听技巧的人。这点我崇拜他。
说这些好话,问题还是离别。
说说今天的告别晚餐,我第一次参加TW同事的告别晚餐。马波又发挥了一次,和每个人说了自己面试的感受,说你离开TW的时候才知道TW的NB之处。其实我来之前就知道了,我也知道里开后去哪里都会不适应。就好比学会了最佳实践又偏要让你忘掉一样困难。另外一个感想就是作为咨询公司我们开发人员一定要争取出台面对客户。这些忠告很好。而后他继续发挥讲如果自己要开公司首先要挖谁,他说第一当然是WPC,他是Mingle团队里面技术最牛的哥们,关键还不是技术本身,而是WPC对于技术的热情,他能感动任何一个要走技术路线的人!这也是马波给我留下的美好印象,因为他是一个尊敬敬业的程序玩家的人,从本质上是一种技术崇拜,我也是这种人。其后不说,但是马波对大家的价值看得很准,说明他是一个很用心的人。关心环境和环境里面的人是一个猎手应有的素质,他是一个有素质的人。又是夸奖。
说到了我,马波说他知道我要什么,也知道TW给我不了我那些。说实话我也迷茫,我不知道我要什么,但是我干得很拼命,我想对得起我一直梦寐以求的TW。可是TW是什么呢?其实是一些靠谱人的组织,也就是说我本质上还是希望对这个由朋友组成的集体做贡献!但是也许我错了,目前我永远也没法为TW出台,但是我会为此努力。马波还说我应该pair,说来郁闷,我从来都特别想要pair,但是也许是我捡了没人做的活来做,所以也很少有人能和我pair。但是不能光怪我的PM们不给我pair的机会,而是也许我就一直没有准备好,也没有和团员们做很好的沟通。马波的话的确点醒了我,我会努力去做!还有马波说不要把待遇看的很重,是的,我对待遇不算满意,但是来TW我就没有把待遇看的很重,而且很多很多的TWer都是和我类似的观点。但是我会争取快乐的生活,快乐比待遇重要,但是如果我也三十儿立了,那么我会选择考虑待遇。
说累了。
谢谢马波给我说了最重要的这最后一句话,以后我们有机会继续说吧。
回来的时候天上下的雨太大了,我在人行道上被路中央汽车划过的涟漪淹没了脚,这是这两年最大的雨了吧,我离开朋友的团队在大公司呆着也有两年了吧。去年在新浪,今年在TW,明年还是会在TW的。
最后再引用马波所说,他说珠三角、沪杭三角、京津塘三角他都去过,见过聪明的人,但是没见过这么多聪明的人在一起工作。TW的老大郭晓最成功之处莫过于拉到了这么多聪明人吧。
我会争取做好得改变,坚持结交更多好的朋友,永远不要丢掉好朋友。
我在ThoughtWorks工作,我的名字叫田乐,我是你的朋友。