Mein vorgeschlagenes Design ist normalerweise schlechter als das meines Kollegen - wie kann ich besser werden? [geschlossen]

69

Ich programmiere seit einigen Jahren und bin im Allgemeinen gut darin, Probleme zu beheben und kleine bis mittlere Skripte zu erstellen. Im Allgemeinen bin ich jedoch nicht gut darin, große Programme objektorientiert zu entwerfen. Ein paar Fragen

  1. Kürzlich hat ein Kollege, der über die gleiche Anzahl von Jahren Erfahrung verfügt wie ich , an einem Problem gearbeitet. Ich habe länger an einem Problem gearbeitet als er, aber er hat eine bessere Lösung gefunden und am Ende werden wir sein Design verwenden. Das hat mich wirklich berührt. Ich gebe zu, dass sein Design besser ist, aber ich wollte ein Design entwickeln, das so gut ist wie sein. Ich denke sogar darüber nach, den Job zu kündigen. Ich bin mir nicht sicher warum, aber plötzlich fühle ich mich unter Druck, zB was würden Junioren von mir und so weiter halten? Es ist normal? Oder denke ich ein bisschen zu viel darüber nach?

  2. Mein Job beinhaltet das Programmieren in Python. Ich versuche, den Quellcode zu lesen, aber wie kann ich meine Designfähigkeiten verbessern? Gibt es gute Bücher oder Software, die ich studieren sollte?

Bitte erleuchte mich. Ich werde Ihre Hilfe sehr schätzen.

user151193
quelle
9
@Oded: Ich denke, der Punkt, den OP anstrebt, ist, dass sie die gleiche Anzahl von Jahren Erfahrung wie die Mitarbeiter haben, aber die Mitarbeiter bessere Designs produzieren, und die OP möchte wissen, wie sie besser werden können, damit sie so sind wie gut wie der Mitarbeiter. Ich denke ...
FrustratedWithFormsDesigner
34
@Oded: Ja, er sollte nicht damit rechnen, ein Meister zu sein, ohne seine 10 Jahre einzubringen, aber auf der anderen Seite werden diese 10 Jahre ihm nicht viel nützen, wenn er keine Quelle hat, von der er lernen kann . Er versucht hier zu wachsen; Lassen Sie uns ihn nicht entmutigen, bitte?
Mason Wheeler
6
Hast du etwas von dem anderen Design gelernt? Können Sie es auf andere Codierungssituationen anwenden, die Sie hatten? Nehmen Sie es auf und lernen Sie so viel wie möglich von Ihrem Kollegen. Angebot Mittagessen.
JeffO
17
Ich würde hier bleiben. Wenn Sie vom Kollegen lernen können, dann tun Sie dies. Lass dich nicht von deinem Ego in die Quere kommen - was ist, wenn du weitermachst und mit Leuten arbeitest, die dir nichts beizubringen haben? Ich habe mehr als 25 Jahre Erfahrung, nehme aber gerne konstruktive Kritik von einem Programmierer mit 3 Jahren an (und gebe meinen Teil dazu). Ich arbeite mit einem Mann zusammen, der an seinem schlimmsten Tag besser ist als ich Mit diesen Leuten bin ich ein besserer Programmierer als vor 2 Jahren.
Mattnz
7
Tatsache ist, dass Sie immer andere finden, die besser sind als Sie. Lassen Sie sich nicht entmutigen, versuchen Sie einfach alles in Ihrer Macht stehende, um besser zu werden.
maple_shaft

Antworten:

69

Ich denke, das ist ein sehr positives Zeichen Ihrer Fähigkeiten. Es kommt weitaus häufiger vor, dass Menschen, die Schwierigkeiten haben, im Team ein „besseres“ Design zu entwickeln, überhaupt nicht erkennen können, warum ein anderes Design besser ist.

Sie haben zwei wirklich große (und überraschend ungewöhnliche) Stärken:

  • Sie sind in der Lage, Ihre Entwürfe objektiv gegen andere zu beurteilen
  • Sie haben den Wunsch und die Mühe, Ihre Entwürfe optimal zu gestalten

Sie sind erst ein paar Jahre alt und haben noch einen langen Weg vor sich, aber mit dieser Einstellung werden Sie auf jeden Fall dorthin gelangen. Geben Sie einfach nicht auf. wir alle haben es mit solchen mentalen Rückschlägen zu tun. So oft ich die Chance bekomme, stecke ich Design Principles (NICHT das Gleiche wie Design Patterns) ein, und ich denke, dies ist ein perfektes Beispiel dafür, wo sie nützlich sind. Studieren Sie sie und üben Sie, sie in Ihren Entwürfen anzuwenden, bevor Sie wissen, dass sie in dieser Hinsicht einen weiteren Schritt nach vorne gemacht haben.

Denken Sie am Ende des Tages daran, dass das Entwerfen schwierig ist. Wir haben es jeden Tag mit komplexen Abstraktionen auf hoher Ebene zu tun, diese aus dem Nichts zu erstellen, sie gut funktionieren zu lassen und für Kollegen einfach zu bedienen, ist eine äußerst schwierige Aufgabe. Es braucht jahrelange Übung .

Denken Sie also daran: Es gibt eine ganze Reihe von Leuten, die zwei Designs nicht bewerten können und tatsächlich eines als besser als das andere anerkennen. Wie gut verstehen sie sich bei der Erstellung guter Designs?

Edit:
'nother tip, nachdem Sie sich ein wenig mit den Grundsätzen befasst und deren Anwendung geübt haben, denke ich, dass es ein weiteres Juwel aus einer anderen Frage gibt, das den Wert des Lernens einer Vielzahl von Sprachen mit unterschiedlichen Zwecken und Regeln zum Ausdruck bringt:

Idealerweise sollte jeder Programmierer eine Sprache aus jeder Klasse kennen. Was könntest du lernen:

  1. Eine statisch typisierte OOP-Hauptsprache: Java, C # (meistens in Unternehmenssoftware verwendet) und C ++ (Systemprogrammierung und komplexe Desktopanwendungen)
  2. Eine prototypbasierte OOP-Sprache: Javascript (clientseitige Webprogrammierung)
  3. Eine prozedurale Sprache: C (eingebettete Software und Systemprogrammierung)
  4. Eine funktionale Sprache: Haskell, ML oder Lisp (funktionale Sprachen eignen sich für stark parallelisierte Software).

Eine logische Programmiersprache (Prolog) ist in der Industrie wahrscheinlich nicht so nützlich und wird hauptsächlich in der AI-Forschung verwendet.

Dies wird dazu beitragen, die Vielfalt der Ideen zu erweitern, die beim Entwerfen einer Lösung in den Sinn kommen.

Jimmy Hoffa
quelle
2
+1 Wenn man das Warum versteht , sind sie auf dem besten Weg zu großartigen Designs (vor allem, wenn sie nur über einige Jahre Erfahrung verfügen).
Daniel B
22
  1. Dies ist völlig normal, wenn mehrere Personen Designs unterschiedlicher Qualität entwickeln. Ich wurde in der Vergangenheit eingeladen, Wettbewerbe im Bereich Software-Design zu beurteilen, und ich habe dies aus erster Hand miterlebt: Selbst die einfachsten Designs ergaben Lösungen von drastisch unterschiedlicher Qualität, die alle von intelligenten und erfahrenen Mitarbeitern stammen.
  2. Das Lesen von Quellcode ist zu einfach, um Ihre Entwurfsfähigkeiten zu verbessern: Code adressiert die Komplexität auf einer niedrigeren Ebene als das Gesamtentwurfs.

Der beste Weg zur Verbesserung beim Entwerfen von Software ist das Entwerfen von Software * . Eine Möglichkeit ist die Betrachtung von Designwettbewerben: TopCoder verfügt über ein Archiv mit über 100 Komponentendesigns, einschließlich UML-Designdokumentation und Implementierungen in Java und / oder C #. Nehmen Sie eine fertige Komponente, die Ihnen gefällt, lesen Sie die Anforderungsspezifikation und versuchen Sie, ein Originaldesign zu erstellen, um die Anforderungen zu erfüllen. Denken Sie ein oder zwei Stunden lang über das Problem nach und skizzieren Sie ein Klassendiagramm. Öffnen Sie dann das Gewinnerdesign und lesen Sie, was der Autor getan hat. Vergleichen Sie sein Design mit Ihrem, erkennen Sie die Unterschiede und prüfen Sie, ob Ihr Design besser ist. Überprüfen Sie die Scorecard des Wettbewerbs, um festzustellen, wie die Juroren das Design bewertet haben. Dies gibt Ihnen das Feedback, das Sie benötigen, um zu entscheiden, wie Sie Ihre Designfähigkeiten verbessern können.


* Dies gilt nicht nur für das Entwerfen von Software: Führen Sie einige Schritte mit qualifiziertem Feedback aus, achten Sie auf die darin enthaltenen Informationen und verbessern Sie Ihre Arbeit.

dasblinkenlight
quelle
1
Vielen Dank, dass Sie mich auf TopCoder aufmerksam gemacht haben, eine interessante Idee, es als Lehrmittel zu verwenden.
Neontapir
Könnten Sie bitte, sehr Art einen Link zu einem Archiv von zur Verfügung zu stellen TopCoder archive of 100+ component designs,. Kann solche Dateien nicht finden.
StepUp
1
@StepUp Hier ist es . Möglicherweise müssen Sie sich anmelden, um darauf zuzugreifen.
dasblinkenlight
Wenn ich schönes Design von ASP.NET sehen will, wo soll ich sehen? Unter dem von Ihnen angegebenen Link wird "Komponenten suchen" angezeigt.
StepUp
1
@StepUp ASP.NET ist zu allgemein. TopCoder-Komponenten sind viel spezifischer: SQL-Parser, Ausdrucksauswertung usw.
dasblinkenlight
11

Kündigen Sie nicht Ihren Job. Es ist besser, mit jemandem zusammenzuarbeiten, der über bessere Fähigkeiten verfügt als Sie, damit Sie von ihm oder ihr lernen können.

Schauen Sie sich das bessere Design an und finden Sie heraus, warum es besser ist. Lernen Sie das akzeptierte Design kennen und überlegen Sie, wie Sie ein ähnliches Design in anderen Situationen anwenden können. Sobald Sie wissen, warum es besser ist als Ihr Design, wissen Sie, was Sie beim nächsten Entwurf nicht tun sollten. Sprechen Sie mit dem anderen Entwickler und fragen Sie, wie er auf das Design gekommen ist.

Um die Designfähigkeiten zu verbessern, ist es am besten, Entwürfe zu erstellen und sie dann brutal mit sich selbst zu bewerten und zu bestimmen, wie sie verbessert werden können. Stellen Sie sich Fragen wie: Funktioniert es und erfüllt es die Anforderungen in allen Aspekten? Ist es wartbar? Wie kann ich dies testen? Verursacht es Leistungsprobleme? Wie wahrscheinlich ist es, dass sich die Anforderungen ändern und wie gut wird das Design? in der Lage sein, mit Veränderungen umzugehen. Informieren Sie sich über Entwurfsmuster und versuchen Sie dann, sie auf Ihre Entwürfe anzuwenden. Refactor gnadenlos nach der Entwicklung eines ersten Designs. Wenn Sie zusammen mit der Anwendung eine Datenbank entwerfen, ausführlich über Normalisierung und Leistungsoptimierung der Datenbank lesen, erfahren Sie viel über das Datenbankdesign, wenn Sie lernen, wie eine Datenbank am effektivsten und effizientesten funktioniert. Denken Sie bei Anwendungen an die DRY- und SOLID-Prinzipien, wenn Sie Ihr Design erstellen. Lesen Sie über Antimuster, um zu wissen, was Sie vermeiden sollten.

HLGEM
quelle
3

Ein besseres Design zu erkennen, ist eine wichtige Fähigkeit. Sie sollten dies fördern, wenn Sie einige der früheren Vorschläge zum Betrachten von Designs befolgen.

Nach welchen Kriterien haben Sie das andere Design besser beurteilt? War es einfacher und verständlicher? Hat es einen Leistungsvorteil gebracht? War es erweiterbarer? Es gibt viele Entwurfsprinzipien wie Zerlegung, Abstraktion, Ausblenden von Informationen und Modularität von Komponenten, anhand derer Sie Entwürfe beurteilen können und die Sie möglicherweise bereits erkennen.

  • Versuchen Sie, Ihre Kriterien zu benennen, zu verstehen, zu erweitern und wiederzuverwenden, wenn Sie sich andere Designs ansehen. Wenn Sie Dinge selbst entwerfen, sollten Sie es Teil Ihres Prozesses sein, diese Kriterien zu verwenden und Ihre Entwürfe bewusst daran zu messen. Bereiten Sie sich dann darauf vor, Ihr Design vollständig zu ändern oder zu verwerfen, wenn es nicht Ihren Kriterien entspricht.

Sie erhalten Ideen zu verschiedenen Grundsätzen für Designs aus den folgenden Quellen: http://www.cs.wustl.edu/~schmidt/PDF/design-principles4.pdf Software-Design auf Wikipedia Google "Software-Design-Grundsätze"

  • Verstehen Sie verschiedene Modelle für das Software-Design, z. B. objektorientiertes Design oder funktionales Design oder strukturiertes Analyse-Design. Dies können ganz unterschiedliche Denkweisen sein, um sich einer Designaufgabe zu nähern, und sie haben jeweils Bereiche, in denen sie sich auszeichnen. Lernen Sie diese als Werkzeuge für Ihre Toolbox. http://userpages.umbc.edu/~khoo/survey2.html

  • Stellen Sie sicher, dass Sie Design von Implementierung trennen, und versuchen Sie, die Dinge, die Sie als gute Designs betrachten, grafisch darzustellen, um die Sprach- und Implementierungsspezifikationen von den übergeordneten Designprinzipien zu trennen. Und um Ihr "Designauge" und Ihre Kommunikationsfähigkeiten zu entwickeln.

  • Zu guter Letzt, aber vielleicht am wichtigsten, ist das breite Lesen ein sehr gutes Werkzeug - es gibt viele interessante Dinge, von Fraktalen über Bayes'sche Analyse, Fuzzy-Logik bis hin zur Verarbeitung natürlicher Sprache, die Anregungen für später und unerwartet auftauchende Ideen liefern können. Mit dem Web können Sie Themen weit und breit lesen, nur zu Ihrer Unterhaltung und zur Unterhaltung, und es wird davon profitieren. Sie müssen kein Experte sein, sondern nur mit Begriffen und Ideen vertraut sein.

Viel Spaß - mach es nicht, wenn du es nicht wenigstens ein bisschen genießt!

Lindsay Morsillo
quelle
2

Nun, Sie haben bereits den ersten Schritt getan. Sie geben zu, dass Sie etwas zu lernen haben, dass die Arbeit Ihres Kollegen besser ist als die Ihre, und dass Sie lernen und sich verbessern wollen.

Der zweite Schritt ist die Analyse. Schauen Sie sich seine Arbeit an und sagen Sie nicht nur, dass es besser ist; Finde heraus, warum es besser ist. Achten Sie auf bestimmte Details und Punkte, die er besser gemacht hat.

Wenn Sie das verstanden haben, extrahieren Sie die Prinzipien dahinter. Stellen Sie Fragen wie diese:

  • Was ist mit diesem Design besser als mein Design?
  • Ist dieser Punkt spezifisch für dieses Design, oder handelt es sich um ein allgemeines Prinzip, das in Zukunft auf andere Designs angewendet werden könnte?
  • Wenn es ein allgemeines Prinzip ist, wo liegen seine Grenzen? Wann ist es eine gute Idee , die Dinge nicht so zu machen? (Dieser ist sehr wichtig. Er hindert Sie daran, eine nützliche Idee auch in unangemessenen Fällen als goldenen Hammer zu behandeln.)

Versuchen Sie, die Dinge selbst herauszufinden, da Sie die Ideen besser verinnerlichen können, wenn Sie die Argumentationskette gefunden haben, die Sie selbst zu dem Ergebnis geführt hat. Sprechen Sie aber auch mit Ihrem Kollegen, um sicherzustellen, dass Sie die Dinge bekommen richtig. (Sie wollen doch keine Fehler in Ihren Überlegungen machen und ein schlechtes Prinzip verinnerlichen.) Und Sie können Ihren Kollegen um Hilfe bitten, wenn Sie die Dinge nicht herausfinden können. Das Programmieren ist eine Disziplin, in der Demut häufig geachtet wird, und viele Programmierer werden die Chance ergreifen, jemandem etwas Neues beizubringen. Dies ist wahrscheinlich ein wesentlicher Grund, warum StackOverflow so schnell so groß geworden ist.

Mason Wheeler
quelle
2

Ich möchte auch hinzufügen (zusätzlich zu den tollen Antworten), dass es mehr gibt als "Er kann ein besseres Design schaffen als ich". Die anderen Antworten konzentrieren sich darauf, wie man beim Design besser werden kann - das ist alles und gut ... aber ...

Ich wette, dass SIE etwas Besseres tun können als Ihr Kollege. Nicht um ein Pissing Match oder irgendetwas zu kreieren (Sie können Y besser machen? Verdammt, ich kann X besser machen!), Sondern um die Wahrheit zu betonen, dass jeder Stärken und Schwächen hat.

Bei mir arbeiten 4 Entwickler. Es gibt Zeiten, in denen die beiden Haupt- "Programmierer" Sachen erstellen können, die mich einfach im Staub liegen lassen. Lässt meinen Kopf drehen und versucht, meinen Kopf um ihre Kreationen zu wickeln.

Aber ich kann SQL und Kommandozeilen-Skripte viel besser als sie und kann Dinge automatisieren, die SIE im Staub belassen.

Sind sie besser als ich? In manchen Gegenden ist das definitiv so. Zum Teufel, in vielen Gegenden sind sie es - ich bin bei weitem der Junior-Entwickler in meinem Geschäft und sie haben individuell jahrelange Erfahrung mit mir. Trotz dieser jahrelangen Erfahrung bin ich in einigen Bereichen besser als selbst sie.

Hör auf, dich auf die Tatsache zu konzentrieren, dass jemand besser in X ist als du. Diese Person ist möglicherweise in der Lage, Sie zu übertreffen, ohne es zu versuchen oder auch nur darüber nachzudenken, selbst nachdem Sie die nächsten 10 Jahre darin geübt haben. Nicht, dass Sie überhaupt nicht daran arbeiten sollten, Ihre Schwächen zu beheben, aber denken Sie daran, dass es für jede Stärke eine Schwäche gibt.

Konzentrieren Sie sich auf beide - Stärken und Schwächen - von Ihnen und Ihren Mitarbeitern.

WernerCD
quelle
1

In jedem Aspekt des Lebens finden Sie Menschen, die nicht so gut sind wie Sie, sowie Menschen, die besser sind als Sie, insbesondere nach nur "ein paar Jahren" Erfahrung.

Man muss von allen lernen.

Fühle dich nicht schlecht. Vielleicht ist Ihr Kollege ein Naturtalent. Sie sollten ihm aufrichtig gratulieren und so viel wie möglich von ihm lernen.

Lassen Sie sich nicht von Profis eifersüchtig auf die Gelegenheit ein, etwas zu lernen.

Tulains Córdova
quelle
1
  1. Ein paar Jahre sind wirklich nicht so viel. Und dann gibt es Leute mit besseren oder schlechtesten Designansichten. Ich kenne zum Beispiel Leute, die in der Lage sind, komplexe Algorithmen für Low-Level-Programme zu schreiben, aber nicht in der Lage sind, übergeordnete Designs und Konzepte wie Zusammenhalt und Abhängigkeiten zu verstehen. Dies ist jedoch kein De-facto-Zustand. Beide können Sie auf höherer Designebene verbessern (lesen Sie ein paar Bücher, probieren Sie ein paar Tricks zu Hause aus usw.) und Sie können auch feststellen, dass Ihr Programmierkollege auf anderen Gebieten weniger gut programmiert. Wenn Sie der Meinung sind, dass Sie sowohl in Bezug auf Erfahrung als auch in Bezug auf technisches Wissen ungefähr auf dem gleichen Niveau sind, kann dies eine zufällige Situation gewesen sein. Das nächste Mal haben Sie vielleicht bessere Gestaltungsideen. Nutzen Sie auch diese Gelegenheit und lernen Sie von Ihrem Kollegen, anstatt Ihren Job zu kündigen. Mach das nächste Mal zusammen ein Design, versuche seine Geheimnisse, seine Gedanken zu fangen. Programmieren ist wie ein Handwerk, es wird gelernt, indem man es tut und anderen zuschaut.

  2. Designfähigkeiten kommen meistens mit Erfahrung und nachdem Sie ein paar wichtige Bücher gelesen haben. Ich würde dir folgendes empfehlen:

    • Robert C. Marting - Agile Prinzipien, Muster und Praktiken (es gibt 2 Versionen, eine in Java und eine in C #. Egal welche Sie auswählen, die Ideen und Prinzipien können auf alle objektorientierten angewendet werden - und nicht nur - Quellcode)
    • Dann hat Robert C. Marting zwei weitere interessante Bücher: Clean Code und The Clean Coder
    • Auch wenn Martin in seinem ersten Buch alle modernen Designmuster behandelt, möchten Sie das ursprüngliche Designmusterbuch der Gang of Four nachschlagen.
    • Schließlich gibt es noch andere Bücher, die heute sehr geschätzt werden: Wachsende objektorientierte Software, die von Tests geleitet wird, oder Refactoring von M. Feathers (glaube ich) oder Schreiben effektiver Anwendungsfälle von A. Cockburn und einige weitere, die Sie unterwegs entdecken werden.

Keines dieser Bücher ist ein Wundermittel, aber das Lesen der ersten beiden Empfehlungen wird wahrscheinlich Ihre Sichtweise und Wahrnehmung der Programmierung für immer verändern.

Patkos Csaba
quelle
0

Lass es nicht zu dir kommen. Wenn Sie jahrelange Erfahrung darin haben, Fehler zu beheben und kleine Programme zu erstellen, sind Sie hier genau richtig. Ihr Kollege hat wahrscheinlich jahrelange Erfahrung in der Gestaltung größerer Projekte.

Es ist unglaublich praktisch, mit den zugrunde liegenden Elementen vertraut zu sein, aber wenn Sie das Design verbessern möchten, müssen Sie ein paar Projekte entwerfen. Wiederholen, bis die Fertigkeit einsinkt.

Kurz gesagt, "langjährige Erfahrung" ist nicht immer gleichbedeutend. Mach, dass deine Jahre etwas wert sind.

Philip
quelle
0

"Besser werden" bedeutet oft, dass Sie Ihre Designs oder Ihren Code mit etwas / jemandem vergleichen, sorgfältig vergleichen, aus diesen Unterschieden lernen und kontinuierlich versuchen, Ihre zukünftigen Designs auf dieser Grundlage zu verbessern. Wenn Sie feststellen, dass Sie mehr lernen müssen, verlangsamen Sie diesen nützlichen Prozess. Wenn Sie an einen Ort ziehen, an dem es keine Menschen (oder andere Ressourcen) gibt, die Ihnen manchmal oder immer einen besseren Vergleich bieten können, können Sie diese Gelegenheit verpassen, Ihren Wettprozess besser zu lernen und zu verlangsamen.

hotpaw2
quelle