《精通Python设计模式》译者序

在我读大学那几年,设计模式可谓火极一时,各大公司校招面试也几乎都会考设计模式,反观现在,则似乎很少有人聊设计模式的话题。是因为设计模式过时了吗?还是只是一个错误的概念?从个人这几年的开发经验来看,答案是否定的,设计模式并未过时,更不是一个错误的概念。从曾经的“红极一时”到如今的“门可罗雀”,只是说明软件开发行业以更加客观理性的态度来看待设计模式。软件开发领域的技术概念也似乎总是遵循这样的流行度变迁,最终一次又一次地证明不存在“银弹”。

正确看待设计模式的前提是明白什么是设计模式。正如本书一开始就强调的:“设计模式的本质是在已有的方案之上发现更好的方案(而不是全新发明)”,这是一种务实的态度,设计模式并非是一种高大上或者神秘的东西,而是一些常见的软件工程设计问题的最佳实践方案。

那么应该如何学习设计模式?个人认为软件开发技术的学习都应该以实践为前提,只有理解实践过程中遇到的种种问题,才能明白那些技术的本质和目的是什么,每种新技术都是因某个/某些问题而出现的,软件开发高手一般都反对新手一开始就一股脑地学习设计模式。有些新手学了点设计模式的理论后,甚至在软件开发过程中生搬硬套,结果是适得其反。因此,软件开发人员应该在积累了一定的开发经验,再系统地学习设计模式,效果往往也能事半功倍。

现在有些积累一定开发经验的软件开发人员,在谈起设计模式时,一脸鄙夷。我想这也不是一种客观务实的态度。软件开发不是简单的累积代码,在实现业务功能的同时应该仔细考虑如何控制软件的复杂度。软件的复杂度分为两个层面:业务逻辑复杂度和代码实现复杂度。对同一个业务系统,不同的软件开发人员会有不同的实现,复杂度也不同,相应地实现的易理解性、可维护性、可扩展性也不同。软件开发人员应该不断学习如何控制软件的复杂度,学习并恰当地使用设计模式是应对软件复杂度的有效方法。

然而,设计模式并非是固定不变的(如,《设计模式-可复用面向对象软件的基础》一书总结的23种模式),使用不同的编程语言来编写代码,需要学习的设计模式也不一样。一方面因为软件开发领域迅猛发展,一些新的软件工程问题也随之出现,另一方面则是新的语言新的平台会把一些常见设计模式吸收为内置特性。所以,软件开发人员因以实际问题为驱动,不断更新设计模式方面的知识。

本书以Python编程语言为例,针对目前的软件开发领域,分三大类讲解了16种常用设计模式。使用Python语言编写示例代码,我认为作者主要是考虑到Python的抽象层次高、应用范围广,读者不会被一些实现细节的干扰,从而能快速直接地掌握模式的要领。

全书始终保持务实的态度,列举了大量现实生活的例子和软件开发的例子,并为每个模式提供完整可运行的示例代码。虽然看起来在书中完整地给出所有示例代码,似乎没什么必要,但个人认为作者的用意是希望读者能动手照示例代码写一遍并运行起来看结果,实践为王,加强学习的效果。

虽然是示例,作者还是坚持以地道的Python风格编写代码,以此说明不同语言不同平台要求软件开发人员学习的设计模式也有所不同。另外,开发人员也能从示例代码中学习到一些Python语言的高级特性,所以把本书当做Python开发进阶书籍也无不可。

本书是个人正式翻译的第一本书。虽然以前翻译过很多文章,有些译文还有点影响,但毕竟与正式出版的有些不同,所以接手本书的翻译工作,我内心是有些忐忑的。我把翻译过程分为以下几个阶段进行:

  1. 大致地预读一遍全书,整体上把握原书内容
  2. 将原书翻译成初稿,此阶段基本保证译文的正确性
  3. 通读审校初稿,此阶段确保译文的流畅性,以及用词和逻辑的一致性
  4. 对着译稿,翻译相关图表中的单词;整理示例代码,并确保运行无误

希望通过这种方式基本保证译稿的质量。但因为个人精力有限能力不足,译稿中可能还是有些疏漏甚至错误之处,敬请原谅,也请将问题反馈给出版社,以便在下一版本中更正。

另外,本书的示例代码已经存到Github的一个代码库(见https://github.com/youngsterxyf/mpdp-code)中,如有需要,可下载。

因个人私事,本书推延了一段时间才得以翻译完成,感谢图灵朱巍老师的体谅。译书是件费时费力的事情,感谢妻子郑荣的体谅和支持,也感谢公司领导贾磊和同事的支持,谢谢!

夏永锋

于上海百度研发中心