Monthly Archives: January 2006

本周收藏.2006.01.28

到达深圳

  昨天下午1:40坐上机场大巴,在机场高速遇到交通事故,停了半小时。3:15到机场,一直等到6:00才起飞,我把晚餐全都吃光了,包括榨菜包。

  利用在天上飞的三个小时把《Joel on Software》仔细重看了一遍.原著的确是好书,而且由于大多数文章来源于作者的blog,所以文字很鲜明。但翻译不负责任,实在很烂,其中一个家伙甚至连基本的软件开发常识都没有,能把XP翻译成“超级程序”,把check in/out硬翻译成“检验异常”

  飞机降落时,深圳已经是一片灯火,地面温度16摄氏度,我每次都准备一个大袋子装脱下来的衣服。老妈是自己开车来接我的。祝大家都顺利早点到家。

《Modern C++ Design》

  最近搜索浏览了一些关于template的blog,感觉自己可以开始看《Modern C++ Design》了。所以昨天抽空到中关村图书大厦买了中文版,候捷、於春景译,华中科技大学出版社,中文名是《C++设计新思维》

  浏览了第1章(Policy-Based Class)和第6章(Singletons),目前卡在第3章(Typelists)的迷魂阵里,计划接下来读第9章(Absract Factory)。

  对我这种只会用STL容器,看到大段尖括号就发晕的template菜鸟来说,这本书的学习曲线有些陡峭。但泛型编程和设计模式结合起来太酷了,每看懂几页,就会回忆起以前的某个笨拙设计,开始胡思乱想,踅摸如何重构。

  记笔记,下面是几条以前不知道的ABC:

  1. 虚函数不可以是templates
  2. 如果class template有个成员函数从未被调用,它就不会被编译器实现出来

后记:3月3日读完第一遍

本周收藏.2006.01.22

里程碑,猛玩

  18日milestone按时搞定pFind内核测试,昨天让自己彻底放松。

  下午一起去军都山滑雪。没想到第一次滑雪就能适应中级道,比学轮滑和水冰简单。不过有一次,按照他们的说法,我是摔得“魂飞魄散”,雪板、滑雪杖、手套、眼镜都甩到天边去了。

  晚上,回到北京去电影院看《金刚》,不错的片子。感觉累死了,没力气上网。(keso对《金刚》的评论

  摆脱压力疯狂地玩了一把,过瘾。

  这半年对自己比较满意。接下来几天,整理整理摊子,和领导做些沟通,完成在职研究生课程论文。告一段落。

  想家了,想吃老妈做的拉条子。

找到BUG是好事

  找到BUG就好象发现孩子得病,你提醒他家人一样,人家只会感激你。

  1. 软件作者和你一样,都是追求完美注重细节的人,都希望自己的作品不断改进。

  2. 老板不会用BUG绝对数量衡量工作成绩。开发的代码越多,越重要,发现的BUG机会自然就越多,一行代码不写就没BUG了,没人用的代码也找不出BUG。

  3. 修正BUG会增加作者的工作量,这没那么郁闷,可以往后排进度或找人帮忙;就算实在没时间,至少可以明确“这里不完美”。

  4. 也许这不是BUG?没问题,你不会丢面子或者让别人感觉爱找麻烦,BUG等级里本来就设置了“可疑”,提出问题,说明你认真对待这个软件,我很高兴可以多交流。

  5. 真的很感谢你关心我的工作成果,这太好了,我宁愿和挑剔但负责任的客户打交道,也不愿意碰上没有进取心的家伙。请参考第1条。

  我就是负责整个系统的工程师,最终梦想是实现世界上最好的软件。我很乐意改进自己的代码,也很乐意帮同伴改进他的模块,但首先,请帮个忙,告诉我BUG在哪。

用template模拟虚函数多态性

  以前写过关于对象的多态技术的讨论,提到传统的C++虚函数的做法,像对话框这样的接口,会产生一个巨大的虚函数表,调用时,实际都要执行两步:先通过虚函数表找到函数指针,然后再运行函数。

  那么C++有什么其他解决方法呢?可以借助模板技术。

  首先,Framework实现一个template作为接口:

template<class T>
class FrameworkBase1
{
public:
//调用接口
void HelloWorld(void)
{
static_cast<T *>(this)->SayHello();
};
//实际实现,这里提供一个默认版本,也可以不提供,类似纯虚基类
void SayHello(void)
{
cout<<“Hello World! This is FrameworkBase1n”;
};
protected:
//下面都是扮演Framework调用HelloWorld接口
void call1(void)
{
HelloWorld();
}
void call2(void)
{
HelloWorld();
}
};

  当用户打算实现这个接口,提供给Framework回调的时候,就这样:

class Derived1 : public FrameworkBase1<Derived1>
{
public:
//重新实现
void SayHello(void)
{
cout<<“Hello World! This is Derived1n”;
};
};

  当然,也可以采用Base1类的默认动作:

class Derived2 : public FrameworkBase1<Derived2>
{
//啥也不做,直接采用FrameworkBase1默认的实现
};

  Alan Kay评价:“……所有喜欢和擅长C++的人都必须是严肃认真的铁人,有足够能力在事前规划一切,如果不适应这种风格,大量细节会让你疯狂……”

BLOG和传统媒体

  前一阵传统媒体和网络的关系是焦点。我开始系统地收集订阅BLOG种子以后。

  以前通过《程序员》杂志跟踪最新的技术趋势,每个月读的时候都有种兴奋感。但是最近两期买来一看,40%以上的内容都已经发表在作者的BLOG上了。

  《经济观察报》是新浪的合作伙伴,每期新闻都能上网看,这并不影响我周末去买报纸,因为喜欢他们的社论和专栏。但是,自从订阅了“思维的乐趣”,很多小品和书评第一时间就能看到,阅读报纸的乐趣就减少了。

  除了速度,BLOG代表个人,不掩饰身份,所以读起来很有现场感;而发表在纸上的东西,总会尽量修剪个人化内容,不好玩。

  客观中立?我可以多定几个种子,罗生门,看看甲方乙方各持一词,一样可以做出自己的判断。

  BTW:粘贴一段不相关的文字,无论以前的报纸专栏,还是现在的BLOG,我都是许知远的忠实读者:

  “……是什么导致了明朝的崩溃,它拥有百万军队,而北方的满族入侵部队不会超过十五万人?大清帝国在19世纪中叶仍占据着世界1/3的 GDP,却为何在西方的挑战面前束手无策?这种问题必然拥有复杂的答案,而且永远相互争论不清。但一些意外和重要的因素却经常被忽视掉。如果不是全球白银 的供应量在17世纪时骤然减少,或许明朝不会覆灭得那么快,在一个所有税收都以白银结算的经济体制中,拉丁美洲白银产量的减少,将使中国百姓的压力陡然增 加,而且这一事件可能也与西班牙的衰落不无相关系,这个海上的帝国与由盛转衰几乎明朝的的覆灭同时发生。在解释十九世纪的清朝中国时,这一点不能忽略:正 是人口在过去一个世纪的倍增,才使得整个帝国的压力剧增。生存环境的紧张感可能比外来者的到来更加令人不安。同样,你也可以说,通货膨胀可能与毛泽东的军 事战略一样,在击败国民党的统治时发挥了不可磨灭的作用。……”

本周收藏.2006.01.13

测试进度

  昨天是测试第一天,整天都在忙着组织:配置测试平台、上传测试用质谱、挑选蛋白质数据库索引、解决平台差异、帮助不熟悉自动化测试工具的同事编写脚本、定位缺陷、修订测试案例、添加单元测试代码、发布补丁、汇总进度……直到晚上20:00才搞完。

  回去路上又碰到个神神叨叨的讨厌的家伙,只好从轻轨下来直接打出租车摆脱他,到家直接上床呼了,没开电脑写BLOG。(2011年博客搬家时补:这个跟踪的家伙是我的情敌,真是二,后来居然在晚上加班回家路上用电棍袭击我,被打翻在地上揍一顿就老实了。当时我们也很害怕,差点报警。现在想想2006是有趣的一年,还真遇到过不少稀奇古怪的事)

  美美睡一觉就舒服多了。今天组里的测试工作很顺利。虽然下午有会,还是追上了进度计划。目前共完成测试用例204个,累计报告7个问题,汇总出3个BUG,已修复1个,完成总工作量的21.9%。我自己也一口气测了40个测试用例,位列排行榜第二。

  明天可能有更多空闲调BUG,希望18日的milestone有个好心情去滑雪