是的,把能力转化为知识。

我们受到的教育通常是把知识转化为能力。但是优秀与卓越之间差的不是能力,而是知识。

一个例子

10月21日,EDG团队举行CodeJam活动,在骏骏讲完待重构的代码之后大概只剩下1个小时的时间了。没有人有信心在一个小时的时间里把那份代码重构到一个相对满意的状态。这时候8x出场了。他是所有人中对这份代码的上下文了解最少的一个,因为其他人都至少在这份代码上工作了几个月了,有些甚至工作了一两年了。

最终,经过一个多小时的重构,代码达到了一个相对良好的结构。你会说徐昊的能力强,但是我要说他只是知识熟练。他用的重构无非就是Inline Method,Move Method,Extract Method等非常常见的几种。如果给我们足够的时间,团队中的很多人都可以达到差不多的重构结果。但是对于其他人来说,还不够“熟”。

徐昊在重构的过程中跑测试的次数明显比我少的多,我几乎增减参数都得跑一次测试心里面才有底。他不需要,这就节省了不少时间。这说明他对于这样的重构的影响范围是确定的,而我是不确定的,所以我需要一次外在的反馈(测试)来告诉我。

知识的优势

知识和能力相比优势在于,首先知识是个捷径,速度快。比如,一个直角三角形,两个直角边分别是3和4,斜边的长度是多少呢?有能力没知识的人会去按照勾股定理去算,而有知识的人会直接告诉你是5。其次,因为知识占用大脑时间少,所以大脑可以在不需要上下文切换的情况下继续思考更重要的事情。

勾股定理也可以说是一种知识,对应的能力是三角形角边关系公式,它只是在直角条件下的一种特殊情况。可以想象如果遇到计算斜边长度的时候只能求助于三角形角边关系公式,我们速度和效率将是一种什么状况。

如何将能力转换为知识呢?

——刻意练习。

理解

大部分人,包括大部分TWer对于重构、设计模式都是一知半解。工作中也是不求甚解,似是而非,大原则说得头头是道,写代码照样惨不忍睹,5P(SRP/OCP/LSP/ISP/DIP)轻舞飞扬,Smell漫山遍野。所以,练习之前得先理解要做的事情。

分解

心理学研究表明,人脑对大块知识的记忆不如对经过合理分解的知识的记忆更高效。这里(http://www.supermemo.com/articles/20rules.htm)有一篇文章讲这个事情。

重复

重复是“聪明人”最不愿意干的事情,在重复中保持思考是更加残酷的折磨。

结论

无他,唯手熟尔。

有人可能看出来了,这些思想来自于《哪来的天才》。我推荐所有人,至少所有的TWer都要读一读这本书。大概只要四五个小时,但是它会带给你很多思考。

 

It seems that most people and organizations can not learn from their success, instead most would like to learn from failures. That how the saying “failure is the mother of success.” comes.

From my point of view, anything can fail very easily and should fail at the first time. Why? There are always too many factors involved to make a thing successful. It’s only possible to get success after you have failed it once or more.

When you succeed in a new thing, you won’t know what will fail next time. It is too complex for most people to sort out what is the key that prevents it from failing. It is only when you fail, that you look inside youself and all the factors to determine what went wrong and how to correct it.

So, how can one still do a new thing right in the first place? Find a similiar example that you have done successfully, change a little. This is what Agilist calls continuous improvement.

 

最近在练习听力,题目中有很多静音部分,使用Adobe Audition可以很容易做到将静音区删除。同时,为了能够反复练习同一句话,我们也可以将句子拆分开。

删除静音区

编辑->删除静音区

相关设置可以参考:

delete-silence 

自动分句

编辑->自动标记->查找相位和标记

按alt+8可以查看标记的内容

自动标记设置可以参考:

AutoMark

自动分句完成后还可在标记窗口另存为多段音频。

 

最近公司内讨论OO的问题,偶的Sponsor回了一个邮件,接下来就歪楼了:

这个调调,我写程序写到三五年的时候也很喜欢讲。

现在我觉得没那么复杂。大类,长方法,重复代码,哑对象,散弹修改,就这么几个常见的坏味道。花点时间把《重构》第三章背下来,见到坏味道就重构,程序就坏不到哪里去。非要去谈论这么高深的对象理论,其实出问题的都不是因为对象理论没掌握,就是因为常见的坏味道没消除,这就没意思了。

我们在Sponsor Meeting上专门讨论这件事。仔细读来这个回复不可谓不煞费苦心,但是为啥我乍一读就觉得在说:别扯了!

我认为第一句话是导致误解的关键。这句话其实有更好的写法,可以让别人更容易感觉到其中的诚意和苦心。

两件事:听的人别指望别人说你爱听的,为了自己的成长;说的人,别指望别人总能往你期望的方向理解。

 

电影中探员Larkin需要确认卡麦伦为何有机会下飞机而没有下来,他怀疑后者是为了帮助警方而选择留在飞机上的。下面是他跟同事的对话:

- (Cameron is) U. S. Ranger, highly decorated. Did a little hell-raising when he was a kid, but nothing serious.

- Explain to me why any of this matters.

- Fact one. We got a plane up there filled with killers, rapists and thieves … and we got this guy Cameron Poe, in on an involuntary manslaughter beef. Non-gang affiliated. He’s a parolee hitchig’ a ride home. Fact two. Poe has a chance to get off the plane. Doesn’t do it. Why? Fact three. Our guard, Falzon, said a convict named Cameron Poe planted Sims’s tape record on him. These are interesting facts. You do the math on this, and we got an ally on that plane.

……

紧接着Cameron的老婆到了。

- It seems that your husband, Cameron had an opportunity to get off the plane and he didn’t do it. And I was hoping you could maybe help me figure out why.

- That would make two of us. I don’t know.

- I mean, it’s possible, it’s, it’s not uncommon … that some parolees actually fear there release date. A certain degree of instituationalization sets in. Fear of coming home. Fear of living in society. Any of this make sense?

- No, no. That’s not Cameron. I mean, if you, if you knew him, if you read his letters of if you talked to him on the phone, you’d know that, I mean, he’s been waiting for this day for eight years.

这是一个非常有技巧的对话。如果Larkin从正面提问,比如直接问“你丈夫是否是要帮助警方”这样的问题,他妻子的回答经常会失真。

我们咨询评估中也经常遇到类似的问题。引导性的提问经常容易得到我们想要的答案,但却未必是真实的答案。

 

朋友问我说你怎么愤青了。言外之意,我应该明白在这个无望的朝代折腾是没有意义的。

我并不以为然。

我不绝望吗?很难回答是或者否。首先,我对我所在的组织(该词不符合当地法律不能说)是绝望的,或者更具体的是对这个组织中参与到政府管理的人是绝望的。因为他们从最基层到最高层已经烂透了,不腐烂就没有机会,你很难想象恶的树上怎么能结出善的果实。

但是我对人民并不绝望。很多朋友说国民素质多么低下等等,我认为主要是不作为的政府把人变成了鬼。一个人、一个企业的堕落足以拉低所有人所有企业的道德底线。这一点暂不展开。

但是应该看到利益的对立越来越明显,沟通的成本越来越低,维稳的成本越来越高。我并不指望突变,但是我相信这里面力量的对比所带来的效果会慢慢显现。而不论力量对比将来向什么方向变化,我总要努力,努力让它超我们希望的方向变化。

所以,如果你看懂了,能折腾还是折腾着吧。

 

三十多年前,一位架构师在中国南方画了一个圈,并给这个架构起了名字叫改革开放,总结了这个设计的三个要素——一个中心两个基本点。

数年来,两位新兴的架构师在东北、华北、长江三角洲、西北、西南各地花了很多圈,并给这个架构起了个名字叫——和谐。

几百年来,大洋彼岸的架构师们似乎并不热衷于在国内画圈,因为他们的架构是一开始就设计好了的,稳定性、扩展性、伸缩性和可维护性都不错。

画画不画圈似乎不重要,形成共识很重要。

 

http://digitalpbk.blogspot.com/2009/05/ssh-proxy-windows-linux-orkut-bypass.html

 

我问你“压纪录片一般要什么码率”。

你要是说“具体情况具体分析”,我就会鄙视你。

你要是说“看情况吧,高一点好,清楚”,我仍然鄙视你。

你要是说“看情况吧,别太高了,人眼分辨不出那点差别”,我还是鄙视你。

你要是说“我上次压RMVB的,动态550-1450,我觉得还不错”,我觉得这个回答有些价值。

你要是说“我自己压RMVB的时候,美剧基本上都是一次编码,动态码率550-1450的范围,电影是二次编码,剧情片是550-1450,动作片是 650-1450。声音部分都是用132Kbps Surround Audio。Easy Real Producer 基本上CPU占用在80%以上。一集美剧差不多是播放时长的一半左右的时间就能完成,电影差不多要播放时长的1.5倍左右的时长”我觉得就相当不错了,虽然你都没提到纪录片的事。

这就是明确的思考。

你看,我回答你的“什么叫明确的思考”,基本上就是符合这个原则的。是为——提明确的问题,给明确的答案,做明确的思考。

打三国杀,我手里有一张桃,犹豫要不要吃。

你说,吃了吧长血。鄙视。

你说,吃了吧,省得被人家抽走。嗯……

你说,吃了吧,你下家是甘宁。嗯,已经有点明确的意思了。

你说,别吃,你下家甘宁是内奸,主公空城还只有一滴血了,再下家是反贼刚才还收了个万箭,甘宁不一定能拆到,留着给主公吧。好,我谢谢你。

你说,扔了吧,跟主公联姻。好,我谢谢你。

你说,吃了吧,反正你们这边还有个满血的华佗。好,我谢谢你。

留着、扔掉、吃掉,固然重要作为一个咨询师来说,给一个能把分析过程简单明了的展示出来也是非常重要的。这不仅是一个接收度的问题,这还牵扯到,未来你的客户如何自我改进。

 

前些天参加了公司内一个项目的代码库管理策略的讨论。以前在客户那里做咨询的时候类似的讨论也有很多,但是相对来说客户的情况比较稳定,而且项目与项目之间相似度比较高,所以可选的方式并不多。这一次讨论,因为是发生在ThoughtWorks内部,大家处于完全平等的位置,敞开讨论,反而让原来死板的理论真的活了起来。

背景

CWP是ThoughtWorks内部比较大的一个项目有30多人,当然这跟我们咨询的项目没法比。不过ThoughtWorks比较崇尚小团队,我们认为超过10个人的团队就应该考虑拆分了,这对于项目管理、团队沟通、架构隔离都有好处。项目原来主要关注于一个产品MTX,最近准备加入MTL产品,我们认为这是一个好的时机。MTX和MTL共享一个账户管理的功能。我们想把这个功能抽出来单独成为一个产品——Account Setting,因为未来还有其他的产品也要依赖于这个功能。由于人力资源的限制,Account Setting实际上要放到MTL团队开发,MTX与Account Setting的集成也要放到MTL团队开发。Account Setting的部分功能在MTX中已经实现。

讨论

一个基本的问题是——码库分开还是合在一起。

首先不论是分开还是合在一起都是可以工作的。其次,不论是分开还是合在一起都有相对的劣处。看上去很简单的两点。不事先明确地承认这两点,往往会导致争论陷入僵局。而且,不仅是在开始的时候强调,整个过程中都得反复地说。那么这是不是和稀泥呢?可以是也可以不是。停留在这个层次上就是和稀泥,进一步分析哪种方式会带来什么好处和什么坏处,就不是和稀泥。

首先看合在一起的好处。这些产品之间依赖关系是比较明显的,特别是这几个产品又是同一个团队开发。我们把代码放到一起,能够取得的天然的好处是版本对齐。一个产品依赖于另一个产品有几种方式——API依赖、RPC依赖、REST依赖。我们使用的是REST依赖,但是背后还有一个私有协议的依赖。如果代码是合在一起的,因为我们采用了持续集成的实践,我们可以确保任何时候我发布的版本都是可以一起协作的——不论是交换的接口还是协议。

合在一起的坏处呢?坏处和好处其实非常接近,由于通过代码管理工具进行了强制版本对齐,那么不同产品之间的依赖关系实际上就被绑死了。Account Setting升级了自己的协议,MTX必须同时更新,否则持续集成就不能通过。

分开的好处和坏处基本上跟合在一起的好处和坏处是相反的。分开意味着灵活的版本协作方式,但同时也意味着需要有人专门负责不同产品版本对齐的协调。还有就是版本库的管理——开发人员可能要在不同的版本库之间切换。

纠结

除了上述好处坏处的分析之外。还有些操作可能产生相反的结果。比如,分开可能同时意味着沟通成本的提高和降低。合在一起更方便联调,因为两边的代码都在一起,我可以这边改改那边改改,最终使它们能够一起工作;合在一起也助长了忽视接口设计的风气,使得两边的耦合越倾向于紧密,从而需要沟通的机会增加。我们说真正好的沟通模式是不需要沟通,可以将二者分开,使得双方都更加关注于接口的稳定和降低依赖。

怎么办?

好处-坏处、坏处-好处、纠结-纠结,如果在问题的内部继续讨论,永远都不会有结论。所以,必须跳出来看看,问题的大背景。我们到底是希望一个严格的版本对齐,还是灵活的版本协作。

我们注意到,未来会有更多的产品加入进来依赖Account Setting。保持所有的产品版本对齐,尤其是在开发过程中成本是非常高的。所以就分开吧。

我不说分开是对的,我只能说分开是一个还不错的选择。或者用丘吉尔先生的话说,除了合在一起之外,分开是最差的选择。甚至是不是真的比合在一起好,我也不能保证。这个讨论的价值让我们看到,分开带来了哪些好处,避免了哪些问题。——足矣!

版本依赖管理

代码库分开了,接下来就是持续集成环境怎么搭建。考虑到Account Setting可能会发布多个版本,不同的产品可能依赖于不同的版本。一种方式是把环境搭到Account Setting团队,每个版本维护一个环境,其他产品连到这个环境上做自己的持续集成。另一种方式是环境搭到各个产品那里,你要依赖什么版本你自己决定。

这让我想到在某公司做咨询的时候发生的一件事情。I公司的A部门,分为平台和数个产品多个团队。平台发布的东西交给产品之后,要做一个版的集成少则一两周,多则一两个月。经常平台发布过来的版本,我们所在的产品部门发现根本不可用。我们在产品部门搭建了持续集成环境,但是见效甚微。那么环境应该搭到哪儿呢?我们认为应该搭到平台部门去。你要交付东西给我,这个质量责任应该在你那里。

类比到我们的问题上来,似乎要搭到Account Setting团队这边。但是且慢,这个类比有个问题。Account Setting要对外发布,自己保证质量,搭建与产品集成的环境,这一点没有问题。但是产品自己的持续集成环境要是放到Account Setting这边来问题就大了。——耦合!ABCD四个产品可能都要依赖Account Setting的1.0版本,是不是它们任何一个的持续集成失败了,都要Account Setting去定位呢?更复杂的情况,可能某个产品需要跟小版本联调,这些情况在Account Setting这边会出现爆炸式组合。

那么好,我把环境搭到产品去好了。且慢,现在A产品搭了一个1.0版本的环境,为了联合开发某个特性,需要升级到1.1版本,这个特性由A产品的Dev1开发,那么如果把A产品中的1.0环境升级,其他人的本地构建和提交构建必将失败;如果不升级,Dev1的本地构建和提交构建必将失败。

这是持续集成中典型的环境管理问题。在持续集成中尽量保证本地构建和提交构建的一致性。为了这种一致性,构建对软件和硬件的依赖应该有明确的定义,并且做统一的管理。

持续集成环境管理

典型的持续集成中软件依赖管理方式就是对软件依赖做配置管理。即把Account Setting的发布包放到A产品的代码库中,A产品依赖哪个版本的AS,就提交哪个版本的发布包。构建失败可以回滚到一起的发布包。这样本地构建和提交构建依赖的都是一个版本的发布包。

这个还不是我们最终选择的方案。我们最终选择的方案是AS将自己的发布包放到一个公共可访问的仓库里面,其他产品可以引用不同版本的发布包,类似于Maven的机制。其原理与前面说的类似,其实这也算是一种配置管理吧。

这样一个讨论涉及到了——配置管理、测试、环境管理、流程、组织结构,基本上除了报告之外,与持续集成相关的各个维度都有所涉及。

The End。

© 2012 Keep Thinking Suffusion theme by Sayontan Sinha