Monthly Archives: July 2008

防止脑子坏了

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一遍,那么付出的努力就会很大。无法让问题收敛并最终达到一开始的目标。

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

Continue Reading → 3 Comments

一端简单的向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);

Continue Reading → 2 Comments

短小精悍的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

Continue Reading → 0 Comments

路与两人谈广告

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

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

Continue Reading → 0 Comments

雨夜的离别,送马波

今天外面下雨了,但是与前面的连阴雨天之间间隔了两个闷热的艳阳天。又一位同事离开了,他是我的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工作,我的名字叫田乐,我是你的朋友。

Continue Reading → 2 Comments