新年,2005总结再见,欢迎2006来临!

2005年是我的本命年,其间很多事情发生了改变,人生收获颇多。所以,这里几个流水账,自勉。

 1、年初和期末考试作斗争,并且成功全过。这门过后我的学分基本修够,减少了下个学期的专业课学习压力,是个成功。

 2、第四次冲击6级。靠,我个人非常清楚英语的重要性,所以一直注意实际阅读、听的能力,但是六级的应试能力不佳。幸好zz帮助我,给我找了些真题,而且教导我要向过6级就好好做真题。结果顺利通过,真是喜出望外。今年是老版6级最后一年了,算是赶上这个末班车了。谢谢zz。

3、陪zz准备北京公务员考试,本来说陪她考的,可是由于时效问题,没有真正陪她,也没有好好帮她复习。她没过。这是个失败,明年要陪她冲击。

4、学校第二学期开始,开始一段比较自由的学习。我开始认真地读《程序员杂志》,为自己从硬件兴趣型到软件专业型的转换做准备。经验是,不管如何要专业。

5、和小梁合作的jsp的电子商城项目被我们强行终结,幸好将我们将货款收回。这个项目我们从去年9月做到今年3月,成本亏了是肯定的,但是让我从一个asp程序员转型为jsp程序员,真正了解脚本是什么。呵呵,我的asp还是2年前在玩票,现在的jsp让我慢慢往后了解server可以如何运作。这里不多说了。但是这真的是个正式的算钱的项目,体会了软件工程,学习了如何分工协调,从我的搭档身上也学到了很多,我的学习能力在这个项目上迅速提升。

6、做了几个网站,包括给小叔公司代理telecobriges,还有大学同学的《厅长小武》,还有一个Moshiwig假发。基本上是设计型的,分别对PSD切片、xhtml+w3c等进行了更多的尝试。

7、五月和zz去青岛旅游,太高兴了,充满无数美好回忆!所以明年还要继续选择一个目的地去旅游。

8、进行二级实践课程,认识了几个好朋友,与他们的共事使我真正进入Java Web开发的阵营,并且用心的体验了什么是轻量J2EE开发,真正认识了Spring、Struts、Hibernate,几乎是一夜间我就成为了一个Javaer。

9、上了软件心理学,并认真思考了一下UI设计的问题。虽然没有上升到学术高度,但是确实认真思考了这方面的问题,感觉很有收获。

10、开始研究什么是架构,什么样的需求需要什么样的架构。多次和LBBZH讨论过这些问题,感觉收获巨大,他是个好朋友,以后还要多向他学习。

11、开始用业余时间在混乱的开源项目中体验不同的思路,从而可以在简历中说熟悉了一大堆的框架、工具等等。发现开源社区的意义,并尽量做些贡献(eXtremeComponents、参与翻译Pro Spring等)。这种感觉是快乐充实的。

12、协助一个朋友忙开网吧的事,并出差山东一次。虽然时间不长,但这种只身去陌生地方的经验是第一次,男人需要成长呀。

13、今年第一次自己找了个工作。得到了一个朋友的帮助。工作了不到两个月,平生第一次正式的领到工资。虽然在单位没有发挥自己的全部实力,但是还是认真地做事,可惜单位的职位还是不太适合我,我需要一个空间让我自由发挥。但是单位的同事都是朋友拉。谢谢丸子!

14、今年也第一次尝试了辞职。仅仅工作了两个月就被朋友召唤走了,心里没有一丝依恋。因为新的环境会很自由!辞职的流程还是比较长经验的,哈哈。

15、和朋友组成Team去密云做工程,我的职位是系统架构师。非常惭愧,其实不配这个称号。但是被人家吹捧的感觉还是不错的,谢谢你们的善意欺骗,我会努力成为真正的master的。

16、终于有足够的money陪zz逛街了,很爽。尤其是可以不假思索的说“拿下”,看zz惊讶的笑脸,满足啊。男人就应该这样,明年继续。

17、我和zz终于走到一个里程碑,我们已经计划好,她已经同意嫁给我了。具体的计划还在筹划,这是我人生中的重大决定呀。

18、今年花了很大的心思给zz准备生日礼物。她非常满意。男人应该尽到他的心意。zz,我喜欢给你画画。

19、今年在硬件上。我花eShop工程和小武等工程的钱买了个Dell 1704FPT LCD,并且通过我的努力将有坏点的显示器换成了一个完美的8ms板的。当然1704颜色一般,准备以后换个好的。后来入手了Logitech G5和MX510两个鼠标,键盘变成了Dell 8135。其余的新鲜东西没啥了。

20、年底送给zz一个iPod nano黑色。原先跟她说她并没有感兴趣,但是送她以后她却被它迷住了。她超级喜欢这个礼物,个人认为这礼物是我的杰作。同时送了iDog小狗一直,完全满足我家zz的爱好!

21、由LBBZH推荐加入了BJUG,参与了几次活动,受益匪浅。对各位大牛真地是佩服得五体投地,并且也迅速找到了自己的不足。更加认真地扎入到java这个阵营中了!学习了更多的框架,理解也比以前深刻了,明年还要继续跟进。

22、今年丢了一次钱包,卡没有使用强密码,损失了800元。还好先前花980买了个Meizu E5 512MB Mp3,它给我带来了很多的音乐享受,也让我少丢了另外800元钱。明年要涨记性,多注意防贼!

23、我的三星X108丢失在青岛的崂山风景区,具体丢失过程不明,但是以后还是要多家小心。 好了,23是我的幸运数字,不继续写了。

可以说2005年是我到现在的人生经历中收获最大的一年。学习平稳到了一个收获期,成功转型,成功潜入Java开发阵营并站稳脚,感情稳定并得到认可,经济状况明显好转,性格也成熟了很多,我真的从一个男孩成为一个准男人了。明年的目标就是更男人!要更男人就是为了要扛起我的父母和爱人。期待2006,一定要比2005更加充实。

Spring 2.0和给贫血模型充血

Spring 2.0 vs. the Anemic Domain Model
原来是因为老马骂了贫血模型为反模式,说冲血模型才是最好的,能够真正的OO。
不过Spring 2.0的概念被骂了个体无完肤。
本身,我的立场从来就没有站在OO这一边,我是真的无所谓的人,什么过程、OO、FP我都很认同,当然能优雅些是最好的。
看了以后就想到WQH前两天就已经推荐给我的ajoo写的充血模型的问题,我才意识到QH大师又走在我们前头了!
看了下javaeye上贫血/充血的讨论,才豁然开朗。
知道为什么冲突就对了。关键点还是在争吵OO,而OO在领域模型方面有时适合充血有时适合贫血,当然贫血居多,所以举起例子总是两边倒,没有定论。
还好,抽出重要部分,对于基本CRUD,那么绝对是贫血模型就好了。而对于有复杂计算的领域模型,我们要建立一个完备的OO的领域模型则需要充血。
这提醒了我们,充血的确是需要的。不过给Hibernate下的POJO(明显贫血到死)充血并不容易,所以才有了更多的文章讨论这个问题。
记录下来,大家有兴趣一起研究:
TSS:Spring 2.0 vs. the Anemic Domain Model
http://www.theserverside.com/news/thread.tss?thread_id=38047
Javaeye论坛:贫血就贫血,咂地?
http://www.hibernate.org.cn/viewtopic.php?p=100045&sid=df2163b2c94afbb6b214da6b3be42d73
ajoo在javaeye的conflunce上写的:怎样给马丁的充血域对象注射依赖
ajoo一文的后篇:http://www.javaeye.com/display/ajoo/Dependency+Injection+For+Rich+Domain+Model
对程序员透明的非aop方法解决rich domain object的依赖注射
http://www.javaeye.com/display/ajoo/Transparent+Dependency+Injection+For+Rich+Domain+Model
Codehaus上的一个解决方案:Dependency Injection For Rich Domain Objects
http://docs.codehaus.org/display/YAN/Dependency+Injection+For+Rich+Domain+Objects
老马写的批评贫血模型的檄文:AnemicDomainModel
http://www.martinfowler.com/bliki/AnemicDomainModel.html
Spring Blog上的原文:Spring 2.0 vs. the Anemic Domain Model
http://jroller.com/page/habuma?entry=spring_2_0_vs_the
我个人认为POJO还有DTO都是简单的VO,而VO就是VO,要区别于Real Object。我们的domain里面大都是VO而不是RO。Hibernate也是基于VO的,EJB3同样。所以RO应该说是理想OO下的东西,我们真正要用的时候,还是可以自己选择是否要实现这种复杂的东西的。但是不用RO则我们的程序就变得过程化。所以老马也认为这是头疼的事,但又不要解决,只能放到他的TODO list里面了,哈哈。
哈哈,但是看完Spring的那个Blog,感觉Spring 2.0做好了解决多向以来的模型的方法是很不错的,当然是由解决给贫血模型充血引发的,但是我认为它还能解决其它问题,所以感觉不错。但是Spring 2.0再次强调Aop的好处,也的确能看到,所以有时间还要学习一下AspectJ。
而这个问题ajoo说了IoC和Aop都可以解决,感觉各有道理。IoC方式感觉代码容易读懂,也合理。而Aop则代码有点牵强,当然使用起来感觉很爽,尤其和Lazy-init结合,对生存周期的控制有它读到的地方,而且想明白了用Aop+Annotation感觉也很清楚优雅。

非常完美的一天!

早晨,刚刚睁眼听到妈妈说7:05了。昨晚和ZZ说好了今天8:00去她家找她。所以麻利的起来穿好衣服,洗漱干净背上书包冲出家门。爱人的召唤吸引着我,脚步十分轻快。
和每个找她的周末的早晨一样,习惯性的期望13路正好经过,因为搭乘13是去她家的最佳车辆。作为完美一天开始的信号,我看到十三路从远方开来,并且面前是个绿灯,可以马上过马路到车站。快步冲过人行道,我与车一同停下,上车,心情很愉快!
我在锣鼓巷倒车,换乘115路。下车继续用我喜欢的节奏快步前行,到了115路总站发现刚好就要发车,小跑几步上了车,还坐在我最喜欢的皇帝位上。皇帝位就是最后一排最中间的那个坐,视野广阔,可以面对整个过道,拥有清晰的视野是让人心情轻快的事。
8:05分,我已经在ZZ家楼下。天太冷了,我走到ZZ家的楼道中,此时她已经收到了我到达的讯号,因为我听到她家的门被打开又被关上的声音,多么熟悉呀,说明我家宝贝已经就要下来了。
然后就是蹦蹦跳跳的下楼的声音,我迎上去,我家ZZ看来很高兴,她在看着我开心你的笑。我抱起她,一直到楼下。
按我们的计划上午有个健身的活动,我们搭车去了KFC,吃些早餐。要了咖啡和麦香猪柳蛋的组合。这个选择很英明,芝士ZZ很喜欢,而蛋的口感很顺华,猪柳则明显调和了清淡的口味,配合在一起就能给我们满足的感觉。然后就是期待中的一小段运动时间,现在健身已经是我们生活中的一个重要节目了,因为现在的生活节奏的确需要这种节目来缓解,边运动边聊天。
ZZ说昨晚吃的太少了,尽早就很饿,刚才的早餐其实大部分被我干掉了……ZZ说要计划一下中午吃什么,她想吃好的。
什么叫说曹操曹操就到?在完美的一天一定要有这样的巧合才对。就在我们计划吃什么的时候收到了姐姐发来的短信,问我们在哪里。嘿嘿,姐姐周末的短信就是说要有饭局了。
正好中午要去国展家乐福,就应了姐姐……中午去吃汉拿山,上次就说请姐姐吃的,正好也是ZZ的最爱之一。而我正好是无肉不欢的人,当然乐意的不得了!
饭局定在12:00。我和ZZ先去国展家乐福,这里的特点就是物种极大丰富,我们并不喜欢这里火车般的长队,但是喜欢到这里发现没见过的食物,这种感觉有点像在逛博物馆。
由于时间仓促,我们主要流连于西餐区,因为ZZ总想给我做pasta吃,前一天其实我们已经来过,不过还没有过瘾,我们继续寻找各种pasta的佐料(昨天已经买了通心粉和番茄肉酱),真的很好玩。很快接到电话,二姐的车到了。
我们两个迅速跑出去了,活像两个企鹅,哈哈,摇摇晃晃跑过过街天桥。
去吃汉拿山了。可爱的明明没来,哥哥点的菜。这里的牛扒还是那么好吃,让人感觉幸福呀。腐败的过程不赘述,吃完以后我们来到安贞华联。
ZZ想要兰寇的so magic香水,可惜这里没有兰寇。然后我们逛啊逛,终于逛到了海盗船,那天答应送她一个新耳环。其实她扎了耳朵眼没几天,现在还没好利落呢,前几天送她了一对耳钉,她还想要环。
到了店里,她在挑……我用眼扫了一下,发现一对比较闪亮的,好像在呼唤我。我推荐给ZZ,她一下就喊道:“太漂亮了!”然后她也环视了一下,马上肯定我选到的是最漂亮的,然后说我要买下它。
我非常干脆利落的让小姐开票并去付账了,这是我最近练出的本事,做男人给女朋友花钱一定要买单不眨眼不犹豫,说实话也没什么犹豫的,我喜欢她闪亮亮的。
回来的时候她已经把耳环换好了,看着她闪动着满意的眼神,我心里十分的满足,嘎嘎嘎!
然后继续逛,卖首饰的柜台真多,不过没怎么看到更好看的。所以说是完美的一天,因为想要的东西马上就可以找到!
我们继续逛,她给我指了很多毛衣,可能我很想给她买东西,并没有看到什么让我眼前一亮的毛衣。我现在也变挑剔了,因为要让她有面子我也要打扮得潇洒一些,前年这个时候我可不会逛商场买衣服,但是现在,逛商场感觉就像在自己家里一样。
下了楼,本来要回家了,看到国美电器了。她想起要买个卷发棒,其实去年她就要求过我,可是看到的都太低档了,所以还没出手。
进去以后,很快选定了德国伟嘉的3合1卷发棒,我坚持要送给她!她欣然接受,我很满足,嘻嘻。
然后过了马路,718很快到站,然后又很快有坐。到了家里,有香喷喷的牛肉面等我们爽呀!
爽呀!爽呀!爽呀!爽呀!
真的很满足,因为很完美,我们已经找到了应该收集到的所有快乐碎片,下一步就是步入婚姻殿堂了,她也欣然接受,我就要订婚了,当然日程还没有订!
所以,这是需要纪念的一天!
2005年12月11日!

关于事务的满脑袋酱子,解惑:本地、JTA、CMT

传统上J2EE有两种事务管理策略:全局或者本地事务
全局的由app server保证,如JTA。而本地则是针对某种资源的,如JDBC连接的事务。
其中,全局事务是为了保证多种事务资源的共同工作。但是如果是用本地的事务,则容器(app server)无法保证跨资源的事务。
JTA是一种全局的事务。但是JTA是笨重的,且JTA的事务一般需要通过JNDI获得,所以JNDI和JTA一般联用。而且JTA代码一般不能跨App server,会受限于某种特定的容器。
所以更好的方式是使用EJB CMT(Container Managed Transaction),它的特点是使用声明性事务,而不是编码事务管理。
所以,虽然EJB天然结合了JNDI,但是并不受限于容器(声明性)。
但是CMT又依赖于JTA和App server环境(或者说支持EJB的App server,Tomcat这些Servlet容器就不行啦)。所以这种事务如果依赖于EJB或者EJB的装饰封装则要花不少资本投资App server(不是钱也至少要人,如JBoss)。
但是,我们还有更好的选择,如Spring,或者很多Aop实现,EJB3等等。
而本地的事务策略虽然实现容易,但是缺点显著。它不能在多资源间实现事务支持,并且这种事务对变成模型的侵入也很大(传统JDBC事务使用起来就是这样)。而且如JDBC连接也不能与其他JTA事务协同被管理。如你的JDBC和某个其它事务绑定(如两个JDBC Connection)起来,如果遇到一个失败你如何将两个rollback?(这个是我自己演绎的)
下面是广告:
Spring解决了这个问题。它提供了一个持续的模型,可以应用在大多数环境。也就是说你可以灵活的更换它支持的各种事务策略(你也可以自己扩展)。而且Spring两种方式的事务都支持(声明/编码),当然Spring推荐使用声明的(侵入小,灵活)。

MB,本来写了不少体会,结果倒霉没有保存,如果有时间我再考虑一下是否重写吧,损失惨重!