岁月如歌,人生如戏,软件如棋

2014年8月6日星期三

转移了

因为被GFW墙了,所以转到新浪博客了。

2009年6月12日星期五

《彩色UML建模》译者序

人们的学习都是从模仿开始的。学习书法时,一种重要途径就是临贴。学习围棋时,一种重要途径就是打谱。学习面向对象分析和建模时,对应的途径在哪里?

开发者希望看到真实世界中企业级开发的例子,而不只是ATM机的UML图。如果您是一名建筑设计师,您有机会看到金茂大厦的设计图纸吗?我们会看到最后的产品,但对产品得到的过程一无所知。模型并不重要,重要的是得到模型的过程。我们希望听到更多的设计大师的自战解说。开源让我们有机会看到优秀的代码,而这本书让我们有机会看到优秀的面向对象分析模型,以及建模的过程。

建模能帮您做到什么?或者说,您为什么要建模?对我来说,建模是为了让软件开发更简单一些。虽然让复杂的事情变得简单并不容易,但这本书却做到了。通过4种彩色的架构型,让我们能够迅速地对复杂的业务领域建立起简单的模型。

系统分析师需要“体察千行百业之要义”,这本书对企业组件的全景式描述,为我们提供了学习的典范。

Booch在他的《面向对象分析与设计》一书中说,所有成功的软件项目都有两个显著的特点:一是很强的架构愿景,二是迭代增量式的开发。彩色UML和FDD做到了这两点。

一本好书会改变您对事物的理解,从而改变您的行为实践。对我来说,这本书就是这样的。每次我看到其他人给出的领域分析模型,都会用彩色UML的方法去印证,结果总是能得到更好的模型。

这本书是一本值得反复临写的贴,是一本值得反复打的谱。

在这本书的翻译过程中,我学到了很多,因此郑重地向大家推荐它。如果这本书对于您改进软件开发实践有所帮助,我将十分高兴。

2009年6月10日星期三

Top down还是Bottom up?

设计程序或写程序,您是习惯自顶向下还是自底向上?

一个朋友曾对我说,很感谢父亲小时候对他的作文训练。训练的方法是这样的:扩写和缩写。把一句话扩写成一段话、一篇文章。把一篇文章缩写成一段话、一句话。这就是所谓的演绎和归纳,也是自顶向下和自底向上的方法。

Alistair Cockburn在《编写有效用例》时也表达了这样的观点:所有的系统都可以归纳为一个最大粒度的用例,即“使用XX系统”。然后我们再把它逐步细化,得到“天空级用例”、“海平面级用例”、“水下级用例”。

这是自顶向下的分析方法。但也有不同观点。

Martin Fowler在《设计已死?》中传达出这样的观点:告诉我一个一个的用户故事,最后我会给你一本故事集。这本故事集就是它存在的意义所在,你不必事先告诉我这本故事集“一言以蔽之”应该怎么说。我可以通过不断的消除重复和重构,得到高级的抽象概念。

但是Grady Booch在《面向对象分析与设计》中告诉我们,人们对客观世界的认识往往是从中间的抽象概念开始的。例如小孩在认识动物时,开始是认识狗,然后会向下认识拉布拉多、吉娃娃,向上认识哺乳动物、动物。

我们在写文章时也是如此。先会有一段素材,让你在脑子里闪过一个念头,涌出一股写作的冲动。然后你开始仔细思考,提练更深刻的主题,寻找更多的素材,向抽象和具象不断探索。

我在设计系统时也是如此。

2009年6月9日星期二

RESTful的codebase

我们的代码集曾经保存在不同的地方,现在终于进入了云端。Bespin已经在云上做IDE了。

毫无疑问,代码是很多人关注的一项资源,而资源可以用RESTful的方式来表现。所以可以有这样的URL:

http://www.google.com/code/com.google.inject
http://www.google.com/code/com.google.inject.Guice.java
http://www.google.com/code/com.google.inject.Guice.java/revisions
http://www.google.com/code/com.google.inject.Guice.java/authors

这样隐藏了代码集的一些实现细节,例如,它使用什么版本控制工具。
对代码的浏览可以有SourceInsight那样的效果,也就是把SourceInsight放到云端。
从此不再需要每个人都从svn下载一份代码拷贝,然后打开SourceInsight来读代码了。

爱因斯坦说:想象力比知识更重要。
熊彼特说:创新,就是新的资源组合方式。

RESTful的课程表

一个连锁健身会所在全国有70多家分店,每个店都要有一张课程表。课程表中包含一周的课程、操房、教练等信息。如果客户感兴趣,还可以进一步了解课程介绍、操房介绍和教练介绍等信息。课程表会不定期进行变更,客户可以在网页上查看,也可以下载PDF文件。

如果按RESTful的风格进行设计,可以考虑这样的URL:
http://www.HealthIsOne.com/schedules
http://www.HealthIsOne.com/shanghai/citychamber/schedule
http://www.HealthIsOne.com/coaches/troy.zhu/
http://www.HealthIsOne.com/shanghai/citychamber/rooms/room2
http://www.HealthIsOne.com/courses/YugaIntro

返回的内容可以协商,根据不同情况返回HTML、XML、JSON、PDF或图片,也可以有这样的URL:
http://www.HealthIsOne.com/coaches/troy.zhu/photo
http://www.HealthIsOne.com/coaches/photos
http://www.HealthIsOne.com/shanghai/citychamber/coaches/photos

课程表会变更,就意味着有历史课程表,所以可以有这样的URL:
http://www.HealthIsOne.com/shanghai/citychamber/schedule/20080305

这样做的好处在于:
1、以业务资源为中心,隐藏一切实现细节
2、应用和数据回归Web本质
3、容易支持扩展
4、容易实现缓存机制

2009年6月7日星期日

临摩

我儿子在跟着一位老师学习书法。老师的教法很简单:在教授了点划的写法之后,就是描红,然后是临贴。楷书临的是欧阳询的《九成宫》,一开始自然是临不像的。笔划弯弯扭扭,字歪歪倒倒,还会把墨弄得纸上到处都是,甚至弄到手上和脸上。老师没有不耐烦,每次发现儿子有写得进步的地方,就用朱笔画圈,写得明显漂亮的字就画五角星。然后要求家长督促,回家以后一定要每天练习,经常说“一日不练三日空”、“一日不练,自已知道;两日不练,师父知道;三日不练,观众知道”。老师的眼睛很厉害,如果一周没练,下一个周末去当场写的时候,他就能看出来。

就这样几年之后,儿子写的字有点像样子了。汉隶临的是《张迁碑》,行书在临《兰亭序》和《集字圣教序》。诗云:如切如磋,如琢如磨,大概就是这个意思。书法艺术有几千年的历史,从二王、索靖、张芝、智永、欧储颜柳、张旭、怀素,到苏黄米蔡、赵孟頫、徐渭、王铎,出现了为数不少的大师。不仅他们的作品值得我们反复临习,他们成为大师的艺术追求之路,也同样值得我们借鉴。

米芾的例子就很典型。米芾习书,自称“集古字”。根据米芾自述,在听从苏东坡学习晋书以前,大致可以看出他受五位唐人的影响最深:颜真卿、欧阳询、褚遂良、沈传师、段季展。米芾有很多特殊的笔法,如“门”字右角的圆转、竖钩的陡起以及蟹爪钩等,都集自颜之行书;外形竦削的体势,当来自欧字的模仿,并保持了相当长的一段时间;沈传师的行书面目或与褚遂良相似;米芾大字学段季展,“独有四面”、“刷字”也许来源于此;褚遂良的用笔最富变化,结体也最为生动,合米芾的脾胃,曾赞其字,“如熟驭阵马,举动随人,而别有一种骄色”。然后他开始学习二王。《宋史》载:米芾“妙于翰墨,沉著飞翥,得王献之笔意;尤工临移,至乱真,不可辨……”。最后,“既老始自成家,人见之,不知何以为主”,完成了自己风格的确立,大概在五十岁以后。

所以,成为书法家的过程可以总结为四个字:入帖、出帖。

张大千则是画家中的典型例子。他早年临石涛临到乱真,号称“当代石涛”。四十多岁时自费赴敦煌,花了大量时间对十六国、北魏、北周、隋、唐、五代、宋、西夏、元各朝的壁画代表作及雕塑进行了临摹。从此,张大千的画风也为之一变,善用复笔重色,高雅华丽,潇洒磅礴,被誉为“画中李白”、“今日中国之画仙”。他走的路和米芾一样:从临摩开始,到乱真,最后自成一家。

我读中学时,正好是聂卫平在中日围棋擂台赛上大胜的时候。全国上下掀起了一阵围棋热。我也去弄了一本电视围棋教程来看,我记得很清楚,我只看到了第37页,就把书一扔,找人对杀去了。杀是杀得很爽,但我那时连征子都还没学到,实战中另一个同学“教育”了我。围棋也有数千年的历史,王积薪、黄龙士、施范、秀策、木谷、吴、六超、聂马、曹李,都是我们可以效仿的大师。

一般来说,要想提高棋力,需要日复一日地做三件事:打谱、做死活题、实战。打谱是一种临摩,做死活题是一种临摩,实战也是一种形式的临摩。

另一点值得强调:实战一定要复盘。不论结果如何,要找出下得好的棋和下得臭的棋。在水平低的时候,如果有条件,最好是找水平高的老师来帮忙复盘。这就是老师的作用:虽然他的水平没有大师那么高,但是他可以告诉你练习的方法(需要去临摩哪些东西),也可以指出你最需要改进的地方。可惜我现在明白了怎么学习围棋,却没有太多的时间去练了。

如果想学习管理,可以去看看朱兰、克劳斯比、戴明、德鲁克、高德拉特、韦尔奇,再找个咨询师。如果想练习游泳,可以去看看波波夫、北岛康介、菲尔普斯的视频,再找个专业教练。

如果您是设计软件的,梦想成为一名伟大的程序员,那该怎么做?您一定已经知道了。

2009年6月6日星期六

面向对象设计与开发(两天培训提纲)

一、好的面向对象系统的特点
  • 高内聚、低耦合原则
  • 关注点分离原则
  • SOLID原则
  • Don’t Repeat Yourself!
  • 加入一个中间层!
  • 复杂系统的架构方式

二、设计模式
  • 设计模式的意义
  • 设计模式的模板
  • 设计模式选讲

三、面向对象系统开发过程
  • 从需求到OOA
  • OOA到OOD
  • 自动化测试和持续集成
  • 敏捷开发方法学

四、领域分析与建模
  • 领域驱动开发
  • 彩色UML方法
  • 案例分析

五、相关技术
  • 对象持久设计
  • 表示层设计
  • 组件化
  • AOP
  • SOA和SaaS
  • RESTful和AJAX
  • MapReduce集群