Wie gehe ich mit einer noch nicht implementierten Methode um, die von einem Co-Programmierer durchgeführt wird?

45

Dies ist eine Frage zum Arbeiten in Teams.

Kürzlich habe ich an meinem ersten größeren Programmierprojekt (ca. 80 Klassen, Java) mit einem Team von 6 Personen gearbeitet, obwohl nur 4 von uns kontinuierlich an dem Code gearbeitet haben. Wir haben die zu erledigende Arbeit früh verteilt und irgendwann musste ich eine Methode aufrufen, die noch nicht von einem meiner Co-Programmierer implementiert wurde. Wie ist der empfohlene Umgang damit?

Optionen, die ich gesehen habe, obwohl ich keine wirklich mag:

  1. Schreiben Sie mir eine //TODOund wiederholen Sie diese Codezeile später, um zu überprüfen, ob die Methode in der Zwischenzeit implementiert wurde.

  2. Bitten Sie das entsprechende Teammitglied, dies jetzt umzusetzen .

  3. Auslösen einer benutzerdefinierten runtimeException mit einer klaren Beschreibung dessen, was noch nicht implementiert ist. (Wenigstens müssen wir nicht lange suchen, um herauszufinden, was fehlt)

  4. Fügen Sie ihrer Klasse die erforderliche Methode hinzu und schreiben Sie sie //TODOin den Nachrichtentext. Senden Sie ihnen möglicherweise auch eine kurze Nachricht über diese Änderung. (Jetzt ist es nicht mehr mein Problem, aber dies kann zu lästigen Zusammenführungskonflikten führen, wenn sie in der Zwischenzeit an dieser Methode gearbeitet haben.)

  5. Definieren Sie abstrakte Klassen oder Schnittstellen für alles, bevor Sie den Code schreiben, der die Arbeit erledigt. (Funktionierte nicht so gut, da diese Schnittstellen oft geändert wurden)

lucidbrot
quelle
51
Ich denke, dass der Workflow, in dem Sie eine von jemand anderem geschriebene Methode benötigen, nicht der richtige ist. Sie arbeiten an einer Funktion. Wenn für diese Funktion eine Methode erforderlich ist, implementieren SIE sie. Wenn zwei Personen ein einzelnes Feature implementieren sollen, werden sie entweder gepaart oder integrieren und kommunizieren so oft, dass es fast so aussieht, als würden sie gepaart.
Euphoric
8
@Euphoric Ich bin mehrmals auf eine Situation gestoßen, in der innerhalb eines relativ kurzen Zeitraums ein ziemlich großes neues Feature entwickelt werden sollte und als solches die Benutzeroberfläche, die Geschäftslogik und die API-Ebenen in verschiedene Aufgaben aufgeteilt werden mussten, um gleichzeitig daran zu arbeiten. ansonsten könnte die Frist nie eingehalten werden. Genau hier sollte eine Person, die an der Benutzeroberfläche arbeitet, nur Datenzugriffsmethoden und -befehle für BL als Schnittstellen deklarieren und die anderen Personen an der Implementierung arbeiten lassen, während sie ausschließlich an der Benutzeroberfläche arbeiten.
Andy
15
@ DavidPacker Was Sie beschreiben, ist nicht die einzige Möglichkeit, dieses Problem zu lösen. Vertikale Schnitte, häufige Integration und kleine Features sind bessere Lösungen als horizontale Schnitte, bei denen jede Person an einem separaten Teil arbeitet.
Euphorischer
3
@Euphoric Ich kann dir nicht mehr zustimmen. Wenn möglich, versuchen wir, die komplexen neuen Funktionen unkritischer Teile zu entfernen (dh solche, die nur die UX verbessern würden, aber nicht sofort notwendig sind). Leider sind manchmal die von Ihnen genannten Optionen oder das Feature-Stripping nicht möglich. Unternehmen sagen, Entwickler tun. Während Ihre Punkte solide sind, ist es auch wahrscheinlich, dass jemand auf eine Situation stößt, in der eine Aufteilung der Funktionen erforderlich ist, um die geschäftlichen Anforderungen zu erfüllen.
Andy
2
Was ist mit dem Gespräch , wie er damit umgehen will?
Aganju

Antworten:

5

Es ist eine interessante Frage und die Antwort könnte einfacher sein als Sie denken.

Schreiben Sie einfach Tests, die Ihre Annahmen bestätigen. Es spielt keine Rolle, ob Sie die Implementierung oder Ihre Programmierkollegen durchführen

Die lange Antwort.

Alle Optionen, die Sie auflisten, sind eher passiv und erfordern, dass Sie früher oder später zurückkehren und den Code (falls vorhanden) erneut aufrufen.

  • Kommentare müssen von Ihrem für die Implementierung zuständigen Ansprechpartner gelesen und bearbeitet werden. Ihr Code kann in der Zwischenzeit nicht kompiliert werden. Wenn Sie einen solchen Status in einem Code-Repository überprüfen, funktioniert Ihre Continuous-Integration-Pipeline nicht, und es ist sowieso eine schlechte Praxis ... checken Sie niemals fehlerhaften Code ein
  • Laufzeitausnahmen scheinen besser zu sein, sind aber immer noch giftig, da Ihr Programmierkollege davon ausgehen könnte, dass die Implementierung bereits ohne Überprüfung durchgeführt wurde, und das System auch in einem instabilen Zustand belassen würde. Wenn die Methode nicht so oft ausgelöst wird, kann dies zu fehlerhaftem Produktionscode führen ... auch schlechte Praxis ... checken Sie niemals "nicht implementierte" Ausnahmen ein
  • Das Warten auf die Implementierung der Methoden durch Ihre Programmierkollegen oder auf einen Stub ist ebenfalls entmutigend. Es unterbricht Ihren Workflow und den Workflow Ihrer Programmierkollegen. Was passiert, wenn sie krank sind, in einer Besprechung, in der Kaffeepause, wollen Sie Ihre Zeit damit verbringen, zu warten? ... warte nicht auf jemanden, wenn du nicht musst
  • implementieren Sie die fehlenden Methoden auf jeden Fall der beste Weg, um voranzukommen. Aber was passiert, wenn Ihre Implementierung nicht den gesamten Anwendungsfall erfüllt und Ihre Programmierkollegen ihn ergänzen oder ändern müssen? Wie stellen Sie und sie sicher, dass es immer noch mit Ihren Vorstellungen kompatibel ist? Die Antwort ist wieder einfach. Schreiben Sie Tests, die Ihre Absichten bestätigen, beschreiben und dokumentieren. Wenn die Tests brechen, ist es leicht zu bemerken. Wenn Änderungen an dieser Methode vorgenommen werden müssen, die Ihre Funktion beeinträchtigen, wird dies sofort angezeigt. Sie haben beide einen Grund zu kommunizieren und zu entscheiden, was zu tun ist. Funktionalität aufteilen? Ändern Sie Ihre Implementierung usw. ... checken Sie niemals Code ein, der durch Tests nicht ausreichend dokumentiert ist

Um ein ausreichendes Testniveau zu erreichen, würde ich vorschlagen, dass Sie sich zwei Disziplinen ansehen.

  1. TDD - testgetriebene Entwicklung - dies stellt sicher, dass Sie Ihre Absicht beschreiben und ausreichend testen. Es gibt Ihnen auch die Möglichkeit, Methoden und Klassen (auch unter Verwendung von Schnittstellen) zu verspotten oder zu fälschen, die noch nicht implementiert sind. Der Code und die Tests werden weiterhin kompiliert und ermöglichen es Ihnen, Ihren eigenen Code unabhängig vom Code Ihrer Programmierkollegen zu testen. (siehe: https://en.wikipedia.org/wiki/Test-driven_development )

  2. ATDD - Akzeptanztestgesteuerte Entwicklung - Hierdurch wird eine äußere Schleife (um die TDD-Schleife) erstellt, mit deren Hilfe Sie die Funktion als Ganzes testen können. Diese Tests werden nur dann grün, wenn die gesamte Funktion implementiert ist. Dadurch erhalten Sie eine automatische Anzeige, wenn Ihre Kollegen ihre Arbeit abgeschlossen haben. Ganz nett, wenn du mich fragst.

Einschränkung: In Ihrem Fall würde ich nur einfache Abnahmetests schreiben und nicht versuchen, zu viel von der Geschäftsseite einzubringen, da dies zu Beginn einfach zu viel wäre. Schreiben Sie einfache Integrationstests, die alle für die Funktion erforderlichen Teile des Systems zusammenfassen. Das ist alles was benötigt wird

Auf diese Weise können Sie Ihren Code in eine Continuous Integration-Pipeline einfügen und eine äußerst zuverlässige Implementierung erstellen.

Wenn Sie in diesem Thema mehr erfahren möchten, klicken Sie auf die folgenden Links:

Jesko R.
quelle
103

Fragen Sie nach Stubs.

Oder schreibe sie selbst. In jedem Fall müssen Sie und Ihre Mitarbeiter die Schnittstellen und deren Verwendung vereinbaren. Diese Vereinbarung werden muss , relativ verfestigt , so dass Sie kann gegen Stubs entwickeln - nicht zu erwähnen, so dass Sie Ihre eigene Mocks für Ihre Unit - Tests erstellen können ...

Svidgen
quelle
25
^^ Das. Wenn Sie die Schnittstellen ordnungsgemäß verwenden, sollten Sie die Implementierungen erst benötigen, wenn der andere Typ damit fertig ist, sie zu schreiben.
Robert Harvey
13
Und um Roberts Kommentar zu erweitern: Wenn Sie in einem Projekt, das speziell für die Aufteilung auf mehrere Personen entwickelt wurde, die Benutzeroberflächen nicht richtig verwenden, werden Sie eine schlechte Zeit haben ...
corsiKa
1
Es ist eine Schande, dass Java keine Header-Dateien hat. In der C / C ++ - Welt können Sie Ihre APIs ausarbeiten und zuerst alle Ihre Header schreiben. Eine fehlende Implementierung wird dann zu einem Problem für den Linker. (Eine leichte Vereinfachung, der ABI muss ebenfalls konstant bleiben, damit er nur eine Linker-Angelegenheit ist.)
Wes Toleman
16
@WesToleman Amüsanterweise ist eine meiner Lieblingssachen an Java, dass es keine Header-Dateien hat. Die von Robert und corsiKa erwähnten "Interfaces" füllen diese Rolle perfekt aus. Sie arbeiten zuerst Ihre APIs aus, schreiben die Schnittstellen und ein Mangel an konkreter Implementierung ist für den Compiler kein Problem.
GrandOpener
1
@WesToleman Funktioniert das für Sie gut? In meinen Ohren hört sich das verdammt nach Wasserfall an, und ich vermute, dass Sie die Benutzeroberfläche weiter aktualisieren müssen, wenn Sie feststellen, dass Sie diesen "wichtigen Parameter" vermissen?
netigger
6

In Ihrer Situation würde ich mit dem für diese Funktion zuständigen Teammitglied sprechen. Es kann sein, dass sie in der Lage sind, die Entwicklung dieser Funktion zu priorisieren, damit Sie sie früher verwenden können.

Ich würde Ihre vierte Option meiden. Sie haben Ihren gesamten Code geschrieben und betrachten ihn, wie Sie sagen, nicht mehr als Ihr Problem. Ihr Kollege schreibt dann die Implementierung der Funktion und betrachtet sie nicht länger als ihr Problem. Wer testet eigentlich, ob der von IHNEN geschriebene Code korrekt funktioniert?

Pete
quelle
Sie sollten nach der API für diese Funktion fragen , die zu einer oder mehreren Schnittstellen führen soll. Es ist möglicherweise eine gute Idee, dies zusammen zu tun, da Sie diese Schnittstelle verwenden müssen, um die ersten Testfälle auf der Grundlage Ihrer Eingabe zu entwerfen. Die eigentliche Implementierung kann dann später erfolgen (einschließlich möglicher API-Änderungen)
Thorbjørn Ravn Andersen,