-
2006-12-30
向前迈一步
终于见到北京的雪了!作为一个地道的东北人,我还真不习惯没有雪的冬季。幸好在告别2006年之前,北京的天空飘起了雪,就算是为2006年送别吧!年终岁末,是一个继往开来的好时机。
大约两年前,我在一篇blog里提到学习软件开发技术的的两个方向:向下和向上。以个人兴趣而言,我希望选择一条向下的路,因为当时的我对计算机还有许多困惑。随后便换了工作,并希望借此从“上”到“下”。转眼两年过去了,回过头来看自己当时定下的目标,其实,我内心中真正需要的是解惑。
操作系统和编译器,真正对计算机感兴趣的人一听到这两个词都会有一种热血沸腾的感觉。如果有人能够就此高谈阔论一番,肯定会被人冠以高手的头衔。作为软件开发人员,我们应该了解这些内容,但实际上,真正从事相关开发的又有多少个人呢?所以,这里提到的了解自然不是“精通”。对于普通的应用开发人员而言,真正需要的是把这些知识串起来,让软件运行不再是一个黑盒。
如果以此为目标,我应该说达到了自己的目标。这两年时间里,我了解了一些操作系统、编译器和虚拟机的原理,重新拾起算法知识,甚至还了解了一些处理器方面的知识。或许是知识积累的缘故,最近一段时间,突然有了一种开窍的感觉,许多曾经让我难以理解的东西现在看来已经不再高不可攀。不能说我已经完全掌握了这些东西,只是觉得这些东西不再像从前那样困扰着我,更确切的说,我建立起自认为程序员所应有的基础知识体系。接下来需要做的只是根据自己遇到的需要不断的完善这个知识体系。
工作之初,我给自己定下的目标是做一个程序员,写出自己满意的代码。大约用了三年的时间,我达到了这个目标。之后的目标便是这个让自己“向下”的目标,现在看来,基本上算达到了。接下来呢?我希望学着做一些对更多人有益的事情,不知道这次又要花多长时间。
新年将至,祝所有关注梦想风暴的朋友新年快乐!
祝所有人快乐健康! -
2006-12-26
忙里偷闲
忙里偷闲,周末,回了趟家。有人问,回家过圣诞?答曰,不是给耶稣过生日,给自己过。
有句老话,“儿的生日,娘的苦日”,所以,只要是有可能,在自己生日的时候,我总会争取陪在老妈身边,不必做什么,父母就很开心了。从小到大,除了大学四年之外,生日时,我都在父母身边。从前的生日是父母给我做顿好吃的,工作后,就变成了我请父母吃饭。与以往不同,今年的生日,我们没有到外面吃,而是选择了在家做,掌勺的人变成了我。实际上,我才刚刚开始学习做菜。在老妈的指导之下,也算是凑出了一桌子菜。可想而知,惨不忍睹,唯一的优点是能吃。就是这样的菜,父母也吃得高高兴兴。看得出,能吃到这个”心灵手笨“(老妈评语)的儿子做的菜,他们很满足。
寒冷的季节是对人身体的考验,父母的身体是子女最关心的事情,我送给老妈的“生日礼物”是一个电子血压计。老妈高血压,虽然她也有个血压计,但是测起来总是不太方便。从前每次回家,老妈总是让我帮她测血压,看到我带着听诊器的样子,老妈总是会说,你要是学医,也挺好。有了电子血压计,老妈就可以不用那么费劲的测血压了。
在外工作的几年,每次回家都觉得家是最亲的地方。我的家乡是一个老工业基地,但是在改革开放以来的发展并不好,经济发展缓慢。最近几年,明显可以感到家乡在一点点的变化着,路越来越宽,楼越建越多……。在外人眼里看来,这个城市没有太多值得留恋的地方,但它却是我最喜爱的地方,或许这就是家乡吧!如果以后有恰当的机会,我希望可以回到那里去工作,为家乡的建设尽绵薄之力。所有享受中国高考的地区差待遇的人学成之后都应该回到家乡,否则就应该是全国统一线。
今天是毛主席的诞辰,祝老人家生日快乐!
-
2006-12-20
大师远行——悼念马季先生
从小喜欢相声,因为它能给我带来无限欢乐。我所熟知的相声演员中,能在我心目中算得上大师的有三人:马三立、侯宝林和马季。侯宝林先生早早远行,马老先生告别舞台后不久便仙逝,今天,我心目中最后一位相声大师离开了人世。
得知马季先生去世,我的第一感觉是震惊,瞬间脑子一片空白。之后是不信,因为十一在家看电视的时候,马季先生还笑容可掬的出现在大家面前,短短几个月,人就这么没了。当这个消息得到证实之后,心中充满了无限的忧伤。确实,这个消息太突然。
年纪的关系,给我留下印象最深的马季先生的段子是,《吹牛》、《五官争功》和《宇宙牌香烟》。还记得小时候,总是捧着收音机,反反复复的听这些名段,虽然有时候几乎是听了上句能立刻想到下句,却依然乐此不疲。“吹牛的人不要脸了”,各个器官都请求上调的脑袋,没有一个系列印完的系列产品。我喜欢相声,听相声的时候,可以让人忘却烦恼。大概也是因为如此,我从小养成了乐观的性格,再大的困难也不会压垮我,笑一笑,一切就会过去。还记得上小学的时候,班级里开晚会,我们几个同学组对说相声,虽然表演稚嫩,但同学们依然可以乐得前仰后合,有时候,我们就会说这些几乎能背下来的名段。
最近一些年,相声不景气,让我失去了很多开怀的机会。很多电视上的相声,虽然我知道明知道这个地方它是为了让人乐,可就是乐不出来。这一现象一直持续到今年,来北京之后,无意之间,我开始听郭德纲和德云社的相声,我又开始重新找到了听相声的感觉。周围的几个朋友受我影响,也开始听,此后,我们之间的交谈又多了这些段子中的内容。现在我们最大的心愿是听一回德云社的现场。
当我重新找到相声的乐趣,一位相声的大师却离开了我们。今后,我们只能在音像资料中,回忆这位“小眼睛、胖乎乎”的十大笑星之首,回忆这位站在台上就让人想笑的大师了。
马季先生,一路走好!
-
2006-12-18
BJUG活动
周六下午,BJUG活动。
founder_chen把我介绍进BJUG已经是好长时间之前的事情了。有一段时间BJUG的活动如火如荼,但我当时人并不在北京,并没有机会参加BJUG的活动。等人到了北京,BJUG最为活跃的几个组织者因为工作原因,人不在北京,所以,也没有什么活动。所以,这次BJUG的活动是我第一次参加组织活动。
知道活动消息,我也在犹豫是不是该参加活动,因为除了founder_chen这个老朋友之外,我几乎没有见过BJUG的任何人。一大清早,founder_chen又给我发了活动的消息,让我最终下定了参加活动的决心。按照他的说法,初到一地,拜拜山头还是应该的。
顶着刺骨的寒风来到活动地点——新浪,这还是我第一次参观新浪,总体感觉还可以。只是在这个越来越多的公司提供免费饮料的时候,新浪摆着的售货机显得有些落伍了。^_^
最先见到的是冰云,虽然未曾谋面,但毕竟也打过一些交道,所以,很快便熟悉起来。自我介绍时发现,显然在这群朋友之间交流,网路上的ID大家更熟知一些。见到了被founder_chen称为有艺术家气息的徐X,一头长发,果然“艺术”,顺便请教了他那个让我一直弄不清楚的ID。
好事多磨,活动还未开始便换了场地。大家陆续就座之后,冰云宣布活动方式,先每人自我介绍,然后,有topic的人介绍自己的topic,大家投票。我投了徐X的DSL一票。最终入选的三个topic是,一个CMMI和敏捷的研究,徐X的DSL,还有一个Selenium。
虽然另外两个话题也让我有所收获,但兴趣原因,我对徐X的DSL还是最感兴趣。在我看来,这个topic还是展现了徐X的功力。如果不是见识广泛,而且对某些问题思考很深,无法讲出这样的话。在这个topic中,我发现了很多和我对程序设计语言理解一致的地方。比如,徐X对语法糖的理解,他认为本质上,除了最底层的语言之外,都是语法糖。如果非要划分一下,提升抽闲层次的算是一种语言,比如OO语言,不提升的算是语法糖,比如C#中的代理。当然,这个topic中,徐X也让有一些豁然开朗的感觉,比如,他认为LISP语言本身对应着一颗抽象语法树,因此,它的可定制性最好,所以,有很多软件选择LISP,作为其定制的根本,比如Emacs、AutoCAD。听徐X的topic过程中,我脑子中想起了Darwin:长发,激情四射、对软件开发理解深刻。
不明白活动的规矩,所以,散会之后便跑了,没有与这些难得一聚的朋友好好聊聊,后来,被冰云在邮件列表里点名了,下次注意!
-
2006-12-12
Hello, Java Compiler API
Java 6发布了,想必很多人还不没有来得及玩熟Java 5,很多人还在与1.4打交道,稳定归稳定,发展是不能停止的。Java 6并不像Java 5那样在语法上下了很大的功夫,更多的力气用在丰富API上。其中有一项是我比较感兴趣的,就是Compiler API,也就是JDK为我们提供的访问Java编译器的接口。下面便是一个使用Compiler API编译Java程序的例子。
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;public class Main {
public static void main(String[] args) throws Exception {
String sourceFile = "Hello.java";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager =
compiler.getStandardFileManager(null, null, null);
Iterable compilationUnits = fileManager.getJavaFileObjects(sourceFile);
JavaCompiler.CompilationTask task =
compiler.getTask(null, fileManager, null, null, null, compilationUnits);
task.call();
fileManager.close();
}
}作为一个最简单的例子,代码本身没什么值得太多解释的地方。它实际上完成的就是调用系统的Java编译器去实现完成编译的工作,因此,基本上等价于
javac Hello.java之前,刚刚在blog中提到ASM,里面的代码生成工作是通过直接写bytecode完成的。现在有了Compiler API,可以考虑生成代码以Java源码的形式完成,然后,通过调用Compiler API对源码进行动态编译,这样,可以达到同直接写bytecode类似的作用。使用Compiler API,肯定不如直接生成bytecode来得高效,但对于不了解JVM指令的人来说也许是一种解决方案。
有了Compiler API,就可以在运行时直接编译Java程序,相当于把javac和java两个过程合二为一,这让Java代码拥有了类似于动态语言的特征。事实上,为了了解Compiler API,我确实做了一个这样的例子,不过,这样就要动不少手脚,不像这里展示的代码那样清晰简单。







