《软件框架设计的艺术》试读:***
读者也许会想:“在程序开发领域中,讲述软件设计的技术图书是不是太多了?”,的确如此,因而你有理由来质疑,为什么我还要写一本这样的书而你又凭什么还要再读这样一本书?说起软件设计的经典图书,那本由GoF执笔的《设计模式》,对每一个想要掌握面向对象技术的开发人员来说,已经成为案头必备之书。此外,对于不同类型的应用开发,也存在大量专业的软件设计模式图书。还有Effective Java,这本传世之作已经成为众口相传的Java程序开发圣经。基于以上事实,还有必要再多一本关于软件设计的图书吗?
我相信这自有其必要性。从1997年开始,我一直从事NetBeans的API设计工作。在此期间,与其他设计框架或者通用功能库的人一样,我也经历了各种酸甜苦辣。刚开始时,我一边尝试将其他语言的一些好的代码风格照搬到Java语言上,一边慢慢地找感觉。随后我对Java语言使用渐趋熟练,将已知的模式应用到我写的Java语言代码上,看起来也就容易多了,当然后来,我又发现事情远不是想象中的那么简单。我认识到,要设计NetBeans这样一种面向对象的应用框架,直接套用传统的模式并不恰当,不管那些传统的模式有多成功,它所需要的是一门全新的技艺。
NetBeans中最早的API要追溯到1997年了,距今已有10多年的历史,至今仍然有不少用户在使用这些API,而且程序运行一切正常,当然坦率地说其中有很多内容与开始时的设计已经不尽相同。在这10多年中,我们也经常根据新的需求来调整和扩展类库的功能,同时对开始时犯下的一些错误进行修正。尽管如此,那些使用了这些API的客户仍然可以使用最新版本的类库来编译并运行他们早先的程序。这一切并非偶然,因为我们一直在尽最大的努力来保证类库的向后兼容性。即使客户使用我们10多年前提供的类库来编写程序,然后用最新版本进行编译和运行,这些程序仍然可以平稳地工作。这种有效地保护客户原有的软件投资的理念非常重要,但在常见的设计图书中却无法找到,至少在我读过的那些书中无人提及。当然,在NetBeans平台的开发过程中,并不是所有的API的演化之路都是一帆风顺的,但我相信,NetBeans的团队成员已经炉火纯青地掌握了这方面的API设计技巧,而其他组织的开发人员也同样需要了解这些技巧。基于这个原因,向后兼容性这个话题在本书中占用了大量篇幅,书中还大量介绍了特殊的API设计模式,有助于编写适合向后兼容的代码。
NetBeans团队工作的扩展能力是当时所面临的另外一个挑战。1997年项目刚刚开始的时候,由我个人负责API的开发,其他工程师的工作则只是写代码,也就是说他们负责完成用户界面并实现其他NetBeans IDE,这些工作都需要频繁用到我所设计的API。毫无疑问,当时我就变成了整个项目的瓶颈。我开始认识到,实现NetBeansIDE功能的开发人员越来越多,我一个“架构师”不可能完成所有的API需求。随着时间的流逝,急需做出改变。NetBeans的开发团队中的大部分开发人员都应该能够设计他们自己的API。而且不管是哪个开发人员设计的API,我们希望保持一致性。但一致性在这里却成为最大的一个问题,原因不是出在开发人员身上,他们其实也想保持一致性,只是因为我当时无法给他们解释清楚我所指的一致性到底是什么东西。相信很多人也有过与我类似的感觉:自己知道如何去做一件事,但就是无法清楚地解释给别人听。我当时就处于这种状态:我觉得自己知道如何设计API,但却花了好几个月的时间才整理出想让大家遵守的最重要的规范。
铭记于心的API讲座
一直以来,我对设计和发布API都有着浓厚的兴趣。在Sun公司内部以及为NetBeans合作伙伴我也做过多次关于该议题的讲座。但直到2005年在旧金山举行JavaOne会议时,我才第一次就这个议题进行了公开讲座。当时我和我的朋友Tim Boudreau向大会提交了一份议题,名为:如何设计历久弥新的API。也许是因为在议题摘要中没有写上Ajax和Web 2.0这种吸引眼球的字样,我们的议题被安排在晚上10点30分。对于讲座而言,这个时间点实在算不上理想,各种聚会、免费的啤酒宵夜,以及午夜的各种娱乐活动都会抢走我们的听众。我们深受打击,只能期望讲座期间会有一两个朋友来露上一小脸,问上几个问题。当晚我们抵达会场,看到隔壁将要进行一场JDBC的讲座时,我们的情绪更是一下子跌到了谷底。走廊里挤满了人,我们以为这些人都是对数据库感兴趣,准备来参加隔壁的JDBC技术讲座的。但让我们吃惊的是,大部分听众其实是冲着我们的讲座来的!举办讲座的房间很快就水泄不通了,座无虚席,还有些听众干脆坐在地板上或者倚墙而立,甚至门都不能关上,因为还有部分人只能站在外面的走廊听。最终,我做了一场从未有过的激动人心的讲座。
自那以后,我确信有很多人想要了解如何设计API,这种需求并非凭空臆造,而是真实存在的。因此在我撰写此书的过程中,每当快要失去动力的时候,便会想起那场激情澎湃的讲座,就又重燃热情。这场讲座时刻提醒着我,那些源于实践并指导我们正确设计API的原则应当被记录下来。这些原则虽然基于大量的设计图书介绍的设计知识,但在本书中得到强调和扩展,因为API设计有其特殊性。