期望资深开发人员知道什么是OOP设计模式是否合理?[关闭]


26

我正在为高级发展职位的工作面试准备问题。这项工作将包括面向对象的设计,而现有的软件使用设计模式,所以我想请应聘者解释一些他们知道的设计模式,他们已经使用过,如何使用它们,为什么使用了它们用过它们等等。但是,在之前的采访中,当我问具有至少5-10年经验的高级开发人员有关设计模式时,几乎没有人听说过它们。我认为二十个开发人员中就有两个可以命名一个设计模式(分别为Singleton和MVC)。

所以我的问题是:问这些问题有意义吗?还是这是一个晦涩的主题,以至于您不能期望新员工已经了解他们?

高级开发人员是否应该具有设计模式方面的经验,或者您说设计模式是一个简单的主题,每个体面的开发人员都可以在培训期间掌握它们?如果是这样,您会问什么问题来衡量其设计能力?

添加 在阅读了到目前为止的答案之后,我应该做出一些澄清:

  • 该工作是针对具有OOP / OOD经验的.NET开发人员的。
  • 现有代码在许多地方都使用类名,例如IParameterGraphVisitorIStorageFactory
  • 如果他们没有词汇来解释他们的设计,您如何询问人们过去使用OO设计的经历?这就是我想要做的,而我所能想到的就是“请在白板上绘制上一个项目的设计/对象层次结构”。

27
模式是暂时的伪像;也就是说,它们通过良好的设计出现。它们不是“二手”的。名称是“ pattern”而不是“ constraint”或“ requirement”的原因是有原因的。那么,您想要具有OO设计经验的人,还是具有设计模式经验的人?前者比流行语更可能了解更多信息。
Michael K

6
@迈克尔:同意。知道名称和使用模式之间有区别。我对OO有所了解,但是如果您要求我命名一些模式并描述它们,我将做得不好。我并不特别在乎行业决定如何称呼它,但是我敢打赌我实际上已经实现了您期望列出的大多数模式。
unholysampler 2011年

15
@Michael:我一直把设计模式看作是一种交流帮助。用“这是一个树访问者”代替“这是一个抽象接口,该接口将传递给将遍历树并通过该接口调用方法的函数,这样我就可以将遍历树的代码与做实际的工作”。但是,如果您知道在面试中评估设计技能的更好方法,请回答问题!这就是我想要的。
尼基,

3
也许更好的方法是问他们如何解决特定问题。我曾经不记得所有设计模式的名称,但是我知道如何应用和使用它们。正如@Michael所说,有经验和知道流行语是两回事。
泰安娜(Tyanna)2011年

4
实际上,了解设计模式实际上可能是负面的。一些建筑宇航员只会谈论设计模式,并且会大力应用它们,无论它们是否有意义。
威廉·皮特里

Answers:


67

他们很可能认识他们。他们可能只是不知道它们是“设计模式”。也就是说,他们可能不熟悉此类事情的学术术语。您认为“状态机”可能只是年长,经验丰富的程序员解决问题的常识。例如,我从来没有非常关注“设计模式”,但是当我知道状态机是什么时,我不得不笑了,因为我已经做了多年了。谁知道我是这样一个学者?我一直只是将其视为基本的编码技能,而不是“设计模式”。

重点并不是假设您的经验丰富的开发人员知道有关事物的教科书术语。相反,问他们如何构造类或如何处理任务。


2
+1在“四人帮”问世之前的一段时间里,我一直在使用这些结构,所以我总是很难记住它们的名字。
Dietbuddha

10
我认为,模式文献对这种事情相当明确-模式并非旨在代替设计,而是旨在帮助交流设计。(我想说,就设计交流有助于自己设计,但我想那是另一
回事

5
+1。这一直在我身上发生。不久前,我阅读了有关“依赖注入”的Wiki文章,以了解为什么它如此流行,只是发现这是我使用了多年的技术,但从未给它起过名字。与“状态机”相同。
whatsisname 2011年

4
那么,对于高级开发人员来说,要遵循该领域的现状并采用广泛使用的术语,这不是一个合理的期望吗?模式已经存在了超过15年到现在,所以你很难甚至称他们为“新”了...
彼得Török

2
设计模式的重点是为软件开发人员提供一种共同的语言,让他们彼此讨论解决重复出现的问题的方法。这就是学习设计模式的重点。IMO,这表明他们对专业的绝对缺乏,他们甚至不愿意学习过去17年一直在OO Software开发的最前沿的东西。对于任何不能命名和理解一些基本模式的人,我当然都会有所保留。他们不是在担心因为不知道名字而无法理解人们的对话吗?
邓肯

25

对于高级OO开发人员,您的期望是非常合理的。任何自称不了解“设计模式”的人都只是证明过去的岁月并不会自动带来经验:-(当然,有很多开发人员在该领域花费了数年甚至数十年的时间,却从未听说过设计模式-仅表明他们对学习新想法,自我完善和采用最佳实践不感兴趣。

高级开发人员是否应该具有设计模式方面的经验,或者您说设计模式是一个简单的主题,每个体面的开发人员都可以在培训期间掌握它们?

IMO的经验非常重要。从理论上讲,一个体面的开发人员可以在一本书中甚至在Wikipedia上阅读“设计模式”,并在15分钟内理解基本概念。但是,正确应用这些概念需要来之不易的经验。很容易迷恋模式,试图将它们塞入每一个可能的代码中。也很容易驳斥他们说“模式不是万能的,只是使用可能可行的最简单的方法”。通过学习何时以及如何使用模式来解决实际问题以及何时不使用模式来找到两个极端之间的中间立场,需要多年的经验

您会问什么问题来衡量他们的设计能力?

与上述内容相一致,我只将这些问题添加到您的列表中:

  • 设计模式(通常以及它们明确提到的模式)有哪些缺点?
  • 什么时候使用它们,为什么?

更新资料

@GrandmasterB的优点是,某些开发人员可能在使用特定设计模式时不知道其名称。从某种意义上说,他是对的,因为这是一个术语/交流问题。但是,另一方面,它确实是一个术语/交流问题:-)也就是说,设计模式的主要好处之一是为开发人员提供了通用词汇,极大地改善了交流。(尝试在不使用单词本身或其同义词“ wrapper”等的情况下解释Adapter的基本概念!)因此,无论候选人是多么有才华和知识渊博的人,在不知道广泛接受的术语的情况下,他都会引入沟通问题在您的团队中。


2
我不知道该怎么大致如此,这是,但我也想说,使用设计模式可以引入通信问题。例如,当您正在做的事情类似于众所周知的模式,但又不完全一样时,则对现有模式的了解可能会掩盖您的局部差异。或者,当您团队中的开发人员不完全了解该模式时,他们可能会以一种特殊的方式使用该模式名称。
艾丹·库利(Aidan Cully)

1
@Aidan,好的观点,尽管对我来说这是滥用模式。这是经验和实践必不可少的另一种方式,即区分相同模式的变体与两种不同模式的变体。
彼得Török

1
+1,任何自称为高级.NET开发人员的人都应该能够至少命名几个显式模式名称及其用法。如果没有其他问题,那就是沟通和工具箱的问题。
techphoria414

我已经阅读了3次,但仍然无法确定第一段是否很讽刺
Briddums

@briddums,是什么让您觉得这很讽刺?
彼得Török

10

一个资深的开发者?绝对是 大三。我15岁,对这个主题没有正规的教育,甚至我也理解他们。期望他们认识他们不仅是合理的,否则他们将无法接受。假设他们很了解面向对象编程的知识。


14
公平起见。OO只是成为您一生中最主要的方法之一。在Java 成为大学使用语言之前,有很多人获得了学位。有很多人不生活在OO世界中。
unholysampler 2011年

2
@unholysampler:当然,但是我认为这是一个面向对象的职位,正在谈论
Anto

1
@unholysampler:我希望我当时住着。.我忍受不了什么,除了uni <_ <Java

10

在面试中,您应该问什么对求职者来说才是关键。

如果他们必须知道模式的名称,就像他们来自“四人帮”一样,那么这是一个有效的要求。

另一方面,如果您希望他们显示有关程序体系结构的适当工作知识,那么我认为您最好给他们一个问题,并询问他们如何构造代码。如果他们为您提供适当的模式解决方案,那么您将证明他们知道它,无论使用什么名称。

每当我面试高级职位时,他们往往比“问答”更为“实用”。我想清楚地展示编程技巧和舒适度。我还希望有一个牢固的CS概念基础,这意味着如何应用诸如封装,算法,耦合/内聚性等概念的更通用技能。具有多种语言和范例的经验和熟悉度。


4

取决于他们的专业知识领域。我不希望嵌入式C开发人员对设计模式有所了解。如果我们正在谈论Java或.NET开发人员,则他们应该熟悉设计模式,尤其是如何不被它们所困扰。


2
+1表示对设计模式的
了解不大

好点子。对问题进行了澄清。适用于.NET开发人员,至少具有OO编程语言的项目经验。
nikie 2011年

4

假设您正在寻求OOP的资历,答案肯定是肯定的。设计模式是OOP语言的词典。

此外,如今,拥有10年经验的体面的OOP程序员不能命名设计模式,因为在标准API,库和开发框架中广泛采用的设计模式已经变得不合理。

多年以来,我一直在面试中问这个问题,当候选人未就该主题提供满意的答案时,这是一个热门。


3

是的,但是您应该通过询问设计问题而不是要求人们枚举他们所听说的设计模式来引起他们的理解。我对PoEAA,GoF甚至某些功能编程模式中描述的模式非常满意,而且我仍然不认为您会要求我命名一些模式来了解更多有关解决问题的方法。

遇到诸如“为我设计一个文本编辑器”之类的问题,并提出诸如“如何支持嵌入式对象(如图像?粗体和斜体?撤消?”)之类的问题。您可能最终会听到足够多的声音,甚至通过简短的交谈就可以识别出命令模式,复合模式,记忆模式以及其他一些模式。

发现了设计模式,然后对其进行了描述,以便我们拥有一种共同的语言来传达设计决策。

不幸的是,我为某个必须为每种设计模式的使用进行解释和辩解的人工作,不是因为尽职调查,而是因为他根本不了解它们。不好玩 但是,大多数认真的开发人员是偶然地或设计地了解了最常用的OO模式的名称,如果没有别的,大多数企业应用程序开发人员都应该精打细算,至少对最常见的PoEAA模式有所了解。


3

合理。肯定地。必要。没有

我问潜在的候选人是否知道设计模式。它只是要衡量的几个标准之一。不要忽视整体情况。

是的,毫无疑问,许多开发人员在不知不觉中使用了某些设计模式。

这就是为什么我问这个问题。

重要的是要知道我可以与另一名开发人员快速有效地沟通。我不想在白板上花20分钟解释状态机,而只是发现他们“以前曾使用过它,却从不知道该怎么称呼”。这没有生产力。

它们还有助于重构过程。浏览代码可能会偶然地实现某种形式的工厂模式,但是GoF工厂模式经受了时间的考验。这就是为什么它工厂模式而不是另一个fp的原因(最好不要重新发明轮子,软件上的Joel在这样做时有很多缺点)。

使用并认识到设计模式的重要性的团队可以提高沟通和生产率。如果您的团队作为一个整体不使用dp,那么他们将失去相关性。


2

从我自己的经验来看,我很长一段时间都忽略了设计模式。我知道它们的存在,但我从未读过它们。一旦我终于忍受了硬伤,我意识到我一直在使用设计模式,但是我只是没有意识到,或者我不知道我的设计解决方案实际上有一个通用名称。

我将更倾向于提出一系列问题,其中特定的设计模式非常适合该解决方案,并看到开发人员提出了与该模式类似的东西。如果可以,那就太好了。我可能更倾向于雇用一个在不知情的情况下使用设计模式的开发人员,因为我看到许多拥有设计模式知识的开发人员试图在不合适的情况下尝试将其适合某个模式的解决方案,而不是通过实现特定的模式来解决该问题。问题好。


2

我认为一个更好的问题是:给定模式的名称和模式的描述,例如《四人帮》一书中的“工厂模式”,候选人应该能够提出一种模式将是合理的方法。


1

有5-10年经验的开发人员,还有高级开发人员。他们根本不是一回事。是的,如果您正在招聘高级职位,并且希望人们知道并使用设计模式,那么我不会雇用不熟悉设计模式的高级职位。这就像雇用不了解左联接的数据库专家。对于真正的高级开发人员来说,这是非常基本的东西。我可能会雇用一个初级人员。


1

是的,确实的,他们应该熟悉该术语,甚至应该能够列举一些模式-但不要犯将理论知识与经验相混淆的错误。

有很多人在面试前都会梳理一下设计模式,并通过简短的描述使它们振作起来-但这仅仅是理论。这是一个真正的高级开发人员,可以发现何时使用一个,或者不使用正式模式的知识就能以经典的设计模式解决问题。

最好的检查方法是让他们在您面前设计一些东西并提出探索性问题。高级开发人员是可以在抽象级别自然思考的人。这些是“创建”设计模式的人。

就像Peopleware上的课程一样,它谈论雇用杂耍演员而不要求他们变戏法-只是因为他们说他们可以做的并不多。


您能举个例子吗?我能提出的所有设计示例都很简单,以至于不需要有趣的设计,或者如此构造,以至于很难理解为什么一个解决方案比另一个解决方案更好,或者如此复杂,无法在面试中解决。
nikie 2011年

它到底有什么关系并不重要,它可以像“为我设计抛硬币游戏”那样简单。等待看看他们如何处理它。然后添加一个需求以探索您感兴趣的内容,例如:如何更改它以使其可测试?便携式| 用作服务| 可用于不同的UI 在网络上运行...等等
Stephen Bailey

0

如前所述,我也相信,如果他们不记得那些流行词,那就可以了。但是,由于这是一个高级职位,他们应该知道何时应用最佳方式解决问题的模式,而不是使用最差的解决方案。因此,给他们一个应使用模式解决的问题(例如,如何在不对类进行硬编码的情况下创建对象,如何在不了解对象实现细节的情况下访问对象的元素等),并了解如何他们会攻击它。


0

绝对,他们应该知道模式,但不一定要知道流行语。

例如,MVC具有许多非常相似的替代方案,例如3层PAC。几年前,MVC另一个流行的流行词是“ Model 2”。我实际上认识到非常优秀的开发人员,他们非常了解该模式,但不知道当前流行语是MVC。


0

很简单:如果您正在使用它们,则需要询问您的候选人。如果他们确实知道模式,那么应该加上一些加分;但不知道不一定要禁止他们,尤其是如果他们显示出良好的OOD技能时。与从事设计工作的开发人员相比,从事维护项目的开发人员不太可能了解设计模式。这也取决于他们是否在大学里教过设计模式。根据我的经验,他们不太可能会这样做。大多数大学和私立课程都教你面向对象但不能面向对象。他们学习DP的机会更少。

我个人还没有学习过DP,直到我的项目也需要我。即使那样,我仍然发现我使用了一些模式,至少没有以本书中描述的确切方式使用过类似的方式。令我惊讶的是,他们被编纂了。因此,如果他们不了解DP,请寻求良好的设计技能。如果他们了解DP,则可能是他们设计精良,但仍在对其进行测试。他们可能只是有些关于DP的流行语,或者是从一些内部人士那里发现的,只是研究了一些没有应用它们的模式。


0

您可以期望与您一起申请工作的人知道(或学习)您工作岗位中需要的东西,无论他们是否符合行业标准。否则,您会谴责自己平庸。但是要小心,如果不是真的需要一些知识(或技能)成为一项工作要求。

假设您有两个背景大致相似的候选人,一个可以告诉您设计模式,而另一个则不能。这将告诉您他们在工作中的表现如何?

您说现有软件使用设计模式。这是优势吗?如果是这样,怎么办?您的目标是编写新软件符合现有模式,还是引入新模式?为什么?


0

我可以想到一个在以下情况下不了解设计模式的高级开发人员:

  1. 关于设计模式只有本书。首先是使它们流行的书。如果此人没有读过这本书,则可能是他们对设计模式一无所知,或者可能听说过它们,但没有正确地了解它们的用途。
  2. 相反,他们必须知道一些类似uml的知识。
  3. 从互联网上找到有关设计模式的良好信息并不容易。如果您访问了具有良好的设计模式知识的正确网页,那么您将非常幸运。1995年以后仅仅进入软件可能会使人们不了解设计模式书,因为该书很老。

-2

为什么非OO环境中的任何开发人员都应该了解OO设计模式?我曾在仅从事Cobol,仅PL / SQL,仅Progress 4GL等工作的商店工作过。模式。

能够无意识地引用模式目录也不会使您成为一名优秀的开发人员(实际上,根据我的经验,它会产生一些我见过的最糟糕的代码)。但这就是您期望成为“高级开发人员”的标志。我已经在该行业工作了15年,但请不要画一个模式图。我从来没有花太多时间,我不需要。我已经获得了足够的经验,可以在不使用特定名称的情况下找到可行的方法,并且如果需要正式定义,我知道可以在哪里查找(是的,我的个人图书馆中确实有参考书)。那是经验丰富的开发人员的标志,而不是从填入一些教科书中获得的死记硬背的知识。


2
我认为这个问题无关紧要。我不会在Cobol开发人员职位上面试,也绝对不会要求人们“无心地引用死记硬背的知识”。您唯一的观点似乎是不了解设计模式。
尼基,

unix / linux是用C语言编写的,充满了OO模式,在gof书中还有很多。
ctrl-alt-delor

2
“我已经积累了足够的经验,可以找到有效的方法,而无需为其指定具体的名称。” 设计模式的部分价值是名称。因此,您可以说“让我们使用Factory模式”,您的同事会立即知道您的意思。如果你们俩都知道如何做这种事情,但是你们俩都没有名字,那么您必须花更多的时间来解释对方,然后说“哦,那是什么”。再说一次,如果代码包含WidgetFactory,那么知道Factory模式的人就会明白这是做什么的。
内森·朗

我同意内森。设计模式的重点是为通用解决方案起一个名字。人们很少会自己想到一些设计模式。好处是分配了一个公认的名称,这样您就可以与其他开发人员进行交流,而无需深入探讨。因此,您认为不需要使用模式来命名便是因为您已经在使用它们,这与您所说的交流并不重要有关。尝试进行面试,并说“沟通不重要”,然后看看您能获得多少工作。
邓肯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.