模式:概念源自亚历山大的工作
GoF声称从Christopher Alexander(正如他们在书的前言中所说)汲取了其模式灵感,后者在设计领域广泛使用了这个术语。对于Alexander来说,一个模式:总是一种模式语言的元素;有助于深刻的人类感受;并且总是几何形态的。至少有一些GoF的模式在这些要点上失败了,而有几个在所有三个要点上都失败了。尽管“模式”是一个中性的英语单词,但GoF工作的文化和历史根源,加上他们对亚历山大灵感的引用,使它受到其祖先基本标准的评判,并且它不足够好。即使他们知道,并表达了他们知道,他们与亚历山大有所分歧,他们仍然选择使用他创造、研究和普及的术语,我认为他们应该对此负责。 (也就是说,他们都是有价值的熟人;我们失去了约翰·弗利西德斯(John Vlissides),我与理查德·赫尔姆(Richard Helm)和埃里克·伽玛(Eric Gamma)在这个问题的更深层次上有过很好的对话。我的与拉尔夫(Ralph)的讨论则不那么有趣,因为他们只停留在工程水平上。)
历史根源
“词语有其含义。当GoF写书时,亚历山大派对‘模式’这一术语的理解并不被很好地理解(也没有被整个软件界所理解),但他们建立在当时通俗的看法上,这种看法基于三个来源:1.埃里克·伽玛的博士论文;2.拉尔夫·约翰逊的框架工作;3.C++惯用语书籍(你可以在GoF书的6.3节中找到这个)。 (哦,Knuth也是一个影响因素。)我继续向作者挑战,但人们喜欢它,他们喜欢人们喜欢它,所以势头持续下去。”
“几年后(2004年12月2日),GoF的一位成员会写信给我,描述他最终理解亚历山大所要传达的信息的‘啊哈’体验。 这与GoF书的内容根本不同:”
“最终通过漫长而曲折的道路,理解了‘生成模式’和分步增长……主要是通过软件的一些有趣的普遍属性(无标度和小世界性)”
“有时候我有点慢,但最终到达了那里……”
GoF模式解决的是偶然而非本质复杂性问题
人们发现它们有用,这是现代编程语言的指控。这些语言没有适当的结构来表达亚历山大认为是模式特征的破碎对称性,而这种对称性是复杂设计固有的(《秩序的本质》,第187页:“一般来说,简化的新古典主义类型的大对称很少有助于事物的生命,因为在世界上的任何复杂整体中,几乎总是存在着复杂的不对称力量——位置、环境和功能等问题——需要打破对称”;同上,第63-4页:“自然也创造了美丽的结构,这些结构由结构保持变换的重复应用所支配。在这方面,我认为有用的是要注意,我所谓的结构保持变换与物理学中所谓的“对称性破缺”非常密切相关。”)。Java在这方面特别糟糕,但其祖先Smalltalk也是如此。C++具有描述局部对称性破裂的丰富功能,但大多数人实际上并不知道如何使用它们。与亚历山大紧密合作并拥有类似CLOS和Scheme等语言的Richard Gabriel表示,他根本不理解GoF模式,因为像CLOS或Scheme这样设计良好的语言不需要它们。我在很大程度上也是这个阵营中的一员。
设计运动
这背后有很多设计理论,可以追溯到设计运动(塔卡拉(“现代主义之后的设计”,1989年)、诺尔、亚历山大、克罗斯(“设计方法论的发展”,1984年)以及其他20世纪80年代的作者)。令我惊讶的是程序员们对这一文献体系了解甚少,以及在设计运动的明显发现面前,计算机科学思维是如何错误的。我们于1993年创立了模式学科(The Hillside Group最初的7个成员),熟悉这些文献的主要主题。PLoP会议演变出一套与这些基础截然不同的文献体系,更加专注于晦涩的知识,而不是亚历山大所追求的“无名质量”。
习语的起源
我介绍C++程序员使用成语的原因是为了让他们在语言阻碍时进行面向对象编程。现在,我们有更强大的方法,如DCI,大大减少了使用成语的必要性。模式仍然适用于域级别 - 这符合亚历山大的愿景。已经写了一些好的模式语言;例如,Hanmer(《容错软件模式》2007年);Eloranta等人(《设计分布式控制系统》2014年),以及Alexander本人指出满足必要标准的组织模式(Coplien和Harrison,2004年)。
战斗虽败,但工作仍在继续
亚历山大和我(以及Richard Gabriel-阅读他的“软件模式”-以及其他人)对这个术语的早期重定向感到失望,这个术语在被GoF重新定义之前在设计中已经得到很好的确立。是的,因为他们称它们为设计模式,在谈论Gang of Four的《设计模式》一书时它们就是设计模式。在设计理论和架构的更广泛方案中,它们不是:它们只是惯用语。即使作者自己说,这就是它们起初的样子。
有几个努力正在进行,旨在将亚历山大的视野恢复到软件界。ScrumPLoP®社区(
http://scrumplop.org)非常认真地对待模式的所有亚历山大基础。一位老牌的亚历山大同事Greg Bryant曾为CES做过IT工作,他联系了我,告诉我他正在努力将亚历山大的视野重新引入软件领域,我们即将交换笔记。我相信Dick Gabriel也一直有自己的想法,尽管他和我已经有一段时间没有聊天了。与此同时,我继续直接与亚历山大的同事中野浩联系,他将亚历山大的思想(他直接用《道德经》的术语表达)直接与日本文化的相似之处联系起来。这比试图将其塞入西方文化更加契合。这可能解释了一些难以理解我的说法的挫败感-尽管这并不是一个在知识业务中工作的专业人员的借口。
对抱怨者的鼓励
当然,所有这些基础都是已经发表的辩证法和研究成果,任何愿意花时间去研究的人都可以获得。这不是一个轻松的问题,不能被迅速地驳回,就像在这里所做的那样。我花了20年的时间,并且直接接触到了信息来源。我理解对于普通程序员来说深入了解这些东西很困难,但我建议在否定一个经过充分研究的立场之前,多做一些研究,做好功课。这是StackOverflow的事情。