Ich habe eine sehr einfache Codierungsaufgabe gegeben, aber ich verstehe nicht ganz, was gefragt wurde, wie man effektiver/effizienter ist?

Ich leite ein kleines Teilprojekt in meinem Unternehmen, und ich habe noch nie zuvor in meiner Karriere ein Projekt geleitet, und dieses Miniprojekt soll laut meinem Vorgesetzten eine Führungsübung sein.

Ich habe eine Aufgabenaufschlüsselung vorgenommen und sie zugewiesen. Eine dieser Aufgaben war die Form

Entwickeln Sie eine Funktion/API mit Signatur Output functionName(Input1,Input2), die Funktion sollte TaskX ausführen

Wo TaskX ziemlich ausführlich beschrieben wurde. Es war ziemlich klar und direkt und auch ziemlich eigenständig.

Ich bekam jedoch eine ziemlich große Klasse geliefert, bei der die angeforderte API im Wesentlichen eine Member-Funktion einer Klasse war, die Klasse hatte auch Datenmember, die für die Funktion selbst nicht wirklich nützlich sind (zum Beispiel hat sie einen völlig nutzlosen Viewer für die Funktion). Ich habe den Code überprüft und versucht zu erklären, wie ich es gemacht hätte, einschließlich Codeschnipsel (die ungefähr 20/30 Codezeilen waren), dies beinhaltete auch den Hauptteil der Funktion.

Aus irgendeinem mir nicht ganz ersichtlichen Grund bekomme ich immer wieder eine große Klasse geliefert, deren Feature und Implementierung ich nicht für ganz richtig halte, aber darum geht es nicht. Der Punkt ist, dass ich, wenn ich diese Member-Funktion verwenden wollte, ein ziemlich großes Objekt instanziieren musste, was nicht viel Sinn macht.

Für mich ist das Ziel der Aufgabe also nicht erreicht, und ich habe versucht, genau zu sagen, was ich will und warum, aber irgendwie bekomme ich immer noch Widerstand. Denken Sie auch daran, wie kurz die Funktion war, ich hatte erwartet, dass dies in höchstens drei Tagen erledigt sein würde (und das war eine Überschätzung, da die Funktion am Ende in Bezug auf den Code wirklich kurz war), aber es ist jetzt zwei Wochen her . Der Grund dafür, dass es so lange dauert, ist, dass ich zusammen mit dem eigentlichen Kern der Aufgabe eine ganze Klasse, wie beschrieben, und ein paar Skripte und ein IDE-Projekt bekomme, die ich ehrlich gesagt nicht brauche. Das einzige, was ich physisch brauchen würde, sind ein oder zwei Quelldateien.

Ich habe bereits mit meinem Vorgesetzten darüber gesprochen und im Wesentlichen habe ich aus diesem Gespräch nur herausgefunden, dass der Ingenieur, mit dem ich derzeit zusammenarbeite, dazu neigt, Dinge zu übertreiben. Meine Frage hier ist also, wie kann ich in Zukunft mit dieser Situation am besten umgehen?

Das einzige, woran ich persönlich dachte, war, mich neben ihn zu setzen und zu versuchen, ihn durch die Aufgaben zu führen, die ich ihm zugewiesen habe, aber oft driften diese Gespräche zu Dingen ab, die nicht direkt mit der Aufgabe zusammenhängen (das liegt wahrscheinlich daran, dass ich zu verfügbar bin Erklärungen geben und das schadet mehr als es nützt).

Irgendein Rat?

(Hinweis: Das Projekt ist sehr klein, es sind etwa drei Ingenieure beteiligt, mich eingeschlossen).

Update : Trotz meines Code-Reviews wurde ich also wieder mit aufgeblähtem Code versorgt. Die Technik, die ich angewendet habe, um das zu klären, war also eine Art Mischung aus ein paar Antworten, die ich von hier erhalten habe.

Zunächst einmal habe ich ausdrücklich gefragt, warum ich angesichts der Aufgabe so viel Code bekommen habe. Ich wurde begründet (ob ich zugestimmt habe oder nicht, ist eigentlich egal), aber am Ende haben wir geklärt, was für die Aufgabe notwendig ist, also habe ich am Ende die 20 Zeilen bekommen, die ich für notwendig hielt. Damit war die aktuelle Aufgabe erledigt.

Als Übung für ihn habe ich jedoch beauftragt, mir eine Form von Design/Pseudocode zu geben, dessen Implementierung es ermöglichen würde, das Ziel der nächsten Aufgabe zu erreichen. Deshalb hatten wir ein Treffen, wo wir darüber gesprochen haben. Die Diskussion neigte manchmal dazu, zu anderen Details abzudriften (nützlich zu verstehen, aber aus Codierungssicht nicht wichtig), ich denke, dieses Mal gelang es mir jedoch, die meiste Zeit auf dem Laufenden zu bleiben. Am Ende dieses Treffens stellte ich die explizite Frage "Wie viele Codezeilen brauchen Sie Ihrer Meinung nach, um dies zu implementieren?" er erklärte mir, was er seiner Meinung nach zu tun hatte, und dieses Mal klang es ungefähr richtig, ich habe auch viele Male betont, dass der minimale Code erforderlich ist, und ich denke, ich wurde dieses Mal verstanden.

Führt der Code TaskX aus ? Wäre es möglich, funktionierenden Code aus dem zu extrahieren, was der Entwickler liefert?
Haben Sie Schätzungssitzungen, in denen Sie den Umfang und die Implementierungstickets in der Gruppe besprechen?
@BernhardDöbler es ist möglich, ja und ich habe in meinem Code-Review erklärt, wie. Der Code führt taskX aus, ist aber zu stark an die Klasse gekoppelt. Im Wesentlichen war mein Ziel, primitive Funktionen und Klassen in einer kleinen Bibliothek zu entwickeln (damit sie eigenständig wiederverwendbar sind) und ein komplizierteres System zusammenzubauen.
@Helena nicht unbedingt nein, aber unter den "Epics" in unserem Board habe ich kürzlich ein "Design"-Epos hinzugefügt, in dem mein Ziel darin besteht, "offiziell" Zeit zuzuweisen, um Implementierungen und Architektur zu diskutieren.
Ist dieser Ingenieur ein interner Mitarbeiter oder eine externe Vertragsperson?
@ Daniel R. Collins. Im Haus.
Kann jemand erklären, warum die Leute dafür stimmen, die Frage zu schließen?

Antworten (4)

Das einzige, woran ich persönlich dachte, war, mich neben ihn zu setzen und zu versuchen, ihn durch die Aufgaben zu führen, die ich ihm zugewiesen hatte

Das scheint mir eine gute Idee zu sein. Es folgt grundsätzlich dem Prinzip „Lead by Example“ .

Die Idee ist natürlich, dass Ihr Team irgendwann in der Lage sein wird, Dinge alleine zu erledigen, ohne dass Sie neben ihnen sitzen müssen, aber in diesem Fall scheint es hilfreich zu sein, dies einmal mit dieser Person zu tun.

Versuchen Sie, mit ihnen klarzukommen, und versuchen Sie, eine der Aufgaben zu erledigen, die Sie ihnen zugewiesen haben. Teilen Sie ihnen Ihren Denkprozess mit, fragen Sie sie, was sie denken und argumentieren, geben Sie Feedback, Vorschläge und Korrekturen, aber lassen Sie sie das Codieren übernehmen.

Lassen Sie sie danach die restlichen Aufgaben alleine erledigen und sehen Sie, wie sie das jetzt geschafft haben. Vielleicht neigt diese Person dazu, die Dinge zu verkomplizieren, und was sie braucht, ist ein wenig Anleitung, um ihre Verhaltensweisen zu verstehen und zu ändern.

aber oft driften diese Gespräche zu Dingen ab, die nicht unbedingt mit der Aufgabe zu tun haben (das liegt wahrscheinlich daran, dass ich zu bereitwillig Erklärungen gebe und das mehr schadet als nützt).

Ich würde dies nicht als Gespräch einrahmen ; vielleicht ist das dein fehler und warum weicht das ab.

Dies sollte mehr in Richtung Paarprogrammierung gehen (aber lassen Sie sie auch hier das Codieren machen und vermeiden Sie es, so viel wie möglich selbst zu programmieren).

Wenn Sie das Gefühl haben, dass diese Person anfängt, abzuweichen oder auf Details einzugehen, die nicht benötigt werden, bringen Sie die Übung höflich wieder auf den richtigen Weg und konzentrieren Sie sich wieder auf die anstehende Aufgabe.

Nun, wie ich in meiner Rezension erwähnte, gab es einen relativ langen Kommentar mit im Wesentlichen der Implementierung, die ich gemacht hätte (die 20/30 Codezeilen). Außerdem fügte ich hinzu, wie ich den Code strukturiert hätte, wenn er das wirklich tun wollte Weg. Ich warte immer noch darauf, dass der eigentliche Code zusammengeführt wird, aber seitdem ist eine Woche vergangen, und er brauchte eine weitere Woche, um mir den Code zu geben, der sich derzeit im Repo befindet.
@ user8469759 Ich verstehe, aber eine Sache ist nur zu erwähnen "mach das", und eine andere ist, eine Anleitung zu geben und Paarprogrammierung zu machen und mit Beispielen zu zeigen ("warum schreibst du diese ganze Klasse?" ... "warum tust du nicht einfach eine Statische Methode?" ... "hier, so etwas" ... "ok, siehst du, es funktioniert? versuche jetzt, die anderen Teile so zu machen"). Mir scheint, dass diese Person daran gewöhnt ist, die Dinge auf ihre Weise zu tun, aber Sie sehen jetzt, dass Sie ihnen klar machen müssen, dass es andere Wege gibt, die für diese Aufgaben angemessener sind (und einfach einen Kommentar zu schreiben oder Dinge zu sagen, tut dies möglicherweise nicht Trick).
Ich verstehe, was Sie meinen.
Als Leiter dieser Person ist es Ihre Aufgabe, dafür zu sorgen, dass es ihr gut geht und sie liefert. Es ist kein "Ball Buster" (es sei denn, Sie überprüfen sie immer und rund um die Uhr, was meiner Meinung nach nicht der Fall ist). Ich schlage vor, dass Sie versuchen, dieser Person mehr Anleitung und Paarprogrammierung in einer einzigen Aufgabe zu geben , und dann sehen, wie sie mit den restlichen Aufgaben vorankommt ... das wäre kein Ballbusting, Sie programmieren nur eine einzige Paarprogrammierung mit ihnen Aufgabe ... nun, wenn Sie danach keine Änderungen oder Verbesserungen von ihrer Seite sehen, dann befürchte ich, dass diese Person nicht der beste Lernende ist ...
Ich schätze, die nächste Frage wäre, wie man mit "schlechten Lernenden" umgeht, irgendwelche schnellen Ratschläge dazu? Oder soll ich einfach eine separate Frage stellen?
@ user8469759 das wäre eine separate Frage, und (1) etwas, von dem Sie noch nicht wissen, ob es bei dieser Person der Fall ist, und (2) etwas, von dem ich sicher bin, dass es hier schon einmal gestellt und beantwortet wurde (versuchen Sie also, sich frühere Fragen anzusehen bevor du fragst bitte :)

Stellen Sie Ihrem Ingenieur eine Herausforderung: Produzieren Sie den minimalen Code, um die Anforderungen zu erfüllen. Diese Version muss nicht releasereif sein, sondern lediglich eine korrekte Umsetzung der Anforderungen.

Wenn dies erledigt ist, besprechen Sie mit dem Techniker, was noch benötigt wird, um es für die Veröffentlichung vorzubereiten. Was ist der Nutzen und die Kosten von allem, was hinzugefügt werden könnte?

Kannst du genauer sein? Was für eine Herausforderung? Normalerweise gebe ich in der Beschreibung der Aufgaben die eigentliche API-Signatur an ... Und dann beschreibe ich, was in den Hauptteil der Funktion gehen soll, wie Pseudocode. Der Grund, warum ich das mache, ist, weil ich denke, dass die Leute ihre eigene Art haben, dieselbe Logik umzusetzen. Ich denke, ihm Code zur Verfügung zu stellen, an dem er arbeiten kann, ist ein bisschen zu viel, es sei denn, ich verstehe Sie falsch.
Die Herausforderung besteht darin, den minimalen Code zu produzieren.
Entspricht meine Beschreibung der Aufgabe dann nicht der Herausforderung, von der Sie sprechen? Was fehlte mir, um glasklar zu machen: „Das ist die Funktion und ich will minimalen Code und sonst nichts“?
Aus diesem Grund schlage ich vor, es so zu formulieren, dass „den kürzesten und einfachsten Code schreiben, den Sie können, auch wenn er noch nicht bereit für die Veröffentlichung ist“.
Ich werde Ihre Strategie übernehmen. Wir werden bald ein Design-Meeting haben, bei dem es um das Design eines sehr spezifischen Algorithmus gehen wird, und ich hoffe, ich kann mit ihm die minimale Menge an Code herausfinden, die erforderlich ist.

Das klingt sehr nach Verschleierung . Verschleierung ist eine Praxis, die normalerweise von Entwicklern angewendet wird, die nicht gut in ihrem Job sind, wobei sie ihre Arbeitsplatzsicherheit gewährleisten, indem sie ihren Code so schwer wie möglich machen, um ihn zu verstehen und damit zu arbeiten, so dass sie die einzigen sind, die wissen, wie er funktioniert. Wenn sie gefeuert werden, muss das Unternehmen daher die gesamte Arbeit, die sie geleistet haben, verwerfen und von Grund auf neu machen, weil niemand versteht, was getan wurde. Daher glauben sie, dass sie weniger wahrscheinlich entlassen werden, weil die Gemeinkosten für ihren Ersatz zu hoch sind.

Folgendes tun Sie: Wenn Sie glauben, dass ein Projekt in 3 Tagen erledigt werden kann, dann setzen Sie eine Frist von 3 Tagen. Das ist ein KPI, den Ihr Entwickler erfüllen muss; Wenn sie die Aufgabe nicht in 3 Tagen erledigen können, dann ist das ein Streik gegen sie, den Sie bei ihrer nächsten Leistungsbeurteilung verwenden können. Wenn sie glauben, dass 3 Tage nicht ausreichen, können sie zu Ihnen kommen und die Frist aushandeln, und zu diesem Zeitpunkt können Sie die Anforderungen mit ihnen klären und ihnen klar machen, dass der Auftrag, den sie bekommen, nicht so groß ist, wie sie denken es ist, und wenn sie dann immer noch versuchen, etwas wirklich Großes zu liefern, können Sie ihnen sagen, dass ihr Code nicht den Spezifikationen entspricht.

Das Wichtigste, was man mit einem Entwickler tun sollte, der verschleiert, ist, seinen Code nicht zusammenzuführen . Das Verschleierungsschema schlägt fehl, wenn verhindert wird, dass ihr Code in Produktion geht. Stellen Sie sicher, dass nur sauberer Code in die Produktion geht, damit Sie nicht mit einer Menge technischer Schulden stecken bleiben, wenn dieser Entwickler das Unternehmen verlässt.

Als Einschränkung zu all dem oben Gesagten : Viele Sprachen haben "Best Practices", die sehr nach Code-Verschleierung aussehen, z. B. Schnittstellendefinitionen, viel Konfigurationsaufwand und so weiter. Stellen Sie sicher, dass Sie die Einschränkungen verstehen, unter denen der Entwickler arbeitet; es ist möglich, dass er guten, sauberen Code liefert, der den Standards der Sprachen/Frameworks entspricht, mit denen er arbeitet, und Sie sagen ihm, er soll schlechten, abgedroschenen Code schreiben, der schwer zu warten ist, und er versucht, Ihnen nett zu sagen, dass Sie es sind ein Idiot und du hörst nicht zu. Denken Sie bei allem, was Sie tun, daran.

Er liefert keinen guten Code ... Zum Beispiel hat er den Standard-Move-Konstruktor neu implementiert, um genau dasselbe zu tun, was ein Standard-Move-Konstruktor tun würde. Im Wesentlichen ist der Code sehr redundant und kapselte die eigentliche Funktion, die ich brauche, aber auf eine Weise, die ich für nützlich halte. Außerdem gibt er sich offensichtlich nicht genug Mühe, selbst dies zu tun, da er beispielsweise keine Namenskonvention befolgt hat (einige Variablen sind Großbuchstaben ... andere Kleinbuchstaben). Es gibt auch noch andere Sachen...
@ user8469759 Fair genug. Ich habe kein Beispiel für den Code, den er geschrieben hat; Wenn Sie sicher sind, dass er im Unrecht ist, dann gehen Sie mit dem ersten Teil.
Ich glaube sowieso nicht, dass es Verwirrung gibt. Es ist ein Miniprojekt zur 3D-Formanalyse und er weiß nicht viel darüber. Daher denke ich, dass es ein kleines Hindernis gibt, weil er nicht genau weiß, was er tut. Aus diesem Grund verbringe ich einige Zeit damit, ihm das eigentliche Ziel jedes Teils zu erklären, aber ich merke, dass zu viel geredet wird, bevor ich tatsächlich etwas bekomme, und dass etwas auch nicht das ist, was ich wollte. Es ist auch möglich, dass er sich nicht wirklich um die Codierung kümmert ... Aber so oder so ... er muss mir helfen und ich versuche einen Weg zu finden, wie ich mich verhalten kann, damit das besser funktioniert.
@user8469759 - Klingt so, als ob Sie die Arbeit jemand anderem zuweisen sollten.
@user8469759 Als Sie diesen Entwickler eingestellt haben, haben Sie angegeben, dass die 3D-Formanalyse Teil der für den Job erforderlichen Fähigkeiten sein würde, und haben Sie ihn auf diesbezügliche Fähigkeiten getestet, oder haben Sie ihm eine Standardfrage aus Hacking the Coding Interview gestellt? wie es die meisten Unternehmen tun, und testen Sie ihn, ob er dieses Buch gelesen hat oder nicht (Tipp: die meisten Entwickler haben es)? Wenn Sie ihn nicht auf Kenntnisse in diesem sehr spezifischen und spezialisierten Bereich getestet haben, seien Sie nicht verärgert, wenn er in das Unternehmen eintritt und bei diesen Projekten keine Leistung erbringen kann. Klingt so, als ob Sie vielleicht besser einstellen sollten.
Ich habe niemanden eingestellt. Es ist ein Mini-Projekt und wer wollte, konnte bei mir einspringen, dieser Typ will gezielt mehr über das Thema erfahren. Wie ich schon sagte, das Problem ist "ich kommuniziere", es ist nicht "er ist ein Problem".

Wenn Sie die Autorität haben, versuchen Sie beim Umgang mit diesem Entwickler, engere Fristen einzuführen und spezifische Ausgabeanforderungen hinzuzufügen.

Bis zu dem Punkt, an dem Sie ihm eine dedizierte Code-Editor-Datei senden, je nach verwendeter Sprache (z. B. *.cs) mit Struktur und "Code hier einfügen" im Kontext

Auf diese Weise wäre es für ihn schwieriger, seine Arbeit aufzublähen und zu verschleiern.

Aber wenn Sie als Ergebnis eine inakzeptable Arbeit erhalten würden, hätten Sie etwas, mit dem Sie sich an Ihren Vorgesetzten wenden können, um Rat / Bestätigung einer für diesen Entwickler erforderlichen Maßnahme zu erhalten

IMHO ist der Umgang mit allen Arten von Untergebenen auch Teil des Hineinwachsens in eine Führungsrolle, in der Ihre Aufgabe nicht darin besteht, die Arbeit zu erledigen, sondern Aufgaben zu verteilen und erhaltene Ergebnisse in ein Endprodukt zu integrieren