Tchaikov’s Journal

September 29, 2006

To be or not to be —— GPLv3

Filed under: GNU/Linux

一周之前,几位 Linux kernel 开发者在 LKML上的一篇长文在自由软件世界里掀起了轩然

RMS 让人感觉是一个比较激进的理想主义者和实干家(注意,理想和实干在这里是有顺序的)。在 Free Software 发端的时候,没有这样的领袖人物的确是难成气候。但是Free Software已经有了可用、像样的软件的时候,需要的是吸引更多的贡献者。被别人认可和支持就能获得更多的关注和资源,进而能发展得更好。如果参与的条件过于苛刻,贡献者(包括商业的和非商业的),很可能就会因而却步。

XEmacs 和 GNU Emacs 的决裂(或者说是 XEmacs 从 GNU Emacs fork 出去),有一个很大的原因就是因为 RMS 要求所有进入 GNU Emacs 代码都要签署书面的协议。虽然大家都支持 RMS,都喜欢 GNU Emacs,也同意让自己的改进遵循 GPLv2,但是毕竟,每份 patch 都要签协议(而且是书面的)太麻烦了。

懒惰的程序员们(8))觉得没必要在这种事情(当然还有其他问题)上浪费时间,只得另立门户。

GPLv3 draft 2 关于 DRM 的条款也类似,这次是对商业用户,要求把 checksum 或者数字签名一同附上。

虽然 rms 的动机很好。但是这也可能对自由软件造成潜在的伤害。是极端的自由还是中庸一些对自由软件事业更有帮助,应该只有时间才能检验。

September 18, 2006

想法太多希望太少岁月反覆无常——记在失眠的夜里

Filed under: Life

大学时候,常常听寝室里的一位同学成天放着唐朝的歌。时至今日,大多数的调调都忘记了,唯一有印象的就是这首《天堂》。只觉得它的歌词很是对胃口,特别是头几句,到现在还念念不忘。当然,其中的儿女情长则和我关系不大。

虔诚的佛教徒笃信佛教诸神,伊斯兰教的朋友相信唯一的真主安拉。我相信我可以写出更好的程序。程序运行的时候就像行云流水,干净利落;源代码就像风格清新的散文,自然,优雅。从大一开始,我把自己当成一个程序员看待。直到大四,在考研中名落孙山的我,如愿以偿,成为了一名职业的程序员。在工作的时候,我如鱼得水,在程序中试验自己的设计,通过设计修改好用的程序库,让开发更为愉快。编写小工具,让他人也能从中获得方便。有几次尝试着在已有的程序中引进设计模式的思想,改造程序的架构。当改造完成的时候,竟有一种酣畅淋漓的感觉。第一次用CppUnit做单元测试,看着小圆点刷刷地滑过控制台窗口,心里说不出的喜悦。美滋滋的。

直到我发现公司从来不做 code review,没有 daily build,测试也是非常原始。虽然我极力要求 team leader 做 code review,但是他总是推说没有时间,daily build 没有习惯。测试?发布压力很大,所以只能先这样将就着做吧。说到测试,当时为了做服务器的压力测试,公司上上下下几十号人应QA部门的要求,暂时停下手头的工作,装上客户端,用QA提供的帐号,一起登录,然后就是一通狂点,当然是按照QA要求的流程操作,如此持续了近一天。当天下午我就腻烦了这种重复性的机械劳动,于是抽空写了一个小工具,macro recorder,让它代劳测试工作。迅速地,这个小东西传播开来,越来越多的人开始用它。最后 macro recorder 被我们的技术主管发现了,“这个可以推广”。不过他后来找了一个类似的更完善的工具替换了我的阳春版的小玩意儿。那是后话了。

虽然在公司里能体会到创造带来的愉悦,但是一些体制上的因素让我觉得的是更多的无奈。曾在私下里和一把手提过这方面的意见,但是得到的反馈却是“是应该这样,但是blah blah,所以 blah blah”……

我从不是只活在幻想中的人,相反,我讨厌不切实际的海侃胡吹。我也无法只是看着眼前。在以前的公司里,我感觉看不到自己的将来。于是,迷茫的我,选择了考研。

研究生期间的工作学习没有给我像之前工作时那样的充实感,和创造的欣喜。随着研三的开始,渐渐漫上心头的是莫名其妙的焦虑。

记得有一个大学同学,唔……是个女生。有一次,她说我的性格“也很复杂”。我想她是对的。一方面,我想要写出漂亮的程序,不断改进自己的设计,让别人也能从中获益,而且不时告诫自己说,“对年轻人来说,钱不是最重要的”。另一方面,不断听说身边的同学在这个或那个500强的企业中实习,找工作,自己却也蠢蠢欲动,心急火燎地想找份活干。一个也许是一生雄心勃勃的理想,一个是一时焦躁不安的盲从。临近毕业,为什么会出现这样的心理呢?

很难说这样做不对。但是我想,这其实反映了我对未来的不确信和恐惧感。是的,我希望我将来能有一群聪明友善的同事,做着让人兴奋的工作。但是这一切在现在看来,都是那么地不确定。每当我向熟识的朋友表露这样的想法,他们都会安慰我,告诉我“肯定没问题”。他们可曾知道,我当初也是怀着这样的想法,踏上了考研的不归路。哪知道,事实却与当初的打算相去甚远。

嘴里不禁又哼唱起来,

“总是感觉匆匆忙忙
想法太多
希望太少
岁月反复无常
过去太遥远
未来太迷茫
时间在那梦里躲藏
失眠的恐慌
奔跑的欢畅
在麻醉和迷幻里张扬”

9.18——永志不忘

Filed under: Life

今天是9.18七十五周年,让我们记住历史中的这几页。

九月十八来了日本兵
先占火药库
后占北大营
杀人放火真是凶
杀人放火真是凶
中国的军队有好几十万
恭恭敬敬让出了沈阳城

September 12, 2006

C++表达式中的副作用

Filed under: C++

昨天,有同学给我看这样的程序:

int fun(int n)
{
    if(++n==5)
	return n++;
    else {
	return n*fun(n++);
    }
}

问,

fun(1)
得多少?咋一看,这不是求 5! 么?再看,
++n==5
已经让 n+=1 了,那就应该是这样的:

f(1)
 2  *  f(2)
        3  *  f(3)
               4  *  f(4)
                       5

答案应该是 120。作为一个悲观的 code warrior,我没有就此停止,我习惯性地把段代码贴进 Emacs,编译了一把,运行结果竟然是……300。我瘫坐在椅子里,听着外面淅淅沥沥的雨声。不是说“*”号是从左到右么?怎么会这样。再看了一眼 K&R 的 TCPL,第53页里表格说的是 associativity,不是 evaluate order。而且就在这一页,作者提到了

C, like most languages, does not specify the order in which the operands of an operator are evaluated.

函数参数的情形也一样。

C++标准 ISO/IEC 14882-2003 chap5.4 也提到

Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is unspecified.

Unspecified behaviour 和 undefined behaviour 真是 C/C++ 程序员的噩梦。故事如果发生在不使用副作用的函数语言(比如 Scheme)那里,应该就没有这种问题了。

昨天是911

Filed under: Life

为了不忘记这段历史,在 youtube 上找了些视频 。心情变得很糟糕,加上窗外蒙蒙的细雨,……

不想去吃午饭了。


September 2, 2006

买书,一小堆

Filed under: random-rants

前两天,闲了没事逛 china-pub 新风雨又看到放到收藏夹中好久的几本书,一时冲动就下了订单。顺带着也捎上了《Linux 内核编程》,今天的主角就是它。

该书的翻译阵容强大,共有5人。《译者序》提到为了让书早日出版,译者们加班加点“放弃了春节的休息时间,夜以继日”,得以完成。按照我的经验,译者数量往往和书的质量成反比。这次又是一个例证,况且加班能保证质量么?结果是不仅翻译的文字很干涩,难以下咽。更让人不适的是译文中不时出现的错误:第36页,

每条汇编指令都应该在各自的线路上运行。

原文为

Each assembler instruction should be on its own line.

应该是“每条汇编语句都应该各占一行”。

在第22页,书中2.1.3.1第一段,还有类似的问题。

What if we could rule out half of the ordered list with every comparison?

被译成了:

这种查找方法可以减少有序表中一半的结点吗?

应该是“要是每次比较都能排除一半的节点会怎么样呢?”

这个故事告诉我们两个道理:

  • 冲动是魔鬼
  • 如果对译者(或其数量)没有把握,还是买影印版的书比较保险

Get free blog up and running in minutes with Blogsome
Theme designed by Jay of onefinejay.com