-
如何对private方法进行单元测试
(有很多人很多次问过我这个问题。以下是标准答案。)
问:如何对私有方法进行单元测试?
答:重点在于,你不应该有任何方法是从一开始设计出来就是private的,因为你的每段程序都应该在单元测试的驱动之下产生,而测试是不可能驱动出来一个private方法的。那么private方法从哪里来?只能从重构而来。所以答案是:private方法是不需要测试的,因为它是重构的产物,而重构是不改变程序可观察之行为的。既然行为不改变,测试自然也不需要有任何改变,所以不需要针对private方法建立任何新的测试。
问:但是,如果private方法确实出现问题了怎么办?如果确实希望用测试来弄清一个private方法里面到底发生了什么,该怎么办?
答:如果一个private方法复杂到你不能一眼看清它,那它就太复杂了,你应该把它重构成为一个独立的class,然后针对这个class来建立单元测试。
-
从我家窗口看夜景
东北四环,周六的晚上10点还是这么繁华。
望京西路,孤独的红绿灯守望着车来车往。
新买的富士S9600,套上遮光罩以后相当拉风……最长达30秒的快门,拍夜景的能力相当不错。
-
滇西古镇,疑似江南
-
I Know Ruby Works...In Lijiang
-
I Saw Glacier Today
-
歪理斜说:历史是非线性的
去年在TWU的时候,我向徐昊第一次提起了“非线性历史观”。当时的话题是关于重构的:
“在重复代码出现之后就应该重构。我预见到了重复代码的出现,所以我首先就做了重构。这样一来,重复代码就不会出现了。那样的话,重构岂不是也不该出现吗?我的意识干扰了历史的进程,让因果陷入了混乱。所以合理的解释是:历史不是线性因果关系的……”
诸如此类的胡言乱语。
不过这两天看到了另一个证据。汇率代表着两国经济的对比,当一国经济向好时,该国汇价也应该会上升。所以经济向好的消息发布,应该会指引着之后汇价上升才对。问题是大家都已经知道这事了。所以在消息发布之前,汇价就已经朝着预期的方向发展。
例如周三澳联储发布6月CPI,在好的预期之下,周二澳元兑美元涨到18年新高0.8865(本文所有数据都未考证,只凭记忆);超出预期的CPI发布之后,市场却只是小小鼓一下掌,周三下午再次刷出新高0.8871;周三(北京时间)晚上发布的美国6月房屋销售数据仍然不佳,但对于这个数据的反应只是周四中午达到0.8850左右。所有消息——尽管都是利好澳元的消息——出尽之后,美元在周四晚上暴跌100点到0.8760左右,周五再次暴跌200点,目前收在0.8527左右。
消息会利好澳元。所有人都这样想。于是所有人都在消息发布之前买进澳元,于是汇价提前被抬高。连续13天上涨,指标严重超买,只等消息打开水闸。于是在利好消息真正出台之时,所有人开始获利回吐,汇价开始跳水。
小T把这个叫做“背离”。我把这个叫做“非线性因果”:众人的思想干扰了历史的进程,让因果陷入了混乱。市场和消息的背离如何进行,这是小T研究的课题;我有一个理论:由于历史本就是非线性的,你就没办法用因果逻辑来推测它。
要不然,长期资本管理基金怎么会倒下?
-
RubyWorks Production Stack- Version 1.0 Is Coming
RubyWorks production stack is a collection of open-source software required to host a RubyOnRailsapplication on a Linux server.
To set up a production Rails server, you point a package manager to RubyWorks package repository, runone command, and few minutes later you have a skeleton Rails application served by a cluster ofMongrel servers, load-balanced by HAProxy, monitored by monit and controlled by runit.
Version 0.0.4 is the first release candidate on the way to version 1.0. The corestack has stabilized, and changes from 0.0.3 are all peripheral:
- Officially supported x86_64 packages on Red Hat Enterprise Linux and CentOS.
- Pre-compiled Ruby gems added to the package repositories: rubygem-libxml-ruby, rubygem-hpricot,rubygem-ferret, rubygem-ruby-debug, rubygem-rmagick. All these packages are optional (notautomatically installed with ‘rubyworks’ main package, but available from the sameRPM/DEB repositories).
- Added log rotation script /etc/cron.daily/rubyworks.logrotate.daily.
- BUGFIX: Corrected the value of clitimeout in haproxy.conf (changedfrom 150 seconds to 15 seconds).
- Added documentation for individual components in the stack.
RubyForge project page:http://rubyforge.org/projects/rubyworks
Documentation:http://rubyworks.rubyforge.org
Commercial support:http://studios.thoughtworks.com/rubyworks
Users mailing list:rubyworks-users@rubyforge.org
-
知易行难
CSDN:程序员更喜欢Firefox
“参与这次调查的人数截止到今天达到了1710人,其中38.62%的人使用FireFox”
对此我毫不怀疑。Firefox是比IE好得多的浏览器:符合标准,大量有用的插件,不会成为可怜的安全漏洞。但,做这个调查、发布这条消息的CSDN,对Firefox的支持却实在不怎么样。比如说吧,首页上的漂浮广告,在Firefox底下看着是一团乱。让38.62%的用户不能有效看到自己的广告,我相信这不是CSDN想要的。
所以,“知道应该做什么”还不够,还需要另外两样东西:
1、有效的交流途径。业务负责人有很多需求,如何评估这些需求的价值,如何让价值最高的需求尽快进入开发,如何验证开发产物是否符合要求,如何让开发出来的软件尽快开始创造价值。一句话,如何让价值流动起来——如果100万用户的网站首页上的广告问题要等到明年的改版才能解决,这成本着实不低。
2、有效的质量保障体系。价值能够流动起来,需要一个基本的前提条件:必须全面严格保证质量。如果开发出的软件总在返工重做,如果开发者没有信心修改bug,如果今天改好的bug明天又再次出现,网站的价值如何流动?
知易行难。有多少绝妙的商业创意因为交流不畅、质量不彰而无法达到预期效果?又有多少商业价值在这些或许不太显而易见的环节被浪费?知易行难。如何为团队注入行动力,让价值在整个企业流动,也许CSDN该开始考虑这些问题了。
-
真实的简历,真实的自我
其实是没有资格说这些求职之类的东西……因为我自己先天受限,其实从来没有通过“正常”的渠道找过工作。不过最近招聘的工作做了不少,简历看了不少,人面试了不少,多少也有些自己的想法。只当是野人献曝吧。
勾起动念的是JavaEye的一个讨论。特别是里面这样几句话:
“简历嘛,大家都知道,肯定是有水分的,而且人都有一种心理,明明知道这个人的简历很大的水分,还是想叫过来面试,所以,造就了现在的简历水分很多。”
“你忽略了一点,你太高估现在的简历,想想你的简历是什么样子,现在谁的简历没有一点浮夸”起码我知道两点。第一,我自己的简历不会有任何浮夸,我只会根据不同的需要做不同的删减。第二,如果我知道一份简历有很大的水分,我绝对不会想要面试他/她,首先我花不起这个时间,更重要的是我不想和不诚实的人一起工作。
既不吹牛浮夸,又不让自己的才华在一堆——很可能充斥吹牛浮夸的——竞争简历里被埋没,可能吗?很简单:只陈述事实,不作评论。这其实是给别人提出feedback时的原则:我说“你没有协作精神”,你说“不对,我有”,“你没有”,“我有”……这嘴仗永远打不干净;如果我说“你在结对编程的时候几乎没和我说话,我有点跟不上你的节奏”,那么你就知道是怎么回事了。同样的,“18个月的J2EE开发经验”对于一家公司、一个职位来说可能意味着“天啊,赶快雇他,他将是我们最好的J2EE架构师”,而对另一家公司、另一个职位来说却可能是“呃……他多少有点J2EE背景,或许能帮上忙吧”。既然如此,在简历里写“精通J2EE”,你想表达的究竟是什么呢?不如实实在在写上“18个月J2EE开发经验”吧,你的目标雇主会给事实加上评估的。
推论一:如果筛选简历的人不是根据这些更显而易见的事实、而是根据“精通”、“熟练”之类毫无意义的自我评价来挑选简历,也许你错过这次面试机会不是坏事。也许这家公司不是一个好的目标雇主。目光放远一点,机会永远都是有的。
推论二:如果没有足够多的项目经历放在简历上,用我说的这种风格写出来的简历不会好看。而对开源项目的贡献显然地能够给这份简历加分。不过我仍然认为,软件开发者在工作中所从事的项目,对自己的reputation所起到的帮助还是不足。这是另一个话题,就不延伸了。
推论三:要自己的简历不被埋在简历堆里,最好的办法就是不要把它扔进那一堆。
关于找工作这件事情,我整个的看法一向是:找工作就像找恋人,一方面你要表现出自己好的东西来吸引对方,另一方面你要真实,不然以后相处的时光足够让你把肠子悔青。如果对方是因为你表现出的真实自我而不喜欢你,那就看开点吧,至少胜过相处在一起之后再扯筋。简历也是一样,不用费劲心思去跟别人比拼,把自己描述出来就够了。适合你的那个人(那个公司),也在找你呢。
-
敏捷工作,敏捷生活,敏捷中国
这是在第二届“敏捷中国”软件技术大会听了孟岩演讲之后的感想,也是我在构思的一个讲稿。
敏捷早已不仅仅是一件软件开发的事,它是世界变平以后的必然产物。在一个平坦的、被互联网连接的、遵循同一游戏规则的世界里,说得严重一点,每个企业、每个人都面临来自全球的竞争。你要凭什么赢得这场竞争?
永远记住一个等式:profit = revenue – cost
在一个全球化竞争的市场上,价格必定是趋同的,你只能控制成本。有更低的成本,你可以用更低的价格卖出同样的产品(或服务,下同),或者用同样的价格卖出更多(或更好)的产品,从而赢得更大的市场份额;你也可以用同样的价格卖出同样的产品,从而赢得更高的margin——两者的结果都是,更好的profitability。于是问题变成了:如果没有压倒性的技术优势,靠什么降低成本?
最近我MSN的名字是“むだ!”。这就是答案。(むだ,無馱,muda,waste,浪费)
什么样的浪费?譬如说,用不上的预先准备,过高的风险规避成本,做出来却没有用的工作,不流动的价值。消除浪费,不仅仅是软件项目的事。就连工作方式,就连生活态度,也是一样。孟岩说到“Life2.0”的时候,自嘲是在扯淡,不过我知道他不是扯淡,因为我自己的生活已经比以前敏捷了很多很多。
Chad在演讲的时候说,中国是令人激动、充满希望的地方。我相信是的,因为我今天看到了敏捷中国的曙光。