Ich beende gerade mein Masterstudium (in Informatik) und bewerbe mich um eine Stelle. Ich habe bemerkt, dass viele Unternehmen speziell nach einem Verständnis der Objektorientierung fragen. Beliebte Interviewfragen betreffen Vererbung, Polymorphismus, Zugriffsmethoden usw.
Ist OO wirklich so wichtig? Ich hatte sogar ein Interview für einen Programmierjob in C und die Hälfte des Interviews war OO.
Wird in der realen Welt bei der Entwicklung realer Anwendungen fast immer die Objektorientierung verwendet? Werden Schlüsselmerkmale wie Polymorphismus VIEL verwendet?
Ich denke, meine Frage kommt von einer meiner Schwächen. Obwohl ich OO kenne, scheint es mir nicht möglich zu sein, es in meine Programme zu integrieren.
Antworten:
OOP ist ein Paradigma, mit dem Ihr Programm wachsen kann, ohne dass es unmöglich wird, es zu pflegen / zu verstehen. Dies ist ein Punkt, den Studierende so gut wie nie bekommen, weil sie nur kleine Projekte mit einer Dauer von zwei Wochen bis maximal zwei Monaten durchführen.
Dieser kurze Zeitraum reicht nicht aus, um das Ziel von OOP klar zu machen, insbesondere wenn die Leute am Projekt Anfänger sind. Für große Projekte ist es jedoch entscheidend, sich an die Modellierung zu halten. Ich würde sagen,> 50.000 Codezeilen. OOP ist nicht die einzige Lösung dafür, aber die branchenweit am weitesten verbreitete.
Aus diesem Grund möchten die Leute, dass Sie OOP kennen.
Ich möchte aus Erfahrung hinzufügen, dass fast alle Nachwuchsprogrammierer ernsthafte Mängel in der Modellierung und in der OOP haben. Die meisten von ihnen wissen, wie man Klassen schreibt, von ihnen erbt und solche grundlegenden Dinge, aber sie denken nicht in "OOP" und missbrauchen es am Ende. Aus diesem Grund wird jeder ernsthafte Personalvermittler immer nach Ihren Kompetenzen im OOP-Bereich suchen.
Da diese Dinge in der Schule nicht gelernt werden, gibt es einfach eine enorme Variation des Wissens zwischen verschiedenen Kandidaten. Und seien wir ehrlich: Ich glaube nicht, dass jemand mit schlechten OOP-Kenntnissen an einem großen Projekt arbeiten könnte, nur weil Lead-Entwickler mehr Zeit benötigen, um diese Leute zu verwalten, als nur den Code selbst zu schreiben.
Wenn Sie noch nicht an "OOP" denken, empfehle ich Ihnen, einige Bücher darüber zu lesen und sich in Unternehmen zu bewerben, die keine wirklich großen Projekte haben. sich daran zu gewöhnen, dass OOP weiterhin nützliche Arbeit für Ihren Arbeitgeber leistet (und solange er / sie Ihnen Ihr Gehalt gibt, ist dies auch für Sie nützlich).
EDIT: ha, und ich würde hinzufügen, dass ich bereits OOP-Code in C geschrieben habe, auch wenn es nicht die häufigste Verwendung von C ist, ist dies mit soliden Kenntnissen möglich. Sie müssen nur vtables manuell erstellen.
Und hinter der OOP-Technik verbirgt sich etwas: Software-Design. Software-Design ist sehr hilfreich, in C wie in allen anderen Sprachen. Viele Personalvermittler werden Ihre Software-Design-Kompetenzen testen, und die OOP-Frage ist gut dafür, aber OOP ist nicht die Hauptsache, die hier getestet wird. Aus diesem Grund haben Sie diese Fragen auch für einen C-Job.
quelle
struct
und Funktionen, die an dieser Struktur in C arbeiten, ist OOP.Das überwältigende Problem bei der Computerprogrammierung ist der Umgang mit Komplexität, und moderne Programme können in der Tat sehr komplex sein, und dies scheint nur zuzunehmen.
Ein Großteil der Arbeit im Bereich der Softwareentwicklung für nicht triviale Computerprogramme konzentriert sich darauf, die Komplexität zu beherrschen und sie möglichst vielen zugänglich zu machen, ohne zuvor ein Leben lang zu lernen.
Beispiele:
Mit anderen Worten, viele Tricks zu kennen, ist notwendig, wenn Sie an nicht-trivialen Software-Teilen arbeiten möchten, entweder alleine oder (höchstwahrscheinlich) mit anderen.
quelle
Ja, vor allem, weil die beiden beliebtesten Entwicklungsplattformen, die in der kommerziellen Entwicklung verwendet werden (Java und .NET), möglicherweise objektorientiert sind und dies bedeutet, dass OO häufig verwendet wird (einschließlich Polymorphismus, Vererbung und allem anderen).
Unternehmen interessieren sich nicht speziell für die Objektorientierung als Technologie - dies ist keine ideologische Angelegenheit, sondern für Menschen, die Lösungen für ihre Probleme auf eine Weise entwickeln können, die mit ihrer IT-Strategie in Einklang steht.
Aber ich würde mir keine Sorgen machen, dass es eine Schwäche ist. Ohne Ihre Ausbildung zu missachten, sehen die meisten Menschen in der Geschäftswelt Programmierer, die die Universität verlassen (egal auf welchem Niveau), nicht als fertigen Artikel an. Sie haben noch viel zu lernen und das wird verstanden (wahrscheinlich besser von den Unternehmen als von den Studenten).
quelle
Wie im wirklichen Leben unterscheidet sich die Programmierung im wirklichen Leben von der Theorie.
Ja, wenn Sie das OO-Paradigma stets im Hinterkopf behalten, können Sie besser verwaltbaren, verständlichen und leicht erweiterbaren Code schreiben.
Leider hat die reale Welt dies:
In einem echten Job muss man sich mit den oben genannten Themen beschäftigen. Das klingt demoralisierend. Aber behandeln Sie dies als Heads-up. Bei der Einstellung von Unternehmen wird zu viel Wert auf OO gelegt. Es ist leicht zu verstehen, warum. Die einzige Möglichkeit, den Kandidaten zu testen, besteht darin, nach dem Verständnis von OO zu fragen. Und leider werden diese Fragen von vielen Kandidaten aufgearbeitet, bevor sie zu einem Vorstellungsgespräch erscheinen.
Real-Life-OO kommt langsam. Es hilft, wenn Sie weiterlesen und im Laufe der Zeit verbessern.
quelle
Ich hatte nach Abschluss meines Bachelor-Studiums das gleiche Gefühl und ein großartiges Buch, das mir zeigte, warum und wie wichtig OOP für reale Anwendungen ist, ist Head First: Design Patterns . Ich empfehle Ihnen aufrichtig, einen kurzen Blick darauf zu werfen. Es macht wirklich Spaß und es gibt viele gute Gründe, warum ein OOP-Ansatz wünschenswert ist, wenn Sie mit größeren, sich ständig ändernden Systemen arbeiten.
quelle
Selbst für einige Jobs in C müssen Sie möglicherweise objektorientiertes Design kennen (und wahrscheinlich besser darin sein, als wenn Ihr Compiler dies für Sie getan hätte), wie eine kürzlich erschienene Artikelserie über objektorientiertes Design im Linux-Kernel belegt. ( Teil 1 , Teil 2 )
GTK + verwendet auch viele objektorientierte Entwurfsmuster.
quelle
Ich muss eine gewisse Meinungsverschiedenheit darüber zum Ausdruck bringen, dass OO alles ist - man könnte sagen, dass OO Ihnen erlaubt, Städte zu bauen, aber Verfahrensprogramme sind die Bausteine.
Um meine Antwort in Form einer Analogie zu geben, braucht ein General Gegenstände, der Soldat Verfahrensweisen. Sobald Sie sich ausreichend mit OO vertraut gemacht haben, finden Sie Vorgehensweisen. Wenn dies Ihr Fachwissen ist und Sie gut genug sind, machen Sie sich keine Sorgen um OO, da es für jemanden einfach genug ist, diesen OO-Schachspielcode zu schreiben:
aber dann muss jemand den Code hinter -findBestMove schreiben und Sie können sicher sein, dass es nicht nur das ist:
Sorgen Sie sich dagegen, wenn Sie nicht wissen, wie der OO-Code gelesen wird. Weil Sie (fast) sicher sein können, dass Ihr Code mit irgendwelchen Objekten in Unordnung gerät. Es sei denn, Sie arbeiten am Fortran Legacy Behemoth von 12000 globalen Vars und 1200 Line "Modulen", die ich derzeit betreue.
quelle
Jon Hopkins schrieb:
Das ist ziemlich genau das, was ich sagen wollte, aber es ist nicht nur Java und .Net, C ++ ist überall, Objective-C ist überall in OSX, all die coolen Kids machen Ruby oder Python und all diese Dinge und viele viele mehr haben einen Fokus auf Objektorientierung. Viele neuere Sprachen sind multiparadigm, so dass F # in erster Linie eine funktionale Sprache ist, aber auch die Objektorientierung unterstützt. Es ist überall und zumindest ein wenig Verständnis ist sehr nützlich. Ärgern Sie sich nicht zu sehr darüber, denn gerade abgeschlossene Universitätskurse bedeuten, dass Sie bereit sind, etwas über die Entwicklung von Code in der realen Welt zu lernen :)
quelle
Ich habe lange programmiert und finde, dass die Konzepte von OO auch beim Programmieren in C nützlich sind - auch wenn ich diese Konzepte im Test wahrscheinlich nicht bis ins kleinste Detail beschreiben würde. Irgendwann habe ich sogar eine OO-Sprache erstellt, wenn auch eine rudimentäre, um mich mit den Konzepten vertraut zu machen und OO aus einem neuen Blickwinkel zu genießen.
Übrigens, C ++ hat OO massiv und hässlich durcheinander gebracht, wohingegen Objective C es richtig macht.
Über Interviews sind sie zu einer Horrorshow geworden - von beiden Seiten des Tisches. Die meisten Befragten sind sehr verrückt nach ihnen. Die meisten Einstellungsmanager sind erstaunt darüber, wie viele Leute selbst bei sehr einfachen Programmiertests durchfallen.
Das heißt, es gibt einige enorme Duschtaschen in der Softwareindustrie, die NICHTS kennen und dennoch die Welt von zukünftigen Mitarbeitern erwarten.
quelle
Das Erlernen von OOP ist nicht so nützlich wie das Erlernen der Softwareentwicklung. Lesen Sie Code Complete 2 .
Sicher, es ist ein nützliches Tool, aber OOP selbst ist sehr klein. Wenn Unternehmen und Personalvermittler "OOP" sagen, meinen sie im Allgemeinen "Softwareentwicklung". Es wird als Oberbegriff verwendet.
Echte Personalvermittler werden den Unterschied zwischen dem Wissen, wie man Software entwickelt, und dem Kästchen "Hat 3 Jahre in 'OOP'" erkennen.
quelle
Die Antwort lautet ja, wie mehrere andere angemerkt haben.
ABER, wenn Sie auf Stapel von Nicht-OO-prozeduralem Spaghetti-Code arbeiten möchten, können Sie das auch dort herausfinden. Ich denke, Sie werden die OO-Arbeit vorziehen.
EDIT: Verzeihen Sie meinen Fall von Revolverhelden Zynismus und Sinn für Humor. Wie Raynos sagte, nur weil etwas OO ist, heißt das nicht, dass es gut ist. Die richtige Anwendung von OO erfordert echte Arbeit und Gedanken. Nur Instanzen davon zu haben, bedeutet nicht automatisch, dass eine App gut gemacht ist. Und umgekehrt bin ich mir sicher, dass es da draußen gut geschriebenen Verfahrenscode gibt. Meine Erfahrung in IT-Unternehmensshops in den 90er und 2000er Jahren war, dass viel schlechter Code geschrieben wurde und wahrscheinlich immer noch existiert. Aber näher an der Frage des OP ist mir aufgefallen, dass die intelligenteren Entwickler, wenn sie die Chance haben, zu mehr OO-Systemen wechseln.
quelle
OO ist eine grundlegende Basis, auf der andere Techniken aufgebaut sind. Ein wichtiger Punkt ist, zuerst den Unterschied zwischen einem Typ (einer Klasse) und einer Instanz dieses Typs vollständig zu verstehen. Versuchen Sie nicht, weiterzulesen, ohne dies vollständig zu verstehen (dies wird später klar), da Sie den Rest noch einmal durchlesen müssen, sobald Sie die Vision erfasst haben.
Sobald Sie den Dreh raus haben, werden Sie nie mehr darauf verzichten wollen. Ich bin kein Purist, wenn es um Verkapselung, Muster, Frameworks oder was auch immer geht. Bei der Arbeit müssen Sie sich an verschiedene Ansichten und Konzepte anpassen. Ich werde einige meiner bisherigen Berufserfahrungen auflisten:
In einer Firma wollten meine Kollegen so viel wie möglich faul laden (leere Konstruktoren, sperrige Eigenschaften, die überall auf Nullwerte prüfen mussten). Sie bauten webbasierte serverseitige Objekte, die nur ein kurzes Leben führten.
Der nächste Job war genau umgekehrt. Objekte, die sich in einer Desktop-Anwendung (Excel-basiert) befanden. Möglichst viele Initialisierungen sollten sich im Konstruktor befinden (oder in einer der vielen Konstruktorüberladungen). Leere Konstruktoren waren nicht erlaubt, da leere Objekte kein Existenzrecht hatten (was die Persistenz zu einer ziemlichen Herausforderung machte). Außerdem musste ich mich an die "Coding-Style-Standards" anpassen (wo man Klammern öffnet, nach Kommentaren Leerzeichen hinzufügt usw.), da mein Code nicht eingecheckt werden konnte, wenn er nicht über style-cop kam.
Derzeit arbeite ich in einem Unternehmen, in dem keiner der Entwickler jemals versucht hat, OO zu verstehen. Es ist schwer auszudrücken, wie extrem frustrierend das war. Ich musste meine Grep-Kenntnisse verbessern. Tatsächlich wurde meiner F12-Taste ein HotScripts-Makro zugewiesen, um einen Grep-Vorgang für den ausgewählten Text durchzuführen. Ich werde die anderen Frustrationen verschonen ...
Sobald Sie OO Fähigkeiten erhalten, werden Sie fast zu den Spaghettis allergisch! Jedoch in allen Fällen, sei geduldig und passe dich an. Zögern Sie, "es wegzuwerfen und von vorne zu beginnen". Dein Chef wird dich lieber wählen, wenn es darum geht, dich rauszuwerfen. Leider ist "Geld verdienen" wichtiger als eleganter Code.
Entschuldigung für die lange Antwort, aber ich habe versucht, den größten Teil Ihrer Frage abzudecken :-)
quelle
OOP ist nicht wegen sich selbst wichtig, sondern wegen dem, was es mit sich bringt. Etwas, das sich mit der Fähigkeit befasst, Dinge zu abstrahieren und zu isolieren, Dinge zu gruppieren und nur die Teile freizulegen, die benötigt werden, um miteinander zu interagieren.
Dies ist eine gebräuchliche Technik namens "Modularisierung", die es ermöglicht, komplexe Systeme als Aggregation von einfacheren zu erstellen, ohne auf hoher Ebene auf jedes einzelne Detail Rücksicht zu nehmen, und bei der Komponenten austauschbar sein müssen, auch wenn sie nicht genau die richtigen sind gleich.
Es wurde versucht, diese "Konstruktionskonzepte" in die Softwareentwicklung einzubeziehen, seitdem das Softwareprodukt selbst größer als die "Einzelentwicklerfähigkeit" geworden war. Daher war eine Möglichkeit erforderlich, Entwickler dazu zu bringen, an unabhängigen Teilen zu arbeiten und diese Teile zuzulassen zusammen interagieren.
Das heißt, diese Prinzipien sind nicht notwendigerweise nur in OOP zu finden (wenn die Berechnungstheorie gültig ist, gibt es unendlich viele mögliche Methoden, um zu diesen Ergebnissen zu kommen).
OOP ist einfach ein erfolgreicher Versuch , die Dinge zusammen zu stellen, zu diesen allgemeinen Bedingungen geben (wie Module, Verkapselung, Substitution) präzisere Definitionen und aufwendige Konzeptualisierung auf diesen Definitionen (Muster) , die können in Programmiersprachen passen.
Denken Sie an OOP zunächst nicht als " Sprachfeature ", sondern als " gemeinsames Lexikon ", das Softwareentwickler dazu bringt, sich dem Software-Design anzunähern.
Die Tatsache, dass eine gegebene Sprache Grundelemente hat oder nicht, die dieses Lexikon direkt erzwingen und beispielsweise sicherstellen, dass eine "Kapsel" nicht versehentlich von dem geöffnet wird, der dies nicht tun soll, ist ein sekundärer Aspekt des OOP-Entwurfs. Deshalb werden auch große C-Projekte oft als OOP "verwaltet", auch wenn die Sprache selbst keine direkte Unterstützung dafür bietet.
Der Vorteil von allem, was nicht erkennbar ist, bis eine Projektgröße in der Fähigkeit eines einzelnen Entwicklers verbleibt, alles zu verstehen und nachzuverfolgen (in solchen Situationen kann dies sogar als "Overhead" angesehen werden) oder in einer kleinen Gruppe, in der etwas entwickelt wird eine kurze Zeit. Und das ist der Hauptgrund, warum Junioren, die OOP anhand eines "Sprachfeatures" studiert haben, es oft falsch interpretieren und schlecht gestalteten Code produzieren.
Wie OOP in Sprachen passt, hängt davon ab, wie Sprachdesigner das OOP-Prinzip in ihrem eigenen Konstrukt interpretieren.
So wird "Kapselung" in C ++ zu "privaten Mitgliedern" (und eine "Kapsel" wird zu einer Klasse), "Substitution" wird zum Überschreiben virtueller Funktionen oder zur Parametrisierung / Spezialisierung von Vorlagen usw., während in D eine Kapsel ein "Modul" ist (und die Substitution erfolgt) durch Klassen usw.), wodurch ein bestimmtes Paradigma oder Muster direkt in einer bestimmten Sprache verfügbar gemacht wird und nicht in einer anderen und so weiter.
Was Personalvermittler bei der Beantwortung von OOP-Fragen suchen, ist nur die Überprüfung Ihrer Fähigkeit, Software-Design für zukünftige große Projekte und Entwicklungen zu abstrahieren und zu verstehen. OOP, für sie ist es nur ein "Wörterbuch", von dem sie angenommen haben, dass Sie und sie es wissen, damit Sie über andere allgemeinere Dinge sprechen oder sich in einer bestimmten Implementierung konkretisieren können.
quelle
Eine objektorientierte Sprache hilft Ihnen dabei, ein objektorientiertes Design in Ihrem Code beizubehalten, was gut ist. Es ist aber auch wahr, dass ein solches Design mit jeder anderen Paradigmasprache erzielt werden kann: Der Grund für die Popularität (insbesondere bei Unternehmen) von OO-Sprachen liegt wahrscheinlich im kommerziellen Erfolg von Java und C #.
Wenn Herr Gates sein Unternehmen richtig gegründet hätte, würden wir wahrscheinlich SCHEMA studieren, bevor wir uns auf eine Stelle bewerben.
quelle
Die kurze Antwort lautet Ja
Die längere Version, warum Sie sich fühlen oder in einem Dilemma, warum es wichtig ist, beruht nur auf der Tatsache, dass Sie an keinen Projekten oder Implementierungen gearbeitet haben, die einem bestimmten Zweck dienen. In Klassenzimmern ist es durchaus gültig, Beispiele für Automobile zu haben, die dann auf PKW, LKW usw. ausgeweitet werden. Wenn Sie jedoch in die Softwareentwicklung einsteigen, ist dies eine Lösung, die auf die Erleichterung einiger Aufgaben abzielt. Wenn es nicht
OO
so wäre, müsstejeder ähnliche Codes über die Codebasis oder schreibenRäder jeden Tag neu erfinden. Stellen Sie sich vor, was für ein Durcheinander es wäre, wenn man in eine solche Codebasis eintauchen würde, um etwas zu reparieren. Die Beispiele im Klassenzimmer dienen einer vagen Definition oder Darstellung, wie / warum dies durchgeführt wird. Der eigentliche Test ist abgeschlossen, wenn Sie mit dem Erstellen Ihrer App beginnen. Zweifellos könnte sie fürchterlich verwendet werden, aber aufgrund ihrer klaren und prägnanten Verwendung ist sie äußerst vernünftig. Beginnen Sie also besser mit der Arbeit an diesem schwachen Bereich, wenn Sie keine Alptraumcodes ausgeben.quelle
Es hängt davon ab, ob. Ein Grund, warum Sie OO kennen müssen, weil es die Verkehrssprache der Programmierwelt ist. Wie eine andere Antwort zeigt, ist fast jede Hauptsprache in irgendeiner Weise OO, was bedeutet, dass im Grunde jedes Unternehmen, das Sie einstellen könnte, eine OO-Sprache verwendet. Haben Sie jemals versucht, OCaml-Programmierer einzustellen? Es ist unmöglich; der talentpool ist zu klein. Wenn Sie Ihr Unternehmen mit OCaml gegründet haben und Ihr Unternehmen erfolgreich wird, können Sie Programmierer nicht schnell genug einstellen und das Geschäft wird eingestellt. Daher verwendet fast jedes Unternehmen mit mehr als 3 Programmierern eine OO-Sprache. Um mit Ihren Mitarbeitern zu kommunizieren und die Bibliotheken Ihrer Plattform zu nutzen, benötigen Sie Kenntnisse über OO.
Je nach Sprache des Unternehmens sind Vererbung und Polymorphismus entweder extrem wichtig oder nur mäßig relevant. Sie können in Java nichts tun, ohne 10 GoF-Entwurfsmuster und ein Framework für die Abhängigkeitsinjektion zu eliminieren. Java ist eine der am häufigsten verwendeten Sprachen, daher sind die OO-Prinzipien für die vielen Unternehmen, die Java verwenden, sehr wichtig.
Wenn das Unternehmen eine moderne hybride OO- / Funktionssprache mit Lambdas und Funktionszeigern wie Scala oder C # verwendet, wird die Vererbung plötzlich weniger wichtig, da Sie Funktionen höherer Ordnung haben, um viele der wirklich einfachen Dinge zu handhaben, die ansonsten viel erfordern würden Zeremonie. Sie müssen jedoch weiterhin in der Lage sein, mit OO-Inhalten zu arbeiten, da die meisten Bibliotheken, die Sie verwenden, auf OO-Weise geschrieben werden.
Wenn Vererbung und Polymorphismus für das Unternehmen nicht wichtig sind , werden Sie wahrscheinlich immer noch OO-Fragen haben, weil:
quelle
Mit einem Wort "Ja".
Sie denken vielleicht, Sie kennen die Theorie, aber Sie müssen Code schreiben und in die Praxis umsetzen. Es gibt buchstäblich Tausende von Beispielen und Übungen, die online verfügbar sind.
quelle