OO编程真的和招聘公司一样重要吗?[关闭]


55

我正在完成我的硕士学位(计算机)并申请工作。我注意到许多公司专门要求了解面向对象。流行的访谈问题涉及继承,多态性,访问器等。

OO真的那么重要吗?我什至接受了C语言编程工作的面试,面试的一半是面向对象的。

在现实世界中,开发实际应用程序时,几乎总是使用面向对象吗?诸如多态性之类的关键功能是否大量使用?

我认为我的问题来自我的弱点之一。尽管我了解OO,但是似乎无法将其大量集成到我的程序中。


3
但是,一切并没有丢失。认识到有问题是纠正问题的第一步:)
吞噬了极乐世界

37
我花了几年的时间才明白为什么OO是一个有用的概念。我可以理解所有的技术部分,但是却找不到任何有用的东西。我想其中很多是来自我用狗扩展哺乳动物扩展动物等愚蠢的例子展示的。打开我的眼睛,是对OO设计模式的了解,尤其是侦听器(又名观察员)和策略模式
Mchl

1
是的。老实说
quant_dev

6
参见ThorbjørnRavn Andersen的回答。要成为一名优秀的程序员,您需要了解模块化和API设计。并非业内的所有程序员都不错,但是大多数人都使用OOP。不幸的是,OOP和非模块化代码以及较差的API的混合使用会导致软件质量较差,并且您会看到很多此类代码在起作用。除非您在空闲时间编写大量代码,否则您可能对“现实生活” OOP不太了解。没关系,您并不孤单。
荷兰Joh

1
是的,他可以。相信我,如果您拥有获得硕士学位后对OOP的理解,那么您可能对OOP一无所知。
deadalnix

Answers:


84

OOP是一种范式,它使您的程序得以扩展而又不会变得无法维护/理解。这一点是学生几乎一无所获的,因为他们所做的小项目最多持续两个星期到两个月。

这短暂的时间不足以使OOP的目标明确,特别是如果项目中的人是初学者。但是坚持一些建模对于大型项目至关重要,我要说的是> 50,000行代码。OOP不是解决此问题的唯一方法,但这是业界使用最广泛的方法。

这就是为什么人们希望您了解OOP的原因。

出于经验,我要补充一点,几乎所有初级程序员在建模和OOP方面都存在严重缺陷。他们中的大多数人都知道如何编写类,从中继承类以及诸如此类的基本知识,但是他们不认为“ OOP”会导致滥用。这就是为什么任何认真的招聘人员都将始终看待您在OOP领域中的能力的原因。

由于这些事情不是在学校学习的,因此不同候选人之间的知识差异非常大。坦白地说:我不认为拥有OOP知识的人可以在任何大型项目中工作,仅仅是因为首席开发人员管理这些人员需要更多时间,而不是自己编写代码。

如果您还不认为“ OOP”,我建议您阅读一些有关它的书籍,并在没有真正大项目的公司中申请;习惯OOP继续为您的雇主做有用的工作(只要他/她给您您的薪水,这对您也将是有用的)。

编辑:哈,我还要补充一点,我已经用C编写了OOP代码,即使它不是C的最常用用法,也可以借助很广的知识来实现​​。您只需要手动构建vtable。

在OOP技术背后,隐藏着一些东西:软件设计。与其他任何语言一样,软件设计对C语言确实很有帮助。许多招聘人员将测试您的软件设计能力,OOP问题对此很有帮助,但是OOP并不是这里要测试的主要内容。这就是为什么即使对于C职位也有这些问题的原因。


2
是的..正如我在之前的评论中所写,我认为我需要从事一个更大的项目才能欣赏OOP :)。
ale

5
您不需要vtables进行OOP。简单地使用O struct并在C中使用可在该结构上运行的函数。
edA-qa mort-ora-y

2
@ edA-qa mort-ora-y结构不会为您提供OOP功能。多态性?淫荡?这对您来说意味着什么?好的,那么,如何在没有vtable的情况下实现虚函数呢?
deadalnix

2
@deadalnix:您以.NET和Java进行多重继承的相同方式实现它们。您应该知道,最初的C ++编译器根本不是编译器,它们是采用C ++代码并将其转换为传递给C编译器的C代码的转换器。Google“ CFront”。
gbjbaanb

3
Java和; NET不会进行多重合并。是的,C ++可在C中自动翻译,但这与是否使用vtable完全无关。实际上,您必须:没有vtable,就无法实现虚拟功能。
deadalnix

38

计算机编程的一个压倒性问题是处理复杂性,现代程序的确确实可能非常复杂,而且这种情况似乎只会增加。

非平凡的计算机程序的软件工程中所做的许多工作都集中在驯服复杂性上,并使其尽可能多地可访问,而无需首先投入学习的生命。

例子:

  • 模块化:通过使用代码模块,可以使程序在概念上更简单,其中每个模块仅对其他模块有所了解(而不是例如允​​许通过鼠标图标绘制路由直接操作网卡缓冲区)。
  • API:它们为API背后的复杂程序提供了简单的用法。当您打开文件时,您不必担心网络共享的处理方式是否不同于USB磁盘。API是相同的。
  • 面向对象。这使您可以重用现有代码,并使其与添加的新代码透明地工作,同时仍隐藏所有潜在的复杂性。

换句话说,如果您想单独或(很可能)与他人一起开发非平凡的软件,则需要掌握许多技巧。


7
我喜欢您在模块化,API和OO之间有所作为。我认为在软件行业,人们普遍认为OO意味着所有这些东西。
荷兰Joh

3
即使知道OO本身并不是硬性要求,但在某些领域(C或Haskell),过程和功能范例就足够了。您仍然需要学习模块化和API设计。
雷诺斯2011年

@Raynos,在C语言中有函数指针,可让您明确地执行OO固有的功能。类似地,Haskell使用模式匹配来显式执行编译器在Java等程序中所做的工作。

@ThorbjornRavnAndersen编写OO风格C和Haskell有点小众。我只是说重用代码可以在过程和功能范例中完成。
雷诺斯2011年

3
@mathepic我并不是说应该写OO haskell(或它是否存在)。我说的是您不需要了解OO。还有其他处理复杂性(FP)的方法
Raynos

14

是的,主要是因为也许用于商业开发的两个最受欢迎的开发平台(Java和.NET)是面向对象的,这意味着是的,OO的使用非常广泛(包括多态性,继承和其他所有功能)。

公司并不特别关注面向对象的技术-这不是意识形态的东西,他们关心的是能够以符合IT战略的方式开发问题解决方案的人员。

但是我不会太担心这个缺点。在不尊重您的学历的情况下,商业世界中的大多数人不会看到程序员(无论任何级别)都从大学毕业。您还有很多东西需要学习,而且可以理解(公司可能比学生更好)。


2
必须召集您“不关心” OO的公司-好的公司关心可重用/可维护的代码库,而OO模式是公认的做到这一点的方法。
HorusKol 2011年

1
@HorusKol-他们做到了,尽管Perl,Cobol和Visual Basic都在商业上取得了成功,而Smalltalk却没有。您是对的公司,例如可维护的代码,但这不是绝对要求,它们会与其他因素一起权衡。
乔恩·霍普金斯

好吧,Cobol在面向对象技术之前就存在了。我无法评论Smalltalk,但我想如果没有捡起它,肯定有问题。
HorusKol 2011年

1
@HorusKol-实际上,Cobol和OO大约在同一时间(50年代后期)出现了,但是即使我们假设OO直到70年代甚至1980年代(您在等待C ++)才真正开始占有一席之地,对于公司来说,这是一个大问题,为什么它直到90年代末才流行(使用Java)。答案是,除了OO之外,还有其他方法可以拥有可维护的代码库—公司关心可维护的代码,但是有多种方法可以使猫变皮,OO不是唯一的解决方案。
乔恩·霍普金斯,

将平台本身称为OO有点奇怪。Clojure不是OO。我猜Scala有一些OO元素,但是最好以功能性方式使用。F#也是一样。用F#编写OO代码只是肮脏的。
萨拉

7

与现实生活中一样,现实生活编程与理论上有所不同。

是的,如果保持OO范式完善,并且始终在您的脑海中,那么您可以更好地编写可管理,可理解且易于扩展的代码。

不幸的是,现实世界有:

  • 项目时间压力
  • 以程序为导向的团队成员
  • 跨地区团队,多个供应商
  • 旧代码没有任何方向
  • 只要能正常工作,就很少在乎代码的编写方式
  • 即使代码不起作用,动机也是要修复它,而不是“ OO”它
  • 模块,平台限制,框架,这些根本不允许您执行良好的面向对象

在实际工作中,您必须处理上述问题。这听起来令人沮丧。但是,请将其视为警告。招聘公司在招聘时过于重视OO。很容易明白为什么。他们测试候选人的唯一方法是询问对OO的理解。不幸的是,许多候选人只是在回答面试前就回答了这些问题。

现实中的OO速度很慢。如果您继续阅读并不断改进它会有所帮助。


6

完成学士学位后,我有完全相同的感觉,而一本很棒的书向我展示了OOP为什么以及如何与现实世界中的应用相关:Head First:设计模式。我真诚地建议您看一看,它以一种非常有趣的方式编写,并提出了许多有效的观点,说明了在使用规模较大且不断变化的系统时为什么需要使用OOP方法。


很高兴我不是唯一的一个!谢谢..我将看那本书:)。
ale

6

即使对于C的某些工作,您可能也需要了解面向对象的设计(并且可能比编译器为您做的更好),最近一系列有关Linux内核中面向对象的设计的文章证明了这一点。(第1 部分第2部分

GTK +还使用了许多面向对象的设计模式。


4

我必须对OO是一切的这一观点表示不同意见-可以说OO允许您构建城市,但是程序程序是障碍。

以类推的形式给出我的回答,将军需要对象,士兵需要程序。一旦在OO中深入研究,就可以找到过程,如果那是您的专业知识并且您足够好,就不用担心OO,因为有人编写此OO象棋游戏代码非常容易:

-findBestMove
-makeBestMove
-waitForPlayerInput

但随后有人必须编写-findBestMove背后的代码,并且可以确保它不仅是这样:

foreach $move (@moves){
    $bestMove = ($move > $bestMove ? $move : $bestMove)
}
return $bestMove

另一方面,如果您不知道如何阅读OO代码,请担心。因为您可以(几乎)确定您的代码将被某种对象弄乱。除非您使用的是我目前维护的12000个全局var和1200行“模块”的fortran传统庞然大物。


4

乔恩·霍普金斯写道:

是的,主要是因为也许用于商业开发的两个最受欢迎的开发平台(Java和.NET)是面向对象的,这意味着是的,OO的使用非常广泛(包括多态性,继承和其他所有功能)。

这几乎是我要说的,但不仅仅是Java和.Net,C ++到处都是,Objective-C遍及OSX,所有很酷的孩子在做Ruby或Python,所有这些以及许多其他东西更多的重点放在面向对象。许多新的语言都是多范式的,因此F#之类的东西主要是一种功能语言,但也支持面向对象。它无处不在,至少有一些了解非常有用。不过不要太担心,刚完成大学课程就意味着您已经准备好开始学习在现实世界中开发代码了:)


3

我已经进行了很长时间的编程,并且我发现OO的概念即使在C语言中进行编程时也很有用-即使经过测试,我也可能无法在每个微小的细节中描述这些概念。有时候,我什至创建了一种OO语言,尽管是最基本的一种语言,但我还是想着这个概念,并从一个新的角度寻找OO中的乐趣。

顺便说一句,C ++使得OO变得一团糟,而Objective C做到了。

关于采访,从桌子两边看,它们已经成为恐怖节目。大多数受访者对他们感到非常震惊。大多数招聘经理都对甚至没有通过基本的编程测试而失败的人数感到惊讶。

就是说,目前在软件行业中有一些巨大的冲洗袋,他们一无所知,但对潜在员工的期望却很高。


C ++是一种多范式语言,但是可以很好地处理OO。
日航

1
我想说C ++可以使您产生巨大的丑陋混乱。如果做得正确,它的美就在于它的简单。
马丁·约克

跳过基础知识总是会带来很多麻烦。C ++具有大量您需要了解的基础知识。这就是为什么可以将C ++用于大型程序的原因。这是有必要的。
tp1 2012年

@Ponk:顺便说一句,C ++使OO变得一团糟,而Objective C做到了。-我还没有尝试过Objective C,所以我没有理由怀疑您,但是在哪里可以找到更全面,更令人信服的论点呢?
Jim G. 2012年

3

学习OOP不如学习软件开发有用。去阅读Code Complete 2

当然这是一个非常有用的工具,但OOP本身是真的很小。通常,当公司和招聘人员说“ OOP”时,它们的意思是“软件开发”。它被用作通用术语。

真正的招聘人员会告诉您知道如何开发软件与匹配“在OOP中已有3年”复选框的区别。


是的,在这种情况下,OOP就像GUI,就像“您需要5年的GUI经验才能担任此角色”一样。
gbjbaanb

1

正如其他几个人指出的那样,答案是肯定的。

但是,如果您要处理大量非OO程序的意大利面条代码,也可以在那里找到。我认为您将更喜欢OO工作。

编辑:原谅我关于枪手的犬儒主义和幽默感的案例。正如Raynos所说,仅仅因为OO并不意味着它是好的。OO的正确应用需要实际的工作和思考;仅拥有它的实例并不能自动意味着一个应用程序制作精良。相反,我确信那里有编写良好的程序代码。我在90年代和2000年代的企业IT商店中的经验是,编写了很多不良代码,并且可能仍然存在。但是更接近OP的问题,我注意到,有机会的时候,更聪明的开发人员正在转向更多的OO系统。


3
-1表示非OO代码是意大利面条。那个OO用黑魔法做成了很好的“不是意大利面”。
雷诺斯2011年

@Raynos这是一个公平的观点。仅仅因为不使用OO并不意味着它是不好的。我会编辑。
Bernard Dy

它不仅是程序还是程序/ OOP,还有功能范例。
可替代

我曾经在不可维护的OO应用程序上工作过,这些应用程序中的对象像纸屑一样分散在周围。OOP不是魔术子弹,它只是组织代码的更明确的方式。
gbjbaanb

2
是的,是的,是一千次!请查看编辑。我的评论确实比我对过程或OO的特别冷落更能使我感到高兴,因为我有幸享受到许多糟糕的遗留代码实例。但是,如果我有选择的话,我宁愿使用精心设计的OO系统,也不愿使用精心设计的程序系统。以及经过精心设计的系统(每天设计不佳)。
Bernard Dy

1

OO是构建其他技术的基础。关键是首先要完全了解类型(类)和该类型的实例之间的区别。不要在没有完全理解的情况下继续阅读(以后会明白这一点),因为一旦您了解了愿景,您将不得不重新阅读其余内容。

一旦掌握了它,就永远不会想要没有它。在封装,模式,框架或其他方面,我不是一个纯粹主义者。在工作中,您必须适应各种视图和概念。我将列出一些我自己以前的工作经验:

在一家公司中,我的同龄人希望尽可能多地延迟加载(空构造函数,笨重的属性,这些属性必须在所有地方检查空值)。他们正在构建寿命短的基于Web的服务器端对象。

下一份工作完全相反。对象驻留在桌面(基于Excel)的应用程序中。尽可能多的初始化应该在构造函数中(或许多构造函数重载之一)。空的构造函数是不允许的,因为空的对象没有生存权(这使持久性成为一个挑战)。另外,我不得不适应他们的“编码样式标准”(在其中打开括号,在注释后添加空格等),因为如果没有通过样式警察,则无法检入我的代码。

目前,我在一家公司中工作,那里的开发人员都从未尝试了解OO。很难表达出这种情况多么令人沮丧。我必须提高我的Grep技能,实际上,我已经为我的F12键分配了HotScripts宏,以便对所选文本进行grep。我会避免其他挫败感...

一旦您获得了面向对象的技能,您几乎会对意大利面过敏!但是,在所有情况下,无论是否为OO,都要耐心并适应。不愿“扔掉并重新开始”。当您抛出问题时,老板会宁愿选择您。不幸的是,“赚钱”比优雅的代码更重要。

抱歉,答案很长,但我尝试涵盖您问题的大部分范围:-)


非常感谢您的故事..我很喜欢阅读它们!目前,我正在从事C ++项目,并且正在利用这个机会来思考我可以使用OO技术的可能方式。目前进展顺利:)。+1为您解答。谢谢。
ale

1

OOP并不重要,因为它本身,而是因为它需要什么。涉及抽象和隔离能力的事物,将事物组合在一起最终只暴露了需要一起交互的部分。

这是一种称为“模块化”的通用工程技术,它允许将复杂的系统创建为较简单的系统的集合,而无需在较高层次上关注每个细节,并且即使组件不能完全相同,也要求它们是可替换的。相同。

从软件产品本身变得比“单一开发人员功能”更大的时间开始,就尝试将这些“工程概念”保留在软件开发中,因此需要一种方法来使开发人员在独立的部分上工作,并让这些部分一起互动。

也就是说,这些原理不一定仅在OOP中找到(它的计算理论是有效的,得出这些结果的方法是无限的)。

OOP是简单的一次成功尝试把这些东西放在一起,让那些一般条款(如模块,封装,替换)更精确的定义和精心构思的这些定义(模式),能够适应编程语言。

首先,对OOP而言,不是将其视为“ 语言功能 ”,而是将其视为使软件工程师着手进行软件设计的“ 通用词典 ”。

给定语言是否具有直接执行该词典的原语,以确保(例如)不由不应该这样做的人无意中打开“胶囊”这一事实是OOP设计的第二个方面。这就是为什么即使大型C项目也经常作为OOP“管理”的原因,即使语言本身没有对此提供直接支持。

直到项目规模成为单一开发人员了解和跟踪他所做的事情的能力(事实上,在那种情况下,它甚至可能被视为“开销”)或由一小群人在开发中进行开发,才能认识到所有这些优势。短时间。这就是大三学生根据“语言功能”研究OOP的主要原因,常常会误解它,从而产生错误的设计代码。

OOP如何适应语言取决于语言设计者如何在自己的构造中解释OOP原理。

因此,C ++中的“封装”成为“私有成员”(“胶囊”成为类),“替代”成为虚函数的重写或模板参数化/专业化等,而在D中,胶囊是“模块”(并且替换通过类等),从而使某些范例或模式可以直接在给定语言中使用,而不能在另一种语言中使用,依此类推。

招聘人员在提出OOP问题时寻求的只是检查您抽象和构思未来大型项目和开发的软件设计的能力。OOP,因为他们只是他们和您都知道的“字典”,所以您可以谈论其他更一般的事情或具体化为特定的实现。


0

面向对象的语言可以帮助您在代码中保留面向对象的设计,这很好。但是,也可以使用任何其他范式语言来获得这种设计,这也是事实:OO语言(尤其是在公司中)流行的原因很可能是Java和c#在商业上的成功。

如果盖茨先生以正确的方式创立他的公司,我们可能会在申请工作之前先学习SCHEME。


Scheme与Microsoft出现在同一年(尽管在此之前肯定还有其他LISP)。同样,Java和C#的成功很大程度上要归功于Alan Kay,尤其是Smalltalk和Simula,以及C ++的成功。
JasonTrue 2011年

0

简短的回答是

较长的版本,为什么您感到困惑或为何感到困惑,这仅是因为您尚未从事任何可达到某些目的的项目或实现的事实。它在教室中完全有效,可以在汽车上有示例,然后扩展到汽车,卡车...,但是当您跳入软件开发时,它的解决方案旨在简化某些任务。现在,如果不是这样,OO我们将让每个人都在代码库中编写类似的代码,或者每天重新发明轮子。想象一下,如果深入研究这样的代码库来修复某些问题,那将会是多么混乱。课堂上的例子是模糊的定义或表示方式/原因。当您开始构建应用程序时,真正的测试已经结束,毫无疑问,它可能会被广泛使用,但由于其简洁明了的使用方式,它远远无法衡量其合理性。因此,最好在这些薄弱的地方开始工作,除非您制作出噩梦代码。


0

这取决于。您需要了解OO的原因之一,因为它是编程领域的通用语言。另一个答案指出,几乎每种主要语言在某种程度上都是面向对象的,这意味着基本上任何可能雇用您的公司都在使用面向对象的语言。是否曾经尝试雇用OCaml程序员?不可能; 人才库太小。如果您使用OCaml成立了公司,并且公司成功了,那么您将无法足够快地聘请程序员,这将使您倒闭。因此,几乎每个拥有超过3个程序员的公司都使用OO语言,并且为了与您的同事进行交流并使用平台的库,您需要了解OO。

根据公司所使用的特定语言,继承和多态性要么非常重要,要么只是适度相关。如果不使用10种GoF设计模式和一个依赖项注入框架,您将无法在Java中做任何事情。Java是使用最广泛的语言之一,因此面向对象原则对于许多使用Java的公司来说确实很重要。

如果公司正在使用具有lambda和函数指针的现代混合OO /功能语言(例如Scala或C#),那么继承突然变得不那么重要了,因为您具有更高阶的函数来处理很多非常简单的事情,否则它们将需要很多仪式。但是,您仍然需要能够使用OO东西,因为您使用的大多数库都是以OO方式编写的。

如果继承和多态是不是重要的公司,你还是有可能得到OO问题,因为:

  • 您正在接受人力资源人员的面试,该人员对编程一无所知,并且正在核对清单中的问题。您是否拥有3年的X,您是否执行过多项任务等?
  • 您正在接受一位工程师的采访,该工程师想确保您没有生活在一块石头下。OO是通用语言,因此您会被问到一些粗略的问题。
  • 您是由一位不太擅长采访的工程师采访的。通常,工程师喜欢琐事和复杂性,因此,您会遇到很多有关多态性,继承和GoF设计模式的问题,仅是因为这些内容对面试的人很有趣。

为什么要下票?
2012年

-1

一句话“是”。

您可能认为您了解该理论,但是您需要编写一些代码并将其付诸实践。在线上有成千上万个示例和练习。

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.