2007年11月28日

重回FreeMind

记得2004年Cr向我推荐了这一款软件,由于当时好像只有0.6版本,感觉不是很好,找到强大的MindManager后就不再使用了。由于现在不能用D版软件,准备完成一个想法的实验,不能使用MindManager,现在只能再考虑一下FreeMind了。仔细查看,现在这个软件的版本已经到了0.9beta13了,试用了一下,感觉功能以及美观上都不弱于MindManager。还发现有一个专门的视频教程介绍0.7版的如何使用,看完以后顿觉FreeMind真的已经很好了。毫无疑问,我已经选定它了。

感兴趣的朋友可以看看下面的几个链接:

FreeMind主站

FreeMind视频教学课程

2007年11月23日

寻找失败

成功不能被复制,但失败总在不停复制。看看别人是怎么倒下的,你可以更早地成功。

盛大首席架构师周爱民的专访里,看到如下10条建议:

  1. 不要急。
  2. 不要只做不想。
  3. 听别人的话,即使你不想听。
  4. 订一个五个期的目标,写一个一年期的计划,然后回顾它。
  5. 学好中文,学好写文章,学会打标点符号。
  6. 把工作当成事业做,天天都在做事业,才会成功。
  7. 理论看不懂,就去实践;实践遇到问题,就去看理论。
  8. 参加一个开源项目,如果没你感兴趣的,就自己发起一个。
  9. 保持自己对某一件事物的热心、执着,即使这件事与你是不是程序员毫无关系。
  10. 成功不能被复制,但失败总在不停复制。看看别人是怎么倒下的,你可以更早地成功。

最后一条,感觉有道理。事实上丁磊就经常对别人讲他的成功不可复制。一个人的精力和时间都是有限的,那么如何学习别人失败的经历呢?我想可以多关注一些讲述如何失败的东西。简单找了一下,居然发现还真有这样的东西。

Failure Magazine 

呵呵,这个网站非常有意思

2007年11月22日

UML很重要,初学

准备开始涉及一些程序架构设计方面的东西,感觉UML这个东西在程序开发中非常重要,以前尝试过一次C++程序开发过程中和UML图的不断交互,那样写出来的代码非常清晰,对整个代码的架构掌握的比较清楚。现在开始采用Java编程,也准备采用这种策略来实现一把,毕竟“Java是正儿八经”的编程语言啊 :)

先转载两篇讲述UML在程序开发过程中的重要性的短文,如下。

------------------------------------------------------------------------------------------------------------------------------------

Java开发为什么需要UML?

       知道UML造成了怎样的局面大混乱吗?知道什么样的功能是UML拥有但JAVA不具备的吗?知道我们为什么需要除JAVA外的另一种电脑语言吗?UML并不仅仅只是JAVA或者其它什么语言的替代品。UML并不仅仅只是JAVA或者其它什么语言的替代品。UML是面向对象的分析及设计的注释。 UML是独立于那些传统设计语言之外的一种语言。因为UML并不依附于某种语言,而且它被用作是联系沟通Java、 C++ 、Smalltalk等语言的基础工具。通过使用UML,可以在开始编码之前规划好整个系统,并且开发人员清楚自己所负责的模块在整个系统中所起的作用。

更为重要的是,UML可以帮你记录下从设计就开始出现的错误,要知道糟糕的设计会带来一系列的麻烦。设想一下,在源代码编制到一半的时候,你突然发现你所需要的信息已经枯竭了,但你却没有办法重新取得信息,因为你没有引用Object,甚至于你引用了object,然而信息确是非public 的。显然的,你将花费数天时间来找出代码的变化。

UML可以帮您摆脱如下一些困境:代码随着细节的增多而累积,因此,查找哪些是系统的基本要素,了解objects之间的关系如何以及它们之间怎么联系都会变得困难起来。当大量的代码产生出来的时候,做一些改变也变得困难。因此决定一个对象的功能被分配到协作中的设置是一项主要的工作。甚至有时只是改变一个方法的名称那样简单事情,也很可能导致一个很长的编辑----编译---错误循环。

在编码之前高水平的设计是进行正确的需求分析和精确的定义,UML的自动化工具固然重要,但UML在设计讨论中就显得更为有用。

Source: http://www.cndw.com/tech/program/2006042862137.asp

------------------------------------------------------------------------------------------------------------------------------------

程序员眼中的UML

UML自1997年诞生以来,受到无数厂商、组织、专家学者的追捧和拥护,短短几年时间,便有一统天下之势。提起建模语言,舍UML其谁?
UML相关标准

OMG组织作为影响力最大的面向对象技术的机构,早早便将UML收入囊中,力捧其为标准建模语言。OMG在CORBA取得成功之后,最大的着力点便是MDA架构,而MDA架构的四大标准UML、MOF、XMI和CWM中,围绕着UML的技术便有三种:UML本身自不必说,版本已经到了2.0;MOF作为“建模语言的语言”,似乎就是为UML量身定做的,虽说MOF有能力创建出与UML并驾齐驱的建模语言,但是似乎没有看到谁这么干,大家只是在努力的发展UML的“方言”,例如UML Profile for CORBA,UML Profile for EJB等等;XMI是“模型的标准存储交换格式”,为了解决不同的建模工具创建的模型不能互用的问题,OMG创建了XMI作为模型的存储交换标准。这样一来,UML工具更加可以大行其道,使用不同的建模工具创建的UML模型可以互相交流,只要它们都基于XMI。
UML相关工具

工具的多寡与优劣可以看出某个技术的受欢迎程度,在建模工具中,不说100%,大概也有90%支持了UML语言。最出名的UML工具Rational Rose,被IBM收购了;Eclipse下面的UML工具EclipseUML让开发它的小公司Omondo也出名了;国内也有一个UML工具,听说效果也不错,就是楚凡科技的Trufun Plato 2005。至于其他国际上有点名气的UML工具,更是不胜枚举,几乎有点软件实力的国家,都有自己的UML工具。

当然,UML不仅仅出现在专用的UML工具中,它也频繁出现在最新的各种开发环境中。例如编程开发环境JBuilder,具有将代码转换为UML类图的功能;Together就更进一步,直接实现了代码和类图的同步转换;Eclipse作为最优秀的开放式开发平台,拥有众多的UML相关插件,除了前面提到的EclipseUML,比较有名的还有EMF和UML2。

UML在MDA出现之后,在OMG的概念中,成为了MDA的一个子集(虽然UML的名气远远大于MDA)。因此众多的MDA工具中,几乎都少不了UML功能。我认为很多MDA工具就是从UML工具直接改过来的。
UML使用现状

照理说来,如火如荼的标准和工具应该催生出如火如荼的应用才对,可是UML的使用状况实在不尽如人意。无论是身边的还是网络上的朋友,在项目中使用UML的都是凤毛麟角,即便使用了UML,也是在很小的范围内,完全没有发挥出1%的功效。现在总结一下目前我所知道的UML使用现状:

  • 读代码时,用UML工具进行逆向工程,可以清晰的观察代码结构,方便理解代码。
  • 写代码时,由于开发平台可以自动生成UML类图,因此有时观察UML类图得到比较清晰的代码结构。例如Together或者JBuilder等工具。当然,如果没有自动生成的UML图,大部分人也不会寻找其他工具去生成UML类图的。
  • 撰写科技论文时,使用UML来表达系统架构或者系统流程等。
  • 部分对UML非常熟悉的程序员,在开始写代码时,先画UML类图,然后利用工具生成代码,最后对代码进行扩展。

从上面的使用现状可以看出,很多人把UML当成一种可有可无的技术。即使使用了UML,也只是围绕着UML中的类图,其他的UML图都抛到一边去了。造成这种状况的原因,一方面固然是因为国内的正规大型软件项目比较少,软件工程技术起步很晚;另一方面是由于国内不管是架构师、系统分析员、软件工程师、程序员、测试人员等等实质上都是程序员而已,很多人是赶着鸭子上架成了架构师或者系统分析员的。这种状况下,软件工程的概念难以深入人心,UML更加成了一个国内项目的鸡肋。

看看国外的架构师、UML专家们,往往都是满脸大胡子,在计算机领域中浸淫了3,40年;而中国最古老的程序员,也只有十几年经验,除去在黑暗中摸索的几年,有十年以上开发经验的程序员少之又少。不经历几个大型项目,要使用软件工程技术是不可能的,也是不能起到什么效果的。因此,有人堂而皇之的撰文“UML的三大硬伤”,将UML驳斥得一无是处。高喊口号打倒某东西是很容易的,关键是打倒了UML何以取而代之?
程序员眼中的UML

既然国内90%以上的软件开发人员都是程序员,那么程序员眼中的UML到底应该是什么样子的呢?我很期望有一本好书能够让程序员们快速的掌握自己所需的UML知识,遗憾的是目前还没有看到这样的一本书。无论是“三友”的UML经典教材还是国内的一些“xx天精通UML”都不符合这样的要求。没有一本是“有中国特色的UML教材――一本写给程序员的UML入门书”。

作为一个程序员,我很了解其他同僚的心理,如果拿到一本书,翻了一个小时还没有找到可以run的HelloWorld,90%的人会大叫一声“去nmd”,然后把书扔进废纸堆。不能怪我们急功近利,在这个技术术语满天飞,连底层平台都动荡不安的年代,谁还有时间和兴趣看一些与自己无关的东西呢?

我很能想象一个程序员,好不容易空出时间来看看最近很热的UML技术,当他拿到一本UML入门以后,开始寻找对自己有用的东西。在开始的一个小时,满篇都是需求分析,use case,甚至书的作者还在饶有兴趣的介绍use case有六种译法:用例、用况、用案……对不起,老子一百年都没做过需求分析了,也不想知道这个狗屁的use case到底叫什么。于是开始后悔在china-pub上又白花了这么多银子。

还有些书上信誓旦旦的说“学好UML,走遍天下都不怕”,如果你做需求分析,你可以用UML和客户交流;如果你做系统分析员,你可以用UML设计系统;如果你做程序员,你可以用UML生成程序;如果你做测试员,你可以基于UML设计测试用例。而实际情况是什么呢?国内的客户有几个懂UML?懂UML的人差不多自己都可以把软件写出来了,还需要请你做需求分析么?别说客户了,上次听同学说和北京某大科研所的工程师们交流,无意中说起了UML,在场的竟然只有一个稍微了解,而且坚持认为那是一种画图工具(那位仁兄其实也没错,Visio不就是一个画图工具么)。

虽然状况如此不堪,但是UML确实是一个很优秀的“交流语言”、“代码生成工具”和“系统设计工具”。让我们擦干身上的献血,掩埋战友的尸体,睁大迷蒙的双眼来看清UML对程序员的作用。UML有九种图,作用各自不同,基本上涵盖了软件工程的各个方面,很多人就是不堪于忍受知识不足的困惑与“侮辱”(很多程序员认为一种技术自己看不懂就是对自己的侮辱),从而放弃了整片UML森林。他们怕的不是在UML这棵树上吊死,而是怕在UML森林里面迷路。但是我想说,知识学习的过程就是去芜存精,找出对自己有用的东西,然后掌握之。对于程序员来说,UML的价值就体现在三个方面:

一、UML是最好的交流语言,无论是与其他程序员交流,还是与领域专家、测试员或者用户交流。原因只有一点,UML是标准的,就像英语一样,无论多么该死,大家还是忙着把自己的论文改成英文的。当然,在小的领域可能有更好的交流方言,但是在大而长远的交流中,使用标准的交流语言是稳妥的。

二、UML是很好的代码生成工具,其实代码生成功能并不是由UML语言和规范提供的,而是由UML工具提供的,而且不同的UML工具提供的代码生成功能还不尽相同。例如Rose提供简单的代码框架生成,而Eclipse插件EMF可以生成功能丰富,提供了各种设计模式的代码包。无论如何,如果程序员可以从UML入手来写程序,比直接敲代码要高级那么一点点。从文档、版本控制、维护、测试等各方面来说,画UML类图比直接写代码都要高那么一点点。

三、UML是很好的系统设计工具。对于程序员来说,很少用到“设计”这个词,大部分时候我们都是在“编写”或者“实现”。但是勿庸置疑,程序员的许多工作中还是需要 “设计”的。包和组件之间的依赖关系、复杂操作的流程、对象之间的关联和状态、程序的部署等等,都经常是程序员的工作。那么上面的四种情况可以用UML的组件图、序列图、对象图和部署图来设计。虽然,不同的程序员有不同的设计方法或者设计图例,不过,UML是标准的。不要忽视标准的力量,标准的东西意味着在全世界范围内都有可能会被看懂,不标准的东西可能出了你的办公室就没人能够清晰、准确的理解了。
后记

Blog好久没有更新,因为最近一直忙于一些俗物,于是想写点清高的东西。但是写完之后再看,好像也不怎么清高,反而更俗了。

前段时间写论文时,需要用到UML2.0的类图元模型,在UML2.0的规范中寻觅了好久,发现类图元模型已经被拆分到三个包里面了,因为UML2.0的规范实在是太大太繁琐了。于是有感于UML之博大精深,说好听是博大精深,难听点就是乱七八糟。不过OMG历来如此,当初的CORBA如果更简约一点,也许J2EE根本就没有立足之地。

感慨之后就是想把UML中对自己有用的部分整理出来,在整理之前免不了到处翻资料,这篇文档就是翻资料的一些感触了。希望能够将UML的有用部分都整理出来,形成一个系列的文档。

Source: http://dxxhh.cnblogs.com/archive/2005/11/18/279882.html

------------------------------------------------------------------------------------------------------------------------------------

2007年11月21日

点滴

Java里面比较两个字符串是否相等不能直接用“=”。那样只能比较两个对象是否是同一个,也就是比较对象的地址而已。这一点在学Java的时候看到过,但是一时疏忽居然忘了,害得我今天花了一个小时时间来修改用于字符串比较的“=”。Java里类的成员变量不要随便将一个静态变量在某个非静态函数中自增,否则会出现严重的问题,当然如果确实需要这种功能的话,需要格外谨慎的。这段时间用Java编程,感觉Java还是很方便的,按照XF的话来说,Java是“正儿八经的编程语言”:)

Google真牛啊!今天试用了Google Calendar的手机短信提醒功能。真的很棒啊,最为关键的一点是用户不需要支付任何费用。这下子好了,也不用买个高档手机来导入Outlook的提醒了。另外得知Google正准备推出Google手机,据说能和Gmail以及搜索功能绑定,呵呵,值得期待啊。

这些日子了解到一些新加坡的历史,值得借鉴啊~!

2007年11月16日

NUS的地图大还是小?

初到NUS(新加坡国立大学)时,被发给一张全校地图,其实学校并不大,但是看到地图总觉得很大,学校里还在有三趟校车围着学校转,整个校园全景图就像下面这样。

我所在的位置就是下面这幅图中红色五角星那里

 

非常遗憾的是,我来这里几乎每天都会迷路,经常出现拿着地图找地方的情况。好在地图虽然看起来很大的样子,但是每两个地方之间都走不了两分钟。

今天,就在今天发生了一件让我感觉不愉快的事情。

事情是这样的,我帮一位朋友带了两个热水袋过来,因为新加坡气温终年都在27度左右,自然不需要热水袋的。送完热水袋回来,那位朋友头送我上了一种专门在两个NUS科学园之间往返的汽车,朋友告诉我可以提前告诉司机在计算中心下车。等过了计算中心我才想起来需要告诉司机。看到汽车行驶的路线和我要去的红色五角星处是一样的路线,我就非常自然的想到可以在离最近的地方叫一下司机停车。但是等到快到时,司机好像是欺负车上就我一个乘客,而且一看就是新来的中国人,居然不停车,还在那里罗里罗嗦的用英语解释不停。大概意思就是,他的工作就是在两个科学园之间运送乘客,你如果要下车的话需要提前举手,而且需要向司机说明。总之就是,司机是很尽责的,如果违规停车的话就会被开除的。

后来我也懒得听他说了,他倒是非常尽兴的说了足足5分钟。哼哼,要是我英文好些的话,肯定会说过他的。

好在,他在一个他认为已经很远的地方停车了,等下车我一看,哈哈,这个司机想整我,但是实际上这里离我要去的地方似乎也比较近。我凭着自己较为敏感的方向感,拿着地图,五分钟内回到了研究所。当我看到研究所大楼的时候,心里甭提有多么畅快。

 

吃一堑长一职,以后做这种两个科学园之间的汽车一定要注意,“举手”,提前说要下车,免得又被人整  :)

 

我送热水袋后,那位朋友非常热情的送给了我基本认为我会用上的书,《Vim》,《Latex用户手册》,《The Java Programming Language》。呵呵,非常好啊。感谢这位朋友咯。哦,对了,前天给另外一位朋友送动画片后获赠了一盒很不错的巧克力,好像叫“FERRERO ROCHER”。也不知道是什么牌子,就是觉得味道还不错。在这里感谢两位朋友的馈赠咯。

2007年11月15日

软件替换

金山词霸 vs Lingoes(免费),而且似乎Lingoes更好些,而且整个软件非常的小(才2M)唯一不足就是Lingoes不支持Acrobat Pdf。但是可以在同样免费PDF X-Change PDF Viewer上完成。

Komodo vs UliPad+PyScripter. 原先Komodo很不错,可以实现编辑和调试,也是很方便的,后来用了UliPad,感觉更为方便,但是UliPad不支持调试,为此加上PyScripter就感觉非常舒服了。现在写Python感觉就是一种享受。

Outlook vs Gmail + Google Canlender. 原先非常熟悉Outlook的使用,也很方便。但是如果没有Exahcnge Server的支持的话,Outlook换个机器就非常麻烦。不得已,经过详细对比分析各种相关解决方案,最终选择了Gmail + Google Canlender。现在我已经脱离Outlook一周了。感觉没有Outlook也是可以正常工作的。

SWI Prolog vs YAP Prolog. 原先就知道运行Prolog程序时Yap会快些,但是由于自己不懂怎么弄那个DEPTH设置,一直只能用SWI。昨天在一位斯里兰卡同事的帮助下,很快就搞定了这个问题。现在能够在Yap上自由运行程序了。但是今天试了一下,似乎有点小问题。

C++ vs Java。由于项目需要,我必须用Java来编写程序,好在来之前突击了一段时间Java,现在基本能够解决问题,但是有时候仍然是采用C++的编程习惯来编写Java程序。昨天得知NUS的本科生一开始就用Java编写程序,而且Java可以很好的完成各种任务。继续学习Java中...。

Windowsvs Linux . 这个是最大的替换,虽然我已经较为熟悉Windows下完成各种任务,但是感觉Linux下也能够非常好的工作,而且有时候Linux下运行大型的程序会更为方便一些。昨天看着斯里兰卡同事的操作,才真正领略了Linux的方便和强大。整个Linux世界是较为成熟的。现在我也得开始好好学习Linux了。首先感谢孙军借给了我一本好书:LINUX随身指南。

SSH vs Putty。原先一直使用SSH来连接Linux的服务器,这两天发现这边都用Putty来连接。Putty比SSH好在哪里还需要体会一下。

2007年11月10日

From 哈尔滨 to Singapore

      第一次走出国门,真的比较紧张,其中遇到了很多的有趣的"意外"。

      首先,我乘坐的飞机经停了两次,大连 and 广州。买票以及取票时都没有被告知会在大连经停40分钟。巧合的是,在飞机快到大连前,我正在阅读的一本高群耀的书《体验微软》,居然正好讲到大连那一段。感觉大连确实非常的美,尤其在飞机起飞以及快要降落时看到的场景。

      大连机场,登机前,我在让机场人员检查我的机票时,一位30多岁的女士问我是否要去Singapore。原来她的机票和我的一摸一样。想到同是从哈尔滨到异国,一时到像是遇到了老乡似的。呵呵,她是哈尔滨人,我是四川人。真是一种奇怪而特有的感觉。随后的两次碰上的几分钟的闲谈,她向我介绍了Singapore相关的很多信息,例如哈尔滨的特产红肠、黑木耳、马哈鱼等在新加坡都非常受欢迎,因为新加坡的木耳都很厚很大,味道不如哈尔滨的。她介绍马哈鱼在中国只有很少的几个城市能买到,算是哈尔滨的一种特产。我原本以为马哈鱼属于海货,新加坡这种岛国应该会很多的。

      广州下飞机后,首先是换取登机牌以及托运行礼,原先一直以为自己的箱子已经就20kg了,哈尔滨至广州断,我一直还随身带着一个大拎包和自己的背包,在广州换登机牌时随手试了一下,居然两个包加起来也不足20kg。这下子就轻松了很多。高中同学来机场见我一面,简单的闲谈了很多,谈及最多的还是大家高中毕业后的经历,最后的结论是大家都要好好努力,年轻时多积累经验。

      最为担心的是在广州登机前的安检。听说随身携带的药品需要过海关申报,在遇到申报这关时我填写的都是不用申报,最后居然顺利过关了。现在才知道,自己带的这些日常用药根本就不用申报的。

      刚登上去往新加坡的飞机,一位新加坡老太太询问我是否可以和她的一位朋友换个位置,我应声答应了。从左侧的过道侧位置转到了右侧的中间位置。翻看了几分钟随意的杂志,旁边的一位中年女士问我是否要看报纸。接下来,这位女士给我讲述了她半生的奋斗史,以及她所理解的社会、人生、以及世界各地的各种人文轶事。她说她最为厉害的就是在全世界范围内买廉价机票以及定廉价酒店。随后她就向我讲述了其中的"诀窍"。从她的言谈以及对各种最新消息的关注程度,我发现她是一位"全球化"的人士。她的很多业务都验证了《世界是平的》一书的描述,唯一不同的是她根本不借助互联网,而是单纯的凭借她的那种由于美容技术而快速结交人士的能力以及对各种相关信息的跟踪与分析。听了她的介绍,我觉得这些内容都能写成一本传记,缺少的只是后续的内容。从中也体会到了很多华人在海外的遭遇以及执着的奋斗。

      到新加坡下机后,我拎着那位哈尔滨"老乡"的行李,在一个路口等她。一位准备清理飞机的工作人员问我你怎么穿那么多啊,我说我是从哈尔滨过来的,那边气温已经低于0度了,随之而来的是一阵惊讶。

      在入境处,工作人员很顺利的建检查了我的证件,我还解释了一下我的签证的情况,看着顺利通过了检查,我觉得我用中文解释还是很有帮助的,因为这个签证很特殊的。忽然,"please speak in English"传入了我的耳朵。原来,这位官员是马来西亚人,后面的"老乡"让我帮翻译一下后也顺利通过了检查。忽然意识到了很多场合开始更多的需要英文了。

      最为意外的是在机场的接机。原先告诉了我的三位同学来接我,相关的机场怎么坐车的信息我就没有预先查一下。等我推着行李车走到接机处后居然没有看到我的同学们。一时真的有点着急了,围着两个接机口转了四个来回,我决定开始应急方案。经过数次询问后,我兑换了一些新币,购买了一张像国内IC卡那样的电话卡,准备给直接带我的老师XF打电话。因为他之前告诉我他的手机号时补充了一句,"When you are lost in the airport, please call me"。说来也巧,就在我最后一遍查看同学们是否在接机处时,忽然出现了明显匆匆赶到的Sun Jun和Jiang Hongfei。那一刻,真有一种找到家的感觉。Sun Jun变得Stronger了许多,Hongfei变得白了许多。原来他们根据经验,认为我会先填写入境登记表,然后时繁琐的入境检查,之后会是被迫缓慢的查询托运的行礼,最后才是出现在接机处。

      由于时间已经接近12点,没有了公交车,我们只好打车。刚上车,我发现新加坡的汽车原来是右边驾驶的,而且整个交通系统都是自左原则,刚好和中国的情况完全相反。弄得半天我都以为是坐在左前方的Hongfei在驾驶似的。

      半个小时后,我们终于达到目的地,原本以为会先到他们的住处挤一晚,此刻才知道他们直接送我到了帮我预租的房子这里。送走二人后,由于看起来整个房间都没有人,我开始收拾起来。先铺好床,简单收拾一下房间的格局以及自己随行携带的东西,之后洗完热水澡后就不知到怎么睡着的了。这时是凌晨2:30。